diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..48e84a7 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,65 @@ +name: Docs + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: docs-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Set up Quarto + uses: quarto-dev/quarto-actions/setup@v2 + + - name: Configure GitHub Pages + uses: actions/configure-pages@v5 + + - name: Install package and demo dependencies + run: | + python -m pip install --upgrade pip + python -m pip install -e ".[demo]" + + - name: Build Great Docs site + env: + PYTHONIOENCODING: utf-8 + PYTHONUTF8: "1" + run: python scripts/build_great_docs.py + + - name: Upload GitHub Pages artifact + uses: actions/upload-pages-artifact@v4 + with: + path: great-docs/_site/ + + deploy: + needs: build + if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch) + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml new file mode 100644 index 0000000..29c781a --- /dev/null +++ b/.github/workflows/publish-release.yml @@ -0,0 +1,116 @@ +name: Publish Release + +on: + pull_request_target: + branches: + - main + types: + - closed + +permissions: + contents: write + +concurrency: + group: publish-release-${{ github.event.pull_request.number }} + cancel-in-progress: false + +jobs: + publish: + if: ${{ github.event.pull_request.merged == true }} + runs-on: ubuntu-latest + environment: + name: pypi + steps: + - name: Check out main + uses: actions/checkout@v6 + with: + ref: ${{ github.event.pull_request.base.ref }} + fetch-depth: 0 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: npm + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Validate release request + id: release + env: + PR_TITLE: ${{ github.event.pull_request.title }} + PR_BASE_REF: ${{ github.event.pull_request.base.ref }} + PR_HEAD_REF: ${{ github.event.pull_request.head.ref }} + shell: bash + run: | + version="$(python scripts/validate_release_pr.py --allow-current-version --print-version)" + echo "version=$version" >> "$GITHUB_OUTPUT" + + - name: Apply release version + env: + PR_TITLE: ${{ github.event.pull_request.title }} + RELEASE_DATE: ${{ github.event.pull_request.merged_at }} + shell: bash + run: | + export RELEASE_DATE="${RELEASE_DATE%%T*}" + python scripts/apply_release_version.py + + - name: Install Node dependencies + run: npm ci --legacy-peer-deps + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + python -m pip install -r requirements.txt -r tests/requirements.txt + + - name: Build and verify release artifacts + run: python scripts/check_release.py + + - name: Ensure PyPI token is configured + env: + PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }} + shell: bash + run: | + if [ -z "${PYPI_API_TOKEN}" ]; then + echo "Missing PYPI_API_TOKEN secret in the 'pypi' environment." >&2 + exit 1 + fi + + - name: Commit release metadata + shell: bash + run: | + if git diff --quiet -- package.json package-lock.json dash_mantine_datatable/package-info.json Project.toml CHANGELOG.md; then + exit 0 + fi + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add package.json package-lock.json dash_mantine_datatable/package-info.json Project.toml CHANGELOG.md + git commit -m "chore: release v${{ steps.release.outputs.version }}" + git push origin "HEAD:${{ github.event.pull_request.base.ref }}" + + - name: Publish package to PyPI + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + run: python -m twine upload --skip-existing dist/* + + - name: Generate GitHub release notes + run: python scripts/extract_release_notes.py "${{ steps.release.outputs.version }}" > "$RUNNER_TEMP/release-notes.md" + + - name: Create or update GitHub release + env: + GH_TOKEN: ${{ github.token }} + RELEASE_TAG: v${{ steps.release.outputs.version }} + RELEASE_TITLE: ${{ github.event.pull_request.title }} + shell: bash + run: | + release_target="$(git rev-parse HEAD)" + if gh release view "$RELEASE_TAG" >/dev/null 2>&1; then + gh release edit "$RELEASE_TAG" --target "$release_target" --title "$RELEASE_TITLE" --notes-file "$RUNNER_TEMP/release-notes.md" + else + gh release create "$RELEASE_TAG" --target "$release_target" --title "$RELEASE_TITLE" --notes-file "$RUNNER_TEMP/release-notes.md" + fi diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml new file mode 100644 index 0000000..1d0c221 --- /dev/null +++ b/.github/workflows/release-pr.yml @@ -0,0 +1,40 @@ +name: Release PR Guard + +on: + pull_request: + branches: + - main + types: + - opened + - edited + - reopened + - synchronize + - ready_for_review + +permissions: + contents: read + +concurrency: + group: release-pr-${{ github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + validate-release-pr: + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Validate staging release PR + env: + PR_TITLE: ${{ github.event.pull_request.title }} + PR_BASE_REF: ${{ github.base_ref }} + PR_HEAD_REF: ${{ github.head_ref }} + run: python scripts/validate_release_pr.py diff --git a/.gitignore b/.gitignore index e2e1749..0d0dcdb 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,9 @@ node_modules/ pytest-cache-files-*/ pytest-tmp/ site/ +great-docs/_site/ +great-docs/.quarto/ +great-docs/**/*.quarto_ipynb venv/ *.egg-info/ *.log diff --git a/CHANGELOG.md b/CHANGELOG.md index 914a8ef..4cf0c1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,25 @@ ## Unreleased -- Added GitHub Actions to validate `staging -> main` release pull requests and - publish releases to PyPI and GitHub after merge. -- Made the release pull request title the source of truth for the next package - version, with automated version stamping and changelog promotion during the - publish workflow. -- Documented the staging-based release flow and the local release preflight - steps for contributors and maintainers. +### Added + +- Great Docs site with user guide, recipes, and API reference, published to GitHub Pages. +- Recipe generator (`scripts/generate_recipes.py`) that keeps docs examples aligned with `usage.py`. +- Documentation media capture helper for README and recipe screenshots. +- Restored GitHub Actions for docs deployment, release PR validation, and PyPI publishing. + +### Changed + +- README refreshed with docs link, badges, feature overview, and example media. +- GitHub Pages docs workflow now builds the Quarto Great Docs site instead of pdoc-only output. + +### Fixed + +- Dash template rendering for grouped hierarchy cells and expansion chevrons. +- Filter popover dismissal for MultiSelect, Select, DateInput, and Autocomplete controls. +- Array-valued cell display formatting for filter and presentation columns. +- Table min-height row stretch behavior in fixed-height layouts. +- Inline editor and filter `setProps` synchronization for Dash Mantine controls. ## 0.1.0 - 2026-04-07 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 900062d..e5d2587 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,8 +14,18 @@ npm run build:js npm run build:backends python -m pytest python usage.py +python scripts/generate_recipes.py +python scripts/build_great_docs.py +python scripts/capture_docs_media.py ``` +## Documentation + +- Public docs are built from `great-docs/` with Quarto via `python scripts/build_great_docs.py`. +- Recipe pages are generated from `usage.py` via `python scripts/generate_recipes.py`. +- Screenshots for README and recipes come from `python scripts/capture_docs_media.py` while `usage.py` is running. +- `.github/workflows/docs.yml` publishes `great-docs/_site` to GitHub Pages on every `main` push. + ## Branch workflow - Create feature branches from `staging`. diff --git a/DESCRIPTION b/DESCRIPTION index b8741ed..04ca560 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: dashMantineDatatable Title: Mantine DataTable for Dash -Version: 0.0.1 +Version: 0.1.0 Description: Dash bindings for Mantine DataTable with Dash-friendly helpers and component templates. Depends: R (>= 3.0.2) Imports: diff --git a/README.md b/README.md index 0981f0b..8cc133b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ # dash-mantine-datatable - -`dash-mantine-datatable` is a Dash wrapper around Mantine DataTable for apps -that already use `dash-mantine-components` and want a table that feels native -to the Mantine stack. It adds a Dash-friendly prop model, Mantine style props, -Dash-safe render and editor slots, and chainable Python helpers for columns, -grouping, rows, selection, pagination, sorting, and search. + +[![PyPI version](https://img.shields.io/pypi/v/dash-mantine-datatable.svg)](https://pypi.org/project/dash-mantine-datatable/) +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) +[![Documentation](https://img.shields.io/badge/docs-GitHub%20Pages-0366d6)](https://jeffgallini.github.io/dash-mantine-datatable/) +[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) + +`dash-mantine-datatable` is a Dash wrapper around [Mantine DataTable](https://github.com/icflorescu/mantine-datatable) for apps that already use `dash-mantine-components`. It adds a Dash-friendly prop model, Mantine style props, component templates for renderers/editors/filters, and chainable Python helpers for columns, grouping, rows, selection, pagination, sorting, and search. + +![Basic formatting example](great-docs/assets/examples/hero-basic-formatting.png) + +Read the full user guide and recipes on [GitHub Pages](https://jeffgallini.github.io/dash-mantine-datatable/). ## Install @@ -12,14 +17,13 @@ grouping, rows, selection, pagination, sorting, and search. pip install dash-mantine-datatable ``` -Install the optional demo dependency bundle when you want to run the live -market-data examples from `usage.py`: +Optional demo dependencies for the live gallery in `usage.py`: ```bash pip install "dash-mantine-datatable[demo]" ``` -## Quick Start +## Quick start ```python from dash import Dash @@ -47,47 +51,46 @@ if __name__ == "__main__": app.run(debug=True) ``` -## Highlights +## Features -- Mantine-flavored Dash props such as `radius`, `bg`, `classNames`, `styles`, - `bd`, and `bdrs` -- Chainable helpers including `update_layout()`, `update_table_properties()`, - `update_columns()`, `group_columns()`, `update_rows()`, - `update_selection()`, `update_pagination()`, `update_sorting()`, and - `update_search()` -- Dash-safe component templates for column renderers, editors, filters, empty - states, custom loaders, row expansion content, and sort icons -- Support for grouped headers, grouped rows, nested child rows, row dragging, - server-side pagination, server-side sorting, server-side search, and - selector-based row styling rules -- Multi-language Dash component assets for Python, R, and Julia generated from - the same source tree +- Mantine-native styling via `radius`, `bg`, `classNames`, `styles`, and related props +- Fluent helpers: `update_layout()`, `update_table_properties()`, `update_columns()`, `group_columns()`, `update_rows()`, `update_selection()`, `update_pagination()`, `update_sorting()`, and `update_search()` +- Dash component slots for renderers, editors, filters, empty states, loaders, row expansion, and sort icons +- Client and server modes for pagination, sorting, and search +- Column filtering with Dash Mantine controls in header popovers +- Grouped headers, inline row grouping, nested child rows, and row expansion +- Checkbox selection with shift-range support, row dragging, inline editing, and callback payloads for row/cell interactions +- Generated Python, R, and Julia component packages from the same source tree -## Compared With `dash-ag-grid` +## Documentation -The comparison below reflects this package's current `0.1.0` surface and the -official Dash AG Grid docs as of April 17, 2026. +| Resource | Link | +| --- | --- | +| User guide + recipes | [jeffgallini.github.io/dash-mantine-datatable](https://jeffgallini.github.io/dash-mantine-datatable/) | +| Interactive demo app | `python usage.py` | +| API reference (local pdoc) | `python scripts/build_docs.py` | -| Area | `dash-mantine-datatable` | `dash-ag-grid` | -| --- | --- | --- | -| UI fit | Best when the rest of the app is already Mantine/DMC and visual consistency matters | Best when the grid is its own major product surface and can use AG Grid's theme/system | -| Authoring model | Compact Dash API with Python helpers like `update_columns()` and `update_rows()` | Richer but more verbose grid configuration with AG Grid concepts and options | -| Styling | Mantine props, Mantine tokens, Dash components in table slots | AG Grid theme system plus extensive cell, row, header, and menu customization | -| Dash component slots | Strong support for Dash components in renderers, editors, filters, empty states, loaders, and row expansion | Strong custom rendering and editing support, with a broader grid API around it | -| Common app-table features | Sorting, search, selection, pagination, row expansion, row dragging, grouped headers, conditional row rules | All of the above plus a much broader spreadsheet-style feature set | -| Grouping and hierarchy | Inline row grouping, aggregations, grouped headers, nested child rows | Broader grouping/tree/master-detail model; some advanced features are enterprise-only | -| Large-data strategy | Client and server modes for pagination, sorting, and search; no AG Grid-style row-model surface exposed | Client-side, infinite, viewport, and server-side row models | -| Export and clipboard workflows | Not a current focus of the package surface | Mature CSV/export/clipboard workflows and more Excel-like interactions | -| Analytics features | Focused on application tables, formatting, and interaction | Pivoting, advanced aggregation, charts, sidebars, and other grid-heavy workflows; many advanced features are enterprise-only | -| Licensing story | MIT package built on the Mantine DataTable ecosystem | Core grid is free; advanced AG Grid features may require an Enterprise license | -| Best fit | Dash apps that want a polished Mantine-native table without AG Grid complexity | Data-heavy apps that need deep grid mechanics, very large-data tooling, or enterprise spreadsheet features | - -Choose `dash-mantine-datatable` when you want the table to feel like the rest -of a Mantine app and you value a smaller Dash-native API. Choose -`dash-ag-grid` when the grid itself is the power-user surface and you need row -models, export, pivoting, or other spreadsheet-grade features. - -## Helper Example +Build the public docs site locally: + +```bash +python -m pip install -e ".[demo]" +python scripts/build_great_docs.py +``` + +Regenerate recipe pages from `usage.py`: + +```bash +python scripts/generate_recipes.py +``` + +Capture README/recipe screenshots from the running demo: + +```bash +python usage.py +python scripts/capture_docs_media.py +``` + +## Helper example ```python table = ( @@ -106,23 +109,18 @@ table = ( ) ``` -## API Docs - -Build the package API docs locally with `pdoc`: - -```bash -python -m pip install -e ".[docs]" -python scripts/build_docs.py -``` - -This generates a static site in `site/`. The repository also includes -`.github/workflows/docs.yml`, which rebuilds the same docs and deploys them to -GitHub Pages whenever `main` changes. +## Compared with `dash-ag-grid` -To enable deployment on GitHub, open `Settings -> Pages` and set the publishing -source to `GitHub Actions`. +| Area | `dash-mantine-datatable` | `dash-ag-grid` | +| --- | --- | --- | +| UI fit | Best when the app is already Mantine/DMC | Best when the grid is its own major product surface | +| Authoring model | Compact Dash API with Python helpers | Richer but more verbose AG Grid configuration | +| Dash component slots | Strong support for DMC renderers, editors, filters, and states | Strong custom rendering with a broader grid API | +| Common app-table features | Sorting, search, selection, pagination, expansion, dragging, grouped headers | Same core set plus spreadsheet-style tooling | +| Large-data strategy | Client/server pagination, sorting, and search | Additional row models and enterprise features | +| Best fit | Mantine-native Dash apps that want polished tables without AG Grid complexity | Data-heavy apps that need spreadsheet-grade grid mechanics | -## Local Development +## Local development ```bash npm install --legacy-peer-deps @@ -134,6 +132,8 @@ python usage.py ## Publishing +Preflight locally: + ```powershell .\scripts\check-release.ps1 ``` @@ -142,36 +142,16 @@ python usage.py python scripts/check_release.py ``` -Use `staging` as the integration branch for contributor PRs, then open a -release PR from `staging` into `main` when you are ready to publish. The -release PR title is the source of truth for the next package version, so title -it like `v0.1.1 Release - Improved Documentation and reduced console warnings`. - -The release guard validates that: - -- the PR is `staging -> main` -- the title starts with `vX.Y.Z Release` -- the requested version is newer than the current package version - -When that release PR is merged, `.github/workflows/publish-release.yml` will: - -- stamp the requested version into `package.json`, `package-lock.json`, - `dash_mantine_datatable/package-info.json`, and `Project.toml` -- promote `## Unreleased` in `CHANGELOG.md` into `## X.Y.Z - YYYY-MM-DD` - or, if needed, create a release section from the title summary -- commit those release metadata changes back to `main` -- rebuild, test, package, upload to PyPI, and create or update a GitHub release +Release flow: -Recommended changelog flow: +1. Land changes on `staging`. +2. Open a `staging -> main` PR titled `v1.0.0 Release - Stable feature set, docs site, and bug fixes`. +3. Merge to publish to PyPI, create the GitHub release, and deploy docs to GitHub Pages. -- Keep a `## Unreleased` section at the top of `CHANGELOG.md` on `staging`. -- Add release notes there as contributors land changes. -- Let the publish workflow convert that section into the final versioned entry. +Required one-time setup: -One-time GitHub setup: +- Protect `main` and require the Release PR Guard workflow. +- Configure GitHub Pages to publish from GitHub Actions. +- Add `PYPI_API_TOKEN` to the `pypi` environment. -- Create a long-lived `staging` branch. -- Protect `main` so changes land by pull request, not direct push. -- Require the `Release PR Guard` workflow on `main`. -- Add a `PYPI_API_TOKEN` secret to the `pypi` environment used by the publish - workflow. +See [CONTRIBUTING.md](CONTRIBUTING.md) and [CHANGELOG.md](CHANGELOG.md) for details. diff --git a/dash_mantine_datatable/__init__.py b/dash_mantine_datatable/__init__.py index 85325ed..f3e7b30 100644 --- a/dash_mantine_datatable/__init__.py +++ b/dash_mantine_datatable/__init__.py @@ -91,25 +91,24 @@ "sort_icons": "sortIcons", } _EXTRA_BASE_NODES = ( - "customLoader", - "defaultColumnRender", - "emptyState", - "noRecordsIcon", + # Intentionally empty: loader/empty-state/sort-icon slots are materialized + # by DataTable from dry JSON so template cloning stays Dash-safe. ) -_EXTRA_CHILDREN_PROPS = ( - "columns[].render", - "columns[].editor", - "columns[].footer", +# Keep template slots out of `_children_props`. Dash would otherwise hydrate +# them into wrappers that cannot be safely cloned/re-rendered for templates, +# which surfaces as "undefined was not found" and blank cells. Top-level +# Component values are converted to dry JSON in DataTable.__init__ / +# _update_props so the Python API still accepts Dash components. +_EXTRA_CHILDREN_PROPS = () +_TEMPLATE_SLOT_PROPS = ( "customLoader", - "defaultColumnProps.render", - "defaultColumnProps.editor", - "defaultColumnProps.footer", "defaultColumnRender", "emptyState", "noRecordsIcon", - "sortIcons.sorted", - "sortIcons.unsorted", ) +_TEMPLATE_NESTED_SLOT_PROPS = { + "sortIcons": ("sorted", "unsorted"), +} _MERGED_MAPPING_PROPS = {"style", "styles", "classNames", "tableProps", "scrollAreaProps"} _COLUMN_MERGE_PROPS = { "cellAttributes", @@ -152,7 +151,47 @@ def _normalize_kwargs(kwargs: dict[str, Any]) -> dict[str, Any]: if canonical in normalized and canonical != key: raise TypeError(f"Received both '{canonical}' and alias '{key}'.") normalized[canonical] = value - return normalized + return _serialize_template_slots(normalized) + + +def _serialize_dash_tree(value: Any) -> Any: + """Convert Dash Component trees into dry JSON component dictionaries.""" + + if value is None: + return None + + to_plotly_json = getattr(value, "to_plotly_json", None) + if callable(to_plotly_json): + # Component.to_plotly_json() may still contain nested Component + # instances in props/children, so recurse through the result. + return _serialize_dash_tree(to_plotly_json()) + + if isinstance(value, (list, tuple)): + return [_serialize_dash_tree(item) for item in value] + + if isinstance(value, dict): + return {key: _serialize_dash_tree(item) for key, item in value.items()} + + return value + + +def _serialize_template_slots(mapping: dict[str, Any]) -> dict[str, Any]: + serialized = dict(mapping) + + for key in _TEMPLATE_SLOT_PROPS: + if key in serialized: + serialized[key] = _serialize_dash_tree(serialized[key]) + + for key, nested_keys in _TEMPLATE_NESTED_SLOT_PROPS.items(): + if key not in serialized or not isinstance(serialized[key], dict): + continue + nested = dict(serialized[key]) + for nested_key in nested_keys: + if nested_key in nested: + nested[nested_key] = _serialize_dash_tree(nested[nested_key]) + serialized[key] = nested + + return serialized def _normalize_column(column: Any) -> dict[str, Any]: diff --git a/dash_mantine_datatable/dash_mantine_datatable.min.js b/dash_mantine_datatable/dash_mantine_datatable.min.js index f821973..753c307 100644 --- a/dash_mantine_datatable/dash_mantine_datatable.min.js +++ b/dash_mantine_datatable/dash_mantine_datatable.min.js @@ -1,3 +1,3 @@ /*! For license information please see dash_mantine_datatable.min.js.LICENSE.txt */ -(()=>{"use strict";var e={677(e,t,a){a.d(t,{A:()=>l});var n=a(354),r=a.n(n),o=a(314),i=a.n(o)()(r());i.push([e.id,'@layer mantine-datatable{.mantine-datatable-nowrap{white-space:nowrap}.mantine-datatable-ellipsis{overflow:hidden;text-overflow:ellipsis}.mantine-datatable-pointer-cursor{cursor:pointer}.mantine-datatable-context-menu-cursor{cursor:context-menu}.mantine-datatable-text-selection-disabled{user-select:none}.mantine-datatable-text-align-left{text-align:left}.mantine-datatable-text-align-center{text-align:center}.mantine-datatable-text-align-right{text-align:right}.mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-light,var(--mantine-color-text)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-dark,var(--mantine-color-text)\n )}.mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-light,var(--mantine-color-body)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-dark,var(--mantine-color-body)\n )}.mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-light,var(--mantine-color-gray-3)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-dark,var(--mantine-color-dark-4)\n )}.mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-light,var(--mantine-datatable-border-color)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-dark,var(--mantine-datatable-border-color)\n )}.mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-light,var(--mantine-color-gray-0)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-dark,var(--mantine-color-dark-6)\n )}.mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-light,var(--mantine-color-gray-1)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-dark,var(--mantine-color-dark-5)\n )}.mantine-datatable{--mantine-datatable-selection-color:var(--mantine-primary-color-light);--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.05),transparent),linear-gradient(rgba(0,0,0,.05) 30%,transparent)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.25),transparent),linear-gradient(rgba(0,0,0,.25) 30%,transparent)}.mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.05),transparent),linear-gradient(270deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.25),transparent),linear-gradient(270deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.05)),linear-gradient(transparent 30%,rgba(0,0,0,.05))}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.25)),linear-gradient(transparent 30%,rgba(0,0,0,.25))}.mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.05),transparent),linear-gradient(90deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.25),transparent),linear-gradient(90deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-header-height:0;--mantine-datatable-footer-height:0;--mantine-datatable-selection-column-width:0;--mantine-datatable-top-shadow-opacity:0;--mantine-datatable-left-shadow-opacity:0;--mantine-datatable-bottom-shadow-opacity:0;--mantine-datatable-right-shadow-opacity:0;--mantine-datatable-footer-position:sticky;--mantine-datatable-footer-bottom:0;--mantine-datatable-last-row-border-bottom:unset;background:var(--mantine-datatable-background-color);color:var(--mantine-datatable-color);display:flex;flex-direction:column;overflow:hidden;position:relative}.mantine-datatable td,.mantine-datatable th{border-left:0}[dir=rtl] .mantine-datatable td,[dir=rtl] .mantine-datatable th{border-left:0;border-right:0}[dir=rtl] .mantine-datatable td:not(:first-of-type),[dir=rtl] .mantine-datatable th:not(:first-of-type){border-right:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-with-border{border:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-resizable-columns{table-layout:fixed}.mantine-datatable-resizable-columns th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mantine-datatable-pin-first-column td:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-resizable-columns th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible.mantine-datatable-resizable-columns th:nth-of-type(2),.mantine-datatable-pin-last-column td:last-of-type,.mantine-datatable-pin-last-column.mantine-datatable-resizable-columns th:last-of-type{overflow:visible}.mantine-datatable td[data-accessor=__selection__],.mantine-datatable th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable:not(.mantine-datatable-resizable-columns) th{max-width:none;min-width:auto;white-space:nowrap;width:auto}.mantine-datatable:not(.mantine-datatable-resizable-columns) td[data-accessor=__selection__],.mantine-datatable:not(.mantine-datatable-resizable-columns) th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable-table{background:var(--mantine-datatable-background-color);border-collapse:separate;border-spacing:0;color:inherit}.mantine-datatable-table td,.mantine-datatable-table th{border-color:var(--mantine-datatable-row-border-color)}.mantine-datatable-table tbody,.mantine-datatable-table td,.mantine-datatable-table tfoot,.mantine-datatable-table tfoot tr,.mantine-datatable-table th,.mantine-datatable-table thead,.mantine-datatable-table thead tr{background:inherit}.mantine-datatable-table[data-striped] tbody tr:nth-of-type(odd){background:var(--mantine-datatable-striped-color)}.mantine-datatable-table[data-highlight-on-hover] tbody tr:hover{background:var(--mantine-datatable-highlight-on-hover-color)}.mantine-datatable-table tbody tr:last-of-type{border-bottom:0}.mantine-datatable-table tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:var(--mantine-datatable-last-row-border-bottom)}.mantine-datatable-vertical-align-top td{vertical-align:top}.mantine-datatable-vertical-align-bottom td{vertical-align:bottom}.mantine-datatable-last-row-border-bottom-visible tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}}@layer mantine-datatable{.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,.mantine-datatable-pin-last-column th:last-of-type{position:sticky!important;right:calc(-.025rem*var(--mantine-scale));z-index:1;@-moz-document url-prefix(){right:0}}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type{left:calc(-.025rem*var(--mantine-scale));right:auto;@-moz-document url-prefix(){left:0}}.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,.mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-right:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);pointer-events:none;position:absolute;top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);border-right:0;left:100%;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto;z-index:2}.mantine-datatable-pin-last-column th:last-of-type:after,.mantine-datatable-pin-last-column tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):last-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tfoot th:last-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type{background:inherit}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:var(--mantine-datatable-selection-column-width);position:sticky!important;z-index:1}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:auto;right:var(--mantine-datatable-selection-column-width)}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";opacity:var(--mantine-datatable-left-shadow-opacity);pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);right:auto}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:0}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tfoot th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tfoot th:first-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type{background:inherit}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):before,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-cell-resizable:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th.mantine-datatable-header-cell-resizable:first-of-type,.mantine-datatable-pin-last-column th.mantine-datatable-header-cell-resizable:last-of-type{position:sticky!important}.mantine-datatable-empty-row,.mantine-datatable-table[data-highlight-on-hover] tbody .mantine-datatable-empty-row:hover{background:transparent}.mantine-datatable-empty-state{bottom:0;color:var(--mantine-color-gray-6);flex-direction:column;left:0;pointer-events:none;position:absolute;right:0;top:0}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state{color:var(--mantine-color-dark-3)}.mantine-datatable-empty-state{opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);transition:opacity .2s}.mantine-datatable-empty-state[data-active]{opacity:1}.mantine-datatable-empty-state-icon{background:var(--mantine-color-gray-2);border-radius:50%;font-size:0;padding:var(--mantine-spacing-xs)}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state-icon{background:var(--mantine-color-dark-5)}.mantine-datatable-empty-state-icon{margin-bottom:calc(var(--mantine-spacing-xs)/2)}.mantine-datatable-footer{bottom:var(--mantine-datatable-footer-bottom);position:var(--mantine-datatable-footer-position);z-index:2}.mantine-datatable-footer th{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-footer-selector-placeholder-cell{left:0;position:sticky;width:0}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell{left:auto;right:0}.mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-header{position:sticky;top:0;z-index:2}.mantine-datatable-header th{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-header-column-toggle-checkbox-label{user-select:none}.mantine-datatable-header-cell-sortable{cursor:pointer;transition:background .2s}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{.mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable{border-radius:calc(.375rem*var(--mantine-scale));cursor:grab;transition:all .2s}.mantine-datatable-header-cell-draggable:active{cursor:grabbing}.mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-2)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable-action-icon{cursor:inherit;margin:calc(-.125rem*var(--mantine-scale)) calc(.125rem*var(--mantine-scale)) 0}.mantine-datatable-header-cell-drag-over{background:var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-drag-over{background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-toggleable-icon{opacity:.1;transition:opacity .2s}.mantine-datatable-header-cell-toggleable:hover .mantine-datatable-header-cell-toggleable-icon{opacity:1}.mantine-datatable-header-cell-resizable{position:relative}.mantine-datatable-header-resizable-handle{background:transparent;bottom:0;cursor:col-resize;opacity:0;position:absolute;right:-6px;top:0;transition:opacity .2s;width:12px;z-index:0}.mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-gray-4);bottom:2px;content:"";left:5px;position:absolute;top:2px;width:2px}[data-mantine-color-scheme=dark] .mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-dark-4)}.mantine-datatable-header-resizable-handle:after{border-radius:1px;transition:background-color .2s}[dir=rtl] .mantine-datatable-header-resizable-handle:after{left:auto;right:5px}.mantine-datatable-header-resizable-handle:hover{opacity:1}.mantine-datatable-header-resizable-handle:hover:after{background:var(--mantine-primary-color-6)}.mantine-datatable-header-resizable-handle:active{opacity:1!important}.mantine-datatable-header-resizable-handle:active:after{background:var(--mantine-primary-color-7)}[dir=rtl] .mantine-datatable-header-resizable-handle{left:-6px;right:auto}.mantine-datatable-header-cell-toggleable.mantine-datatable-header-cell-resizable:hover .mantine-datatable-header-resizable-handle,tr:hover .mantine-datatable-header-resizable-handle{opacity:1}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){transition:background .1s}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{transition:background .1s}.mantine-datatable-header-cell-sortable-group{gap:.25em}.mantine-datatable-header-cell-sortable-text{flex-grow:1;min-width:0}.mantine-datatable-header-cell-sortable-icon{transition:transform .2s}.mantine-datatable-header-cell-sortable-icon-reversed{transform:scaleY(-1)}.mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-sortable-unsorted-icon{transition:color .2s}th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-6)}[data-mantine-color-scheme=dark] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-2)}.mantine-datatable-header-cell-filter-action-icon{border:0;color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-filter-action-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-filter-action-icon[data-active]{color:var(--mantine-color-text)}.mantine-datatable-header-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-column-group-header-cell--needs-border{border-inline-end:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-loader{background:color-mix(in srgb,var(--mantine-datatable-background-color),transparent 25%);bottom:0;left:0;opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s;z-index:3}.mantine-datatable-loader-fetching{opacity:1;pointer-events:all}.mantine-datatable-page-size-selector-button-icon{margin:0 calc(-.25rem*var(--mantine-scale)) 0 calc(.125rem*var(--mantine-scale))}[dir=rtl] .mantine-datatable-page-size-selector-button-icon{margin:0 calc(.125rem*var(--mantine-scale)) 0 calc(-.25rem*var(--mantine-scale))}.mantine-datatable-page-size-selector-menu-arrow{z-index:-1}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-page-size-selector-active{background:var(--mantine-datatable-pagination-active-background-color);color:var(--mantine-datatable-pagination-active-text-color);opacity:1}.mantine-datatable-pagination{align-items:center;background:inherit;border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color);display:flex;gap:var(--mantine-spacing-xs);justify-content:space-between}.mantine-datatable-pagination-text{flex:1 1 auto}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-pagination-pages{opacity:1;transition:opacity .2s}.mantine-datatable-pagination-pages-fetching{opacity:0}.mantine-datatable-pagination-pages-control{border-color:var(--mantine-datatable-border-color);color:var(--mantine-datatable-color)}.mantine-datatable-pagination-pages-control[data-active]{background:var(--mantine-datatable-pagination-active-background-color);border-color:transparent;color:var(--mantine-datatable-pagination-active-text-color)}.mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-dark\n )}.mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-dark\n )}.mantine-datatable-row{background:var(--mantine-datatable-row-background-color,inherit);color:var(--mantine-datatable-row-color,inherit)}.mantine-datatable-row[data-with-row-border]:not(:last-of-type) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row[data-selected] td{background:var(--mantine-datatable-selection-color)}.mantine-datatable-row-expansion-cell{padding:0}tr:not(:last-of-type) .mantine-datatable-row-expansion-cell-content{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row-expansion-cell-content{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}[data-with-row-border] .mantine-datatable-row-expansion-cell-content{border-top:0}.mantine-datatable-row-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-row-selector-cell{left:auto;right:0}tr[data-selected] .mantine-datatable-row-selector-cell{background:inherit}tr[data-selected] .mantine-datatable-row-selector-cell:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}tr[data-with-row-border] .mantine-datatable-row-selector-cell:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}tr:last-of-type .mantine-datatable-row-selector-cell:after{bottom:0}.mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-row-selector-cell-checkbox{cursor:pointer}.mantine-datatable-scroll-area{flex:1 1 100%}.mantine-datatable-scroll-area-corner{background:transparent}.mantine-datatable-scroll-area-thumb{z-index:3}.mantine-datatable-scroll-area-scrollbar[data-state=visible]{background:transparent}.mantine-datatable-scroll-area-scrollbar div:before{pointer-events:none}.mantine-datatable-scroll-area-shadow{pointer-events:none;position:absolute;transition:opacity .2s}.mantine-datatable-scroll-area-top-shadow{background:var(--mantine-datatable-shadow-background-top);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-top-shadow-opacity);right:0;top:var(--mantine-datatable-header-height);z-index:2}.mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-left);bottom:0;left:0;opacity:var(--mantine-datatable-left-shadow-opacity);top:0;width:var(--mantine-spacing-xs);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-left-shadow{left:auto}.mantine-datatable-scroll-area-right-shadow,[dir=rtl] .mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-right);opacity:var(--mantine-datatable-right-shadow-opacity);right:0}.mantine-datatable-scroll-area-right-shadow{bottom:0;top:0;width:calc(var(--mantine-spacing-xs)/2);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-right-shadow{background:var(--mantine-datatable-shadow-background-left);left:0;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto}.mantine-datatable-scroll-area-shadow-behind{z-index:0}.mantine-datatable-scroll-area-bottom-shadow{background:var(--mantine-datatable-shadow-background-bottom);bottom:var(--mantine-datatable-footer-height);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-bottom-shadow-opacity);right:0;z-index:2}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}',"",{version:3,sources:["webpack://./node_modules/mantine-datatable/dist/styles.layer.css"],names:[],mappings:"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",sourcesContent:['@layer mantine-datatable{.mantine-datatable-nowrap{white-space:nowrap}.mantine-datatable-ellipsis{overflow:hidden;text-overflow:ellipsis}.mantine-datatable-pointer-cursor{cursor:pointer}.mantine-datatable-context-menu-cursor{cursor:context-menu}.mantine-datatable-text-selection-disabled{user-select:none}.mantine-datatable-text-align-left{text-align:left}.mantine-datatable-text-align-center{text-align:center}.mantine-datatable-text-align-right{text-align:right}.mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-light,var(--mantine-color-text)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-dark,var(--mantine-color-text)\n )}.mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-light,var(--mantine-color-body)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-dark,var(--mantine-color-body)\n )}.mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-light,var(--mantine-color-gray-3)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-dark,var(--mantine-color-dark-4)\n )}.mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-light,var(--mantine-datatable-border-color)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-dark,var(--mantine-datatable-border-color)\n )}.mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-light,var(--mantine-color-gray-0)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-dark,var(--mantine-color-dark-6)\n )}.mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-light,var(--mantine-color-gray-1)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-dark,var(--mantine-color-dark-5)\n )}.mantine-datatable{--mantine-datatable-selection-color:var(--mantine-primary-color-light);--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.05),transparent),linear-gradient(rgba(0,0,0,.05) 30%,transparent)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.25),transparent),linear-gradient(rgba(0,0,0,.25) 30%,transparent)}.mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.05),transparent),linear-gradient(270deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.25),transparent),linear-gradient(270deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.05)),linear-gradient(transparent 30%,rgba(0,0,0,.05))}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.25)),linear-gradient(transparent 30%,rgba(0,0,0,.25))}.mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.05),transparent),linear-gradient(90deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.25),transparent),linear-gradient(90deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-header-height:0;--mantine-datatable-footer-height:0;--mantine-datatable-selection-column-width:0;--mantine-datatable-top-shadow-opacity:0;--mantine-datatable-left-shadow-opacity:0;--mantine-datatable-bottom-shadow-opacity:0;--mantine-datatable-right-shadow-opacity:0;--mantine-datatable-footer-position:sticky;--mantine-datatable-footer-bottom:0;--mantine-datatable-last-row-border-bottom:unset;background:var(--mantine-datatable-background-color);color:var(--mantine-datatable-color);display:flex;flex-direction:column;overflow:hidden;position:relative}.mantine-datatable td,.mantine-datatable th{border-left:0}[dir=rtl] .mantine-datatable td,[dir=rtl] .mantine-datatable th{border-left:0;border-right:0}[dir=rtl] .mantine-datatable td:not(:first-of-type),[dir=rtl] .mantine-datatable th:not(:first-of-type){border-right:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-with-border{border:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-resizable-columns{table-layout:fixed}.mantine-datatable-resizable-columns th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mantine-datatable-pin-first-column td:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-resizable-columns th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible.mantine-datatable-resizable-columns th:nth-of-type(2),.mantine-datatable-pin-last-column td:last-of-type,.mantine-datatable-pin-last-column.mantine-datatable-resizable-columns th:last-of-type{overflow:visible}.mantine-datatable td[data-accessor=__selection__],.mantine-datatable th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable:not(.mantine-datatable-resizable-columns) th{max-width:none;min-width:auto;white-space:nowrap;width:auto}.mantine-datatable:not(.mantine-datatable-resizable-columns) td[data-accessor=__selection__],.mantine-datatable:not(.mantine-datatable-resizable-columns) th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable-table{background:var(--mantine-datatable-background-color);border-collapse:separate;border-spacing:0;color:inherit}.mantine-datatable-table td,.mantine-datatable-table th{border-color:var(--mantine-datatable-row-border-color)}.mantine-datatable-table tbody,.mantine-datatable-table td,.mantine-datatable-table tfoot,.mantine-datatable-table tfoot tr,.mantine-datatable-table th,.mantine-datatable-table thead,.mantine-datatable-table thead tr{background:inherit}.mantine-datatable-table[data-striped] tbody tr:nth-of-type(odd){background:var(--mantine-datatable-striped-color)}.mantine-datatable-table[data-highlight-on-hover] tbody tr:hover{background:var(--mantine-datatable-highlight-on-hover-color)}.mantine-datatable-table tbody tr:last-of-type{border-bottom:0}.mantine-datatable-table tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:var(--mantine-datatable-last-row-border-bottom)}.mantine-datatable-vertical-align-top td{vertical-align:top}.mantine-datatable-vertical-align-bottom td{vertical-align:bottom}.mantine-datatable-last-row-border-bottom-visible tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}}@layer mantine-datatable{.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,.mantine-datatable-pin-last-column th:last-of-type{position:sticky!important;right:calc(-.025rem*var(--mantine-scale));z-index:1;@-moz-document url-prefix(){right:0}}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type{left:calc(-.025rem*var(--mantine-scale));right:auto;@-moz-document url-prefix(){left:0}}.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,.mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-right:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);pointer-events:none;position:absolute;top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);border-right:0;left:100%;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto;z-index:2}.mantine-datatable-pin-last-column th:last-of-type:after,.mantine-datatable-pin-last-column tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):last-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tfoot th:last-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type{background:inherit}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:var(--mantine-datatable-selection-column-width);position:sticky!important;z-index:1}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:auto;right:var(--mantine-datatable-selection-column-width)}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";opacity:var(--mantine-datatable-left-shadow-opacity);pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);right:auto}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:0}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tfoot th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tfoot th:first-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type{background:inherit}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):before,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-cell-resizable:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th.mantine-datatable-header-cell-resizable:first-of-type,.mantine-datatable-pin-last-column th.mantine-datatable-header-cell-resizable:last-of-type{position:sticky!important}.mantine-datatable-empty-row,.mantine-datatable-table[data-highlight-on-hover] tbody .mantine-datatable-empty-row:hover{background:transparent}.mantine-datatable-empty-state{bottom:0;color:var(--mantine-color-gray-6);flex-direction:column;left:0;pointer-events:none;position:absolute;right:0;top:0}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state{color:var(--mantine-color-dark-3)}.mantine-datatable-empty-state{opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);transition:opacity .2s}.mantine-datatable-empty-state[data-active]{opacity:1}.mantine-datatable-empty-state-icon{background:var(--mantine-color-gray-2);border-radius:50%;font-size:0;padding:var(--mantine-spacing-xs)}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state-icon{background:var(--mantine-color-dark-5)}.mantine-datatable-empty-state-icon{margin-bottom:calc(var(--mantine-spacing-xs)/2)}.mantine-datatable-footer{bottom:var(--mantine-datatable-footer-bottom);position:var(--mantine-datatable-footer-position);z-index:2}.mantine-datatable-footer th{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-footer-selector-placeholder-cell{left:0;position:sticky;width:0}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell{left:auto;right:0}.mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-header{position:sticky;top:0;z-index:2}.mantine-datatable-header th{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-header-column-toggle-checkbox-label{user-select:none}.mantine-datatable-header-cell-sortable{cursor:pointer;transition:background .2s}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{.mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable{border-radius:calc(.375rem*var(--mantine-scale));cursor:grab;transition:all .2s}.mantine-datatable-header-cell-draggable:active{cursor:grabbing}.mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-2)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable-action-icon{cursor:inherit;margin:calc(-.125rem*var(--mantine-scale)) calc(.125rem*var(--mantine-scale)) 0}.mantine-datatable-header-cell-drag-over{background:var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-drag-over{background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-toggleable-icon{opacity:.1;transition:opacity .2s}.mantine-datatable-header-cell-toggleable:hover .mantine-datatable-header-cell-toggleable-icon{opacity:1}.mantine-datatable-header-cell-resizable{position:relative}.mantine-datatable-header-resizable-handle{background:transparent;bottom:0;cursor:col-resize;opacity:0;position:absolute;right:-6px;top:0;transition:opacity .2s;width:12px;z-index:0}.mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-gray-4);bottom:2px;content:"";left:5px;position:absolute;top:2px;width:2px}[data-mantine-color-scheme=dark] .mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-dark-4)}.mantine-datatable-header-resizable-handle:after{border-radius:1px;transition:background-color .2s}[dir=rtl] .mantine-datatable-header-resizable-handle:after{left:auto;right:5px}.mantine-datatable-header-resizable-handle:hover{opacity:1}.mantine-datatable-header-resizable-handle:hover:after{background:var(--mantine-primary-color-6)}.mantine-datatable-header-resizable-handle:active{opacity:1!important}.mantine-datatable-header-resizable-handle:active:after{background:var(--mantine-primary-color-7)}[dir=rtl] .mantine-datatable-header-resizable-handle{left:-6px;right:auto}.mantine-datatable-header-cell-toggleable.mantine-datatable-header-cell-resizable:hover .mantine-datatable-header-resizable-handle,tr:hover .mantine-datatable-header-resizable-handle{opacity:1}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){transition:background .1s}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{transition:background .1s}.mantine-datatable-header-cell-sortable-group{gap:.25em}.mantine-datatable-header-cell-sortable-text{flex-grow:1;min-width:0}.mantine-datatable-header-cell-sortable-icon{transition:transform .2s}.mantine-datatable-header-cell-sortable-icon-reversed{transform:scaleY(-1)}.mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-sortable-unsorted-icon{transition:color .2s}th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-6)}[data-mantine-color-scheme=dark] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-2)}.mantine-datatable-header-cell-filter-action-icon{border:0;color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-filter-action-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-filter-action-icon[data-active]{color:var(--mantine-color-text)}.mantine-datatable-header-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-column-group-header-cell--needs-border{border-inline-end:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-loader{background:color-mix(in srgb,var(--mantine-datatable-background-color),transparent 25%);bottom:0;left:0;opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s;z-index:3}.mantine-datatable-loader-fetching{opacity:1;pointer-events:all}.mantine-datatable-page-size-selector-button-icon{margin:0 calc(-.25rem*var(--mantine-scale)) 0 calc(.125rem*var(--mantine-scale))}[dir=rtl] .mantine-datatable-page-size-selector-button-icon{margin:0 calc(.125rem*var(--mantine-scale)) 0 calc(-.25rem*var(--mantine-scale))}.mantine-datatable-page-size-selector-menu-arrow{z-index:-1}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-page-size-selector-active{background:var(--mantine-datatable-pagination-active-background-color);color:var(--mantine-datatable-pagination-active-text-color);opacity:1}.mantine-datatable-pagination{align-items:center;background:inherit;border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color);display:flex;gap:var(--mantine-spacing-xs);justify-content:space-between}.mantine-datatable-pagination-text{flex:1 1 auto}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-pagination-pages{opacity:1;transition:opacity .2s}.mantine-datatable-pagination-pages-fetching{opacity:0}.mantine-datatable-pagination-pages-control{border-color:var(--mantine-datatable-border-color);color:var(--mantine-datatable-color)}.mantine-datatable-pagination-pages-control[data-active]{background:var(--mantine-datatable-pagination-active-background-color);border-color:transparent;color:var(--mantine-datatable-pagination-active-text-color)}.mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-dark\n )}.mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-dark\n )}.mantine-datatable-row{background:var(--mantine-datatable-row-background-color,inherit);color:var(--mantine-datatable-row-color,inherit)}.mantine-datatable-row[data-with-row-border]:not(:last-of-type) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row[data-selected] td{background:var(--mantine-datatable-selection-color)}.mantine-datatable-row-expansion-cell{padding:0}tr:not(:last-of-type) .mantine-datatable-row-expansion-cell-content{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row-expansion-cell-content{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}[data-with-row-border] .mantine-datatable-row-expansion-cell-content{border-top:0}.mantine-datatable-row-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-row-selector-cell{left:auto;right:0}tr[data-selected] .mantine-datatable-row-selector-cell{background:inherit}tr[data-selected] .mantine-datatable-row-selector-cell:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}tr[data-with-row-border] .mantine-datatable-row-selector-cell:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}tr:last-of-type .mantine-datatable-row-selector-cell:after{bottom:0}.mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-row-selector-cell-checkbox{cursor:pointer}.mantine-datatable-scroll-area{flex:1 1 100%}.mantine-datatable-scroll-area-corner{background:transparent}.mantine-datatable-scroll-area-thumb{z-index:3}.mantine-datatable-scroll-area-scrollbar[data-state=visible]{background:transparent}.mantine-datatable-scroll-area-scrollbar div:before{pointer-events:none}.mantine-datatable-scroll-area-shadow{pointer-events:none;position:absolute;transition:opacity .2s}.mantine-datatable-scroll-area-top-shadow{background:var(--mantine-datatable-shadow-background-top);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-top-shadow-opacity);right:0;top:var(--mantine-datatable-header-height);z-index:2}.mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-left);bottom:0;left:0;opacity:var(--mantine-datatable-left-shadow-opacity);top:0;width:var(--mantine-spacing-xs);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-left-shadow{left:auto}.mantine-datatable-scroll-area-right-shadow,[dir=rtl] .mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-right);opacity:var(--mantine-datatable-right-shadow-opacity);right:0}.mantine-datatable-scroll-area-right-shadow{bottom:0;top:0;width:calc(var(--mantine-spacing-xs)/2);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-right-shadow{background:var(--mantine-datatable-shadow-background-left);left:0;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto}.mantine-datatable-scroll-area-shadow-behind{z-index:0}.mantine-datatable-scroll-area-bottom-shadow{background:var(--mantine-datatable-shadow-background-bottom);bottom:var(--mantine-datatable-footer-height);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-bottom-shadow-opacity);right:0;z-index:2}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}'],sourceRoot:""}]);const l=i},228(e,t,a){a.d(t,{A:()=>l});var n=a(354),r=a.n(n),o=a(314),i=a.n(o)()(r());i.push([e.id,"@layer mantine, mantine-datatable, dash-mantine-datatable;\n\n@layer dash-mantine-datatable {\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd),\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd) td {\n background: var(--mantine-datatable-striped-color);\n }\n\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover td {\n background: var(--mantine-datatable-highlight-on-hover-color);\n }\n\n .dash-mantine-datatable-striped .mantine-datatable-table tbody,\n .dash-mantine-datatable-striped .mantine-datatable-table tbody td,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody td {\n background: inherit;\n }\n\n .dash-mantine-datatable-row-drag-enabled .mantine-datatable-table tbody tr {\n transition:\n background-color 120ms ease,\n box-shadow 120ms ease,\n opacity 120ms ease;\n }\n\n .dash-mantine-datatable-row-draggable {\n cursor: grab;\n }\n\n .dash-mantine-datatable-row-draggable:active {\n cursor: grabbing;\n }\n\n .dash-mantine-datatable-row-dragging,\n .dash-mantine-datatable-row-dragging td {\n opacity: 0.75;\n }\n\n .dash-mantine-datatable-row-drag-over,\n .dash-mantine-datatable-row-drag-over td {\n background: color-mix(\n in srgb,\n var(--mantine-primary-color-1),\n var(--mantine-datatable-background-color) 35%\n );\n }\n\n .dash-mantine-datatable-row-drag-over td {\n box-shadow: inset 0 2px 0 var(--mantine-primary-color-filled);\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell {\n background: inherit;\n padding: 0;\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content {\n border-bottom: 0;\n border-top: 0;\n padding: 0;\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content > * {\n margin: 0;\n }\n\n .dash-mantine-datatable-grouped-child {\n border-radius: 0;\n box-shadow: none;\n }\n\n .dash-mantine-datatable-grouped-child,\n .dash-mantine-datatable-grouped-child .mantine-datatable,\n .dash-mantine-datatable-grouped-child .mantine-datatable-table {\n background: transparent;\n }\n\n .dash-mantine-datatable-grouped-child .mantine-datatable-table td:first-child,\n .dash-mantine-datatable-grouped-child .mantine-datatable-table th:first-child {\n border-left: 0;\n }\n\n .dash-mantine-datatable-group-cell {\n align-items: center;\n display: inline-flex;\n gap: 8px;\n min-width: 0;\n }\n\n .dash-mantine-datatable-group-cell-content {\n min-width: 0;\n }\n\n .dash-mantine-datatable-group-chevron {\n border-bottom: 1.5px solid currentColor;\n border-right: 1.5px solid currentColor;\n color: var(--mantine-color-dimmed);\n display: inline-block;\n flex: 0 0 7px;\n height: 7px;\n margin-inline-start: 1px;\n transform: rotate(-45deg);\n transform-origin: 55% 55%;\n transition: transform 120ms ease;\n width: 7px;\n }\n\n .dash-mantine-datatable-group-chevron-spacer {\n opacity: 0;\n }\n\n .dash-mantine-datatable-group-chevron-visible {\n opacity: 1;\n }\n\n .dash-mantine-datatable-group-chevron-expanded {\n transform: rotate(45deg);\n }\n\n .dash-mantine-datatable-editable-cell {\n cursor: text;\n display: inline-block;\n min-width: 100%;\n }\n\n .dash-mantine-datatable-editable-cell-active {\n outline: 2px solid color-mix(\n in srgb,\n var(--mantine-primary-color-filled),\n transparent 55%\n );\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .dash-mantine-datatable-editable-dropdown {\n min-width: 180px;\n }\n\n .dash-mantine-datatable-editable-dropdown > * {\n width: 100%;\n }\n}\n","",{version:3,sources:["webpack://./src/lib/styles/layers.css"],names:[],mappings:"AAAA,yDAAyD;;AAEzD;IACI;;QAEI,kDAAkD;IACtD;;IAEA;;QAEI,6DAA6D;IACjE;;IAEA;;;;QAII,mBAAmB;IACvB;;IAEA;QACI;;;8BAGsB;IAC1B;;IAEA;QACI,YAAY;IAChB;;IAEA;QACI,gBAAgB;IACpB;;IAEA;;QAEI,aAAa;IACjB;;IAEA;;QAEI;;;;SAIC;IACL;;IAEA;QACI,6DAA6D;IACjE;;IAEA;QACI,mBAAmB;QACnB,UAAU;IACd;;IAEA;QACI,gBAAgB;QAChB,aAAa;QACb,UAAU;IACd;;IAEA;QACI,SAAS;IACb;;IAEA;QACI,gBAAgB;QAChB,gBAAgB;IACpB;;IAEA;;;QAGI,uBAAuB;IAC3B;;IAEA;;QAEI,cAAc;IAClB;;IAEA;QACI,mBAAmB;QACnB,oBAAoB;QACpB,QAAQ;QACR,YAAY;IAChB;;IAEA;QACI,YAAY;IAChB;;IAEA;QACI,uCAAuC;QACvC,sCAAsC;QACtC,kCAAkC;QAClC,qBAAqB;QACrB,aAAa;QACb,WAAW;QACX,wBAAwB;QACxB,yBAAyB;QACzB,yBAAyB;QACzB,gCAAgC;QAChC,UAAU;IACd;;IAEA;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;;IAEA;QACI,wBAAwB;IAC5B;;IAEA;QACI,YAAY;QACZ,qBAAqB;QACrB,eAAe;IACnB;;IAEA;QACI;;;;SAIC;QACD,mBAAmB;QACnB,kBAAkB;IACtB;;IAEA;QACI,gBAAgB;IACpB;;IAEA;QACI,WAAW;IACf;AACJ",sourcesContent:["@layer mantine, mantine-datatable, dash-mantine-datatable;\n\n@layer dash-mantine-datatable {\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd),\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd) td {\n background: var(--mantine-datatable-striped-color);\n }\n\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover td {\n background: var(--mantine-datatable-highlight-on-hover-color);\n }\n\n .dash-mantine-datatable-striped .mantine-datatable-table tbody,\n .dash-mantine-datatable-striped .mantine-datatable-table tbody td,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody td {\n background: inherit;\n }\n\n .dash-mantine-datatable-row-drag-enabled .mantine-datatable-table tbody tr {\n transition:\n background-color 120ms ease,\n box-shadow 120ms ease,\n opacity 120ms ease;\n }\n\n .dash-mantine-datatable-row-draggable {\n cursor: grab;\n }\n\n .dash-mantine-datatable-row-draggable:active {\n cursor: grabbing;\n }\n\n .dash-mantine-datatable-row-dragging,\n .dash-mantine-datatable-row-dragging td {\n opacity: 0.75;\n }\n\n .dash-mantine-datatable-row-drag-over,\n .dash-mantine-datatable-row-drag-over td {\n background: color-mix(\n in srgb,\n var(--mantine-primary-color-1),\n var(--mantine-datatable-background-color) 35%\n );\n }\n\n .dash-mantine-datatable-row-drag-over td {\n box-shadow: inset 0 2px 0 var(--mantine-primary-color-filled);\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell {\n background: inherit;\n padding: 0;\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content {\n border-bottom: 0;\n border-top: 0;\n padding: 0;\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content > * {\n margin: 0;\n }\n\n .dash-mantine-datatable-grouped-child {\n border-radius: 0;\n box-shadow: none;\n }\n\n .dash-mantine-datatable-grouped-child,\n .dash-mantine-datatable-grouped-child .mantine-datatable,\n .dash-mantine-datatable-grouped-child .mantine-datatable-table {\n background: transparent;\n }\n\n .dash-mantine-datatable-grouped-child .mantine-datatable-table td:first-child,\n .dash-mantine-datatable-grouped-child .mantine-datatable-table th:first-child {\n border-left: 0;\n }\n\n .dash-mantine-datatable-group-cell {\n align-items: center;\n display: inline-flex;\n gap: 8px;\n min-width: 0;\n }\n\n .dash-mantine-datatable-group-cell-content {\n min-width: 0;\n }\n\n .dash-mantine-datatable-group-chevron {\n border-bottom: 1.5px solid currentColor;\n border-right: 1.5px solid currentColor;\n color: var(--mantine-color-dimmed);\n display: inline-block;\n flex: 0 0 7px;\n height: 7px;\n margin-inline-start: 1px;\n transform: rotate(-45deg);\n transform-origin: 55% 55%;\n transition: transform 120ms ease;\n width: 7px;\n }\n\n .dash-mantine-datatable-group-chevron-spacer {\n opacity: 0;\n }\n\n .dash-mantine-datatable-group-chevron-visible {\n opacity: 1;\n }\n\n .dash-mantine-datatable-group-chevron-expanded {\n transform: rotate(45deg);\n }\n\n .dash-mantine-datatable-editable-cell {\n cursor: text;\n display: inline-block;\n min-width: 100%;\n }\n\n .dash-mantine-datatable-editable-cell-active {\n outline: 2px solid color-mix(\n in srgb,\n var(--mantine-primary-color-filled),\n transparent 55%\n );\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .dash-mantine-datatable-editable-dropdown {\n min-width: 180px;\n }\n\n .dash-mantine-datatable-editable-dropdown > * {\n width: 100%;\n }\n}\n"],sourceRoot:""}]);const l=i},314(e){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var a="",n=void 0!==t[5];return t[4]&&(a+="@supports (".concat(t[4],") {")),t[2]&&(a+="@media ".concat(t[2]," {")),n&&(a+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),a+=e(t),n&&(a+="}"),t[2]&&(a+="}"),t[4]&&(a+="}"),a}).join("")},t.i=function(e,a,n,r,o){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(n)for(var l=0;l0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=o),a&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=a):d[2]=a),r&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=r):d[4]="".concat(r)),t.push(d))}},t}},354(e){e.exports=function(e){var t=e[1],a=e[3];if(!a)return t;if("function"==typeof btoa){var n=btoa(unescape(encodeURIComponent(JSON.stringify(a)))),r="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(n),o="/*# ".concat(r," */");return[t].concat([o]).join("\n")}return[t].join("\n")}},20(e,t,a){var n=a(609),r=Symbol.for("react.element"),o=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,l=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,c={key:!0,ref:!0,__self:!0,__source:!0};function s(e,t,a){var n,o={},s=null,d=null;for(n in void 0!==a&&(s=""+a),void 0!==t.key&&(s=""+t.key),void 0!==t.ref&&(d=t.ref),t)i.call(t,n)&&!c.hasOwnProperty(n)&&(o[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps)void 0===o[n]&&(o[n]=t[n]);return{$$typeof:r,type:e,key:s,ref:d,props:o,_owner:l.current}}t.Fragment=o,t.jsx=s,t.jsxs=s},848(e,t,a){e.exports=a(20)},72(e){var t=[];function a(e){for(var a=-1,n=0;n0?" ".concat(a.layer):""," {")),n+=a.css,r&&(n+="}"),a.media&&(n+="}"),a.supports&&(n+="}");var o=a.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,a)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113(e){e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},609(e){e.exports=window.React}},t={};function a(n){var r=t[n];if(void 0!==r)return r.exports;var o=t[n]={id:n,exports:{}};return e[n](o,o.exports,a),o.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n,r=function(){var e=document.currentScript;if(!e){for(var t=document.getElementsByTagName("script"),a=[],n=0;nIa,DataTable:()=>_a});var l=a(72),c=a.n(l),s=a(825),d=a.n(s),m=a(659),u=a.n(m),b=a(56),A=a.n(b),p=a(540),h=a.n(p),g=a(113),f=a.n(g),C=a(677),v={};v.styleTagTransform=f(),v.setAttributes=A(),v.insert=u().bind(null,"head"),v.domAPI=d(),v.insertStyleElement=h(),c()(C.A,v),C.A&&C.A.locals&&C.A.locals;var y=a(228),w={};w.styleTagTransform=f(),w.setAttributes=A(),w.insert=u().bind(null,"head"),w.domAPI=d(),w.insertStyleElement=h(),c()(y.A,w),y.A&&y.A.locals&&y.A.locals;var x=a(609),k=a.n(x);const B=window.PropTypes;var S=a.n(B);function D(e){var t,a,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var r=e.length;for(t=0;t{let{children:t,columnsOrder:a,setColumnsOrder:n,columnsToggle:r,setColumnsToggle:o,resetColumnsOrder:i,resetColumnsToggle:l,setColumnWidth:c,setMultipleColumnWidths:s,resetColumnsWidth:d}=e,[m,u]=(0,x.useState)(""),[b,A]=(0,x.useState)("");return(0,E.jsx)(T,{value:{sourceColumn:m,setSourceColumn:u,targetColumn:b,setTargetColumn:A,columnsToggle:r,setColumnsToggle:o,swapColumns:()=>{if(!(a&&n&&m&&b))return;let e=a.indexOf(m),t=a.indexOf(b);if(-1!==e&&-1!==t){let r=a.splice(e,1)[0];a.splice(t,0,r),n([...a])}},resetColumnsOrder:i,resetColumnsToggle:l,setColumnWidth:c,setMultipleColumnWidths:s,resetColumnsWidth:d},children:t})};function z(){return(0,E.jsx)("tr",{className:"mantine-datatable-empty-row",children:(0,E.jsx)("td",{})})}function R(){return(0,E.jsxs)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M12.983 8.978c3.955 -.182 7.017 -1.446 7.017 -2.978c0 -1.657 -3.582 -3 -8 -3c-1.661 0 -3.204 .19 -4.483 .515m-2.783 1.228c-.471 .382 -.734 .808 -.734 1.257c0 1.22 1.944 2.271 4.734 2.74"}),(0,E.jsx)("path",{d:"M4 6v6c0 1.657 3.582 3 8 3c.986 0 1.93 -.067 2.802 -.19m3.187 -.82c1.251 -.53 2.011 -1.228 2.011 -1.99v-6"}),(0,E.jsx)("path",{d:"M4 12v6c0 1.657 3.582 3 8 3c3.217 0 5.991 -.712 7.261 -1.74m.739 -3.26v-4"}),(0,E.jsx)("path",{d:"M3 3l18 18"})]})}function M({icon:e,text:t,active:a,children:n}){return(0,E.jsx)(O.Center,{className:"mantine-datatable-empty-state","data-active":a||void 0,children:n||(0,E.jsxs)(E.Fragment,{children:[e||(0,E.jsx)("div",{className:"mantine-datatable-empty-state-icon",children:(0,E.jsx)(R,{})}),(0,E.jsx)(O.Text,{component:"div",size:"sm",c:"dimmed",children:t})]})})}var N=({key:e,columns:t=[],getInitialValueInEffect:a=!0,headerRef:n,scrollViewportRef:r,onFixedLayoutChange:o})=>{let{columnsOrder:i,setColumnsOrder:l,resetColumnsOrder:c}=function({key:e,columns:t=[],getInitialValueInEffect:a=!0}){let n=t&&t.map(e=>e.accessor)||[],[r,o]=(0,P.useLocalStorage)({key:e?`${e}-columns-order`:"",defaultValue:e?n:void 0,getInitialValueInEffect:a});function i(t){e&&o(t)}let l=()=>{i(n)};if(!e)return{columnsOrder:r,setColumnsOrder:i,resetColumnsOrder:l};let c=function(e,t){let a=[];return e.forEach(e=>{t.find(t=>t.accessor===e)&&a.push(e)}),t.forEach(e=>{a.includes(e.accessor)||a.push(e.accessor)}),a}(r,t),s=JSON.stringify(r);return JSON.stringify(c)!==s&&i(c),{columnsOrder:c,setColumnsOrder:i,resetColumnsOrder:l}}({key:e,columns:t,getInitialValueInEffect:a}),{columnsToggle:s,setColumnsToggle:d,resetColumnsToggle:m}=function({key:e,columns:t=[],getInitialValueInEffect:a=!0}){let n=t&&t.map(e=>({accessor:e.accessor,defaultToggle:e.defaultToggle||!0,toggleable:e.toggleable,toggled:void 0===e.defaultToggle||e.defaultToggle})),[r,o]=(0,P.useLocalStorage)({key:e?`${e}-columns-toggle`:"",defaultValue:e?n:void 0,getInitialValueInEffect:a});function i(t){e&&o(t)}let l=()=>{i(n)};if(!e)return{columnsToggle:r,setColumnsToggle:i,resetColumnsToggle:l};let c=function(e,t){let a=[];return e.forEach(e=>{t.find(t=>t.accessor===e.accessor)&&a.push(e)}),t.forEach(e=>{a.find(t=>t.accessor===e.accessor)||a.push({accessor:e.accessor,defaultToggle:e.defaultToggle||!0,toggleable:e.toggleable,toggled:void 0===e.defaultToggle||e.defaultToggle})}),a}(r,t),s=JSON.stringify(r);return JSON.stringify(c)!==s&&i(c),{columnsToggle:c,setColumnsToggle:i,resetColumnsToggle:l}}({key:e,columns:t,getInitialValueInEffect:a}),{columnsWidth:u,setColumnsWidth:b,setColumnWidth:A,setMultipleColumnWidths:p,resetColumnsWidth:h,hasResizableColumns:g,allResizableWidthsInitial:f,measureAndSetColumnWidths:C}=function({key:e,columns:t=[],getInitialValueInEffect:a=!0,headerRef:n,onFixedLayoutChange:r}){let o=(0,x.useRef)(!1),i=(0,x.useRef)({}),[l,c]=(0,x.useState)(!0),s=(0,x.useMemo)(()=>t.some(e=>e.resizable&&!e.hidden&&"__selection__"!==e.accessor),[t]),d=(0,x.useMemo)(()=>t.filter(e=>e.resizable&&!e.hidden&&"__selection__"!==e.accessor),[t]),m=(0,x.useMemo)(()=>d.some(e=>void 0===e.width||""===e.width||"initial"===e.width),[d]),u=(0,x.useCallback)(()=>t.filter(e=>"__selection__"!==e.accessor).map(e=>({[e.accessor]:e.width??"auto"})),[t]),[b,A]=(0,P.useLocalStorage)({key:e?`${e}-columns-width`:"",defaultValue:e?u():void 0,getInitialValueInEffect:!1}),[p,h]=(0,x.useState)(()=>u());(0,x.useEffect)(()=>{c(!1)},[]);let g=(0,x.useCallback)(()=>{if(!n?.current||l)return{};let e=n.current,t=Array.from(e.querySelectorAll("th[data-accessor]")),a={};return t.forEach(e=>{let t=e.getAttribute("data-accessor");if(!t||"__selection__"===t)return;let n=d.find(e=>e.accessor===t);if(n&&(void 0===n.width||""===n.width||"initial"===n.width)){let n=e.getBoundingClientRect();a[t]=Math.round(n.width)}}),a},[n,d,l]),f=(0,x.useCallback)(t=>{let a=t.filter(e=>"__selection__"!==e.accessor),n=p.map(e=>{let t=Object.keys(e)[0],n=a.find(e=>e.accessor===t);return n?{[t]:n.width}:e});h(n),e&&A(n)},[p,e,A]),C=(0,x.useCallback)(e=>{f(e)},[f]),v=(0,x.useCallback)(()=>{if(n?.current&&r&&!l)if(m)r(!1),requestAnimationFrame(()=>{requestAnimationFrame(()=>{let e=g();i.current={...i.current,...e};let a=t.filter(e=>"__selection__"!==e.accessor).map(t=>{let a=t.accessor,n=b?.find(e=>Object.keys(e)[0]===a);if(n&&"auto"!==n[a])return{[a]:n[a]};let r=e[a];return r?{[a]:`${r}px`}:{[a]:t.width??"auto"}});h(a),setTimeout(()=>{r(!0),o.current=!0},10)})});else{let e=t.filter(e=>"__selection__"!==e.accessor).map(e=>({[e.accessor]:e.width??"auto"}));h(e),r(!0),o.current=!0}},[n,r,l,m,g,t,b]),y=v;(0,x.useEffect)(()=>{if(!s||!r||l)return void r?.(!1);o.current=!1;let e=setTimeout(()=>{v()},50);return()=>clearTimeout(e)},[s,r,l,v]),(0,x.useEffect)(()=>{l||!e||!a||b&&b.length>0&&h(b)},[l,e,a,b]);let w=(0,x.useCallback)(()=>{e&&A(u()),i.current={},o.current=!1,r&&(r(!1),setTimeout(()=>{v()},10))},[e,A,u,r,v]),k=(0,x.useCallback)((e,t)=>{f([{accessor:e,width:t}])},[f]),B=(0,x.useMemo)(()=>!!s&&p.filter(e=>{let t=Object.keys(e)[0];return d.some(e=>e.accessor===t)}).every(e=>{let t=Object.values(e)[0];return"auto"===t||"initial"===t}),[s,p,d]);return{columnsWidth:p,setColumnsWidth:f,setColumnWidth:k,setMultipleColumnWidths:C,resetColumnsWidth:w,hasResizableColumns:s,allResizableWidthsInitial:B,measureAndSetColumnWidths:y}}({key:e,columns:t,getInitialValueInEffect:a,headerRef:n,scrollViewportRef:r,onFixedLayoutChange:o});return{effectiveColumns:(0,x.useMemo)(()=>i?i.map(e=>t.find(t=>t.accessor===e)).map(e=>({...e,hidden:e?.hidden||!s.find(t=>t.accessor===e?.accessor)?.toggled})).map(e=>"__selection__"===e?.accessor?e:{...e,width:u.find(t=>t[e?.accessor])?.[e?.accessor]}):t,[t,i,s,u]),setColumnsOrder:l,columnsOrder:i,resetColumnsOrder:c,columnsToggle:s,setColumnsToggle:d,resetColumnsToggle:m,columnsWidth:u,setColumnsWidth:b,setColumnWidth:A,setMultipleColumnWidths:p,resetColumnsWidth:h,hasResizableColumns:g,allResizableWidthsInitial:f,measureAndSetColumnWidths:C}},W=typeof window<"u"?x.useLayoutEffect:x.useEffect;function L(e){let t=(0,x.useRef)(e);return t.current=e,t}var F="--mantine-datatable-header-height",V="--mantine-datatable-footer-height",Q="--mantine-datatable-selection-column-width",U="--mantine-datatable-last-row-border-bottom";function G(e,t,a){e?.style.setProperty(t,a)}function q(e){let t=e.borderBoxSize?.[0]||e.contentBoxSize?.[0];return t?{width:t.inlineSize,height:t.blockSize}:{width:e.contentRect.width,height:e.contentRect.height}}function H(e,t,a){if(e){let n=new ResizeObserver(e=>{let a=e[0];a&&t(q(a))});return n.observe(e),()=>{n.disconnect(),a()}}}function K(e,t,{getInitialValueInEffect:a}={getInitialValueInEffect:!0}){let[n,r]=(0,x.useState)(a?t:function(e,t){return t||(typeof window<"u"&&"matchMedia"in window?e.map(e=>window.matchMedia(e).matches):e.map(()=>!1))}(e,t)),o=(0,x.useRef)(null);return(0,x.useEffect)(()=>{if("matchMedia"in window)return o.current=e.map(e=>window.matchMedia(e)),r(o.current.map(e=>e.matches)),function(e){let t=()=>{var t;t=e.map(e=>e.matches),r(t)},a=e.map(e=>{try{return e.addEventListener("change",t),()=>e.removeEventListener("change",t)}catch{return e.addListener(t),()=>e.removeListener(t)}});return()=>{a.forEach(e=>e())}}(o.current)},[e]),n}function $(e){let t=(0,O.useMantineTheme)(),a="function"==typeof e?e(t):e;return(0,P.useMediaQuery)(a||"",!0)}function J(e){let t=e.replace(/([a-z\d])([A-Z]+)/g,"$1 $2").replace(/\W|_/g," ").trim().toLowerCase();return`${t.charAt(0).toUpperCase()}${t.slice(1)}`}function Y(e,t){return e.filter((e,a,n)=>a===n.findIndex(a=>t(e)===t(a)))}function X(e,t){return t?t.match(/([^[.\]])+/g).reduce((e,t)=>e&&e[t],e):void 0}function Z(e,t){return"string"==typeof t?X(e,t):t(e)}function ee(e){return e&&0!==e.length?Math.max(...e.map(e=>e.groups&&e.groups.length>0?1+ee(e.groups):1)):0}function te(e){let t=[];for(let a of e)a.columns&&a.columns.length>0?t.push(...a.columns.filter(e=>null!=e)):a.groups&&a.groups.length>0&&t.push(...te(a.groups));return t.filter(e=>null!=e)}function ae(e,t){return e.columns&&e.columns.length>0?e.columns.filter((e,a)=>!(e.hidden||t&&!1===t[a])).length:e.groups&&e.groups.length>0?e.groups.reduce((e,a)=>e+ae(a,t),0):0}function ne(e,t,a=0){if(a===t)return[...e];let n=[];for(let r of e)r.groups&&r.groups.length>0&&n.push(...ne(r.groups,t,a+1));return n}var re="mantine-datatable-nowrap",oe="mantine-datatable-ellipsis",ie="mantine-datatable-pointer-cursor",le="mantine-datatable-context-menu-cursor",ce="mantine-datatable-text-selection-disabled",se="mantine-datatable-text-align-left",de="mantine-datatable-text-align-center",me="mantine-datatable-text-align-right";function ue({className:e,style:t,visibleMediaQuery:a,title:n,noWrap:r,ellipsis:o,textAlign:i,width:l}){return $(a)?(0,E.jsx)(O.TableTh,{className:j({[re]:r||o,[oe]:o,[se]:"left"===i,[de]:"center"===i,[me]:"right"===i},e),style:[{width:l,minWidth:l,maxWidth:l},t],children:n}):null}function be({shadowVisible:e}){return(0,E.jsx)(O.TableTh,{className:"mantine-datatable-footer-selector-placeholder-cell","data-shadow-visible":e||void 0})}function Ae({className:e,style:t,columns:a,defaultColumnProps:n,selectionVisible:r,selectorCellShadowVisible:o,ref:i}){return(0,E.jsx)(O.TableTfoot,{ref:i,className:j("mantine-datatable-footer",e),style:t,children:(0,E.jsxs)(O.TableTr,{children:[r&&(0,E.jsx)(be,{shadowVisible:o}),a.map(({hidden:e,...t})=>{if(e)return null;let{accessor:a,visibleMediaQuery:r,textAlign:o,width:i,footer:l,footerClassName:c,footerStyle:s,noWrap:d,ellipsis:m}={...n,...t};return(0,E.jsx)(ue,{className:c,style:s,visibleMediaQuery:r,textAlign:o,width:i,title:l,noWrap:d,ellipsis:m},a)})]})})}function pe({group:{id:e,columns:t,groups:a,title:n,textAlign:r,className:o,style:i},maxDepth:l,currentDepth:c,previousGroups:s,isLastGroup:d,withColumnBorders:m=!1,totalTableColumns:u}){let b=(0,x.useMemo)(()=>t&&t.length>0?t:a&&a.length>0?te([{id:e,columns:t,groups:a}]):[],[t,a,e]),A=function(e){let t=(0,O.useMantineTheme)();return K((0,x.useMemo)(()=>e.map(e=>("function"==typeof e?e(t):e)??""),[e,t]),(0,x.useMemo)(()=>e.map(()=>!0),[e]))}((0,x.useMemo)(()=>b.map(({visibleMediaQuery:e})=>e),[b])),p=(0,x.useMemo)(()=>ae({id:e,columns:t,groups:a},A),[e,t,a,A]),h=(0,x.useMemo)(()=>s.reduce((e,t)=>e+ae(t,A),0),[s,A]),g=a&&a.length>0?1:l-c,f=function(e,t,a){return!!a&&(!e||t)}(d,h+p0?(0,E.jsx)(O.TableTh,{colSpan:p,rowSpan:g>1?g:void 0,className:j("mantine-datatable-column-group-header-cell",{[se]:"left"===r,[de]:"center"===r,[me]:"right"===r,"mantine-datatable-column-group-header-cell--needs-border":f},o),style:i,children:n??J(e)}):null}function he(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z"})]})}function ge(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M20 3h-16a1 1 0 0 0 -1 1v2.227l.008 .223a3 3 0 0 0 .772 1.795l4.22 4.641v8.114a1 1 0 0 0 1.316 .949l6 -2l.108 -.043a1 1 0 0 0 .576 -.906v-6.586l4.121 -4.12a3 3 0 0 0 .879 -2.123v-2.171a1 1 0 0 0 -1 -1z",strokeWidth:"0",fill:"currentColor"})]})}function fe({children:e,isActive:t,filterPopoverProps:a,filterPopoverDisableClickOutside:n}){let[r,{close:o,toggle:i}]=(0,P.useDisclosure)(!1),l=t?ge:he,c=(0,P.useClickOutside)(o);return n&&(c=void 0),(0,E.jsxs)(O.Popover,{withArrow:!0,shadow:"md",opened:r,onClose:o,trapFocus:!0,...a,children:[(0,E.jsx)(O.PopoverTarget,{children:(0,E.jsx)(O.ActionIcon,{className:"mantine-datatable-header-cell-filter-action-icon","data-active":t||void 0,size:"sm",variant:"default",onClick:e=>{e.preventDefault(),i()},onKeyDown:e=>e.stopPropagation(),children:(0,E.jsx)(l,{})})}),(0,E.jsx)(O.PopoverDropdown,{ref:c,onClick:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),children:"function"==typeof e?e({close:o}):e})]})}var Ce=e=>{let{accessor:t,columnRef:a}=e,[n,r]=(0,x.useState)(!1),o=(0,x.useRef)(0),i=(0,x.useRef)({current:0,next:0}),{dir:l}=(0,O.useDirection)(),c="rtl"===l,{setMultipleColumnWidths:s}=_(),d=(0,x.useCallback)(e=>{if(e.preventDefault(),e.stopPropagation(),!a.current)return;let n=a.current,l=n.nextElementSibling;for(;l;){let e=l.getAttribute("data-accessor");if(e&&"__selection__"!==e)break;l=l.nextElementSibling}if(!l)return;let d=l.getAttribute("data-accessor");if(!d)return;let m="__selection__"===d;r(!0),o.current=e.clientX;let u=n.offsetWidth,b=l.offsetWidth;i.current={current:u,next:b};let A=e=>{if(!a.current)return;let t=a.current,n=t.nextElementSibling;if(!n)return;let r=e.clientX-o.current;c&&(r=-r);let l=i.current.current-50,s=i.current.next-50,d=Math.max(-l,Math.min(r,s)),m=i.current.current+d,u=i.current.next-d;t.style.width=`${m}px`,n.style.width=`${u}px`,t.style.minWidth=`${m}px`,t.style.maxWidth=`${m}px`,n.style.minWidth=`${u}px`,n.style.maxWidth=`${u}px`},p=()=>{if(!a.current)return;let e=a.current,n=e.nextElementSibling;r(!1),document.body.style.cursor="initial",document.body.style.userSelect="initial";let o=parseInt(e.style.width)||e.offsetWidth,i=n?parseInt(n.style.width)||n.offsetWidth:0,l=[{accessor:t,width:`${o}px`}];if(n&&!m){let e=n.getAttribute("data-accessor");e&&l.push({accessor:e,width:`${i}px`})}setTimeout(()=>{s(l)},0),document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",p)};document.body.style.cursor="col-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",A),document.addEventListener("mouseup",p)},[t,a,c,s]),m=(0,x.useCallback)(()=>{if(!a.current)return;let e=a.current,n=e.nextElementSibling;e.style.width="",e.style.minWidth="",e.style.maxWidth="";let r=[{accessor:t,width:"auto"}];if(n){n.style.width="",n.style.minWidth="",n.style.maxWidth="";let e=n.getAttribute("data-accessor");e&&"__selection__"!==e&&r.push({accessor:e,width:"auto"})}setTimeout(()=>{s(r)},0)},[t,a,s]);return(0,E.jsx)("div",{className:"mantine-datatable-header-resizable-handle",style:{cursor:n?"col-resize":void 0},onMouseDown:d,onDoubleClick:m,onClick:e=>e.stopPropagation(),title:"Drag to resize column, double-click to reset"})};function ve(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M12 5l0 14"}),(0,E.jsx)("path",{d:"M16 9l-4 -4"}),(0,E.jsx)("path",{d:"M8 9l4 -4"})]})}function ye(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M8 7l4 -4l4 4"}),(0,E.jsx)("path",{d:"M8 17l4 4l4 -4"}),(0,E.jsx)("path",{d:"M12 3l0 18"})]})}function we(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M9 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M9 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M9 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M15 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M15 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M15 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"})]})}function xe(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M18 6l-12 12"}),(0,E.jsx)("path",{d:"M6 6l12 12"})]})}function ke({className:e,style:t,accessor:a,visibleMediaQuery:n,title:r,sortable:o,draggable:i,toggleable:l,resizable:c,sortIcons:s,textAlign:d,width:m,sortStatus:u,onSortStatusChange:b,filter:A,filterPopoverProps:p,filterPopoverDisableClickOutside:h,filtering:g,sortKey:f}){let{setSourceColumn:C,setTargetColumn:v,swapColumns:y,setColumnsToggle:w}=_(),[k,B]=(0,x.useState)(!1),S=(0,x.useRef)(null);if(!$(n))return null;let D=r??J(a),P="string"==typeof D?D:void 0,T=o&&b?e=>{e?.defaultPrevented||b({sortKey:f,columnAccessor:a,direction:u?.columnAccessor===a?"asc"===u.direction?"desc":"asc":u?.direction??"asc"})}:void 0;return(0,E.jsxs)(O.TableTh,{"data-accessor":a,className:j({"mantine-datatable-header-cell-sortable":o,"mantine-datatable-header-cell-toggleable":l,"mantine-datatable-header-cell-resizable":c},e),style:[{width:m,...c?{}:{minWidth:m,maxWidth:m}},t],role:o?"button":void 0,tabIndex:o?0:void 0,onClick:T,onKeyDown:e=>"Enter"===e.key&&T?.(),ref:S,children:[(0,E.jsxs)(O.Group,{className:"mantine-datatable-header-cell-sortable-group",justify:"space-between",wrap:"nowrap",children:[(0,E.jsxs)(O.Flex,{align:"center",w:"100%",className:j({"mantine-datatable-header-cell-draggable":i,"mantine-datatable-header-cell-drag-over":k}),draggable:i,onDragStart:i?e=>{e.stopPropagation(),C(a),B(!1)}:void 0,onDragEnter:i?()=>{B(!0)}:void 0,onDragOver:i?e=>{e.preventDefault(),v(a),B(!0)}:void 0,onDrop:i?()=>{v(a),B(!1),y()}:void 0,onDragLeave:i?()=>{B(!1)}:void 0,children:[i?(0,E.jsx)(O.Center,{role:"img","aria-label":"Drag column",children:(0,E.jsx)(O.ActionIcon,{className:"mantine-datatable-header-cell-draggable-action-icon",variant:"subtle",size:"xs",onClick:e=>{e.stopPropagation()},children:(0,E.jsx)(we,{})})}):null,(0,E.jsx)(O.Box,{className:j("mantine-datatable-header-cell-sortable-text",{[se]:"left"===d,[de]:"center"===d,[me]:"right"===d},re,oe),title:P,children:D})]}),l?(0,E.jsx)(O.Center,{className:"mantine-datatable-header-cell-toggleable-icon",role:"img","aria-label":"Toggle column",children:(0,E.jsx)(O.ActionIcon,{size:"xs",variant:"light",onClick:e=>{e.stopPropagation(),w(e=>e.map(e=>e.accessor===a?{...e,toggled:!1}:e))},children:(0,E.jsx)(xe,{})})}):null,o||u?.columnAccessor===a?(0,E.jsx)(E.Fragment,{children:u?.columnAccessor===a?(0,E.jsx)(O.Center,{className:j("mantine-datatable-header-cell-sortable-icon",{"mantine-datatable-header-cell-sortable-icon-reversed":"desc"===u.direction}),role:"img","aria-label":"Sorted "+("desc"===u.direction?"descending":"ascending"),children:s?.sorted||(0,E.jsx)(ve,{})}):(0,E.jsx)(O.Center,{className:"mantine-datatable-header-cell-sortable-unsorted-icon",role:"img","aria-label":"Not sorted",children:s?.unsorted||(0,E.jsx)(ye,{})})}):null,A?(0,E.jsx)(fe,{filterPopoverProps:p,isActive:!!g,filterPopoverDisableClickOutside:h,children:A}):null]}),c&&"__selection__"!==a?(0,E.jsx)(Ce,{accessor:a,columnRef:S}):null]})}function Be({className:e,style:t,trigger:a,shadowVisible:n,checked:r,indeterminate:o,checkboxProps:i,onChange:l,rowSpan:c,ref:s}){let d=!i.disabled;return(0,E.jsx)(O.TableTh,{ref:s,className:j("mantine-datatable-header-selector-cell",{[ie]:"cell"===a&&d},e),style:t,rowSpan:c,"data-shadow-visible":n||void 0,"data-accessor":"__selection__",onClick:"cell"===a&&d?l:void 0,children:(0,E.jsx)(O.Checkbox,{classNames:d?{input:ie}:void 0,checked:r,indeterminate:o,onChange:l,...i,disabled:!(l||i.onChange)||i.disabled})})}function Se({selectionColumnHeaderRef:e,className:t,style:a,sortStatus:n,sortIcons:r,onSortStatusChange:o,columns:i,defaultColumnProps:l,groups:c,selectionTrigger:s,selectionVisible:d,selectionChecked:m,selectionIndeterminate:u,onSelectionChange:b,selectionCheckboxProps:A,selectorCellShadowVisible:p,selectionColumnClassName:h,selectionColumnStyle:g,withColumnBorders:f=!1,ref:C}){let v=c?ee(c):0,y=v>0?v+1:1,w=d?(0,E.jsx)(Be,{ref:e,className:h,style:g,trigger:s,shadowVisible:p,checked:m,indeterminate:u,checkboxProps:A,onChange:b,rowSpan:c?y:void 0}):null,{columnsToggle:k,setColumnsToggle:B}=_(),[S,D]=(0,x.useState)(!1),P=i.some(e=>e.toggleable),T=P?Object.fromEntries(i.map(({accessor:e,title:t})=>[e,t??J(String(e))])):void 0,I=(0,E.jsxs)(O.TableThead,{className:j("mantine-datatable-header",t),style:a,ref:C,onContextMenu:P?e=>{e.preventDefault(),D(e=>!e)}:void 0,children:[c&&Array.from({length:v},(e,t)=>{let a=ne(c,t);return(0,E.jsxs)(O.TableTr,{children:[0===t&&w,a.map((e,n)=>(0,E.jsx)(pe,{group:e,maxDepth:v,currentDepth:t,previousGroups:a.slice(0,n),isLastGroup:n===a.length-1,withColumnBorders:f,totalTableColumns:i.length},e.id))]},`group-depth-${t}`)}),(0,E.jsxs)(O.TableTr,{children:[!c&&w,i.map(({hidden:e,...t},a)=>{if(e)return null;let{accessor:c,visibleMediaQuery:s,textAlign:d,width:m,title:u,sortable:b,draggable:A,toggleable:p,resizable:h,titleClassName:g,titleStyle:f,filter:C,filterPopoverProps:v,filterPopoverDisableClickOutside:y,filtering:w,sortKey:x}={...l,...t};return(0,E.jsx)(ke,{accessor:c,className:g,style:f,visibleMediaQuery:s,textAlign:d,width:m,title:u,sortable:b,draggable:A,toggleable:p,resizable:h&&ae.toggleable).map(e=>(0,E.jsx)(O.Group,{children:(0,E.jsx)(O.Checkbox,{classNames:{label:"mantine-datatable-header-column-toggle-checkbox-label"},size:"xs",label:T[e.accessor],checked:e.toggled,onChange:t=>{B(k.map(a=>a.accessor===e.accessor?{...a,toggled:t.currentTarget.checked}:a))}})},e.accessor))})})]}):I}function De({fetching:e,customContent:t,backgroundBlur:a,size:n,type:r,color:o}){return(0,E.jsx)(O.Center,{className:j("mantine-datatable-loader",{"mantine-datatable-loader-fetching":e}),style:[{backdropFilter:a?`blur(${a}px)`:void 0}],children:e&&(t||(0,E.jsx)(O.Loader,{size:n,type:r,color:o}))})}function je(e,t,a){return e?(0,O.parseThemeColor)({color:"object"==typeof e?e[a]:e,theme:t}).value:void 0}function Oe({theme:e,c:t,backgroundColor:a,borderColor:n,rowBorderColor:r,stripedColor:o,highlightOnHoverColor:i}){return{"--mantine-datatable-color-light":je(t,e,"light"),"--mantine-datatable-color-dark":je(t,e,"dark"),"--mantine-datatable-background-color-light":je(a,e,"light"),"--mantine-datatable-background-color-dark":je(a,e,"dark"),"--mantine-datatable-border-color-light":je(n,e,"light"),"--mantine-datatable-border-color-dark":je(n,e,"dark"),"--mantine-datatable-row-border-color-light":je(r,e,"light"),"--mantine-datatable-row-border-color-dark":je(r,e,"dark"),"--mantine-datatable-striped-color-light":je(o,e,"light"),"--mantine-datatable-striped-color-dark":je(o,e,"dark"),"--mantine-datatable-highlight-on-hover-color-light":je(i,e,"light"),"--mantine-datatable-highlight-on-hover-color-dark":je(i,e,"dark")}}function Pe({theme:e,paginationActiveTextColor:t,paginationActiveBackgroundColor:a}){return{"--mantine-datatable-pagination-active-text-color-light":je(t,e,"light"),"--mantine-datatable-pagination-active-text-color-dark":je(t,e,"dark"),"--mantine-datatable-pagination-active-background-color-light":je(a,e,"light"),"--mantine-datatable-pagination-active-background-color-dark":je(a,e,"dark")}}function Ee(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M8 9l4 -4l4 4"}),(0,E.jsx)("path",{d:"M16 15l-4 4l-4 -4"})]})}var Te={xs:(0,O.rem)(22),sm:(0,O.rem)(26),md:(0,O.rem)(32),lg:(0,O.rem)(38),xl:(0,O.rem)(44)};function _e({size:e,label:t,values:a,value:n,activeTextColor:r,activeBackgroundColor:o,onChange:i}){return(0,E.jsxs)(O.Group,{gap:"xs",children:[(0,E.jsx)(O.Text,{component:"div",size:e,children:t}),(0,E.jsxs)(O.Menu,{withinPortal:!0,withArrow:!0,offset:2,classNames:{arrow:"mantine-datatable-page-size-selector-menu-arrow"},children:[(0,E.jsx)(O.MenuTarget,{children:(0,E.jsx)(O.Button,{size:e,variant:"default",classNames:{section:"mantine-datatable-page-size-selector-button-icon"},rightSection:(0,E.jsx)(Ee,{}),style:[{fontWeight:"normal"},t=>({height:Te[e],paddingLeft:t.spacing[e],paddingRight:t.spacing[e]})],children:n})}),(0,E.jsx)(O.MenuDropdown,{children:a.map(t=>{let a=t===n;return(0,E.jsx)(O.MenuItem,{className:j({"mantine-datatable-page-size-selector-active":a}),style:[{height:Te[e]},a&&(r||o)?e=>Pe({theme:e,paginationActiveTextColor:r,paginationActiveBackgroundColor:o}):void 0],disabled:a,onClick:()=>i(t),children:(0,E.jsx)(O.Text,{component:"div",size:e,children:t})},t)})})]})]})}function Ie({className:e,style:t,fetching:a,page:n,onPageChange:r,paginationWithEdges:o,paginationWithControls:i,paginationActiveTextColor:l,paginationActiveBackgroundColor:c,paginationSize:s,loadingText:d,noRecordsText:m,paginationText:u,totalRecords:b,recordsPerPage:A,onRecordsPerPageChange:p,recordsPerPageLabel:h,recordsPerPageOptions:g,recordsLength:f,horizontalSpacing:C,paginationWrapBreakpoint:v,getPaginationControlProps:y,getPaginationItemProps:w,renderPagination:x}){let k;if(b){let e=(n-1)*A+1;k=u({from:e,to:e+(f||0)-1,totalRecords:b})}else k=a?d:m;let B=b&&A?Math.max(1,Math.ceil(b/A)):1,S=b?(n-1)*(A??0)+1:void 0,D=b?(S??1)+(f??0)-1:void 0,P=!$(({breakpoints:e})=>`(min-width: ${"number"==typeof v?`${(0,O.rem)(v)}rem`:e[v]||v})`),T={Text:e=>(0,E.jsx)(O.Text,{component:"div",className:"mantine-datatable-pagination-text",size:s,...e,children:k}),PageSizeSelector:e=>g?(0,E.jsx)(_e,{activeTextColor:l,activeBackgroundColor:c,size:s,label:h,values:g,value:A,onChange:p,...e}):(0,E.jsx)(E.Fragment,{}),Pagination:e=>(0,E.jsx)(O.Pagination,{classNames:{root:j("mantine-datatable-pagination-pages",{"mantine-datatable-pagination-pages-fetching":a||!f}),control:"mantine-datatable-pagination-pages-control"},style:l||c?e=>Pe({theme:e,paginationActiveTextColor:l,paginationActiveBackgroundColor:c}):void 0,withEdges:o,withControls:i,value:n,onChange:r,size:s,total:B,getControlProps:y,getItemProps:w,...e})},_={state:{paginationSize:s,page:n,totalPages:B,totalRecords:b,recordsPerPage:A,recordsLength:f,fetching:a,from:S,to:D,isWrapped:P},actions:{setPage:e=>r?.(e),setRecordsPerPage:p?e=>p(e):void 0},Controls:T};return(0,E.jsx)(O.Box,{px:C??"xs",py:"xs",className:j("mantine-datatable-pagination",e),style:[{flexDirection:P?"column":"row"},t],children:"function"==typeof x?x(_):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(T.Text,{}),(0,E.jsx)(T.PageSizeSelector,{}),(0,E.jsx)(T.Pagination,{})]})})}function ze({className:e,style:t,visibleMediaQuery:a,record:n,index:r,onClick:o,onDoubleClick:i,onContextMenu:l,noWrap:c,ellipsis:s,textAlign:d,width:m,accessor:u,render:b,defaultRender:A,customCellAttributes:p}){return $(a)?(0,E.jsx)(O.TableTd,{className:j({[re]:c||s,[oe]:s,[ie]:o||i,[le]:l,[se]:"left"===d,[de]:"center"===d,[me]:"right"===d},e),style:[{width:m,minWidth:m,maxWidth:m},t],onClick:o,onDoubleClick:i,onContextMenu:l,...p?.(n,r),children:b?b(n,r):A?A(n,r,u):X(n,u)}):null}function Re({open:e,colSpan:t,content:a,collapseProps:n}){let{expanded:r,visible:o}=function(e,t){let[a,n]=(0,x.useState)(e),[r,o]=(0,x.useState)(e),i=(0,P.useTimeout)(()=>n(!0),0),l=(0,P.useTimeout)(()=>o(!1),t||200);return(0,x.useEffect)(()=>{e?(l.clear(),o(!0),i.start()):(i.clear(),n(!1),l.start())},[i,l,e]),{expanded:a,visible:r}}(e,n?.transitionDuration);return o?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(O.TableTr,{}),(0,E.jsx)(O.TableTr,{children:(0,E.jsx)(O.TableTd,{className:"mantine-datatable-row-expansion-cell",colSpan:t,children:(0,E.jsx)(O.Collapse,{in:r,...n,children:(0,E.jsx)("div",{className:"mantine-datatable-row-expansion-cell-content",children:a()})})})})]}):null}function Me({className:e,style:t,record:a,index:n,trigger:r,onChange:o,withRightShadow:i,checkboxProps:l,getCheckboxProps:c,...s}){let d={...l,...c(a,n)},m=!s.disabled&&!d.disabled;return(0,E.jsx)(O.TableTd,{className:j("mantine-datatable-row-selector-cell",{[ie]:"cell"===r&&m},e),style:t,"data-shadow-visible":i||void 0,onClick:e=>{e.stopPropagation(),"cell"===r&&m&&o?.(e)},children:(0,E.jsx)(O.Checkbox,{classNames:m?{input:ie}:void 0,onChange:o,...s,...d})})}function Ne({record:e,index:t,columns:a,defaultColumnProps:n,defaultColumnRender:r,selectionTrigger:o,selectionVisible:i,selectionChecked:l,onSelectionChange:c,isRecordSelectable:s,selectionCheckboxProps:d,getSelectionCheckboxProps:m,onClick:u,onDoubleClick:b,onContextMenu:A,onCellClick:p,onCellDoubleClick:h,onCellContextMenu:g,expansion:f,customAttributes:C,color:v,backgroundColor:y,className:w,style:x,selectorCellShadowVisible:k,selectionColumnClassName:B,selectionColumnStyle:S,rowFactory:D}){let P=(0,E.jsxs)(E.Fragment,{children:[i&&(0,E.jsx)(Me,{className:B,style:S,record:e,index:t,trigger:o,withRightShadow:k,checked:l,disabled:!c||!!s&&!s(e,t),onChange:c,checkboxProps:d,getCheckboxProps:m}),a.map(({hidden:a,hiddenContent:o,...i},l)=>{if(a||o)return null;let{accessor:c,visibleMediaQuery:s,textAlign:d,noWrap:m,ellipsis:u,width:b,render:A,cellsClassName:f,cellsStyle:C,customCellAttributes:v}={...n,...i};return(0,E.jsx)(ze,{className:"function"==typeof f?f(e,t):f,style:C?.(e,t),visibleMediaQuery:s,record:e,index:t,onClick:p?a=>p({event:a,record:e,index:t,column:i,columnIndex:l}):void 0,onDoubleClick:h?a=>h({event:a,record:e,index:t,column:i,columnIndex:l}):void 0,onContextMenu:g?a=>g({event:a,record:e,index:t,column:i,columnIndex:l}):void 0,accessor:c,textAlign:d,noWrap:m,ellipsis:u,width:b,render:A,defaultRender:r,customCellAttributes:v},c)})]}),T=f&&(0,E.jsx)(Re,{colSpan:a.filter(({hidden:e})=>!e).length+(i?1:0),open:f.isRowExpanded(e),content:f.content({record:e,index:t}),collapseProps:f.collapseProps}),_=function({record:e,index:t,selectionChecked:a,onClick:n,onDoubleClick:r,onContextMenu:o,expansion:i,customAttributes:l,color:c,backgroundColor:s,className:d,style:m}){return{className:j("mantine-datatable-row",{[ie]:n||r||i?.isExpandable({record:e,index:t})&&i?.expandOnClick},{[le]:o},"function"==typeof d?d(e,t):d),"data-selected":a||void 0,onClick:a=>{if(i){let{isExpandable:a,isRowExpanded:n,expandOnClick:r,expandRow:o,collapseRow:l}=i;a({record:e,index:t})&&r&&(n(e)?l(e):o(e))}n?.({event:a,record:e,index:t})},onDoubleClick:r?a=>r({event:a,record:e,index:t}):void 0,onContextMenu:o?a=>o({event:a,record:e,index:t}):void 0,style:[c||s?a=>{let n=c?.(e,t),r=s?.(e,t);return function({theme:e,color:t,backgroundColor:a}){return{"--mantine-datatable-row-color-light":je(t,e,"light"),"--mantine-datatable-row-color-dark":je(t,e,"dark"),"--mantine-datatable-row-background-color-light":je(a,e,"light"),"--mantine-datatable-row-background-color-dark":je(a,e,"dark")}}({theme:a,color:n,backgroundColor:r})}:void 0,m?.(e,t)],...l?.(e,t)??{}}}({record:e,index:t,selectionChecked:l,onClick:u,onDoubleClick:b,onContextMenu:A,expansion:f,customAttributes:C,color:v,backgroundColor:y,className:w,style:x});return D?D({record:e,index:t,rowProps:_,children:P,expandedElement:T}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(O.TableTr,{..._,children:P}),T]})}function We({leftShadowBehind:e,rightShadowBehind:t,onScrollPositionChange:a,children:n,viewportRef:r,scrollAreaProps:o}){return(0,E.jsxs)(O.ScrollArea,{...o,viewportRef:r,classNames:{root:"mantine-datatable-scroll-area",scrollbar:"mantine-datatable-scroll-area-scrollbar",thumb:"mantine-datatable-scroll-area-thumb",corner:"mantine-datatable-scroll-area-corner"},onScrollPositionChange:a,children:[n,(0,E.jsx)(O.Box,{className:j("mantine-datatable-scroll-area-shadow","mantine-datatable-scroll-area-top-shadow")}),(0,E.jsx)("div",{className:j("mantine-datatable-scroll-area-shadow","mantine-datatable-scroll-area-left-shadow",{"mantine-datatable-scroll-area-shadow-behind":e})}),(0,E.jsx)("div",{className:j("mantine-datatable-scroll-area-shadow","mantine-datatable-scroll-area-right-shadow",{"mantine-datatable-scroll-area-shadow-behind":t})}),(0,E.jsx)(O.Box,{className:j("mantine-datatable-scroll-area-shadow","mantine-datatable-scroll-area-bottom-shadow")})]})}function Le({withTableBorder:e,borderRadius:t,textSelectionDisabled:a,height:n="100%",minHeight:r,maxHeight:o,shadow:i,verticalAlign:l="center",fetching:c,columns:s,storeColumnsKey:d,groups:m,pinFirstColumn:u,pinLastColumn:b,defaultColumnProps:A,defaultColumnRender:p,idAccessor:h="id",records:g,selectionTrigger:f="checkbox",selectedRecords:C,onSelectedRecordsChange:v,selectionColumnClassName:y,selectionColumnStyle:w,isRecordSelectable:k,selectionCheckboxProps:B,allRecordsSelectionCheckboxProps:S={"aria-label":"Select all records"},getRecordSelectionCheckboxProps:D=(e,t)=>({"aria-label":`Select record ${t+1}`}),sortStatus:T,sortIcons:_,onSortStatusChange:R,horizontalSpacing:K,page:$,onPageChange:J,totalRecords:X,recordsPerPage:ee,onRecordsPerPageChange:ae,recordsPerPageOptions:ne,recordsPerPageLabel:re="Records per page",paginationWithEdges:oe,paginationWithControls:ie,paginationActiveTextColor:le,paginationActiveBackgroundColor:se,paginationSize:de="sm",paginationText:me=({from:e,to:t,totalRecords:a})=>`${e} - ${t} / ${a}`,paginationWrapBreakpoint:ue="sm",getPaginationControlProps:be=e=>"previous"===e?{"aria-label":"Previous page"}:"next"===e?{"aria-label":"Next page"}:{},getPaginationItemProps:pe,renderPagination:he,loaderBackgroundBlur:ge,customLoader:fe,loaderSize:Ce,loaderType:ve,loaderColor:ye,loadingText:we="...",emptyState:xe,noRecordsText:ke="No records",noRecordsIcon:Be,highlightOnHover:je,striped:Pe,noHeader:Ee,onRowClick:Te,onRowDoubleClick:_e,onRowContextMenu:ze,onCellClick:Re,onCellDoubleClick:Me,onCellContextMenu:Le,onScroll:Fe,onScrollToTop:Ve,onScrollToBottom:Qe,onScrollToLeft:Ue,onScrollToRight:Ge,c:qe,backgroundColor:He,borderColor:Ke,rowBorderColor:$e,stripedColor:Je,highlightOnHoverColor:Ye,rowColor:Xe,rowBackgroundColor:Ze,rowExpansion:et,rowClassName:tt,rowStyle:at,customRowAttributes:nt,scrollViewportRef:rt,scrollAreaProps:ot,tableRef:it,bodyRef:lt,m:ct,my:st,mx:dt,mt,mb:ut,ml:bt,mr:At,className:pt,classNames:ht,style:gt,styles:ft,rowFactory:Ct,tableWrapper:vt,...yt}){let wt=(0,x.useMemo)(()=>m?te(m):s,[s,m]),[xt,kt]=(0,x.useState)(!1),{refs:Bt,onScroll:St}=function({scrollCallbacks:e,withRowBorders:t}){let a={root:(0,x.useRef)(null),table:(0,x.useRef)(null),scrollViewport:(0,x.useRef)(null),header:(0,x.useRef)(null),footer:(0,x.useRef)(null),selectionColumnHeader:(0,x.useRef)(null)},{root:n,table:r,scrollViewport:o,header:i,footer:l,selectionColumnHeader:c}=a,s=L({withRowBorders:t}),d=L(e),m=(0,x.useRef)(()=>{}),u=(0,x.useRef)(()=>{}),b=(0,x.useCallback)(e=>{d.current.onScroll?.(e),m.current()},[]);return(0,x.useEffect)(()=>H(i.current,e=>{G(n.current,F,`${e.height}px`)},()=>G(n.current,F,"0")),[i.current]),(0,x.useEffect)(()=>H(l.current,e=>{G(n.current,V,`${e.height}px`)},()=>G(n.current,V,"0")),[l.current]),(0,x.useEffect)(()=>H(c.current,e=>{G(n.current,Q,`${e.width}px`)},()=>G(n.current,Q,"0")),[c.current]),W(()=>{if(void 0===typeof window)return;let e={top:!0,bottom:!0,left:!0,right:!0},t={width:0,height:0},a={width:0,height:0};function i(t,a){let r=e[t];return e[t]=a,G(n.current,`--mantine-datatable-${t}-shadow-opacity`,a?"0":"1"),r}function l(){s.current.withRowBorders&&t.height{for(let n of e)switch(n.target.tagName){case"TABLE":t=q(n);break;case"DIV":a=q(n)}c(),function(){let e=t.height-a.height,r=e<0;G(n.current,"--mantine-datatable-footer-position",r?"relative":"sticky"),G(n.current,"--mantine-datatable-footer-bottom",r?`${e}px`:"0")}(),l()});return b.observe(r.current),b.observe(o.current),()=>{b.disconnect()}},[]),W(()=>{u.current()},[t]),{refs:a,onScroll:b}}({scrollCallbacks:{onScroll:Fe,onScrollToTop:Ve,onScrollToBottom:Qe,onScrollToLeft:Ue,onScrollToRight:Ge},withRowBorders:yt.withRowBorders}),Dt=N({key:d,columns:wt,headerRef:Bt.header,scrollViewportRef:Bt.scrollViewport,onFixedLayoutChange:kt}),jt=(0,P.useMergedRef)(Bt.table,it),Ot=(0,P.useMergedRef)(Bt.scrollViewport,rt),Pt=function({rowExpansion:e,records:t,idAccessor:a}){let n=[];if(e&&t){let{trigger:r,allowMultiple:o,initiallyExpanded:i}=e;t&&"always"===r?n=t.map(e=>Z(e,a)):i&&(n=t.filter((e,t)=>i({record:e,index:t})).map(e=>Z(e,a)),o||(n=[n[0]]))}let r,o,i=(0,x.useState)(n);if(e){let{expandable:t,trigger:n,allowMultiple:l,collapseProps:c,content:s}=e;e.expanded?({recordIds:r,onRecordIdsChange:o}=e.expanded):[r,o]=i;let d=e=>o?.(r.filter(t=>t!==Z(e,a)));return{expandOnClick:"always"!==n&&"never"!==n,isRowExpanded:e=>"always"===n||r.includes(Z(e,a)),isExpandable:({record:e,index:a})=>!t||t({record:e,index:a}),expandRow:e=>{let t=Z(e,a);o?.(l?[...r,t]:[t])},collapseRow:d,collapseProps:c,content:({record:e,index:t})=>()=>s({record:e,index:t,collapse:()=>d(e)})}}}({rowExpansion:et,records:g,idAccessor:h}),Et=(0,x.useRef)(!1),Tt=(0,x.useRef)($),_t=(0,x.useRef)(g),It=(0,x.useCallback)(e=>{Et.current=!0,_t.current=g,J(e)},[J,g]);(0,x.useEffect)(()=>{Tt.current!==$&&(Et.current=!0,_t.current=g,Tt.current=$)},[$,g]);let zt=g?.length;(0,x.useLayoutEffect)(()=>{if(!Et.current||c||g===_t.current)return;let e=Bt.scrollViewport.current;if(!e)return;let t=requestAnimationFrame(()=>{e.scrollTo({top:0,left:0}),Et.current=!1});return()=>cancelAnimationFrame(t)},[c,g,Bt.scrollViewport]);let Rt=g?.map(e=>Z(e,h)),Mt=!!C,Nt=C?.map(e=>Z(e,h)),Wt=void 0!==Rt&&void 0!==Nt&&Nt.length>0,Lt=k?g?.filter(k):g,Ft=Lt?.map(e=>Z(e,h)),Vt=Wt&&Ft.every(e=>Nt.includes(e)),Qt=Wt&&Ft.some(e=>Nt.includes(e)),Ut=(0,x.useCallback)(()=>{C&&v&&v(Vt?C.filter(e=>!Ft.includes(Z(e,h))):Y([...C,...Lt],e=>Z(e,h)))},[Vt,h,v,Ft,Lt,C]),{lastSelectionChangeIndex:Gt,setLastSelectionChangeIndex:qt}=function(e){let[t,a]=(0,x.useState)(null),n=e?.join(":")||"";return(0,x.useEffect)(()=>{a(null)},[n]),{lastSelectionChangeIndex:t,setLastSelectionChangeIndex:a}}(Rt),Ht=Mt&&!u,Kt={m:ct,my:st,mx:dt,mt,mb:ut,ml:bt,mr:At},$t=(0,x.useCallback)(({children:e})=>vt?vt({children:e}):e,[vt]);return(0,E.jsx)(I,{...Dt,children:(0,E.jsxs)(O.Box,{ref:Bt.root,...Kt,className:j("mantine-datatable",{"mantine-datatable-with-border":e},pt,ht?.root),style:[e=>({...Oe({theme:e,c:qe,backgroundColor:He,borderColor:Ke,rowBorderColor:$e,stripedColor:Je,highlightOnHoverColor:Ye}),borderRadius:e.radius[t]||t,boxShadow:e.shadows[i]||i,height:n,minHeight:r,maxHeight:o}),gt,ft?.root,{position:"relative"}],children:[(0,E.jsx)(We,{viewportRef:Ot,leftShadowBehind:Mt||!!u,rightShadowBehind:b,onScrollPositionChange:St,scrollAreaProps:ot,children:(0,E.jsx)($t,{children:(0,E.jsxs)(O.Table,{ref:jt,horizontalSpacing:K,className:j("mantine-datatable-table",{[ce]:a,"mantine-datatable-vertical-align-top":"top"===l,"mantine-datatable-vertical-align-bottom":"bottom"===l,"mantine-datatable-pin-last-column":b,"mantine-datatable-selection-column-visible":Mt,"mantine-datatable-pin-first-column":u,"mantine-datatable-resizable-columns":Dt.hasResizableColumns&&xt},ht?.table),style:{...ft?.table},"data-striped":zt&&Pe||void 0,"data-highlight-on-hover":je||void 0,...yt,children:[Ee?null:(0,E.jsx)(I,{...Dt,children:(0,E.jsx)(Se,{ref:Bt.header,selectionColumnHeaderRef:Bt.selectionColumnHeader,className:ht?.header,style:ft?.header,columns:wt,defaultColumnProps:A,groups:m,sortStatus:T,sortIcons:_,onSortStatusChange:R,selectionTrigger:f,selectionVisible:Mt,selectionChecked:Vt,selectionIndeterminate:Qt&&!Vt,onSelectionChange:Ut,selectionCheckboxProps:{...B,...S},selectorCellShadowVisible:Ht,selectionColumnClassName:y,selectionColumnStyle:w,withColumnBorders:yt.withColumnBorders})}),(0,E.jsx)("tbody",{ref:lt,children:zt?g.map((e,t)=>{let a,n=Z(e,h),r=Nt?.includes(n)||!1;return v&&C&&(a=a=>{if(a.nativeEvent.shiftKey&&null!==Gt){let e=g.filter(t>Gt?(e,a)=>a>=Gt&&a<=t&&(!k||k(e,a)):(e,a)=>a>=t&&a<=Gt&&(!k||k(e,a)));v(r?function(e,t,a){return e.filter(e=>!t.map(a).includes(a(e)))}(C,e,e=>Z(e,h)):Y([...C,...e],e=>Z(e,h)))}else v(r?C.filter(e=>Z(e,h)!==n):Y([...C,e],e=>Z(e,h)));qt(t)}),(0,E.jsx)(Ne,{record:e,index:t,columns:wt,defaultColumnProps:A,defaultColumnRender:p,selectionTrigger:f,selectionVisible:Mt,selectionChecked:r,onSelectionChange:a,isRecordSelectable:k,selectionCheckboxProps:B,getSelectionCheckboxProps:D,onClick:Te,onDoubleClick:_e,onCellClick:Re,onCellDoubleClick:Me,onContextMenu:ze,onCellContextMenu:Le,expansion:Pt,color:Xe,backgroundColor:Ze,className:tt,style:at,customAttributes:nt,selectorCellShadowVisible:Ht,selectionColumnClassName:y,selectionColumnStyle:w,idAccessor:h,rowFactory:Ct},n)}):(0,E.jsx)(z,{})}),wt.some(({footer:e})=>e)&&(0,E.jsx)(Ae,{ref:Bt.footer,className:ht?.footer,style:ft?.footer,columns:wt,defaultColumnProps:A,selectionVisible:Mt,selectorCellShadowVisible:Ht})]})})}),!(!$||!zt)&&(0,E.jsx)(Ie,{className:ht?.pagination,style:ft?.pagination,horizontalSpacing:K,fetching:c,page:$,onPageChange:It,totalRecords:X,recordsPerPage:ee,onRecordsPerPageChange:ae,recordsPerPageOptions:ne,recordsPerPageLabel:re,paginationWithEdges:oe,paginationWithControls:ie,paginationActiveTextColor:le,paginationActiveBackgroundColor:se,paginationSize:de,paginationText:me,paginationWrapBreakpoint:ue,getPaginationControlProps:be,getPaginationItemProps:pe,noRecordsText:ke,loadingText:we,recordsLength:zt,renderPagination:he}),(0,E.jsx)(De,{fetching:c,backgroundBlur:ge,customContent:fe,size:Ce,type:ve,color:ye}),(0,E.jsx)(M,{icon:Be,text:ke,active:!c&&!zt,children:xe})]})})}function Fe({className:e,children:t,isDragging:a,ref:n,...r}){let o=(0,x.useRef)(null),i=(0,P.useMergedRef)(o,n);return(0,x.useEffect)(()=>{if(!o.current||!a)return;let e=o.current.parentElement.parentElement.children[0].children[0];for(let t=0;te.length)&&(t=e.length);for(var a=0,n=Array(t);a=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,i=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return o=e.done,e},e:function(e){i=!0,r=e},f:function(){try{o||null==t.return||t.return()}finally{if(i)throw r}}}}(e);try{for(o.s();!(r=o.n()).done;){var i=r.value;if(wa(i,a)===t)return i;if(n){var l=mt(i,n);if(Array.isArray(l)){var c=bt(l,t,a,n);if(c)return c}}}}catch(e){o.e(e)}finally{o.f()}}},At=function(e,t,a,n,r,o){if(!Array.isArray(e))return{records:e,didUpdate:!1};var i=!1,l=e.map(function(e){var l=e;if(wa(e,a)===t&&(l=ut(e,n,r),i=!0),o){var c=mt(l,o);if(Array.isArray(c)){var s=At(c,t,a,n,r,o);s.didUpdate&&(l=ut(l,o,s.records),i=!0)}}return l});return{records:i?l:e,didUpdate:i}},pt=function(e,t){if(e===t)return!0;if(e instanceof Date||t instanceof Date)return String(e)===String(t);if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every(function(e,a){return pt(e,t[a])});if(e&&t&&"object"===et(e)&&"object"===et(t))try{return JSON.stringify(e)===JSON.stringify(t)}catch(e){return!1}return!1},ht=function(e){var t,a;return st(e)?"string"==typeof e.type?e.type:void 0:k().isValidElement(e)?"string"==typeof e.type?e.type:dt.has(e.type)?dt.get(e.type):(null===(t=e.type)||void 0===t?void 0:t.displayName)||(null===(a=e.type)||void 0===a?void 0:a.name):void 0},gt=function(e,t){if(e&&"object"===et(e)&&!Array.isArray(e)){if(Object.prototype.hasOwnProperty.call(e,t))return e[t];if(e.currentTarget&&Object.prototype.hasOwnProperty.call(e.currentTarget,t))return e.currentTarget[t];if(e.target&&Object.prototype.hasOwnProperty.call(e.target,t))return e.target[t]}return e},ft=function(e,t,a){if(e instanceof Date){var n=ht(a);return"date"===(null==t?void 0:t.presentation)||"date"===(null==t?void 0:t.type)||"DateInput"===n?e.toISOString().slice(0,10):e.toISOString()}return Array.isArray(e)?e.map(function(e){return ft(e,t,a)}):e},Ct={Checkbox:"checked",Switch:"checked"},vt=new Set(["Autocomplete","JsonInput","PasswordInput","PinInput","TextInput","Textarea"]),yt=new Set(["CheckboxGroup","MultiSelect","TagsInput"]),wt=new Set(["RangeSlider"]),xt=new Set(["DateInput","DatePickerInput","DateTimePicker","MonthPickerInput","TimeInput","YearPickerInput"]),kt=new Set(["ChipGroup","ColorInput","ColorPicker","NativeSelect","NumberInput","RadioGroup","Rating","SegmentedControl","Select"]),Bt=new Set([].concat(Je(vt),Je(yt),Je(wt),Je(xt),Je(kt),["Checkbox","Switch"])),St=new Set(["all","__all__"]),Dt=function(e,t){return e&&"object"===et(e)&&!Array.isArray(e)?Ge(Ge({},e),t):t},jt=function(e,t){return e&&"object"===et(e)&&!Array.isArray(e)?Ge(Ge({},t),e):t},Ot=function(e){try{return JSON.stringify(e)}catch(t){return String(e)}},Pt=function(e){if(!lt(e))return"string"==typeof e||"number"==typeof e?String(e):Ot(e)},Et=function(e){return(k().isValidElement(e)||st(e))&&e.props||at},Tt=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:tt,n=Pt(Et(e).id),r=a.length?a.join("."):"root";return n||"".concat((null==t?void 0:t.accessor)||"__filter__",":").concat(r)},_t=function(e){var t=e.props||at;if(Object.prototype.hasOwnProperty.call(t,e.valueProp))return t[e.valueProp];var a="checked"===e.valueProp?"defaultChecked":"defaultValue";return Object.prototype.hasOwnProperty.call(t,a)?t[a]:void 0},It=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:tt;if(k().isValidElement(e)||st(e)){var n=Et(e),r=[];if(function(e){var t=Et(e);if(!1===t.filterRegistration||!1===t.autoFilter)return!1;var a=ht(e),n="function"==typeof t.setProps&&t.setProps!==nt&&["value","defaultValue","checked","defaultChecked"].some(function(e){return Object.prototype.hasOwnProperty.call(t,e)});return Bt.has(a)||!0===t.filterRegistration||!0===t.autoFilter||n}(e)){var o=function(e,t){if("string"==typeof(null==e?void 0:e.filterValueProp))return e.filterValueProp;var a=ht(t);if(Ct[a])return Ct[a];var n=Et(t);return Object.prototype.hasOwnProperty.call(n,"checked")||Object.prototype.hasOwnProperty.call(n,"defaultChecked")?"checked":"value"}(t,e);r.push({key:Tt(e,t,a),path:a,props:n,typeName:ht(e),valueProp:o})}return r.concat(It(n.children,t,[].concat(Je(a),["children"])))}return Array.isArray(e)?e.flatMap(function(e,n){return It(e,t,[].concat(Je(a),[n]))}):tt},zt=function(e,t,a,n,r){var o=ct(e)?Ge({},e):{};if(r<=1)return o[t]=n,o;var i=ct(o[t])?o[t]:{};return o[t]=Ge(Ge({},i),{},qe({},a,n)),o},Rt=function(e,t,a,n){if(!ct(e))return{hasValue:!1,value:void 0};if(!Object.prototype.hasOwnProperty.call(e,t))return{hasValue:!1,value:void 0};var r=e[t];return n<=1?ct(r)&&Object.prototype.hasOwnProperty.call(r,a)?{hasValue:!0,value:r[a]}:{hasValue:!0,value:r}:ct(r)&&Object.prototype.hasOwnProperty.call(r,a)?{hasValue:!0,value:r[a]}:{hasValue:!1,value:void 0}},Mt=function(e,t){if(!lt(t)&&pt(e,t))return!1;if(lt(e))return!1;if("boolean"==typeof e)return e;if("string"==typeof e){var a=e.trim();return""!==a&&!St.has(a.toLowerCase())}return Array.isArray(e)?e.some(function(e){return Mt(e,void 0)}):"object"!==et(e)||Object.values(e).some(function(e){return Mt(e,void 0)})},Nt=function(e,t){var a=(null==t?void 0:t.controls)||tt;return a.map(function(n){var r=Rt(e,t.accessor,n.key,a.length),o=r.hasValue?r.value:_t(n),i=function(e,t){var a=e||at,n=t.props||at;return Object.prototype.hasOwnProperty.call(a,"filterEmptyValue")?a.filterEmptyValue:Object.prototype.hasOwnProperty.call(n,"filterEmptyValue")?n.filterEmptyValue:!wt.has(t.typeName)||lt(n.min)||lt(n.max)?void 0:[n.min,n.max]}(t.column,n);return Ge(Ge({},n),{},{emptyValue:i,value:o})}).filter(function(e){return Mt(e.value,e.emptyValue)})},Wt=function(e,t){return Nt(e,t).length>0},Lt=function(e){if(e instanceof Date)return e.getTime();if("number"==typeof e)return e;if("string"==typeof e){var t=e.trim(),a=Number(t);if(""!==t&&Number.isFinite(a))return a;if(function(e){return"string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e.trim())}(t)){var n=Date.parse(t);if(Number.isFinite(n))return n}return t.toLowerCase()}return e},Ft=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(Array.isArray(e))return e.some(function(e){return Ft(e,t,a)});if(Array.isArray(t))return t.some(function(t){return Ft(e,t,a)});var n=Lt(e),r=Lt(t);if("string"==typeof n||"string"==typeof r){var o=lt(n)?"":String(n),i=lt(r)?"":String(r);return a?o===i:o.toLowerCase()===i.toLowerCase()}return n===r},Vt=function(e,t){var a=Lt(e),n=Lt(t);return an?1:0},Qt=function(e){var t=function(e){var t,a,n;return[e.key,Pt(null===(t=e.props)||void 0===t?void 0:t.id),null===(a=e.props)||void 0===a?void 0:a.label,null===(n=e.props)||void 0===n?void 0:n.placeholder].filter(Boolean).join(" ").toLowerCase()}(e);return/(from|start|minimum|min|after|earliest|lower)/.test(t)?"gte":/(to|end|maximum|max|before|latest|upper)/.test(t)?"lte":void 0},Ut=function(e,t,a){var n=Array.isArray(t)?t:[t];return Array.isArray(e)?e.some(function(e){return n.some(function(t){return Ft(e,t,a)})}):n.some(function(t){return Ft(e,t,a)})},Gt=function(e,t,a){return!(lt(e)||Mt(t,void 0)&&Vt(e,t)<0||Mt(a,void 0)&&Vt(e,a)>0)},qt=function(e,t,a){var n=Nt(t,a);if(!n.length)return!0;var r=a.column||at,o=r.filterAccessor||r.filterValueAccessor||a.accessor,i=mt(e,o);if(function(e,t){return!(t.length<2)&&(!!["between","range"].includes(e.filterOperator||e.filterMatchMode)||!!t.some(function(e){return Qt(e)})||t.every(function(e){return xt.has(e.typeName)||"NumberInput"===e.typeName}))}(r,n)){var l=function(e){var t,a;return e.forEach(function(e){var n=Qt(e);"lte"!==n?"gte"!==n?lt(t)?t=e.value:lt(a)&&(a=e.value):t=e.value:a=e.value}),[t,a]}(n),c=He(l,2),s=c[0],d=c[1];return Gt(i,s,d)}return n.every(function(e){return function(e,t,a){var n=function(e,t){var a;return e.filterOperator||e.filterMatchMode||(null===(a=t.props)||void 0===a?void 0:a.filterOperator)||Qt(t)||(wt.has(t.typeName)||xt.has(t.typeName)&&Array.isArray(t.value)?"between":yt.has(t.typeName)?"in":vt.has(t.typeName)?"contains":Array.isArray(t.value)?"in":"equals")}(a,t),r=Boolean(a.filterCaseSensitive);if("function"==typeof a.filterPredicate)return Boolean(a.filterPredicate(e,t.value,{column:a,filter:t}));if("contains"===n)return function(e,t,a){var n=va(e),r=String(t);return a?n.includes(r):n.toLowerCase().includes(r.toLowerCase())}(e,t.value,r);if("startsWith"===n){var o=va(e),i=String(t.value);return r?o.startsWith(i):o.toLowerCase().startsWith(i.toLowerCase())}if("endsWith"===n){var l=va(e),c=String(t.value);return r?l.endsWith(c):l.toLowerCase().endsWith(c.toLowerCase())}if("in"===n)return Ut(e,t.value,r);if("between"===n||"range"===n){var s=He(Array.isArray(t.value)?t.value:[void 0,t.value],2),d=s[0],m=s[1];return Gt(e,d,m)}return"gte"===n?Vt(e,t.value)>=0:"gt"===n?Vt(e,t.value)>0:"lte"===n?Vt(e,t.value)<=0:"lt"===n?Vt(e,t.value)<0:"notIn"===n?!Ut(e,t.value,r):Ft(e,t.value,r)}(i,e,r)})},Ht=function(e,t){var a,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:at,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:tt;if(k().isValidElement(e)){var o,i=e.props||at,l=Object.prototype.hasOwnProperty.call(i,"children")?Ht(i.children,t,n,[].concat(Je(r),["children"])):void 0,c=(null===(o=n.filterDefinitionsByAccessor)||void 0===o||null===(o=o[t.accessor])||void 0===o?void 0:o.controls)||tt,s=Tt(e,t,r),d=c.find(function(e){return e.key===s}),m=Ge({},i);if(Object.prototype.hasOwnProperty.call(i,"children")&&(m.children=l),!d)return k().cloneElement(e,m);var u=Rt(n.filterValues,t.accessor,d.key,c.length),b=Object.prototype.hasOwnProperty.call(i,d.valueProp);(u.hasValue||b)&&(m[d.valueProp]=u.hasValue?u.value:i[d.valueProp]),m.comboboxProps=jt(i.comboboxProps,{withinPortal:!1}),m.popoverProps=jt(i.popoverProps,{withinPortal:!1});var A=i.setProps,p=i.onChange,h=function(e){"function"==typeof n.handleFilterValueChange&&n.handleFilterValueChange(t,d,e,c.length)};return m.setProps=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:at;e&&Object.prototype.hasOwnProperty.call(e,d.valueProp)&&h(e[d.valueProp]),"function"==typeof A&&A(e)},"function"!=typeof p&&("function"==typeof A||(a=e,k().isValidElement(a)&&dt.has(a.type)))||(m.onChange=function(e){if(h(gt(e,d.valueProp)),"function"==typeof p){for(var t=arguments.length,a=new Array(t>1?t-1:0),n=1;n1?t-1:0),n=1;nr?1:0},Xt={count:function(e,t){return t.length},sum:function(e){var t=e.map(function(e){return Number(e)}).filter(function(e){return Number.isFinite(e)});if(t.length)return t.reduce(function(e,t){return e+t},0)},mean:function(e){var t=e.map(function(e){return Number(e)}).filter(function(e){return Number.isFinite(e)});if(t.length)return t.reduce(function(e,t){return e+t},0)/t.length},median:function(e){var t=e.map(function(e){return Number(e)}).filter(function(e){return Number.isFinite(e)}).sort(function(e,t){return e-t});if(t.length){var a=Math.floor(t.length/2);return t.length%2==0?(t[a-1]+t[a])/2:t[a]}},min:function(e){var t=e.filter(function(e){return!lt(e)});if(t.length)return t.reduce(function(e,t){return Yt(t,e)<0?t:e})},max:function(e){var t=e.filter(function(e){return!lt(e)});if(t.length)return t.reduce(function(e,t){return Yt(t,e)>0?t:e})}},Zt=function(e,t,a){return Array.isArray(a)&&a.length?a.reduce(function(e,a){var n=a.outputAccessor,r=a.sourceAccessor,o=a.aggregator,i=r?t.map(function(e){return mt(e,r)}):tt,l="string"==typeof o&&Object.prototype.hasOwnProperty.call(Xt,o.trim().toLowerCase())?Xt[o.trim().toLowerCase()]:function(e){if("function"==typeof e)return e;if("string"!=typeof e)return null;var t=e.trim();if(!t)return null;try{if(t.startsWith("lambda ")){var a=/^lambda\s*\(([^)]*)\)\s*:\s*([\s\S]+)$/.exec(t)||/^lambda\s+([^:]+)\s*:\s*([\s\S]+)$/.exec(t);if(a)return Function("return (".concat(a[1].trim(),") => (").concat(a[2].trim(),");"))()}return t.includes("=>")||t.startsWith("function")?Function("return (".concat(t,");"))():Function("values","records","groupRecord","outputAccessor",t)}catch(e){return null}}(o);if("function"!=typeof l)return e;var c=l(i,t,e,n);return lt(c)?e:Ge(Ge({},e),{},qe({},n,c))},e):e},ea=function(e){return Boolean((null==e?void 0:e.__group)||(null==e?void 0:e.__hierarchyParent))},ta=function(e,t,a){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:tt;if(!(Array.isArray(e)&&e.length&&Array.isArray(t)&&t.length))return tt;var r=function(e){return $e(e)||Xe(e)||Ye(e)||Ke()}(t),o=r[0],i=Ze(r).slice(1),l=[],c=new Map;return e.forEach(function(e){var t=mt(e,o),a="".concat(o,":").concat($t(t));if(!c.has(a)){var r=[].concat(Je(n),[{accessor:o,value:t}]),s={__group:!0,__groupAccessor:o,__groupId:Jt(r),__groupLevel:n.length,__groupPath:r,__groupValue:t,__hierarchyParent:!0,__groupedRecords:tt,__remainingGroupBy:i};lt(t)||(s[o]=t);var d={record:s,records:[]};c.set(a,d),l.push(d)}c.get(a).records.push(e)}),l.map(function(e){var t=e.record.__groupPath,n=i.length?ta(e.records,i,a,t):e.records.map(function(e){return Ge(Ge({},e),{},{__group:!1,__groupLevel:t.length,__leafRecords:[e]})}),r=i.length?n.flatMap(function(e){return e.__leafRecords||tt}):e.records;return Zt(Ge(Ge({},e.record),{},{__children:n,__groupedRecords:r,__leafRecords:r}),r,a)})},aa=function(e){return Array.isArray(e)?e.flatMap(function(e){return null!=e&&e.__group?[e.__groupId].concat(Je(aa(e.__children))):tt}):tt},na=function(e,t,a){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return Array.isArray(e)?e.map(function(e){var r=function(e,t){return!(!e||"string"!=typeof t||!t.trim())&&t.split(".").every(function(t){return!(null==e||"object"!==et(e)||!Object.prototype.hasOwnProperty.call(e,t)||(e=e[t],0))})}(e,t),o=r?mt(e,t):void 0,i=Array.isArray(o)?na(o,t,a,n+1):tt,l=r?i.flatMap(function(e){return e.__leafRecords||tt}):[e],c=Ge(Ge({},e),{},{__children:i,__group:!1,__groupLevel:n,__groupedRecords:l,__hierarchyParent:r,__leafRecords:l});return r?Zt(c,l,a):c}):tt},ra=function(e,t,a){return Array.isArray(e)?e.flatMap(function(e){if(!ea(e))return[e];var n=wa(e,a);return t.includes(n)?[e].concat(Je(ra(e.__children,t,a))):[e]}):tt},oa=function(e){return Array.isArray(e)?e.flatMap(function(e){return[e].concat(Je(oa(null==e?void 0:e.__children)))}):tt},ia=function(){for(var e=arguments.length,t=new Array(e),a=0;a2&&void 0!==arguments[2]?arguments[2]:at,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:tt;if(k().isValidElement(e)){var r=Object.keys(e.props||{}).reduce(function(r,o){return r[o]=ba(e.props[o],t,a,[].concat(Je(n),[o])),r},{});return k().cloneElement(e,ua(r,t,a))}return st(e)?function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:at,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:tt,r=function(e){var t,a,n,r=null==e?void 0:e.namespace,o=null==e?void 0:e.type;return r&&o&&"undefined"!=typeof window?"dash_html_components"===r||"dash.html"===r?String(o).toLowerCase():(n=o,(a=(null===(t=window)||void 0===t||null===(t=t[r])||void 0===t?void 0:t[o])||null)&&("function"==typeof a||"object"===et(a)&&null!==a)&&dt.set(a,n),a):null}(e);if(!r)return da(e,t);var o=da(e.props||at,t),i=Object.entries(o).reduce(function(e,r){var o=He(r,2),i=o[0],l=o[1];return"children"===i||(e[i]=ba(l,t,a,[].concat(Je(n),[i]))),e},{}),l="string"==typeof r||"function"==typeof i.setProps?i:Ge(Ge({},i),{},{setProps:nt}),c=ua(l,t,a),s=Object.prototype.hasOwnProperty.call(o,"children")?ba(o.children,t,a,[].concat(Je(n),["children"])):void 0;return Array.isArray(s)?k().createElement.apply(k(),[r,c].concat(Je(s))):lt(s)?k().createElement(r,c):k().createElement(r,c,s)}(e,t,a,n):Array.isArray(e)?e.map(function(e,r){return ba(e,t,a,[].concat(Je(n),[r]))}):e&&"object"===et(e)?Object.entries(e).reduce(function(e,r){var o=He(r,2),i=o[0],l=o[1];return e[i]=ba(l,t,a,[].concat(Je(n),[i])),e},{}):sa(e,t)},Aa=function(e,t,a,n){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:at;return{accessor:null==a?void 0:a.accessor,column:a,idAccessor:r.idAccessor,index:t,locale:n,record:e,recordId:wa(e,r.idAccessor),row:e,value:mt(e,null==a?void 0:a.accessor)}},pa=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:at;return"function"==typeof e?e(t.record,t.index):ba(e,t,a)},ha=function(e,t,a,n,r){return pa(e,Aa(t,a,n,r,arguments.length>5&&void 0!==arguments[5]?arguments[5]:at))},ga=function(e,t,a){return pa(e,Aa(void 0,void 0,t,a,arguments.length>3&&void 0!==arguments[3]?arguments[3]:at))},fa=function(e,t,a){if(t.template)return la(t.template,e);var n=mt(e,t.accessor);return"string"==typeof t.valueAccessor?mt(e,t.valueAccessor):function(e,t,a){if(lt(e))return t.emptyValue||"";var n=t.presentation||t.type||"text",r=t.locale||a,o=t.formatOptions||at;if("number"===n||"currency"===n||"percent"===n){var i=Number(e);if(Number.isNaN(i))return String(e);var l=Ge({},o);return"currency"===n?(l.style="currency",l.currency=t.currency||l.currency||"USD"):"percent"===n&&(l.style="percent"),lt(t.minimumFractionDigits)||(l.minimumFractionDigits=t.minimumFractionDigits),lt(t.maximumFractionDigits)||(l.maximumFractionDigits=t.maximumFractionDigits),new Intl.NumberFormat(r,l).format(i)}if("date"===n||"datetime"===n||"time"===n){var c=function(e){if(e instanceof Date)return e;var t=new Date(e);return Number.isNaN(t.getTime())?null:t}(e);if(!c)return String(e);var s=Ge({},o);return"date"===n?s.dateStyle=s.dateStyle||"medium":"datetime"===n?(s.dateStyle=s.dateStyle||"medium",s.timeStyle=s.timeStyle||"short"):"time"===n&&(s.timeStyle=s.timeStyle||"short"),new Intl.DateTimeFormat(r,s).format(c)}if("boolean"===n){var d=t.trueLabel||"Yes",m=t.falseLabel||"No";return e?d:m}return"object"===et(e)?JSON.stringify(e):String(e)}(n,t,a)},Ca=function(e){return"string"==typeof e?e.toLowerCase():e instanceof Date?e.getTime():e},va=function(e){return lt(e)?"":Array.isArray(e)?e.map(va).join(" "):"object"===et(e)?JSON.stringify(e):String(e)},ya=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:":";return e.map(function(e){return lt(e)?"":String(e)}).join(t)},wa=function(e,t){if(e){if(Object.prototype.hasOwnProperty.call(e,"__groupId"))return e.__groupId;if("function"==typeof t)return t(e);if(Array.isArray(t))return ya(t.map(function(t){return mt(e,t)}));if((a=t)&&"object"===et(a)&&!Array.isArray(a)){if("string"==typeof t.template)return la(t.template,e);if(Array.isArray(t.accessors))return ya(t.accessors.map(function(t){return mt(e,t)}),t.separator);if("string"==typeof t.accessor)return mt(e,t.accessor)}var a;return mt(e,t||"id")}},xa=function(e,t,a,n){return!!lt(a)||("function"==typeof a?Boolean(a(e,t)):Array.isArray(a)?a.some(function(a){return xa(e,t,a,n)}):"string"==typeof a||"number"==typeof a?wa(e,n)===a:"object"===et(a)&&Object.entries(a).every(function(a){var r,o=He(a,2),i=o[0],l=o[1];return r="index"===i?t:"id"===i||"recordId"===i?wa(e,n):mt(e,i),Array.isArray(l)?l.includes(r):function(e,t){return!t||"object"!==et(t)||Array.isArray(t)?e===t:!(lt(e)&&["gt","gte","lt","lte","contains","startsWith","endsWith"].some(function(e){return Object.prototype.hasOwnProperty.call(t,e)})||Object.prototype.hasOwnProperty.call(t,"eq")&&e!==t.eq||Object.prototype.hasOwnProperty.call(t,"ne")&&e===t.ne||Object.prototype.hasOwnProperty.call(t,"gt")&&!(e>t.gt)||Object.prototype.hasOwnProperty.call(t,"gte")&&!(e>=t.gte)||Object.prototype.hasOwnProperty.call(t,"lt")&&!(e3&&void 0!==arguments[3]?arguments[3]:{}).merge,r=void 0!==n&&n;return"function"==typeof e?e:lt(e)?void 0:function(n,o){var i,l=Array.isArray(e)?e:[e];if(r){var c=l.reduce(function(e,r){var i=ka(r,t,n,o,a);return i&&"object"===et(i)&&!Array.isArray(i)?Ge(Ge({},e),i):e},{});return Object.keys(c).length?c:void 0}return l.forEach(function(e){var r=ka(e,t,n,o,a);lt(r)||(i=r)}),i}},Sa=function(e,t,a,n){return"function"==typeof e?function(t,a){var r=e(t,a);return lt(r)?n:Boolean(r)}:lt(e)?void 0:function(r,o){var i=Array.isArray(e)?e:[e],l=n;return i.forEach(function(e){var n=ka(e,t,r,o,a);lt(n)||(l=Boolean(n))}),l}},Da=function(e,t){var a=wa(e.record,t),n={record:e.record,recordId:a,index:e.index,timestamp:Date.now()};return e.column&&(n.column=e.column,n.columnAccessor=e.column.accessor,n.columnIndex=e.columnIndex,n.value=mt(e.record,e.column.accessor)),n},ja=function(e){return Array.isArray(e)?e.flatMap(function(e){return[].concat(Je(Array.isArray(null==e?void 0:e.columns)?e.columns:tt),Je(ja(null==e?void 0:e.groups)))}):tt},Oa=function(e,t){if(Array.isArray(e))return e.map(function(e){var a=new Set(Array.isArray(null==e?void 0:e.columns)?e.columns.map(function(e){return null==e?void 0:e.accessor}).filter(Boolean):tt);return Ge(Ge({},e),{},{columns:(t||tt).filter(function(e){return a.has(null==e?void 0:e.accessor)}),groups:Array.isArray(null==e?void 0:e.groups)?Oa(e.groups,t):null==e?void 0:e.groups})})},Pa=function(e,t,a,n){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:at,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:at,i="function"==typeof e.filter?function(t){return Ht(e.filter(t),e,o)}:lt(e.filter)?e.filter:Ht(ga(e.filter,e,t,n),e,o),l=lt(e.filtering)&&"function"==typeof o.isColumnFilterActive?o.isColumnFilterActive(e):e.filtering;return{accessor:e.accessor,title:e.title,textAlign:e.textAlign,sortable:e.sortable,sortKey:e.sortKey,draggable:e.draggable,toggleable:e.toggleable,resizable:e.resizable,defaultToggle:e.defaultToggle,filter:i,filtering:l,filterPopoverProps:e.filterPopoverProps,filterPopoverDisableClickOutside:e.filterPopoverDisableClickOutside,width:e.width,hidden:e.hidden,hiddenContent:e.hiddenContent,visibleMediaQuery:e.visibleMediaQuery,titleClassName:e.titleClassName,titleStyle:e.titleStyle,cellsClassName:j(e.cellsClassName),cellsStyle:"function"==typeof e.cellsStyle?e.cellsStyle:e.cellsStyle?function(){return e.cellsStyle}:void 0,customCellAttributes:Ba(lt(e.cellAttributes)?e.customCellAttributes:e.cellAttributes,"attributes",n.idAccessor,{merge:!0}),footer:lt(e.footer)?e.footer:ga(e.footer,e,t,n),footerClassName:e.footerClassName,footerStyle:e.footerStyle,ellipsis:e.ellipsis,noWrap:e.noWrap,render:function(o,i){var l,c,s=mt(o,e.accessor),d=fa(o,e,t),m=e.presentation||e.type||"text",u=e.render;if(lt(u))if("badge"===m){var b=e.badgeColorAccessor?mt(o,e.badgeColorAccessor):e.badgeColor||"gray";l=k().createElement(O.Badge,{color:b,radius:e.badgeRadius||"sm",variant:e.badgeVariant||"light"},d)}else if("link"===m){var A=e.hrefAccessor?mt(o,e.hrefAccessor):la(e.hrefTemplate,o);l=k().createElement(O.Anchor,{href:A,target:e.target||"_blank"},d)}else if("code"===m)l=k().createElement(O.Code,null,d);else if("progress"===m){var p=Number(s||0);l=k().createElement(O.Progress,{color:e.progressColor||"blue",radius:e.progressRadius||"xl",value:Number.isNaN(p)?0:p})}else"json"===m?l=k().createElement(O.Code,{style:{whiteSpace:"pre-wrap"}},JSON.stringify(s,null,2)):lt(a)?(c=e,l=["color","fw","size"].some(function(e){return!lt(c[e])})?k().createElement(O.Text,{c:e.color,component:"span",fw:e.fw,size:e.size},d):d):l=ha(a,o,i,e,t,n);else l=ha(u,o,i,e,t,n);if(!e.editable||!e.accessor||null!=o&&o.__group||"function"!=typeof(null==r?void 0:r.isEditingCell)||"function"!=typeof(null==r?void 0:r.handleValueChange)||"function"!=typeof(null==r?void 0:r.closeEditor))return l;var h=e.editor||k().createElement(O.TextInput,{size:"xs"}),g=ha(h,o,i,e,t,n);return k().createElement(Kt,{closeEditor:r.closeEditor,content:l,editor:g,editorDefinition:{column:e,editor:h},handleValueChange:function(t){return r.handleValueChange(o,e,ft(t,e,h))},isEditing:r.isEditingCell(o,e),value:s})}}},Ea=function(e,t,a,n){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:at,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:at;return{id:e.id,title:e.title,textAlign:e.textAlign,className:e.className,style:e.style,columns:Array.isArray(e.columns)?e.columns.map(function(e){return Pa(e,t,a,n,r,o)}):void 0,groups:Array.isArray(e.groups)?e.groups.map(function(e){return Ea(e,t,a,n,r,o)}):void 0}},Ta=function(e){var t,a=e.data,n=void 0===a?tt:a,r=e.columns,o=void 0===r?tt:r,i=e.groups,l=void 0===i?void 0:i,c=e.groupBy,s=void 0===c?void 0:c,d=e.childRowsAccessor,m=void 0===d?void 0:d,u=e.groupAggregations,b=void 0===u?void 0:u,A=e.idAccessor,p=void 0===A?"id":A,h=e.locale,g=void 0===h?"en-US":h,f=e.paginationMode,C=void 0===f?"client":f,v=e.sortMode,y=void 0===v?"client":v,w=e.searchMode,B=void 0===w?"client":w,S=e.filterMode,D=void 0===S?"client":S,P=e.recordsPerPage,E=void 0===P?10:P,T=e.pageSize,_=void 0===T?10:T,I=e.noRecordsText,z=void 0===I?"No records found":I,R=e.pageSizeOptions,M=void 0===R?[10,25,50]:R,W=e.recordsPerPageOptions,L=void 0===W?void 0:W,F=e.recordsPerPageLabel,V=void 0===F?"Rows per page":F,Q=e.paginationSize,U=void 0===Q?"sm":Q,G=(e.direction,e.selectionTrigger),q=void 0===G?void 0:G,H=e.tableProps,K=void 0===H?at:H,$=e.scrollAreaProps,J=void 0===$?at:$,Y=(e.withRowBorders,e.withTableBorder,e.withColumnBorders,e.striped,e.highlightOnHover,e.textSelectionDisabled,function(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(-1!==t.indexOf(n))continue;a[n]=e[n]}return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n0,We=!Ne&&Boolean(Re),Ue=Ne||We,qe=Z>0,Ke=Ne?ta(Ie,ze,Me):void 0,$e=Ne?aa(Ke):tt,Ye=Array.isArray(null==ke?void 0:ke.initiallyExpandedRecordIds)?ke.initiallyExpandedRecordIds:tt,Xe=E||_||10,Ze=He((0,x.useState)(oe||1),2),nt=Ze[0],rt=Ze[1],ot=He((0,x.useState)(Xe),2),dt=ot[0],ut=ot[1],ht=He((0,x.useState)(le||null),2),gt=ht[0],ft=ht[1],Ct=He((0,x.useState)(Array.isArray(se)?se:tt),2),vt=Ct[0],yt=Ct[1],wt=He((0,x.useState)(Array.isArray(de)?de:ia($e,Ye)),2),xt=wt[0],kt=wt[1],Bt=He((0,x.useState)(null),2),St=Bt[0],Dt=Bt[1],jt=(0,x.useDeferredValue)(ae);(0,x.useEffect)(function(){lt(oe)||rt(oe)},[oe]),(0,x.useEffect)(function(){lt(E)&<(_)||ut(E||_)},[E,_]),(0,x.useEffect)(function(){le&&ft(le)},[le]),(0,x.useEffect)(function(){Array.isArray(se)&&yt(se)},[se]),(0,x.useEffect)(function(){Array.isArray(de)&&kt(de)},[de]);var Pt=lt(oe)?nt:oe,Et=lt(E)?lt(_)?dt:_:E,Tt=le||gt,Rt=Array.isArray(se)?se:vt,Mt=Array.isArray(de)?de:xt,Nt=(0,x.useRef)(null),Lt=He((0,x.useState)(null),2),Ft=Lt[0],Vt=Lt[1],Qt=He((0,x.useState)(null),2),Ut=Qt[0],Gt=Qt[1],Ht=ja(l),Kt=Array.isArray(o)&&o.length>0,$t=Array.isArray(l)&&l.length>0,Jt=Kt?o:Ht,Yt=N({key:Y.storeColumnsKey,columns:Jt}).effectiveColumns,Xt=Array.isArray(Yt)?Yt:Jt,Zt=Y.defaultColumnProps&&!lt(Y.defaultColumnProps.filter)?Xt.map(function(e){var t,a;return lt(e.filter)?Ge(Ge({},e),{},{filter:Y.defaultColumnProps.filter,filterPopoverProps:null!==(t=e.filterPopoverProps)&&void 0!==t?t:Y.defaultColumnProps.filterPopoverProps,filterPopoverDisableClickOutside:null!==(a=e.filterPopoverDisableClickOutside)&&void 0!==a?a:Y.defaultColumnProps.filterPopoverDisableClickOutside}):e}):Xt,ca=Array.isArray(ne)?ne:Xt.filter(function(e){return!1!==e.searchable}).map(function(e){return e.accessor}).filter(Boolean),sa={idAccessor:p},da=function(e,t,a,n){return(e||tt).map(function(e){var r=t?Ge(Ge({},t),e):e,o=lt(null==e?void 0:e.filter)?null==t?void 0:t.filter:e.filter;if(null==e||!e.accessor||lt(o))return{accessor:null==e?void 0:e.accessor,column:r,controls:tt};var i="function"==typeof o?void 0:ga(o,e,a,n);return{accessor:e.accessor,column:r,controls:i?It(i,e):tt}})}(Zt,Y.defaultColumnProps,g,sa),ma=Ot((da||tt).map(function(e){return{accessor:e.accessor,controls:(e.controls||tt).map(function(e){return{defaultValue:_t(e),key:e.key,typeName:e.typeName,valueProp:e.valueProp}})}})),ua=(da||tt).reduce(function(e,t){var a=t.controls||tt;return a.forEach(function(n){var r=_t(n);lt(r)||Object.assign(e,zt(e,t.accessor,n.key,r,a.length))}),e},{}),ba=He((0,x.useState)(ua),2),ha=ba[0],ya=ba[1],xa=(0,x.useRef)(ct(re)).current;(0,x.useEffect)(function(){xa||ya(function(e){return function(e,t){var a={};return(t||tt).forEach(function(t){var n;t.accessor&&null!==(n=t.controls)&&void 0!==n&&n.length&&Object.prototype.hasOwnProperty.call(e,t.accessor)&&(a[t.accessor]=e[t.accessor])}),a}(Ge(Ge({},ua),e),da)})},[ma,xa]);var Ta=xa?re:ha,_a=da.reduce(function(e,t){return t.accessor&&(e[t.accessor]=t),e},{}),Ia=function(e){Be&&Be(e)},za="client"===B?function(e,t,a){if(!t)return e;var n=String(t).trim().toLowerCase();return n?e.filter(function(e){return a.some(function(t){return va(mt(e,t)).toLowerCase().includes(n)})}):e}(Ie,jt,ca):Ie,Ra="client"===D?function(e,t,a){var n=(a||tt).filter(function(e){return Wt(t,e)});return n.length?e.filter(function(e){return n.every(function(a){return qt(e,t,a)})}):e}(za,Ta,da):za,Ma="client"===y?function(e,t){if(!t||!t.columnAccessor)return e;var a="desc"===t.direction?-1:1,n=t.sortKey||t.columnAccessor,r=Je(e);return r.sort(function(e,t){var r=Ca(mt(e,n)),o=Ca(mt(t,n));return lt(r)&<(o)?0:lt(r)?1:lt(o)?-1:r>o?a:r3&&void 0!==arguments[3]?arguments[3]:0,r=Boolean(null==t?void 0:t.__group),o=!!r&&a.includes(t.__groupId);return k().createElement(O.Box,{component:"span",className:"dash-mantine-datatable-group-cell",style:{paddingInlineStart:"".concat(20*Math.max(n,0),"px")}},k().createElement("span",{"aria-hidden":"true",className:j("dash-mantine-datatable-group-chevron",r?"dash-mantine-datatable-group-chevron-visible":"dash-mantine-datatable-group-chevron-spacer",o&&"dash-mantine-datatable-group-chevron-expanded")}),k().createElement(O.Box,{component:"span",className:"dash-mantine-datatable-group-cell-content"},e))}(null!=e&&e.__group&&(lt(o)||""===o)?String(null!==(n=e.__groupValue)&&void 0!==n?n:""):o,e,Mt,null!==(r=null==e?void 0:e.__groupLevel)&&void 0!==r?r:Z)}})}):on,cn=$t?Oa(l,Zt):void 0,sn=$t?cn.map(function(e){return Ea(e,g,tn,sa,{closeEditor:$a,handleValueChange:Ya,isEditingCell:Ja},rn)}):void 0,dn=ke?{trigger:ke.trigger||"click",allowMultiple:ke.allowMultiple,expandable:function(e){var t=e.record,a=e.index;return!ea(t)&&("function"!=typeof ke.expandable||ke.expandable({record:t,index:a}))},initiallyExpanded:function(e){var t=e.record;return!ea(t)&&Array.isArray(ke.initiallyExpandedRecordIds)&&ke.initiallyExpandedRecordIds.includes(wa(t,p))},expanded:{recordIds:Mt,onRecordIdsChange:function(e){Ia(Xa(e))}},content:function(e){var t=e.record;return ea(t)?null:function(e,t,a){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:at;if(!e)return null;if(k().isValidElement(e)||Array.isArray(e)||st(e))return pa(e,Aa(t,void 0,{accessor:"__rowExpansion__"},a,n),n);if("object"!==et(e))return pa(e,Aa(t,void 0,{accessor:"__rowExpansion__"},a,n),n);if("json"===e.type){var r=e.accessor?mt(t,e.accessor):t;return k().createElement(O.Code,{block:!0,style:{whiteSpace:"pre-wrap"}},JSON.stringify(r,null,2))}if("text"===e.type){var o=e.template?la(e.template,t):fa(t,e,a);return k().createElement(O.Text,{size:"sm"},o)}var i=Array.isArray(e.fields)?e.fields:tt;return k().createElement(O.Paper,{p:"sm",radius:"sm",withBorder:!0},k().createElement(O.Stack,{gap:"xs"},e.title?k().createElement(O.Text,{fw:700},la(e.title,t)):null,i.map(function(e){return k().createElement(O.Group,{align:"flex-start",gap:"xs",grow:!0,key:e.accessor||e.label,wrap:"nowrap"},k().createElement(O.Text,{c:"dimmed",fw:600,size:"sm",style:{minWidth:110}},e.label||e.accessor),k().createElement(O.Box,{style:{flex:1}},function(e,t,a){var n={accessor:e.accessor,template:e.template,presentation:e.presentation,type:e.type,locale:e.locale,currency:e.currency,formatOptions:e.formatOptions,trueLabel:e.trueLabel,falseLabel:e.falseLabel,emptyValue:e.emptyValue,minimumFractionDigits:e.minimumFractionDigits,maximumFractionDigits:e.maximumFractionDigits},r=fa(t,n,a);return"code"===e.type?k().createElement(O.Code,null,r):k().createElement(O.Text,{c:e.color||"dimmed",fw:e.fw,size:e.size||"sm"},r)}(e,t,a)))})))}(ke.content||ke,t,g,sa)}}:void 0,mn=ce?{sorted:lt(ce.sorted)?ce.sorted:ga(ce.sorted,{accessor:"__sort_icon_sorted__"},g,sa),unsorted:lt(ce.unsorted)?ce.unsorted:ga(ce.unsorted,{accessor:"__sort_icon_unsorted__"},g,sa)}:void 0,un=("string"==typeof Se?k().createElement(O.Text,{c:"dimmed",ta:"center"},Se):Se&&"text"===Se.type&&!Se.namespace?k().createElement(O.Text,{c:"dimmed",ta:"center"},Se.value):void 0)||((k().isValidElement(Se)||Array.isArray(Se)||st(Se))&&!lt(Se)?ga(Se,{accessor:"__empty_state__"},g,sa):void 0),bn=lt(Se)&&!lt(De)?ga(De,{accessor:"__no_records_icon__"},g,sa):void 0,An=lt(Ee)?void 0:ga(Ee,{accessor:"__custom_loader__"},g,sa),pn=Ge(Ge({},(nn=Y,it.reduce(function(e,t){return lt(nn[t])||(e[t]=nn[t]),e},{}))),{},{bg:lt(Y.bg)?Y.backgroundColor:Y.bg,h:lt(Y.h)?Y.height:Y.h,mih:lt(Y.mih)?Y.minHeight:Y.mih,mah:lt(Y.mah)?Y.maxHeight:Y.mah,radius:lt(Y.borderRadius)?Y.radius:Y.borderRadius}),hn=Ue||qe?Ge(Ge({},K),{},{layout:(null==K?void 0:K.layout)||"fixed"}):K,gn=Ba(Ce,"color",p),fn=Ba(ve,"backgroundColor",p),Cn=function(e,t){return"function"==typeof e||"string"==typeof e?e:lt(e)?void 0:function(a,n){var r=(Array.isArray(e)?e:[e]).map(function(e){return ka(e,"className",a,n,t)}).filter(Boolean);return r.length?j(r):void 0}}(ye,p),vn=function(e,t){return"function"==typeof e?e:lt(e)?void 0:function(a,n){var r=(Array.isArray(e)?e:[e]).reduce(function(e,r){var o=ka(r,"style",a,n,t);return o&&"object"===et(o)&&!Array.isArray(o)?Ge(Ge({},e),o):e},{});return Object.keys(r).length?r:void 0}}(we,p),yn=Ba(xe,"attributes",p,{merge:!0}),wn=Ue?function(e){return wa(e,p)}:function(e){return"function"==typeof e||"string"==typeof e?e:lt(e)?"id":function(t){return wa(t,e)}}(p),xn=Ne?void 0:q,kn=xn?function(e,t){return(null==e||!e.__group)&&(!Ga||!Ga(e,t))&&(!Ua||Ua(e,t))}:void 0,Bn=qa&&xn?function(e,t){return qa(e,t)||at}:void 0,Sn="rtl"===Y.direction?"rtl":"ltr";return k().createElement(O.DirectionProvider,{detectDirection:!1,initialDirection:Sn,key:"".concat(ee||"datatable","-").concat(Sn)},k().createElement(O.Box,{dir:Sn},k().createElement(Le,Qe({},pn,hn,{id:ee,backgroundColor:pn.bg,bodyRef:Y.bodyRef,borderColor:Y.borderColor,borderRadius:pn.radius,c:Y.c,className:j(Te,_e,Ha&&"dash-mantine-datatable-row-drag-enabled",(Ue||qe)&&"dash-mantine-datatable-grouped",qe&&"dash-mantine-datatable-grouped-child",Y.striped&&"dash-mantine-datatable-striped",Y.highlightOnHover&&"dash-mantine-datatable-highlight-on-hover"),classNames:Y.classNames,columns:$t?void 0:ln,customLoader:An,customRowAttributes:yn,defaultColumnProps:en,emptyState:un,fetching:Y.fetching,groups:sn,height:pn.h,highlightOnHover:Y.highlightOnHover,highlightOnHoverColor:Y.highlightOnHoverColor,idAccessor:wn,isRecordSelectable:kn,getRecordSelectionCheckboxProps:Bn,loadingText:Pe,loaderBackgroundBlur:Y.loaderBackgroundBlur,loaderColor:Y.loaderColor,loaderSize:Y.loaderSize,loaderType:Y.loaderType,maxHeight:pn.mah,minHeight:pn.mih,noHeader:Y.noHeader,noRecordsIcon:bn,noRecordsText:z,onCellClick:function(e){return Ia({cellClick:Da(e,p)})},onCellContextMenu:function(e){return Ia({cellContextMenu:Da(e,p)})},onCellDoubleClick:function(e){var t,a=Da(e,p),n=Xt.find(function(e){return(null==e?void 0:e.accessor)===a.columnAccessor});null==n||!n.editable||null!==(t=e.record)&&void 0!==t&&t.__group||lt(a.recordId)?$a():Dt({columnAccessor:a.columnAccessor,recordId:a.recordId}),Ia({cellDoubleClick:a})},onPageChange:function(e){lt(oe)&&rt(e),Ia({page:e,pagination:{page:e,recordsPerPage:Et,totalRecords:Na,timestamp:Date.now()}})},onRecordsPerPageChange:function(e){lt(E)&<(_)&&ut(e),lt(oe)&&rt(1),Ia({recordsPerPage:e,pageSize:e,page:1,pagination:{page:1,recordsPerPage:e,totalRecords:Na,timestamp:Date.now()}})},onRowClick:function(e){return Ia(Ge(Ge({},ea(e.record)?function(e){var t=wa(e,p);if(lt(t))return at;var a=Mt.includes(t)?Mt.filter(function(e){return e!==t}):ia(Mt,[t]);return Xa(a)}(e.record):at),{},{rowClick:Da(e,p)}))},onRowContextMenu:function(e){return Ia({rowContextMenu:Da(e,p)})},onRowDoubleClick:function(e){return Ia({rowDoubleClick:Da(e,p)})},onScroll:function(e){return Ia({scrollPosition:Ge(Ge({},e),{},{timestamp:Date.now()})})},onScrollToBottom:function(){return Ia({scrollEdge:{edge:"bottom",timestamp:Date.now()}})},onScrollToLeft:function(){return Ia({scrollEdge:{edge:"left",timestamp:Date.now()}})},onScrollToRight:function(){return Ia({scrollEdge:{edge:"right",timestamp:Date.now()}})},onScrollToTop:function(){return Ia({scrollEdge:{edge:"top",timestamp:Date.now()}})},onSelectedRecordsChange:function(e){var t=e.map(function(e){return wa(e,p)});Array.isArray(se)||yt(t),Ia({selectedRecordIds:t,selectedRecords:e,lastSelectionChange:{recordIds:t,records:e,timestamp:Date.now()}})},onSortStatusChange:function(e){le||ft(e),Ia({sortStatus:e,lastSortChange:Ge(Ge({},e),{},{timestamp:Date.now()})})},page:"none"===C?void 0:Pt,paginationActiveBackgroundColor:Oe,paginationActiveTextColor:je,paginationSize:U,paginationWithControls:Y.paginationWithControls,paginationWithEdges:Y.paginationWithEdges,pinFirstColumn:Y.pinFirstColumn,pinLastColumn:Y.pinLastColumn,horizontalSpacing:Y.horizontalSpacing,records:Va,recordsPerPage:"none"===C?void 0:Et,recordsPerPageLabel:V,recordsPerPageOptions:L||M||tt,rowBorderColor:Y.rowBorderColor,rowColor:gn,rowBackgroundColor:fn,rowClassName:Cn,rowFactory:Za,rowExpansion:dn,rowStyle:vn,scrollAreaProps:J,selectedRecords:xn||Rt.length?Qa:void 0,allRecordsSelectionCheckboxProps:Ae,selectionCheckboxProps:be,selectionColumnClassName:me,selectionColumnStyle:ue,selectionTrigger:xn,shadow:Y.shadow,sortIcons:mn,sortStatus:Tt,storeColumnsKey:Y.storeColumnsKey,stickyHeader:Y.stickyHeader,stickyHeaderOffset:Y.stickyHeaderOffset,striped:Y.striped,stripedColor:Y.stripedColor,style:Y.style,styles:Y.styles,tableRef:Y.tableRef,textSelectionDisabled:Y.textSelectionDisabled,totalRecords:"none"===C?void 0:Na,verticalSpacing:Y.verticalSpacing,verticalAlign:Y.verticalAlign,withRowBorders:Y.withRowBorders,withColumnBorders:Y.withColumnBorders,withTableBorder:Y.withTableBorder}))))};Ta.propTypes={id:S().oneOfType([S().string,S().object]),data:S().arrayOf(S().object),records:S().arrayOf(S().object),columns:S().arrayOf(S().object),groups:S().arrayOf(S().object),groupBy:S().oneOfType([S().string,S().arrayOf(S().string)]),childRowsAccessor:S().string,groupAggregations:S().object,idAccessor:S().oneOfType([S().string,S().object,S().arrayOf(S().string)]),locale:S().string,direction:S().oneOf(["ltr","rtl"]),paginationMode:S().oneOf(["client","server","none"]),sortMode:S().oneOf(["client","server"]),searchMode:S().oneOf(["client","server"]),filterMode:S().oneOf(["client","server","none"]),searchQuery:S().string,searchableAccessors:S().arrayOf(S().string),filterValues:S().object,page:S().number,recordsPerPage:S().number,pageSize:S().number,totalRecords:S().number,sortStatus:S().object,selectedRecordIds:S().array,selectedRecords:S().array,expandedRecordIds:S().array,selectionTrigger:S().oneOf(["cell","checkbox"]),selectionColumnClassName:S().string,selectionColumnStyle:S().object,selectionCheckboxProps:S().object,allRecordsSelectionCheckboxProps:S().object,selectableRowRules:S().oneOfType([S().bool,S().object,S().array]),disabledSelectionRowRules:S().oneOfType([S().bool,S().object,S().array]),selectionCheckboxRules:S().oneOfType([S().object,S().array]),rowDragging:S().oneOfType([S().bool,S().object]),rowColor:S().oneOfType([S().string,S().object,S().array]),rowBackgroundColor:S().oneOfType([S().string,S().object,S().array]),rowClassName:S().oneOfType([S().string,S().object,S().array]),rowAttributes:S().oneOfType([S().object,S().array]),rowStyle:S().oneOfType([S().object,S().array]),rowExpansion:S().object,rowClick:S().object,rowDoubleClick:S().object,rowContextMenu:S().object,cellClick:S().object,cellDoubleClick:S().object,cellContextMenu:S().object,pagination:S().object,scrollPosition:S().object,scrollEdge:S().object,lastRowDragChange:S().object,lastSortChange:S().object,lastSelectionChange:S().object,lastExpansionChange:S().object,lastFilterChange:S().object,emptyState:S().oneOfType([S().string,S().object]),noRecordsIcon:S().any,noRecordsText:S().string,recordsPerPageOptions:S().arrayOf(S().number),pageSizeOptions:S().arrayOf(S().number),recordsPerPageLabel:S().string,paginationSize:S().oneOfType([S().string,S().number]),paginationActiveTextColor:S().oneOfType([S().string,S().object]),paginationActiveBackgroundColor:S().oneOfType([S().string,S().object]),loadingText:S().string,tableProps:S().object,scrollAreaProps:S().object,className:S().string,tableClassName:S().string,classNames:S().object,style:S().object,styles:S().object,radius:S().oneOfType([S().string,S().number]),height:S().oneOfType([S().string,S().number]),minHeight:S().oneOfType([S().string,S().number]),maxHeight:S().oneOfType([S().string,S().number]),shadow:S().string,bg:S().oneOfType([S().string,S().object]),c:S().oneOfType([S().string,S().object]),backgroundColor:S().oneOfType([S().string,S().object]),borderColor:S().oneOfType([S().string,S().object]),rowBorderColor:S().oneOfType([S().string,S().object]),stripedColor:S().oneOfType([S().string,S().object]),highlightOnHoverColor:S().oneOfType([S().string,S().object]),withRowBorders:S().bool,withTableBorder:S().bool,withColumnBorders:S().bool,horizontalSpacing:S().oneOfType([S().string,S().number]),verticalSpacing:S().oneOfType([S().string,S().number]),borderRadius:S().oneOfType([S().string,S().number]),striped:S().bool,highlightOnHover:S().bool,textSelectionDisabled:S().bool,fetching:S().bool,loaderBackgroundBlur:S().number,loaderSize:S().oneOfType([S().string,S().number]),loaderType:S().string,loaderColor:S().string,customLoader:S().any,noHeader:S().bool,pinFirstColumn:S().bool,pinLastColumn:S().bool,stickyHeader:S().bool,stickyHeaderOffset:S().oneOfType([S().string,S().number]),verticalAlign:S().oneOf(["top","center","bottom"]),paginationWithEdges:S().bool,paginationWithControls:S().bool,storeColumnsKey:S().string,defaultColumnProps:S().object,defaultColumnRender:S().any,sortIcons:S().object,bodyRef:S().any,tableRef:S().any,m:S().oneOfType([S().string,S().number]),mx:S().oneOfType([S().string,S().number]),my:S().oneOfType([S().string,S().number]),mt:S().oneOfType([S().string,S().number]),mb:S().oneOfType([S().string,S().number]),ms:S().oneOfType([S().string,S().number]),me:S().oneOfType([S().string,S().number]),ml:S().oneOfType([S().string,S().number]),mr:S().oneOfType([S().string,S().number]),p:S().oneOfType([S().string,S().number]),px:S().oneOfType([S().string,S().number]),py:S().oneOfType([S().string,S().number]),pt:S().oneOfType([S().string,S().number]),pb:S().oneOfType([S().string,S().number]),ps:S().oneOfType([S().string,S().number]),pe:S().oneOfType([S().string,S().number]),pl:S().oneOfType([S().string,S().number]),pr:S().oneOfType([S().string,S().number]),w:S().oneOfType([S().string,S().number]),miw:S().oneOfType([S().string,S().number]),maw:S().oneOfType([S().string,S().number]),h:S().oneOfType([S().string,S().number]),mih:S().oneOfType([S().string,S().number]),mah:S().oneOfType([S().string,S().number]),opacity:S().oneOfType([S().string,S().number]),ff:S().string,fz:S().oneOfType([S().string,S().number]),fw:S().oneOfType([S().string,S().number]),lts:S().oneOfType([S().string,S().number]),ta:S().string,lh:S().oneOfType([S().string,S().number]),fs:S().string,tt:S().string,display:S().string,flex:S().oneOfType([S().string,S().number]),bd:S().oneOfType([S().string,S().number]),bdrs:S().oneOfType([S().string,S().number]),td:S().string,bgsz:S().string,bgp:S().string,bgr:S().string,bga:S().string,pos:S().string,top:S().oneOfType([S().string,S().number]),left:S().oneOfType([S().string,S().number]),bottom:S().oneOfType([S().string,S().number]),right:S().oneOfType([S().string,S().number]),inset:S().oneOfType([S().string,S().number]),hiddenFrom:S().string,visibleFrom:S().string,setProps:S().func},Ta.dashChildrenUpdate=!0;const _a=Ta;var Ia=_a;window.dash_mantine_datatable=i})(); +(()=>{"use strict";var e={677(e,t,a){a.d(t,{A:()=>l});var n=a(354),r=a.n(n),o=a(314),i=a.n(o)()(r());i.push([e.id,'@layer mantine-datatable{.mantine-datatable-nowrap{white-space:nowrap}.mantine-datatable-ellipsis{overflow:hidden;text-overflow:ellipsis}.mantine-datatable-pointer-cursor{cursor:pointer}.mantine-datatable-context-menu-cursor{cursor:context-menu}.mantine-datatable-text-selection-disabled{user-select:none}.mantine-datatable-text-align-left{text-align:left}.mantine-datatable-text-align-center{text-align:center}.mantine-datatable-text-align-right{text-align:right}.mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-light,var(--mantine-color-text)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-dark,var(--mantine-color-text)\n )}.mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-light,var(--mantine-color-body)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-dark,var(--mantine-color-body)\n )}.mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-light,var(--mantine-color-gray-3)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-dark,var(--mantine-color-dark-4)\n )}.mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-light,var(--mantine-datatable-border-color)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-dark,var(--mantine-datatable-border-color)\n )}.mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-light,var(--mantine-color-gray-0)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-dark,var(--mantine-color-dark-6)\n )}.mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-light,var(--mantine-color-gray-1)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-dark,var(--mantine-color-dark-5)\n )}.mantine-datatable{--mantine-datatable-selection-color:var(--mantine-primary-color-light);--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.05),transparent),linear-gradient(rgba(0,0,0,.05) 30%,transparent)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.25),transparent),linear-gradient(rgba(0,0,0,.25) 30%,transparent)}.mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.05),transparent),linear-gradient(270deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.25),transparent),linear-gradient(270deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.05)),linear-gradient(transparent 30%,rgba(0,0,0,.05))}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.25)),linear-gradient(transparent 30%,rgba(0,0,0,.25))}.mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.05),transparent),linear-gradient(90deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.25),transparent),linear-gradient(90deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-header-height:0;--mantine-datatable-footer-height:0;--mantine-datatable-selection-column-width:0;--mantine-datatable-top-shadow-opacity:0;--mantine-datatable-left-shadow-opacity:0;--mantine-datatable-bottom-shadow-opacity:0;--mantine-datatable-right-shadow-opacity:0;--mantine-datatable-footer-position:sticky;--mantine-datatable-footer-bottom:0;--mantine-datatable-last-row-border-bottom:unset;background:var(--mantine-datatable-background-color);color:var(--mantine-datatable-color);display:flex;flex-direction:column;overflow:hidden;position:relative}.mantine-datatable td,.mantine-datatable th{border-left:0}[dir=rtl] .mantine-datatable td,[dir=rtl] .mantine-datatable th{border-left:0;border-right:0}[dir=rtl] .mantine-datatable td:not(:first-of-type),[dir=rtl] .mantine-datatable th:not(:first-of-type){border-right:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-with-border{border:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-resizable-columns{table-layout:fixed}.mantine-datatable-resizable-columns th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mantine-datatable-pin-first-column td:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-resizable-columns th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible.mantine-datatable-resizable-columns th:nth-of-type(2),.mantine-datatable-pin-last-column td:last-of-type,.mantine-datatable-pin-last-column.mantine-datatable-resizable-columns th:last-of-type{overflow:visible}.mantine-datatable td[data-accessor=__selection__],.mantine-datatable th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable:not(.mantine-datatable-resizable-columns) th{max-width:none;min-width:auto;white-space:nowrap;width:auto}.mantine-datatable:not(.mantine-datatable-resizable-columns) td[data-accessor=__selection__],.mantine-datatable:not(.mantine-datatable-resizable-columns) th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable-table{background:var(--mantine-datatable-background-color);border-collapse:separate;border-spacing:0;color:inherit}.mantine-datatable-table td,.mantine-datatable-table th{border-color:var(--mantine-datatable-row-border-color)}.mantine-datatable-table tbody,.mantine-datatable-table td,.mantine-datatable-table tfoot,.mantine-datatable-table tfoot tr,.mantine-datatable-table th,.mantine-datatable-table thead,.mantine-datatable-table thead tr{background:inherit}.mantine-datatable-table[data-striped] tbody tr:nth-of-type(odd){background:var(--mantine-datatable-striped-color)}.mantine-datatable-table[data-highlight-on-hover] tbody tr:hover{background:var(--mantine-datatable-highlight-on-hover-color)}.mantine-datatable-table tbody tr:last-of-type{border-bottom:0}.mantine-datatable-table tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:var(--mantine-datatable-last-row-border-bottom)}.mantine-datatable-vertical-align-top td{vertical-align:top}.mantine-datatable-vertical-align-bottom td{vertical-align:bottom}.mantine-datatable-last-row-border-bottom-visible tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}}@layer mantine-datatable{.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,.mantine-datatable-pin-last-column th:last-of-type{position:sticky!important;right:calc(-.025rem*var(--mantine-scale));z-index:1;@-moz-document url-prefix(){right:0}}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type{left:calc(-.025rem*var(--mantine-scale));right:auto;@-moz-document url-prefix(){left:0}}.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,.mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-right:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);pointer-events:none;position:absolute;top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);border-right:0;left:100%;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto;z-index:2}.mantine-datatable-pin-last-column th:last-of-type:after,.mantine-datatable-pin-last-column tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):last-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tfoot th:last-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type{background:inherit}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:var(--mantine-datatable-selection-column-width);position:sticky!important;z-index:1}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:auto;right:var(--mantine-datatable-selection-column-width)}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";opacity:var(--mantine-datatable-left-shadow-opacity);pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);right:auto}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:0}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tfoot th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tfoot th:first-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type{background:inherit}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):before,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-cell-resizable:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th.mantine-datatable-header-cell-resizable:first-of-type,.mantine-datatable-pin-last-column th.mantine-datatable-header-cell-resizable:last-of-type{position:sticky!important}.mantine-datatable-empty-row,.mantine-datatable-table[data-highlight-on-hover] tbody .mantine-datatable-empty-row:hover{background:transparent}.mantine-datatable-empty-state{bottom:0;color:var(--mantine-color-gray-6);flex-direction:column;left:0;pointer-events:none;position:absolute;right:0;top:0}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state{color:var(--mantine-color-dark-3)}.mantine-datatable-empty-state{opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);transition:opacity .2s}.mantine-datatable-empty-state[data-active]{opacity:1}.mantine-datatable-empty-state-icon{background:var(--mantine-color-gray-2);border-radius:50%;font-size:0;padding:var(--mantine-spacing-xs)}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state-icon{background:var(--mantine-color-dark-5)}.mantine-datatable-empty-state-icon{margin-bottom:calc(var(--mantine-spacing-xs)/2)}.mantine-datatable-footer{bottom:var(--mantine-datatable-footer-bottom);position:var(--mantine-datatable-footer-position);z-index:2}.mantine-datatable-footer th{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-footer-selector-placeholder-cell{left:0;position:sticky;width:0}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell{left:auto;right:0}.mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-header{position:sticky;top:0;z-index:2}.mantine-datatable-header th{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-header-column-toggle-checkbox-label{user-select:none}.mantine-datatable-header-cell-sortable{cursor:pointer;transition:background .2s}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{.mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable{border-radius:calc(.375rem*var(--mantine-scale));cursor:grab;transition:all .2s}.mantine-datatable-header-cell-draggable:active{cursor:grabbing}.mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-2)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable-action-icon{cursor:inherit;margin:calc(-.125rem*var(--mantine-scale)) calc(.125rem*var(--mantine-scale)) 0}.mantine-datatable-header-cell-drag-over{background:var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-drag-over{background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-toggleable-icon{opacity:.1;transition:opacity .2s}.mantine-datatable-header-cell-toggleable:hover .mantine-datatable-header-cell-toggleable-icon{opacity:1}.mantine-datatable-header-cell-resizable{position:relative}.mantine-datatable-header-resizable-handle{background:transparent;bottom:0;cursor:col-resize;opacity:0;position:absolute;right:-6px;top:0;transition:opacity .2s;width:12px;z-index:0}.mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-gray-4);bottom:2px;content:"";left:5px;position:absolute;top:2px;width:2px}[data-mantine-color-scheme=dark] .mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-dark-4)}.mantine-datatable-header-resizable-handle:after{border-radius:1px;transition:background-color .2s}[dir=rtl] .mantine-datatable-header-resizable-handle:after{left:auto;right:5px}.mantine-datatable-header-resizable-handle:hover{opacity:1}.mantine-datatable-header-resizable-handle:hover:after{background:var(--mantine-primary-color-6)}.mantine-datatable-header-resizable-handle:active{opacity:1!important}.mantine-datatable-header-resizable-handle:active:after{background:var(--mantine-primary-color-7)}[dir=rtl] .mantine-datatable-header-resizable-handle{left:-6px;right:auto}.mantine-datatable-header-cell-toggleable.mantine-datatable-header-cell-resizable:hover .mantine-datatable-header-resizable-handle,tr:hover .mantine-datatable-header-resizable-handle{opacity:1}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){transition:background .1s}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{transition:background .1s}.mantine-datatable-header-cell-sortable-group{gap:.25em}.mantine-datatable-header-cell-sortable-text{flex-grow:1;min-width:0}.mantine-datatable-header-cell-sortable-icon{transition:transform .2s}.mantine-datatable-header-cell-sortable-icon-reversed{transform:scaleY(-1)}.mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-sortable-unsorted-icon{transition:color .2s}th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-6)}[data-mantine-color-scheme=dark] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-2)}.mantine-datatable-header-cell-filter-action-icon{border:0;color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-filter-action-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-filter-action-icon[data-active]{color:var(--mantine-color-text)}.mantine-datatable-header-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-column-group-header-cell--needs-border{border-inline-end:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-loader{background:color-mix(in srgb,var(--mantine-datatable-background-color),transparent 25%);bottom:0;left:0;opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s;z-index:3}.mantine-datatable-loader-fetching{opacity:1;pointer-events:all}.mantine-datatable-page-size-selector-button-icon{margin:0 calc(-.25rem*var(--mantine-scale)) 0 calc(.125rem*var(--mantine-scale))}[dir=rtl] .mantine-datatable-page-size-selector-button-icon{margin:0 calc(.125rem*var(--mantine-scale)) 0 calc(-.25rem*var(--mantine-scale))}.mantine-datatable-page-size-selector-menu-arrow{z-index:-1}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-page-size-selector-active{background:var(--mantine-datatable-pagination-active-background-color);color:var(--mantine-datatable-pagination-active-text-color);opacity:1}.mantine-datatable-pagination{align-items:center;background:inherit;border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color);display:flex;gap:var(--mantine-spacing-xs);justify-content:space-between}.mantine-datatable-pagination-text{flex:1 1 auto}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-pagination-pages{opacity:1;transition:opacity .2s}.mantine-datatable-pagination-pages-fetching{opacity:0}.mantine-datatable-pagination-pages-control{border-color:var(--mantine-datatable-border-color);color:var(--mantine-datatable-color)}.mantine-datatable-pagination-pages-control[data-active]{background:var(--mantine-datatable-pagination-active-background-color);border-color:transparent;color:var(--mantine-datatable-pagination-active-text-color)}.mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-dark\n )}.mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-dark\n )}.mantine-datatable-row{background:var(--mantine-datatable-row-background-color,inherit);color:var(--mantine-datatable-row-color,inherit)}.mantine-datatable-row[data-with-row-border]:not(:last-of-type) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row[data-selected] td{background:var(--mantine-datatable-selection-color)}.mantine-datatable-row-expansion-cell{padding:0}tr:not(:last-of-type) .mantine-datatable-row-expansion-cell-content{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row-expansion-cell-content{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}[data-with-row-border] .mantine-datatable-row-expansion-cell-content{border-top:0}.mantine-datatable-row-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-row-selector-cell{left:auto;right:0}tr[data-selected] .mantine-datatable-row-selector-cell{background:inherit}tr[data-selected] .mantine-datatable-row-selector-cell:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}tr[data-with-row-border] .mantine-datatable-row-selector-cell:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}tr:last-of-type .mantine-datatable-row-selector-cell:after{bottom:0}.mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-row-selector-cell-checkbox{cursor:pointer}.mantine-datatable-scroll-area{flex:1 1 100%}.mantine-datatable-scroll-area-corner{background:transparent}.mantine-datatable-scroll-area-thumb{z-index:3}.mantine-datatable-scroll-area-scrollbar[data-state=visible]{background:transparent}.mantine-datatable-scroll-area-scrollbar div:before{pointer-events:none}.mantine-datatable-scroll-area-shadow{pointer-events:none;position:absolute;transition:opacity .2s}.mantine-datatable-scroll-area-top-shadow{background:var(--mantine-datatable-shadow-background-top);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-top-shadow-opacity);right:0;top:var(--mantine-datatable-header-height);z-index:2}.mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-left);bottom:0;left:0;opacity:var(--mantine-datatable-left-shadow-opacity);top:0;width:var(--mantine-spacing-xs);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-left-shadow{left:auto}.mantine-datatable-scroll-area-right-shadow,[dir=rtl] .mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-right);opacity:var(--mantine-datatable-right-shadow-opacity);right:0}.mantine-datatable-scroll-area-right-shadow{bottom:0;top:0;width:calc(var(--mantine-spacing-xs)/2);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-right-shadow{background:var(--mantine-datatable-shadow-background-left);left:0;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto}.mantine-datatable-scroll-area-shadow-behind{z-index:0}.mantine-datatable-scroll-area-bottom-shadow{background:var(--mantine-datatable-shadow-background-bottom);bottom:var(--mantine-datatable-footer-height);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-bottom-shadow-opacity);right:0;z-index:2}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}',"",{version:3,sources:["webpack://./node_modules/mantine-datatable/dist/styles.layer.css"],names:[],mappings:"AAAA,yBAAyB,0BAA0B,kBAAkB,CAAC,4BAA4B,eAAe,CAAC,sBAAsB,CAAC,kCAAkC,cAAc,CAAC,uCAAuC,mBAAmB,CAAC,2CAA2C,gBAAgB,CAAC,mCAAmC,eAAe,CAAC,qCAAqC,iBAAiB,CAAC,oCAAoC,gBAAgB,CAAC,mBAAmB;;GAEhe,CAAC,oDAAoD;;GAErD,CAAC,mBAAmB;;GAEpB,CAAC,oDAAoD;;GAErD,CAAC,mBAAmB;;GAEpB,CAAC,oDAAoD;;GAErD,CAAC,mBAAmB;;GAEpB,CAAC,oDAAoD;;GAErD,CAAC,mBAAmB;;GAEpB,CAAC,oDAAoD;;GAErD,CAAC,mBAAmB;;GAEpB,CAAC,oDAAoD;;GAErD,CAAC,mBAAmB,sEAAsE,CAAC,uIAAuI,CAAC,oDAAoD,uIAAuI,CAAC,mBAAmB,uJAAuJ,CAAC,oDAAoD,uJAAuJ,CAAC,mBAAmB,0IAA0I,CAAC,oDAAoD,0IAA0I,CAAC,mBAAmB,oJAAoJ,CAAC,oDAAoD,oJAAoJ,CAAC,mBAAmB,mCAAmC,CAAC,mCAAmC,CAAC,4CAA4C,CAAC,wCAAwC,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,0CAA0C,CAAC,0CAA0C,CAAC,mCAAmC,CAAC,gDAAgD,CAAC,oDAAoD,CAAC,oCAAoC,CAAC,YAAY,CAAC,qBAAqB,CAAC,eAAe,CAAC,iBAAiB,CAAC,4CAA4C,aAAa,CAAC,gEAAgE,aAAa,CAAC,cAAc,CAAC,wGAAwG,gEAAgE,CAAC,+BAA+B,sFAAsF,CAAC,qCAAqC,kBAAkB,CAAC,wCAAwC,eAAe,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,8fAA8f,gBAAgB,CAAC,sGAAsG,wBAAwB,CAAC,wBAAwB,CAAC,oBAAoB,CAAC,gEAAgE,cAAc,CAAC,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,0LAA0L,wBAAwB,CAAC,wBAAwB,CAAC,oBAAoB,CAAC,yBAAyB,oDAAoD,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,aAAa,CAAC,wDAAwD,sDAAsD,CAAC,yNAAyN,kBAAkB,CAAC,iEAAiE,iDAAiD,CAAC,iEAAiE,4DAA4D,CAAC,+CAA+C,eAAe,CAAC,8EAA8E,6DAA6D,CAAC,yCAAyC,kBAAkB,CAAC,4CAA4C,qBAAqB,CAAC,uGAAuG,iGAAiG,CAAC,CAAC,yBAAyB,iJAAiJ,yBAAyB,CAAC,yCAAyC,CAAC,SAAS,CAAC,4BAA4B,OAAO,CAAC,CAAC,qKAAqK,wCAAwC,CAAC,UAAU,CAAC,4BAA4B,MAAM,CAAC,CAAC,6JAA6J,2DAA2D,CAAC,gEAAgE,CAAC,QAAQ,CAAC,UAAU,CAAC,uCAAuC,CAAC,qDAAqD,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,KAAK,CAAC,sBAAsB,CAAC,+BAA+B,CAAC,iLAAiL,0DAA0D,CAAC,+DAA+D,CAAC,cAAc,CAAC,SAAS,CAAC,oDAAoD,CAAC,UAAU,CAAC,SAAS,CAAC,yMAAyM,2CAA2C,CAAC,wCAAwC,CAAC,+DAA+D,wCAAwC,CAAC,gHAAgH,kBAAkB,CAAC,uHAAuH,mDAAmD,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,wuBAAwuB,oDAAoD,CAAC,yBAAyB,CAAC,SAAS,CAAC,oyBAAoyB,SAAS,CAAC,qDAAqD,CAAC,4wBAA4wB,0DAA0D,CAAC,+DAA+D,CAAC,QAAQ,CAAC,UAAU,CAAC,oDAAoD,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,wCAAwC,CAAC,KAAK,CAAC,sBAAsB,CAAC,+BAA+B,CAAC,w0BAAw0B,2DAA2D,CAAC,aAAa,CAAC,gEAAgE,CAAC,uCAAuC,CAAC,qDAAqD,CAAC,UAAU,CAAC,yHAAyH,MAAM,CAAC,mIAAmI,SAAS,CAAC,OAAO,CAAC,+nBAA+nB,2CAA2C,CAAC,wCAAwC,CAAC,+NAA+N,wCAAwC,CAAC,iUAAiU,kBAAkB,CAAC,+UAA+U,mDAAmD,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,kXAAkX,yBAAyB,CAAC,wHAAwH,sBAAsB,CAAC,+BAA+B,QAAQ,CAAC,iCAAiC,CAAC,qBAAqB,CAAC,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,gEAAgE,iCAAiC,CAAC,+BAA+B,SAAS,CAAC,uDAAuD,CAAC,oDAAoD,CAAC,sBAAsB,CAAC,4CAA4C,SAAS,CAAC,oCAAoC,sCAAsC,CAAC,iBAAiB,CAAC,WAAW,CAAC,iCAAiC,CAAC,qEAAqE,sCAAsC,CAAC,oCAAoC,+CAA+C,CAAC,0BAA0B,6CAA6C,CAAC,iDAAiD,CAAC,SAAS,CAAC,6BAA6B,0FAA0F,CAAC,oDAAoD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,8DAA8D,SAAS,CAAC,OAAO,CAAC,0DAA0D,0DAA0D,CAAC,+DAA+D,CAAC,2CAA2C,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,wCAAwC,CAAC,KAAK,CAAC,sBAAsB,CAAC,+BAA+B,CAAC,oEAAoE,2DAA2D,CAAC,aAAa,CAAC,gEAAgE,CAAC,uCAAuC,CAAC,UAAU,CAAC,+EAA+E,oDAAoD,CAAC,yFAAyF,qDAAqD,CAAC,0BAA0B,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,6BAA6B,6FAA6F,CAAC,uDAAuD,gBAAgB,CAAC,wCAAwC,cAAc,CAAC,yBAAyB,CAAC,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,sEAAsE,sCAAsC,CAAC,uGAAuG,sCAAsC,CAAC,yCAAyC,gDAAgD,CAAC,WAAW,CAAC,kBAAkB,CAAC,gDAAgD,eAAe,CAAC,uEAAuE,sCAAsC,CAAC,wGAAwG,sCAAsC,CAAC,qDAAqD,cAAc,CAAC,+EAA+E,CAAC,yCAAyC,sCAAsC,CAAC,0EAA0E,sCAAsC,CAAC,+CAA+C,UAAU,CAAC,sBAAsB,CAAC,+FAA+F,SAAS,CAAC,yCAAyC,iBAAiB,CAAC,2CAA2C,sBAAsB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,sBAAsB,CAAC,UAAU,CAAC,SAAS,CAAC,iDAAiD,sCAAsC,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,kFAAkF,sCAAsC,CAAC,iDAAiD,iBAAiB,CAAC,+BAA+B,CAAC,2DAA2D,SAAS,CAAC,SAAS,CAAC,iDAAiD,SAAS,CAAC,uDAAuD,yCAAyC,CAAC,kDAAkD,mBAAmB,CAAC,wDAAwD,yCAAyC,CAAC,qDAAqD,SAAS,CAAC,UAAU,CAAC,uLAAuL,SAAS,CAAC,gGAAgG,sCAAsC,CAAC,iIAAiI,sCAAsC,CAAC,gGAAgG,yBAAyB,CAAC,mGAAmG,sCAAsC,CAAC,oIAAoI,sCAAsC,CAAC,mGAAmG,yBAAyB,CAAC,8CAA8C,SAAS,CAAC,6CAA6C,WAAW,CAAC,WAAW,CAAC,6CAA6C,wBAAwB,CAAC,sDAAsD,oBAAoB,CAAC,sDAAsD,iCAAiC,CAAC,uFAAuF,iCAAiC,CAAC,sDAAsD,oBAAoB,CAAC,+DAA+D,iCAAiC,CAAC,gGAAgG,iCAAiC,CAAC,kDAAkD,QAAQ,CAAC,iCAAiC,CAAC,mFAAmF,iCAAiC,CAAC,+DAA+D,+BAA+B,CAAC,wCAAwC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,iCAAiC,CAAC,eAAe,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,kDAAkD,SAAS,CAAC,OAAO,CAAC,8CAA8C,0DAA0D,CAAC,+DAA+D,CAAC,2CAA2C,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,wCAAwC,CAAC,KAAK,CAAC,sBAAsB,CAAC,+BAA+B,CAAC,wDAAwD,2DAA2D,CAAC,aAAa,CAAC,gEAAgE,CAAC,uCAAuC,CAAC,UAAU,CAAC,mEAAmE,oDAAoD,CAAC,6EAA6E,qDAAqD,CAAC,0DAA0D,qEAAqE,CAAC,0BAA0B,uFAAuF,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,uDAAuD,CAAC,oDAAoD,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,SAAS,CAAC,mCAAmC,SAAS,CAAC,kBAAkB,CAAC,kDAAkD,gFAAgF,CAAC,4DAA4D,gFAAgF,CAAC,iDAAiD,UAAU,CAAC,6CAA6C;;GAEvwsB,CAAC,8EAA8E;;GAE/E,CAAC,6CAA6C;;GAE9C,CAAC,8EAA8E;;GAE/E,CAAC,6CAA6C,sEAAsE,CAAC,2DAA2D,CAAC,SAAS,CAAC,8BAA8B,kBAAkB,CAAC,kBAAkB,CAAC,0FAA0F,CAAC,YAAY,CAAC,6BAA6B,CAAC,6BAA6B,CAAC,mCAAmC,aAAa,CAAC,oCAAoC;;GAExf,CAAC,qEAAqE;;GAEtE,CAAC,oCAAoC;;GAErC,CAAC,qEAAqE;;GAEtE,CAAC,oCAAoC,SAAS,CAAC,sBAAsB,CAAC,6CAA6C,SAAS,CAAC,4CAA4C,kDAAkD,CAAC,oCAAoC,CAAC,yDAAyD,sEAAsE,CAAC,wBAAwB,CAAC,2DAA2D,CAAC,uBAAuB;;GAE7e,CAAC,wDAAwD;;GAEzD,CAAC,uBAAuB;;GAExB,CAAC,wDAAwD;;GAEzD,CAAC,uBAAuB,gEAAgE,CAAC,gDAAgD,CAAC,mEAAmE,iGAAiG,CAAC,yCAAyC,mDAAmD,CAAC,sCAAsC,SAAS,CAAC,oEAAoE,iGAAiG,CAAC,8CAA8C,8FAA8F,CAAC,qEAAqE,YAAY,CAAC,qCAAqC,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,iCAAiC,CAAC,eAAe,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,+CAA+C,SAAS,CAAC,OAAO,CAAC,uDAAuD,kBAAkB,CAAC,8DAA8D,mDAAmD,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,2CAA2C,0DAA0D,CAAC,+DAA+D,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,wCAAwC,CAAC,KAAK,CAAC,sBAAsB,CAAC,+BAA+B,CAAC,qDAAqD,2DAA2D,CAAC,aAAa,CAAC,gEAAgE,CAAC,uCAAuC,CAAC,UAAU,CAAC,oEAAoE,2CAA2C,CAAC,wCAAwC,CAAC,2DAA2D,QAAQ,CAAC,gEAAgE,oDAAoD,CAAC,0EAA0E,qDAAqD,CAAC,8CAA8C,cAAc,CAAC,+BAA+B,aAAa,CAAC,sCAAsC,sBAAsB,CAAC,qCAAqC,SAAS,CAAC,6DAA6D,sBAAsB,CAAC,oDAAoD,mBAAmB,CAAC,sCAAsC,mBAAmB,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,0CAA0C,yDAAyD,CAAC,wCAAwC,CAAC,MAAM,CAAC,mDAAmD,CAAC,OAAO,CAAC,0CAA0C,CAAC,SAAS,CAAC,2CAA2C,0DAA0D,CAAC,QAAQ,CAAC,MAAM,CAAC,oDAAoD,CAAC,KAAK,CAAC,+BAA+B,CAAC,SAAS,CAAC,qDAAqD,SAAS,CAAC,iGAAiG,2DAA2D,CAAC,qDAAqD,CAAC,OAAO,CAAC,4CAA4C,QAAQ,CAAC,KAAK,CAAC,uCAAuC,CAAC,SAAS,CAAC,sDAAsD,0DAA0D,CAAC,MAAM,CAAC,oDAAoD,CAAC,UAAU,CAAC,6CAA6C,SAAS,CAAC,6CAA6C,4DAA4D,CAAC,6CAA6C,CAAC,wCAAwC,CAAC,MAAM,CAAC,sDAAsD,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB,CAAC,yBAAyB",sourcesContent:['@layer mantine-datatable{.mantine-datatable-nowrap{white-space:nowrap}.mantine-datatable-ellipsis{overflow:hidden;text-overflow:ellipsis}.mantine-datatable-pointer-cursor{cursor:pointer}.mantine-datatable-context-menu-cursor{cursor:context-menu}.mantine-datatable-text-selection-disabled{user-select:none}.mantine-datatable-text-align-left{text-align:left}.mantine-datatable-text-align-center{text-align:center}.mantine-datatable-text-align-right{text-align:right}.mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-light,var(--mantine-color-text)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-dark,var(--mantine-color-text)\n )}.mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-light,var(--mantine-color-body)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-dark,var(--mantine-color-body)\n )}.mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-light,var(--mantine-color-gray-3)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-dark,var(--mantine-color-dark-4)\n )}.mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-light,var(--mantine-datatable-border-color)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-dark,var(--mantine-datatable-border-color)\n )}.mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-light,var(--mantine-color-gray-0)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-dark,var(--mantine-color-dark-6)\n )}.mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-light,var(--mantine-color-gray-1)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-dark,var(--mantine-color-dark-5)\n )}.mantine-datatable{--mantine-datatable-selection-color:var(--mantine-primary-color-light);--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.05),transparent),linear-gradient(rgba(0,0,0,.05) 30%,transparent)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.25),transparent),linear-gradient(rgba(0,0,0,.25) 30%,transparent)}.mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.05),transparent),linear-gradient(270deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.25),transparent),linear-gradient(270deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.05)),linear-gradient(transparent 30%,rgba(0,0,0,.05))}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.25)),linear-gradient(transparent 30%,rgba(0,0,0,.25))}.mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.05),transparent),linear-gradient(90deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.25),transparent),linear-gradient(90deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-header-height:0;--mantine-datatable-footer-height:0;--mantine-datatable-selection-column-width:0;--mantine-datatable-top-shadow-opacity:0;--mantine-datatable-left-shadow-opacity:0;--mantine-datatable-bottom-shadow-opacity:0;--mantine-datatable-right-shadow-opacity:0;--mantine-datatable-footer-position:sticky;--mantine-datatable-footer-bottom:0;--mantine-datatable-last-row-border-bottom:unset;background:var(--mantine-datatable-background-color);color:var(--mantine-datatable-color);display:flex;flex-direction:column;overflow:hidden;position:relative}.mantine-datatable td,.mantine-datatable th{border-left:0}[dir=rtl] .mantine-datatable td,[dir=rtl] .mantine-datatable th{border-left:0;border-right:0}[dir=rtl] .mantine-datatable td:not(:first-of-type),[dir=rtl] .mantine-datatable th:not(:first-of-type){border-right:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-with-border{border:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-resizable-columns{table-layout:fixed}.mantine-datatable-resizable-columns th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mantine-datatable-pin-first-column td:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-resizable-columns th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible.mantine-datatable-resizable-columns th:nth-of-type(2),.mantine-datatable-pin-last-column td:last-of-type,.mantine-datatable-pin-last-column.mantine-datatable-resizable-columns th:last-of-type{overflow:visible}.mantine-datatable td[data-accessor=__selection__],.mantine-datatable th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable:not(.mantine-datatable-resizable-columns) th{max-width:none;min-width:auto;white-space:nowrap;width:auto}.mantine-datatable:not(.mantine-datatable-resizable-columns) td[data-accessor=__selection__],.mantine-datatable:not(.mantine-datatable-resizable-columns) th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable-table{background:var(--mantine-datatable-background-color);border-collapse:separate;border-spacing:0;color:inherit}.mantine-datatable-table td,.mantine-datatable-table th{border-color:var(--mantine-datatable-row-border-color)}.mantine-datatable-table tbody,.mantine-datatable-table td,.mantine-datatable-table tfoot,.mantine-datatable-table tfoot tr,.mantine-datatable-table th,.mantine-datatable-table thead,.mantine-datatable-table thead tr{background:inherit}.mantine-datatable-table[data-striped] tbody tr:nth-of-type(odd){background:var(--mantine-datatable-striped-color)}.mantine-datatable-table[data-highlight-on-hover] tbody tr:hover{background:var(--mantine-datatable-highlight-on-hover-color)}.mantine-datatable-table tbody tr:last-of-type{border-bottom:0}.mantine-datatable-table tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:var(--mantine-datatable-last-row-border-bottom)}.mantine-datatable-vertical-align-top td{vertical-align:top}.mantine-datatable-vertical-align-bottom td{vertical-align:bottom}.mantine-datatable-last-row-border-bottom-visible tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}}@layer mantine-datatable{.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,.mantine-datatable-pin-last-column th:last-of-type{position:sticky!important;right:calc(-.025rem*var(--mantine-scale));z-index:1;@-moz-document url-prefix(){right:0}}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type{left:calc(-.025rem*var(--mantine-scale));right:auto;@-moz-document url-prefix(){left:0}}.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,.mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-right:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);pointer-events:none;position:absolute;top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);border-right:0;left:100%;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto;z-index:2}.mantine-datatable-pin-last-column th:last-of-type:after,.mantine-datatable-pin-last-column tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):last-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tfoot th:last-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type{background:inherit}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:var(--mantine-datatable-selection-column-width);position:sticky!important;z-index:1}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:auto;right:var(--mantine-datatable-selection-column-width)}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";opacity:var(--mantine-datatable-left-shadow-opacity);pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);right:auto}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:0}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tfoot th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tfoot th:first-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type{background:inherit}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):before,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-cell-resizable:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th.mantine-datatable-header-cell-resizable:first-of-type,.mantine-datatable-pin-last-column th.mantine-datatable-header-cell-resizable:last-of-type{position:sticky!important}.mantine-datatable-empty-row,.mantine-datatable-table[data-highlight-on-hover] tbody .mantine-datatable-empty-row:hover{background:transparent}.mantine-datatable-empty-state{bottom:0;color:var(--mantine-color-gray-6);flex-direction:column;left:0;pointer-events:none;position:absolute;right:0;top:0}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state{color:var(--mantine-color-dark-3)}.mantine-datatable-empty-state{opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);transition:opacity .2s}.mantine-datatable-empty-state[data-active]{opacity:1}.mantine-datatable-empty-state-icon{background:var(--mantine-color-gray-2);border-radius:50%;font-size:0;padding:var(--mantine-spacing-xs)}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state-icon{background:var(--mantine-color-dark-5)}.mantine-datatable-empty-state-icon{margin-bottom:calc(var(--mantine-spacing-xs)/2)}.mantine-datatable-footer{bottom:var(--mantine-datatable-footer-bottom);position:var(--mantine-datatable-footer-position);z-index:2}.mantine-datatable-footer th{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-footer-selector-placeholder-cell{left:0;position:sticky;width:0}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell{left:auto;right:0}.mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-header{position:sticky;top:0;z-index:2}.mantine-datatable-header th{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-header-column-toggle-checkbox-label{user-select:none}.mantine-datatable-header-cell-sortable{cursor:pointer;transition:background .2s}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{.mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable{border-radius:calc(.375rem*var(--mantine-scale));cursor:grab;transition:all .2s}.mantine-datatable-header-cell-draggable:active{cursor:grabbing}.mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-2)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable-action-icon{cursor:inherit;margin:calc(-.125rem*var(--mantine-scale)) calc(.125rem*var(--mantine-scale)) 0}.mantine-datatable-header-cell-drag-over{background:var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-drag-over{background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-toggleable-icon{opacity:.1;transition:opacity .2s}.mantine-datatable-header-cell-toggleable:hover .mantine-datatable-header-cell-toggleable-icon{opacity:1}.mantine-datatable-header-cell-resizable{position:relative}.mantine-datatable-header-resizable-handle{background:transparent;bottom:0;cursor:col-resize;opacity:0;position:absolute;right:-6px;top:0;transition:opacity .2s;width:12px;z-index:0}.mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-gray-4);bottom:2px;content:"";left:5px;position:absolute;top:2px;width:2px}[data-mantine-color-scheme=dark] .mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-dark-4)}.mantine-datatable-header-resizable-handle:after{border-radius:1px;transition:background-color .2s}[dir=rtl] .mantine-datatable-header-resizable-handle:after{left:auto;right:5px}.mantine-datatable-header-resizable-handle:hover{opacity:1}.mantine-datatable-header-resizable-handle:hover:after{background:var(--mantine-primary-color-6)}.mantine-datatable-header-resizable-handle:active{opacity:1!important}.mantine-datatable-header-resizable-handle:active:after{background:var(--mantine-primary-color-7)}[dir=rtl] .mantine-datatable-header-resizable-handle{left:-6px;right:auto}.mantine-datatable-header-cell-toggleable.mantine-datatable-header-cell-resizable:hover .mantine-datatable-header-resizable-handle,tr:hover .mantine-datatable-header-resizable-handle{opacity:1}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){transition:background .1s}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{transition:background .1s}.mantine-datatable-header-cell-sortable-group{gap:.25em}.mantine-datatable-header-cell-sortable-text{flex-grow:1;min-width:0}.mantine-datatable-header-cell-sortable-icon{transition:transform .2s}.mantine-datatable-header-cell-sortable-icon-reversed{transform:scaleY(-1)}.mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-sortable-unsorted-icon{transition:color .2s}th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-6)}[data-mantine-color-scheme=dark] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-2)}.mantine-datatable-header-cell-filter-action-icon{border:0;color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-filter-action-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-filter-action-icon[data-active]{color:var(--mantine-color-text)}.mantine-datatable-header-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-column-group-header-cell--needs-border{border-inline-end:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-loader{background:color-mix(in srgb,var(--mantine-datatable-background-color),transparent 25%);bottom:0;left:0;opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s;z-index:3}.mantine-datatable-loader-fetching{opacity:1;pointer-events:all}.mantine-datatable-page-size-selector-button-icon{margin:0 calc(-.25rem*var(--mantine-scale)) 0 calc(.125rem*var(--mantine-scale))}[dir=rtl] .mantine-datatable-page-size-selector-button-icon{margin:0 calc(.125rem*var(--mantine-scale)) 0 calc(-.25rem*var(--mantine-scale))}.mantine-datatable-page-size-selector-menu-arrow{z-index:-1}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-page-size-selector-active{background:var(--mantine-datatable-pagination-active-background-color);color:var(--mantine-datatable-pagination-active-text-color);opacity:1}.mantine-datatable-pagination{align-items:center;background:inherit;border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color);display:flex;gap:var(--mantine-spacing-xs);justify-content:space-between}.mantine-datatable-pagination-text{flex:1 1 auto}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-pagination-pages{opacity:1;transition:opacity .2s}.mantine-datatable-pagination-pages-fetching{opacity:0}.mantine-datatable-pagination-pages-control{border-color:var(--mantine-datatable-border-color);color:var(--mantine-datatable-color)}.mantine-datatable-pagination-pages-control[data-active]{background:var(--mantine-datatable-pagination-active-background-color);border-color:transparent;color:var(--mantine-datatable-pagination-active-text-color)}.mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-dark\n )}.mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-dark\n )}.mantine-datatable-row{background:var(--mantine-datatable-row-background-color,inherit);color:var(--mantine-datatable-row-color,inherit)}.mantine-datatable-row[data-with-row-border]:not(:last-of-type) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row[data-selected] td{background:var(--mantine-datatable-selection-color)}.mantine-datatable-row-expansion-cell{padding:0}tr:not(:last-of-type) .mantine-datatable-row-expansion-cell-content{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row-expansion-cell-content{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}[data-with-row-border] .mantine-datatable-row-expansion-cell-content{border-top:0}.mantine-datatable-row-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-row-selector-cell{left:auto;right:0}tr[data-selected] .mantine-datatable-row-selector-cell{background:inherit}tr[data-selected] .mantine-datatable-row-selector-cell:before{background:var(--mantine-datatable-selection-color);bottom:0;content:"";left:0;position:absolute;right:0;top:0}.mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:"";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}tr[data-with-row-border] .mantine-datatable-row-selector-cell:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}tr:last-of-type .mantine-datatable-row-selector-cell:after{bottom:0}.mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-row-selector-cell-checkbox{cursor:pointer}.mantine-datatable-scroll-area{flex:1 1 100%}.mantine-datatable-scroll-area-corner{background:transparent}.mantine-datatable-scroll-area-thumb{z-index:3}.mantine-datatable-scroll-area-scrollbar[data-state=visible]{background:transparent}.mantine-datatable-scroll-area-scrollbar div:before{pointer-events:none}.mantine-datatable-scroll-area-shadow{pointer-events:none;position:absolute;transition:opacity .2s}.mantine-datatable-scroll-area-top-shadow{background:var(--mantine-datatable-shadow-background-top);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-top-shadow-opacity);right:0;top:var(--mantine-datatable-header-height);z-index:2}.mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-left);bottom:0;left:0;opacity:var(--mantine-datatable-left-shadow-opacity);top:0;width:var(--mantine-spacing-xs);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-left-shadow{left:auto}.mantine-datatable-scroll-area-right-shadow,[dir=rtl] .mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-right);opacity:var(--mantine-datatable-right-shadow-opacity);right:0}.mantine-datatable-scroll-area-right-shadow{bottom:0;top:0;width:calc(var(--mantine-spacing-xs)/2);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-right-shadow{background:var(--mantine-datatable-shadow-background-left);left:0;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto}.mantine-datatable-scroll-area-shadow-behind{z-index:0}.mantine-datatable-scroll-area-bottom-shadow{background:var(--mantine-datatable-shadow-background-bottom);bottom:var(--mantine-datatable-footer-height);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-bottom-shadow-opacity);right:0;z-index:2}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}'],sourceRoot:""}]);const l=i},228(e,t,a){a.d(t,{A:()=>l});var n=a(354),r=a.n(n),o=a(314),i=a.n(o)()(r());i.push([e.id,"@layer mantine, mantine-datatable, dash-mantine-datatable;\n\n@layer dash-mantine-datatable {\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd),\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd) td {\n background: var(--mantine-datatable-striped-color);\n }\n\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover td {\n background: var(--mantine-datatable-highlight-on-hover-color);\n }\n\n .dash-mantine-datatable-striped .mantine-datatable-table tbody,\n .dash-mantine-datatable-striped .mantine-datatable-table tbody td,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody td {\n background: inherit;\n }\n\n .dash-mantine-datatable-row-drag-enabled .mantine-datatable-table tbody tr {\n transition:\n background-color 120ms ease,\n box-shadow 120ms ease,\n opacity 120ms ease;\n }\n\n .dash-mantine-datatable-row-draggable {\n cursor: grab;\n }\n\n .dash-mantine-datatable-row-draggable:active {\n cursor: grabbing;\n }\n\n .dash-mantine-datatable-row-dragging,\n .dash-mantine-datatable-row-dragging td {\n opacity: 0.75;\n }\n\n .dash-mantine-datatable-row-drag-over,\n .dash-mantine-datatable-row-drag-over td {\n background: color-mix(\n in srgb,\n var(--mantine-primary-color-1),\n var(--mantine-datatable-background-color) 35%\n );\n }\n\n .dash-mantine-datatable-row-drag-over td {\n box-shadow: inset 0 2px 0 var(--mantine-primary-color-filled);\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell {\n background: inherit;\n padding: 0;\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content {\n border-bottom: 0;\n border-top: 0;\n padding: 0;\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content > * {\n margin: 0;\n }\n\n .dash-mantine-datatable-grouped-child {\n border-radius: 0;\n box-shadow: none;\n }\n\n .dash-mantine-datatable-grouped-child,\n .dash-mantine-datatable-grouped-child .mantine-datatable,\n .dash-mantine-datatable-grouped-child .mantine-datatable-table {\n background: transparent;\n }\n\n .dash-mantine-datatable-grouped-child .mantine-datatable-table td:first-child,\n .dash-mantine-datatable-grouped-child .mantine-datatable-table th:first-child {\n border-left: 0;\n }\n\n .dash-mantine-datatable-group-cell {\n align-items: center;\n display: inline-flex;\n gap: 8px;\n min-width: 0;\n }\n\n .dash-mantine-datatable-group-cell-content {\n min-width: 0;\n }\n\n .dash-mantine-datatable-group-chevron {\n border-bottom: 1.5px solid currentColor;\n border-right: 1.5px solid currentColor;\n color: var(--mantine-color-dimmed);\n display: inline-block;\n flex: 0 0 7px;\n height: 7px;\n margin-inline-start: 1px;\n transform: rotate(-45deg);\n transform-origin: 55% 55%;\n transition: transform 120ms ease;\n width: 7px;\n }\n\n .dash-mantine-datatable-group-chevron-spacer {\n opacity: 0;\n }\n\n .dash-mantine-datatable-group-chevron-visible {\n opacity: 1;\n }\n\n .dash-mantine-datatable-group-chevron-expanded {\n transform: rotate(45deg);\n }\n\n .dash-mantine-datatable-editable-cell {\n cursor: text;\n display: inline-block;\n min-width: 100%;\n }\n\n .dash-mantine-datatable-editable-cell-active {\n outline: 2px solid color-mix(\n in srgb,\n var(--mantine-primary-color-filled),\n transparent 55%\n );\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .dash-mantine-datatable-editable-dropdown {\n min-width: 180px;\n }\n\n .dash-mantine-datatable-editable-dropdown > * {\n width: 100%;\n }\n\n /* Keep minHeight on the wrapper from stretching body rows. */\n .dash-mantine-datatable-root > .mantine-datatable {\n flex: 0 0 auto;\n }\n\n /* Empty/loading overlays are absolutely positioned; fill the wrapper so\n noRecords/emptyState text can center inside the configured minHeight. */\n .dash-mantine-datatable-root:has(.mantine-datatable-empty-state[data-active])\n > .mantine-datatable,\n .dash-mantine-datatable-root:has(.mantine-datatable-loader-background)\n > .mantine-datatable {\n flex: 1 1 auto;\n min-height: 100%;\n }\n\n .dash-mantine-datatable-root .mantine-datatable-table tbody tr {\n height: auto;\n }\n}\n","",{version:3,sources:["webpack://./src/lib/styles/layers.css"],names:[],mappings:"AAAA,yDAAyD;;AAEzD;IACI;;QAEI,kDAAkD;IACtD;;IAEA;;QAEI,6DAA6D;IACjE;;IAEA;;;;QAII,mBAAmB;IACvB;;IAEA;QACI;;;8BAGsB;IAC1B;;IAEA;QACI,YAAY;IAChB;;IAEA;QACI,gBAAgB;IACpB;;IAEA;;QAEI,aAAa;IACjB;;IAEA;;QAEI;;;;SAIC;IACL;;IAEA;QACI,6DAA6D;IACjE;;IAEA;QACI,mBAAmB;QACnB,UAAU;IACd;;IAEA;QACI,gBAAgB;QAChB,aAAa;QACb,UAAU;IACd;;IAEA;QACI,SAAS;IACb;;IAEA;QACI,gBAAgB;QAChB,gBAAgB;IACpB;;IAEA;;;QAGI,uBAAuB;IAC3B;;IAEA;;QAEI,cAAc;IAClB;;IAEA;QACI,mBAAmB;QACnB,oBAAoB;QACpB,QAAQ;QACR,YAAY;IAChB;;IAEA;QACI,YAAY;IAChB;;IAEA;QACI,uCAAuC;QACvC,sCAAsC;QACtC,kCAAkC;QAClC,qBAAqB;QACrB,aAAa;QACb,WAAW;QACX,wBAAwB;QACxB,yBAAyB;QACzB,yBAAyB;QACzB,gCAAgC;QAChC,UAAU;IACd;;IAEA;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;;IAEA;QACI,wBAAwB;IAC5B;;IAEA;QACI,YAAY;QACZ,qBAAqB;QACrB,eAAe;IACnB;;IAEA;QACI;;;;SAIC;QACD,mBAAmB;QACnB,kBAAkB;IACtB;;IAEA;QACI,gBAAgB;IACpB;;IAEA;QACI,WAAW;IACf;;IAEA,6DAA6D;IAC7D;QACI,cAAc;IAClB;;IAEA;8EAC0E;IAC1E;;;;QAII,cAAc;QACd,gBAAgB;IACpB;;IAEA;QACI,YAAY;IAChB;AACJ",sourcesContent:["@layer mantine, mantine-datatable, dash-mantine-datatable;\r\n\r\n@layer dash-mantine-datatable {\r\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd),\r\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd) td {\r\n background: var(--mantine-datatable-striped-color);\r\n }\r\n\r\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover,\r\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover td {\r\n background: var(--mantine-datatable-highlight-on-hover-color);\r\n }\r\n\r\n .dash-mantine-datatable-striped .mantine-datatable-table tbody,\r\n .dash-mantine-datatable-striped .mantine-datatable-table tbody td,\r\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody,\r\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody td {\r\n background: inherit;\r\n }\r\n\r\n .dash-mantine-datatable-row-drag-enabled .mantine-datatable-table tbody tr {\r\n transition:\r\n background-color 120ms ease,\r\n box-shadow 120ms ease,\r\n opacity 120ms ease;\r\n }\r\n\r\n .dash-mantine-datatable-row-draggable {\r\n cursor: grab;\r\n }\r\n\r\n .dash-mantine-datatable-row-draggable:active {\r\n cursor: grabbing;\r\n }\r\n\r\n .dash-mantine-datatable-row-dragging,\r\n .dash-mantine-datatable-row-dragging td {\r\n opacity: 0.75;\r\n }\r\n\r\n .dash-mantine-datatable-row-drag-over,\r\n .dash-mantine-datatable-row-drag-over td {\r\n background: color-mix(\r\n in srgb,\r\n var(--mantine-primary-color-1),\r\n var(--mantine-datatable-background-color) 35%\r\n );\r\n }\r\n\r\n .dash-mantine-datatable-row-drag-over td {\r\n box-shadow: inset 0 2px 0 var(--mantine-primary-color-filled);\r\n }\r\n\r\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell {\r\n background: inherit;\r\n padding: 0;\r\n }\r\n\r\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content {\r\n border-bottom: 0;\r\n border-top: 0;\r\n padding: 0;\r\n }\r\n\r\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content > * {\r\n margin: 0;\r\n }\r\n\r\n .dash-mantine-datatable-grouped-child {\r\n border-radius: 0;\r\n box-shadow: none;\r\n }\r\n\r\n .dash-mantine-datatable-grouped-child,\r\n .dash-mantine-datatable-grouped-child .mantine-datatable,\r\n .dash-mantine-datatable-grouped-child .mantine-datatable-table {\r\n background: transparent;\r\n }\r\n\r\n .dash-mantine-datatable-grouped-child .mantine-datatable-table td:first-child,\r\n .dash-mantine-datatable-grouped-child .mantine-datatable-table th:first-child {\r\n border-left: 0;\r\n }\r\n\r\n .dash-mantine-datatable-group-cell {\r\n align-items: center;\r\n display: inline-flex;\r\n gap: 8px;\r\n min-width: 0;\r\n }\r\n\r\n .dash-mantine-datatable-group-cell-content {\r\n min-width: 0;\r\n }\r\n\r\n .dash-mantine-datatable-group-chevron {\r\n border-bottom: 1.5px solid currentColor;\r\n border-right: 1.5px solid currentColor;\r\n color: var(--mantine-color-dimmed);\r\n display: inline-block;\r\n flex: 0 0 7px;\r\n height: 7px;\r\n margin-inline-start: 1px;\r\n transform: rotate(-45deg);\r\n transform-origin: 55% 55%;\r\n transition: transform 120ms ease;\r\n width: 7px;\r\n }\r\n\r\n .dash-mantine-datatable-group-chevron-spacer {\r\n opacity: 0;\r\n }\r\n\r\n .dash-mantine-datatable-group-chevron-visible {\r\n opacity: 1;\r\n }\r\n\r\n .dash-mantine-datatable-group-chevron-expanded {\r\n transform: rotate(45deg);\r\n }\r\n\r\n .dash-mantine-datatable-editable-cell {\r\n cursor: text;\r\n display: inline-block;\r\n min-width: 100%;\r\n }\r\n\r\n .dash-mantine-datatable-editable-cell-active {\r\n outline: 2px solid color-mix(\r\n in srgb,\r\n var(--mantine-primary-color-filled),\r\n transparent 55%\r\n );\r\n outline-offset: 2px;\r\n border-radius: 4px;\r\n }\r\n\r\n .dash-mantine-datatable-editable-dropdown {\r\n min-width: 180px;\r\n }\r\n\r\n .dash-mantine-datatable-editable-dropdown > * {\r\n width: 100%;\r\n }\r\n\r\n /* Keep minHeight on the wrapper from stretching body rows. */\r\n .dash-mantine-datatable-root > .mantine-datatable {\r\n flex: 0 0 auto;\r\n }\r\n\r\n /* Empty/loading overlays are absolutely positioned; fill the wrapper so\r\n noRecords/emptyState text can center inside the configured minHeight. */\r\n .dash-mantine-datatable-root:has(.mantine-datatable-empty-state[data-active])\r\n > .mantine-datatable,\r\n .dash-mantine-datatable-root:has(.mantine-datatable-loader-background)\r\n > .mantine-datatable {\r\n flex: 1 1 auto;\r\n min-height: 100%;\r\n }\r\n\r\n .dash-mantine-datatable-root .mantine-datatable-table tbody tr {\r\n height: auto;\r\n }\r\n}\r\n"],sourceRoot:""}]);const l=i},314(e){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var a="",n=void 0!==t[5];return t[4]&&(a+="@supports (".concat(t[4],") {")),t[2]&&(a+="@media ".concat(t[2]," {")),n&&(a+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),a+=e(t),n&&(a+="}"),t[2]&&(a+="}"),t[4]&&(a+="}"),a}).join("")},t.i=function(e,a,n,r,o){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(n)for(var l=0;l0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=o),a&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=a):d[2]=a),r&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=r):d[4]="".concat(r)),t.push(d))}},t}},354(e){e.exports=function(e){var t=e[1],a=e[3];if(!a)return t;if("function"==typeof btoa){var n=btoa(unescape(encodeURIComponent(JSON.stringify(a)))),r="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(n),o="/*# ".concat(r," */");return[t].concat([o]).join("\n")}return[t].join("\n")}},20(e,t,a){var n=a(609),r=Symbol.for("react.element"),o=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,l=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,c={key:!0,ref:!0,__self:!0,__source:!0};function s(e,t,a){var n,o={},s=null,d=null;for(n in void 0!==a&&(s=""+a),void 0!==t.key&&(s=""+t.key),void 0!==t.ref&&(d=t.ref),t)i.call(t,n)&&!c.hasOwnProperty(n)&&(o[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps)void 0===o[n]&&(o[n]=t[n]);return{$$typeof:r,type:e,key:s,ref:d,props:o,_owner:l.current}}t.Fragment=o,t.jsx=s,t.jsxs=s},848(e,t,a){e.exports=a(20)},72(e){var t=[];function a(e){for(var a=-1,n=0;n0?" ".concat(a.layer):""," {")),n+=a.css,r&&(n+="}"),a.media&&(n+="}"),a.supports&&(n+="}");var o=a.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,a)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113(e){e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},609(e){e.exports=window.React}},t={};function a(n){var r=t[n];if(void 0!==r)return r.exports;var o=t[n]={id:n,exports:{}};return e[n](o,o.exports,a),o.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n,r=function(){var e=document.currentScript;if(!e){for(var t=document.getElementsByTagName("script"),a=[],n=0;nRa,DataTable:()=>za});var l=a(72),c=a.n(l),s=a(825),d=a.n(s),m=a(659),u=a.n(m),b=a(56),A=a.n(b),p=a(540),h=a.n(p),g=a(113),f=a.n(g),C=a(677),v={};v.styleTagTransform=f(),v.setAttributes=A(),v.insert=u().bind(null,"head"),v.domAPI=d(),v.insertStyleElement=h(),c()(C.A,v),C.A&&C.A.locals&&C.A.locals;var y=a(228),w={};w.styleTagTransform=f(),w.setAttributes=A(),w.insert=u().bind(null,"head"),w.domAPI=d(),w.insertStyleElement=h(),c()(y.A,w),y.A&&y.A.locals&&y.A.locals;var x=a(609),k=a.n(x);const B=window.PropTypes;var S=a.n(B);function D(e){var t,a,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var r=e.length;for(t=0;t{let{children:t,columnsOrder:a,setColumnsOrder:n,columnsToggle:r,setColumnsToggle:o,resetColumnsOrder:i,resetColumnsToggle:l,setColumnWidth:c,setMultipleColumnWidths:s,resetColumnsWidth:d}=e,[m,u]=(0,x.useState)(""),[b,A]=(0,x.useState)("");return(0,E.jsx)(T,{value:{sourceColumn:m,setSourceColumn:u,targetColumn:b,setTargetColumn:A,columnsToggle:r,setColumnsToggle:o,swapColumns:()=>{if(!(a&&n&&m&&b))return;let e=a.indexOf(m),t=a.indexOf(b);if(-1!==e&&-1!==t){let r=a.splice(e,1)[0];a.splice(t,0,r),n([...a])}},resetColumnsOrder:i,resetColumnsToggle:l,setColumnWidth:c,setMultipleColumnWidths:s,resetColumnsWidth:d},children:t})};function z(){return(0,E.jsx)("tr",{className:"mantine-datatable-empty-row",children:(0,E.jsx)("td",{})})}function R(){return(0,E.jsxs)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M12.983 8.978c3.955 -.182 7.017 -1.446 7.017 -2.978c0 -1.657 -3.582 -3 -8 -3c-1.661 0 -3.204 .19 -4.483 .515m-2.783 1.228c-.471 .382 -.734 .808 -.734 1.257c0 1.22 1.944 2.271 4.734 2.74"}),(0,E.jsx)("path",{d:"M4 6v6c0 1.657 3.582 3 8 3c.986 0 1.93 -.067 2.802 -.19m3.187 -.82c1.251 -.53 2.011 -1.228 2.011 -1.99v-6"}),(0,E.jsx)("path",{d:"M4 12v6c0 1.657 3.582 3 8 3c3.217 0 5.991 -.712 7.261 -1.74m.739 -3.26v-4"}),(0,E.jsx)("path",{d:"M3 3l18 18"})]})}function M({icon:e,text:t,active:a,children:n}){return(0,E.jsx)(O.Center,{className:"mantine-datatable-empty-state","data-active":a||void 0,children:n||(0,E.jsxs)(E.Fragment,{children:[e||(0,E.jsx)("div",{className:"mantine-datatable-empty-state-icon",children:(0,E.jsx)(R,{})}),(0,E.jsx)(O.Text,{component:"div",size:"sm",c:"dimmed",children:t})]})})}var N=({key:e,columns:t=[],getInitialValueInEffect:a=!0,headerRef:n,scrollViewportRef:r,onFixedLayoutChange:o})=>{let{columnsOrder:i,setColumnsOrder:l,resetColumnsOrder:c}=function({key:e,columns:t=[],getInitialValueInEffect:a=!0}){let n=t&&t.map(e=>e.accessor)||[],[r,o]=(0,P.useLocalStorage)({key:e?`${e}-columns-order`:"",defaultValue:e?n:void 0,getInitialValueInEffect:a});function i(t){e&&o(t)}let l=()=>{i(n)};if(!e)return{columnsOrder:r,setColumnsOrder:i,resetColumnsOrder:l};let c=function(e,t){let a=[];return e.forEach(e=>{t.find(t=>t.accessor===e)&&a.push(e)}),t.forEach(e=>{a.includes(e.accessor)||a.push(e.accessor)}),a}(r,t),s=JSON.stringify(r);return JSON.stringify(c)!==s&&i(c),{columnsOrder:c,setColumnsOrder:i,resetColumnsOrder:l}}({key:e,columns:t,getInitialValueInEffect:a}),{columnsToggle:s,setColumnsToggle:d,resetColumnsToggle:m}=function({key:e,columns:t=[],getInitialValueInEffect:a=!0}){let n=t&&t.map(e=>({accessor:e.accessor,defaultToggle:e.defaultToggle||!0,toggleable:e.toggleable,toggled:void 0===e.defaultToggle||e.defaultToggle})),[r,o]=(0,P.useLocalStorage)({key:e?`${e}-columns-toggle`:"",defaultValue:e?n:void 0,getInitialValueInEffect:a});function i(t){e&&o(t)}let l=()=>{i(n)};if(!e)return{columnsToggle:r,setColumnsToggle:i,resetColumnsToggle:l};let c=function(e,t){let a=[];return e.forEach(e=>{t.find(t=>t.accessor===e.accessor)&&a.push(e)}),t.forEach(e=>{a.find(t=>t.accessor===e.accessor)||a.push({accessor:e.accessor,defaultToggle:e.defaultToggle||!0,toggleable:e.toggleable,toggled:void 0===e.defaultToggle||e.defaultToggle})}),a}(r,t),s=JSON.stringify(r);return JSON.stringify(c)!==s&&i(c),{columnsToggle:c,setColumnsToggle:i,resetColumnsToggle:l}}({key:e,columns:t,getInitialValueInEffect:a}),{columnsWidth:u,setColumnsWidth:b,setColumnWidth:A,setMultipleColumnWidths:p,resetColumnsWidth:h,hasResizableColumns:g,allResizableWidthsInitial:f,measureAndSetColumnWidths:C}=function({key:e,columns:t=[],getInitialValueInEffect:a=!0,headerRef:n,onFixedLayoutChange:r}){let o=(0,x.useRef)(!1),i=(0,x.useRef)({}),[l,c]=(0,x.useState)(!0),s=(0,x.useMemo)(()=>t.some(e=>e.resizable&&!e.hidden&&"__selection__"!==e.accessor),[t]),d=(0,x.useMemo)(()=>t.filter(e=>e.resizable&&!e.hidden&&"__selection__"!==e.accessor),[t]),m=(0,x.useMemo)(()=>d.some(e=>void 0===e.width||""===e.width||"initial"===e.width),[d]),u=(0,x.useCallback)(()=>t.filter(e=>"__selection__"!==e.accessor).map(e=>({[e.accessor]:e.width??"auto"})),[t]),[b,A]=(0,P.useLocalStorage)({key:e?`${e}-columns-width`:"",defaultValue:e?u():void 0,getInitialValueInEffect:!1}),[p,h]=(0,x.useState)(()=>u());(0,x.useEffect)(()=>{c(!1)},[]);let g=(0,x.useCallback)(()=>{if(!n?.current||l)return{};let e=n.current,t=Array.from(e.querySelectorAll("th[data-accessor]")),a={};return t.forEach(e=>{let t=e.getAttribute("data-accessor");if(!t||"__selection__"===t)return;let n=d.find(e=>e.accessor===t);if(n&&(void 0===n.width||""===n.width||"initial"===n.width)){let n=e.getBoundingClientRect();a[t]=Math.round(n.width)}}),a},[n,d,l]),f=(0,x.useCallback)(t=>{let a=t.filter(e=>"__selection__"!==e.accessor),n=p.map(e=>{let t=Object.keys(e)[0],n=a.find(e=>e.accessor===t);return n?{[t]:n.width}:e});h(n),e&&A(n)},[p,e,A]),C=(0,x.useCallback)(e=>{f(e)},[f]),v=(0,x.useCallback)(()=>{if(n?.current&&r&&!l)if(m)r(!1),requestAnimationFrame(()=>{requestAnimationFrame(()=>{let e=g();i.current={...i.current,...e};let a=t.filter(e=>"__selection__"!==e.accessor).map(t=>{let a=t.accessor,n=b?.find(e=>Object.keys(e)[0]===a);if(n&&"auto"!==n[a])return{[a]:n[a]};let r=e[a];return r?{[a]:`${r}px`}:{[a]:t.width??"auto"}});h(a),setTimeout(()=>{r(!0),o.current=!0},10)})});else{let e=t.filter(e=>"__selection__"!==e.accessor).map(e=>({[e.accessor]:e.width??"auto"}));h(e),r(!0),o.current=!0}},[n,r,l,m,g,t,b]),y=v;(0,x.useEffect)(()=>{if(!s||!r||l)return void r?.(!1);o.current=!1;let e=setTimeout(()=>{v()},50);return()=>clearTimeout(e)},[s,r,l,v]),(0,x.useEffect)(()=>{l||!e||!a||b&&b.length>0&&h(b)},[l,e,a,b]);let w=(0,x.useCallback)(()=>{e&&A(u()),i.current={},o.current=!1,r&&(r(!1),setTimeout(()=>{v()},10))},[e,A,u,r,v]),k=(0,x.useCallback)((e,t)=>{f([{accessor:e,width:t}])},[f]),B=(0,x.useMemo)(()=>!!s&&p.filter(e=>{let t=Object.keys(e)[0];return d.some(e=>e.accessor===t)}).every(e=>{let t=Object.values(e)[0];return"auto"===t||"initial"===t}),[s,p,d]);return{columnsWidth:p,setColumnsWidth:f,setColumnWidth:k,setMultipleColumnWidths:C,resetColumnsWidth:w,hasResizableColumns:s,allResizableWidthsInitial:B,measureAndSetColumnWidths:y}}({key:e,columns:t,getInitialValueInEffect:a,headerRef:n,scrollViewportRef:r,onFixedLayoutChange:o});return{effectiveColumns:(0,x.useMemo)(()=>i?i.map(e=>t.find(t=>t.accessor===e)).map(e=>({...e,hidden:e?.hidden||!s.find(t=>t.accessor===e?.accessor)?.toggled})).map(e=>"__selection__"===e?.accessor?e:{...e,width:u.find(t=>t[e?.accessor])?.[e?.accessor]}):t,[t,i,s,u]),setColumnsOrder:l,columnsOrder:i,resetColumnsOrder:c,columnsToggle:s,setColumnsToggle:d,resetColumnsToggle:m,columnsWidth:u,setColumnsWidth:b,setColumnWidth:A,setMultipleColumnWidths:p,resetColumnsWidth:h,hasResizableColumns:g,allResizableWidthsInitial:f,measureAndSetColumnWidths:C}},W=typeof window<"u"?x.useLayoutEffect:x.useEffect;function L(e){let t=(0,x.useRef)(e);return t.current=e,t}var F="--mantine-datatable-header-height",V="--mantine-datatable-footer-height",Q="--mantine-datatable-selection-column-width",U="--mantine-datatable-last-row-border-bottom";function G(e,t,a){e?.style.setProperty(t,a)}function q(e){let t=e.borderBoxSize?.[0]||e.contentBoxSize?.[0];return t?{width:t.inlineSize,height:t.blockSize}:{width:e.contentRect.width,height:e.contentRect.height}}function H(e,t,a){if(e){let n=new ResizeObserver(e=>{let a=e[0];a&&t(q(a))});return n.observe(e),()=>{n.disconnect(),a()}}}function K(e,t,{getInitialValueInEffect:a}={getInitialValueInEffect:!0}){let[n,r]=(0,x.useState)(a?t:function(e,t){return t||(typeof window<"u"&&"matchMedia"in window?e.map(e=>window.matchMedia(e).matches):e.map(()=>!1))}(e,t)),o=(0,x.useRef)(null);return(0,x.useEffect)(()=>{if("matchMedia"in window)return o.current=e.map(e=>window.matchMedia(e)),r(o.current.map(e=>e.matches)),function(e){let t=()=>{var t;t=e.map(e=>e.matches),r(t)},a=e.map(e=>{try{return e.addEventListener("change",t),()=>e.removeEventListener("change",t)}catch{return e.addListener(t),()=>e.removeListener(t)}});return()=>{a.forEach(e=>e())}}(o.current)},[e]),n}function $(e){let t=(0,O.useMantineTheme)(),a="function"==typeof e?e(t):e;return(0,P.useMediaQuery)(a||"",!0)}function J(e){let t=e.replace(/([a-z\d])([A-Z]+)/g,"$1 $2").replace(/\W|_/g," ").trim().toLowerCase();return`${t.charAt(0).toUpperCase()}${t.slice(1)}`}function Y(e,t){return e.filter((e,a,n)=>a===n.findIndex(a=>t(e)===t(a)))}function X(e,t){return t?t.match(/([^[.\]])+/g).reduce((e,t)=>e&&e[t],e):void 0}function Z(e,t){return"string"==typeof t?X(e,t):t(e)}function ee(e){return e&&0!==e.length?Math.max(...e.map(e=>e.groups&&e.groups.length>0?1+ee(e.groups):1)):0}function te(e){let t=[];for(let a of e)a.columns&&a.columns.length>0?t.push(...a.columns.filter(e=>null!=e)):a.groups&&a.groups.length>0&&t.push(...te(a.groups));return t.filter(e=>null!=e)}function ae(e,t){return e.columns&&e.columns.length>0?e.columns.filter((e,a)=>!(e.hidden||t&&!1===t[a])).length:e.groups&&e.groups.length>0?e.groups.reduce((e,a)=>e+ae(a,t),0):0}function ne(e,t,a=0){if(a===t)return[...e];let n=[];for(let r of e)r.groups&&r.groups.length>0&&n.push(...ne(r.groups,t,a+1));return n}var re="mantine-datatable-nowrap",oe="mantine-datatable-ellipsis",ie="mantine-datatable-pointer-cursor",le="mantine-datatable-context-menu-cursor",ce="mantine-datatable-text-selection-disabled",se="mantine-datatable-text-align-left",de="mantine-datatable-text-align-center",me="mantine-datatable-text-align-right";function ue({className:e,style:t,visibleMediaQuery:a,title:n,noWrap:r,ellipsis:o,textAlign:i,width:l}){return $(a)?(0,E.jsx)(O.TableTh,{className:j({[re]:r||o,[oe]:o,[se]:"left"===i,[de]:"center"===i,[me]:"right"===i},e),style:[{width:l,minWidth:l,maxWidth:l},t],children:n}):null}function be({shadowVisible:e}){return(0,E.jsx)(O.TableTh,{className:"mantine-datatable-footer-selector-placeholder-cell","data-shadow-visible":e||void 0})}function Ae({className:e,style:t,columns:a,defaultColumnProps:n,selectionVisible:r,selectorCellShadowVisible:o,ref:i}){return(0,E.jsx)(O.TableTfoot,{ref:i,className:j("mantine-datatable-footer",e),style:t,children:(0,E.jsxs)(O.TableTr,{children:[r&&(0,E.jsx)(be,{shadowVisible:o}),a.map(({hidden:e,...t})=>{if(e)return null;let{accessor:a,visibleMediaQuery:r,textAlign:o,width:i,footer:l,footerClassName:c,footerStyle:s,noWrap:d,ellipsis:m}={...n,...t};return(0,E.jsx)(ue,{className:c,style:s,visibleMediaQuery:r,textAlign:o,width:i,title:l,noWrap:d,ellipsis:m},a)})]})})}function pe({group:{id:e,columns:t,groups:a,title:n,textAlign:r,className:o,style:i},maxDepth:l,currentDepth:c,previousGroups:s,isLastGroup:d,withColumnBorders:m=!1,totalTableColumns:u}){let b=(0,x.useMemo)(()=>t&&t.length>0?t:a&&a.length>0?te([{id:e,columns:t,groups:a}]):[],[t,a,e]),A=function(e){let t=(0,O.useMantineTheme)();return K((0,x.useMemo)(()=>e.map(e=>("function"==typeof e?e(t):e)??""),[e,t]),(0,x.useMemo)(()=>e.map(()=>!0),[e]))}((0,x.useMemo)(()=>b.map(({visibleMediaQuery:e})=>e),[b])),p=(0,x.useMemo)(()=>ae({id:e,columns:t,groups:a},A),[e,t,a,A]),h=(0,x.useMemo)(()=>s.reduce((e,t)=>e+ae(t,A),0),[s,A]),g=a&&a.length>0?1:l-c,f=function(e,t,a){return!!a&&(!e||t)}(d,h+p0?(0,E.jsx)(O.TableTh,{colSpan:p,rowSpan:g>1?g:void 0,className:j("mantine-datatable-column-group-header-cell",{[se]:"left"===r,[de]:"center"===r,[me]:"right"===r,"mantine-datatable-column-group-header-cell--needs-border":f},o),style:i,children:n??J(e)}):null}function he(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z"})]})}function ge(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M20 3h-16a1 1 0 0 0 -1 1v2.227l.008 .223a3 3 0 0 0 .772 1.795l4.22 4.641v8.114a1 1 0 0 0 1.316 .949l6 -2l.108 -.043a1 1 0 0 0 .576 -.906v-6.586l4.121 -4.12a3 3 0 0 0 .879 -2.123v-2.171a1 1 0 0 0 -1 -1z",strokeWidth:"0",fill:"currentColor"})]})}function fe({children:e,isActive:t,filterPopoverProps:a,filterPopoverDisableClickOutside:n}){let[r,{close:o,toggle:i}]=(0,P.useDisclosure)(!1),l=t?ge:he,c=(0,P.useClickOutside)(o);return n&&(c=void 0),(0,E.jsxs)(O.Popover,{withArrow:!0,shadow:"md",opened:r,onClose:o,trapFocus:!0,...a,children:[(0,E.jsx)(O.PopoverTarget,{children:(0,E.jsx)(O.ActionIcon,{className:"mantine-datatable-header-cell-filter-action-icon","data-active":t||void 0,size:"sm",variant:"default",onClick:e=>{e.preventDefault(),i()},onKeyDown:e=>e.stopPropagation(),children:(0,E.jsx)(l,{})})}),(0,E.jsx)(O.PopoverDropdown,{ref:c,onClick:e=>e.stopPropagation(),onKeyDown:e=>e.stopPropagation(),children:"function"==typeof e?e({close:o}):e})]})}var Ce=e=>{let{accessor:t,columnRef:a}=e,[n,r]=(0,x.useState)(!1),o=(0,x.useRef)(0),i=(0,x.useRef)({current:0,next:0}),{dir:l}=(0,O.useDirection)(),c="rtl"===l,{setMultipleColumnWidths:s}=_(),d=(0,x.useCallback)(e=>{if(e.preventDefault(),e.stopPropagation(),!a.current)return;let n=a.current,l=n.nextElementSibling;for(;l;){let e=l.getAttribute("data-accessor");if(e&&"__selection__"!==e)break;l=l.nextElementSibling}if(!l)return;let d=l.getAttribute("data-accessor");if(!d)return;let m="__selection__"===d;r(!0),o.current=e.clientX;let u=n.offsetWidth,b=l.offsetWidth;i.current={current:u,next:b};let A=e=>{if(!a.current)return;let t=a.current,n=t.nextElementSibling;if(!n)return;let r=e.clientX-o.current;c&&(r=-r);let l=i.current.current-50,s=i.current.next-50,d=Math.max(-l,Math.min(r,s)),m=i.current.current+d,u=i.current.next-d;t.style.width=`${m}px`,n.style.width=`${u}px`,t.style.minWidth=`${m}px`,t.style.maxWidth=`${m}px`,n.style.minWidth=`${u}px`,n.style.maxWidth=`${u}px`},p=()=>{if(!a.current)return;let e=a.current,n=e.nextElementSibling;r(!1),document.body.style.cursor="initial",document.body.style.userSelect="initial";let o=parseInt(e.style.width)||e.offsetWidth,i=n?parseInt(n.style.width)||n.offsetWidth:0,l=[{accessor:t,width:`${o}px`}];if(n&&!m){let e=n.getAttribute("data-accessor");e&&l.push({accessor:e,width:`${i}px`})}setTimeout(()=>{s(l)},0),document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",p)};document.body.style.cursor="col-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",A),document.addEventListener("mouseup",p)},[t,a,c,s]),m=(0,x.useCallback)(()=>{if(!a.current)return;let e=a.current,n=e.nextElementSibling;e.style.width="",e.style.minWidth="",e.style.maxWidth="";let r=[{accessor:t,width:"auto"}];if(n){n.style.width="",n.style.minWidth="",n.style.maxWidth="";let e=n.getAttribute("data-accessor");e&&"__selection__"!==e&&r.push({accessor:e,width:"auto"})}setTimeout(()=>{s(r)},0)},[t,a,s]);return(0,E.jsx)("div",{className:"mantine-datatable-header-resizable-handle",style:{cursor:n?"col-resize":void 0},onMouseDown:d,onDoubleClick:m,onClick:e=>e.stopPropagation(),title:"Drag to resize column, double-click to reset"})};function ve(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M12 5l0 14"}),(0,E.jsx)("path",{d:"M16 9l-4 -4"}),(0,E.jsx)("path",{d:"M8 9l4 -4"})]})}function ye(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M8 7l4 -4l4 4"}),(0,E.jsx)("path",{d:"M8 17l4 4l4 -4"}),(0,E.jsx)("path",{d:"M12 3l0 18"})]})}function we(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M9 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M9 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M9 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M15 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M15 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"}),(0,E.jsx)("path",{d:"M15 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"})]})}function xe(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M18 6l-12 12"}),(0,E.jsx)("path",{d:"M6 6l12 12"})]})}function ke({className:e,style:t,accessor:a,visibleMediaQuery:n,title:r,sortable:o,draggable:i,toggleable:l,resizable:c,sortIcons:s,textAlign:d,width:m,sortStatus:u,onSortStatusChange:b,filter:A,filterPopoverProps:p,filterPopoverDisableClickOutside:h,filtering:g,sortKey:f}){let{setSourceColumn:C,setTargetColumn:v,swapColumns:y,setColumnsToggle:w}=_(),[k,B]=(0,x.useState)(!1),S=(0,x.useRef)(null);if(!$(n))return null;let D=r??J(a),P="string"==typeof D?D:void 0,T=o&&b?e=>{e?.defaultPrevented||b({sortKey:f,columnAccessor:a,direction:u?.columnAccessor===a?"asc"===u.direction?"desc":"asc":u?.direction??"asc"})}:void 0;return(0,E.jsxs)(O.TableTh,{"data-accessor":a,className:j({"mantine-datatable-header-cell-sortable":o,"mantine-datatable-header-cell-toggleable":l,"mantine-datatable-header-cell-resizable":c},e),style:[{width:m,...c?{}:{minWidth:m,maxWidth:m}},t],role:o?"button":void 0,tabIndex:o?0:void 0,onClick:T,onKeyDown:e=>"Enter"===e.key&&T?.(),ref:S,children:[(0,E.jsxs)(O.Group,{className:"mantine-datatable-header-cell-sortable-group",justify:"space-between",wrap:"nowrap",children:[(0,E.jsxs)(O.Flex,{align:"center",w:"100%",className:j({"mantine-datatable-header-cell-draggable":i,"mantine-datatable-header-cell-drag-over":k}),draggable:i,onDragStart:i?e=>{e.stopPropagation(),C(a),B(!1)}:void 0,onDragEnter:i?()=>{B(!0)}:void 0,onDragOver:i?e=>{e.preventDefault(),v(a),B(!0)}:void 0,onDrop:i?()=>{v(a),B(!1),y()}:void 0,onDragLeave:i?()=>{B(!1)}:void 0,children:[i?(0,E.jsx)(O.Center,{role:"img","aria-label":"Drag column",children:(0,E.jsx)(O.ActionIcon,{className:"mantine-datatable-header-cell-draggable-action-icon",variant:"subtle",size:"xs",onClick:e=>{e.stopPropagation()},children:(0,E.jsx)(we,{})})}):null,(0,E.jsx)(O.Box,{className:j("mantine-datatable-header-cell-sortable-text",{[se]:"left"===d,[de]:"center"===d,[me]:"right"===d},re,oe),title:P,children:D})]}),l?(0,E.jsx)(O.Center,{className:"mantine-datatable-header-cell-toggleable-icon",role:"img","aria-label":"Toggle column",children:(0,E.jsx)(O.ActionIcon,{size:"xs",variant:"light",onClick:e=>{e.stopPropagation(),w(e=>e.map(e=>e.accessor===a?{...e,toggled:!1}:e))},children:(0,E.jsx)(xe,{})})}):null,o||u?.columnAccessor===a?(0,E.jsx)(E.Fragment,{children:u?.columnAccessor===a?(0,E.jsx)(O.Center,{className:j("mantine-datatable-header-cell-sortable-icon",{"mantine-datatable-header-cell-sortable-icon-reversed":"desc"===u.direction}),role:"img","aria-label":"Sorted "+("desc"===u.direction?"descending":"ascending"),children:s?.sorted||(0,E.jsx)(ve,{})}):(0,E.jsx)(O.Center,{className:"mantine-datatable-header-cell-sortable-unsorted-icon",role:"img","aria-label":"Not sorted",children:s?.unsorted||(0,E.jsx)(ye,{})})}):null,A?(0,E.jsx)(fe,{filterPopoverProps:p,isActive:!!g,filterPopoverDisableClickOutside:h,children:A}):null]}),c&&"__selection__"!==a?(0,E.jsx)(Ce,{accessor:a,columnRef:S}):null]})}function Be({className:e,style:t,trigger:a,shadowVisible:n,checked:r,indeterminate:o,checkboxProps:i,onChange:l,rowSpan:c,ref:s}){let d=!i.disabled;return(0,E.jsx)(O.TableTh,{ref:s,className:j("mantine-datatable-header-selector-cell",{[ie]:"cell"===a&&d},e),style:t,rowSpan:c,"data-shadow-visible":n||void 0,"data-accessor":"__selection__",onClick:"cell"===a&&d?l:void 0,children:(0,E.jsx)(O.Checkbox,{classNames:d?{input:ie}:void 0,checked:r,indeterminate:o,onChange:l,...i,disabled:!(l||i.onChange)||i.disabled})})}function Se({selectionColumnHeaderRef:e,className:t,style:a,sortStatus:n,sortIcons:r,onSortStatusChange:o,columns:i,defaultColumnProps:l,groups:c,selectionTrigger:s,selectionVisible:d,selectionChecked:m,selectionIndeterminate:u,onSelectionChange:b,selectionCheckboxProps:A,selectorCellShadowVisible:p,selectionColumnClassName:h,selectionColumnStyle:g,withColumnBorders:f=!1,ref:C}){let v=c?ee(c):0,y=v>0?v+1:1,w=d?(0,E.jsx)(Be,{ref:e,className:h,style:g,trigger:s,shadowVisible:p,checked:m,indeterminate:u,checkboxProps:A,onChange:b,rowSpan:c?y:void 0}):null,{columnsToggle:k,setColumnsToggle:B}=_(),[S,D]=(0,x.useState)(!1),P=i.some(e=>e.toggleable),T=P?Object.fromEntries(i.map(({accessor:e,title:t})=>[e,t??J(String(e))])):void 0,I=(0,E.jsxs)(O.TableThead,{className:j("mantine-datatable-header",t),style:a,ref:C,onContextMenu:P?e=>{e.preventDefault(),D(e=>!e)}:void 0,children:[c&&Array.from({length:v},(e,t)=>{let a=ne(c,t);return(0,E.jsxs)(O.TableTr,{children:[0===t&&w,a.map((e,n)=>(0,E.jsx)(pe,{group:e,maxDepth:v,currentDepth:t,previousGroups:a.slice(0,n),isLastGroup:n===a.length-1,withColumnBorders:f,totalTableColumns:i.length},e.id))]},`group-depth-${t}`)}),(0,E.jsxs)(O.TableTr,{children:[!c&&w,i.map(({hidden:e,...t},a)=>{if(e)return null;let{accessor:c,visibleMediaQuery:s,textAlign:d,width:m,title:u,sortable:b,draggable:A,toggleable:p,resizable:h,titleClassName:g,titleStyle:f,filter:C,filterPopoverProps:v,filterPopoverDisableClickOutside:y,filtering:w,sortKey:x}={...l,...t};return(0,E.jsx)(ke,{accessor:c,className:g,style:f,visibleMediaQuery:s,textAlign:d,width:m,title:u,sortable:b,draggable:A,toggleable:p,resizable:h&&ae.toggleable).map(e=>(0,E.jsx)(O.Group,{children:(0,E.jsx)(O.Checkbox,{classNames:{label:"mantine-datatable-header-column-toggle-checkbox-label"},size:"xs",label:T[e.accessor],checked:e.toggled,onChange:t=>{B(k.map(a=>a.accessor===e.accessor?{...a,toggled:t.currentTarget.checked}:a))}})},e.accessor))})})]}):I}function De({fetching:e,customContent:t,backgroundBlur:a,size:n,type:r,color:o}){return(0,E.jsx)(O.Center,{className:j("mantine-datatable-loader",{"mantine-datatable-loader-fetching":e}),style:[{backdropFilter:a?`blur(${a}px)`:void 0}],children:e&&(t||(0,E.jsx)(O.Loader,{size:n,type:r,color:o}))})}function je(e,t,a){return e?(0,O.parseThemeColor)({color:"object"==typeof e?e[a]:e,theme:t}).value:void 0}function Oe({theme:e,c:t,backgroundColor:a,borderColor:n,rowBorderColor:r,stripedColor:o,highlightOnHoverColor:i}){return{"--mantine-datatable-color-light":je(t,e,"light"),"--mantine-datatable-color-dark":je(t,e,"dark"),"--mantine-datatable-background-color-light":je(a,e,"light"),"--mantine-datatable-background-color-dark":je(a,e,"dark"),"--mantine-datatable-border-color-light":je(n,e,"light"),"--mantine-datatable-border-color-dark":je(n,e,"dark"),"--mantine-datatable-row-border-color-light":je(r,e,"light"),"--mantine-datatable-row-border-color-dark":je(r,e,"dark"),"--mantine-datatable-striped-color-light":je(o,e,"light"),"--mantine-datatable-striped-color-dark":je(o,e,"dark"),"--mantine-datatable-highlight-on-hover-color-light":je(i,e,"light"),"--mantine-datatable-highlight-on-hover-color-dark":je(i,e,"dark")}}function Pe({theme:e,paginationActiveTextColor:t,paginationActiveBackgroundColor:a}){return{"--mantine-datatable-pagination-active-text-color-light":je(t,e,"light"),"--mantine-datatable-pagination-active-text-color-dark":je(t,e,"dark"),"--mantine-datatable-pagination-active-background-color-light":je(a,e,"light"),"--mantine-datatable-pagination-active-background-color-dark":je(a,e,"dark")}}function Ee(){return(0,E.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",strokeWidth:"2",stroke:"currentColor",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,E.jsx)("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),(0,E.jsx)("path",{d:"M8 9l4 -4l4 4"}),(0,E.jsx)("path",{d:"M16 15l-4 4l-4 -4"})]})}var Te={xs:(0,O.rem)(22),sm:(0,O.rem)(26),md:(0,O.rem)(32),lg:(0,O.rem)(38),xl:(0,O.rem)(44)};function _e({size:e,label:t,values:a,value:n,activeTextColor:r,activeBackgroundColor:o,onChange:i}){return(0,E.jsxs)(O.Group,{gap:"xs",children:[(0,E.jsx)(O.Text,{component:"div",size:e,children:t}),(0,E.jsxs)(O.Menu,{withinPortal:!0,withArrow:!0,offset:2,classNames:{arrow:"mantine-datatable-page-size-selector-menu-arrow"},children:[(0,E.jsx)(O.MenuTarget,{children:(0,E.jsx)(O.Button,{size:e,variant:"default",classNames:{section:"mantine-datatable-page-size-selector-button-icon"},rightSection:(0,E.jsx)(Ee,{}),style:[{fontWeight:"normal"},t=>({height:Te[e],paddingLeft:t.spacing[e],paddingRight:t.spacing[e]})],children:n})}),(0,E.jsx)(O.MenuDropdown,{children:a.map(t=>{let a=t===n;return(0,E.jsx)(O.MenuItem,{className:j({"mantine-datatable-page-size-selector-active":a}),style:[{height:Te[e]},a&&(r||o)?e=>Pe({theme:e,paginationActiveTextColor:r,paginationActiveBackgroundColor:o}):void 0],disabled:a,onClick:()=>i(t),children:(0,E.jsx)(O.Text,{component:"div",size:e,children:t})},t)})})]})]})}function Ie({className:e,style:t,fetching:a,page:n,onPageChange:r,paginationWithEdges:o,paginationWithControls:i,paginationActiveTextColor:l,paginationActiveBackgroundColor:c,paginationSize:s,loadingText:d,noRecordsText:m,paginationText:u,totalRecords:b,recordsPerPage:A,onRecordsPerPageChange:p,recordsPerPageLabel:h,recordsPerPageOptions:g,recordsLength:f,horizontalSpacing:C,paginationWrapBreakpoint:v,getPaginationControlProps:y,getPaginationItemProps:w,renderPagination:x}){let k;if(b){let e=(n-1)*A+1;k=u({from:e,to:e+(f||0)-1,totalRecords:b})}else k=a?d:m;let B=b&&A?Math.max(1,Math.ceil(b/A)):1,S=b?(n-1)*(A??0)+1:void 0,D=b?(S??1)+(f??0)-1:void 0,P=!$(({breakpoints:e})=>`(min-width: ${"number"==typeof v?`${(0,O.rem)(v)}rem`:e[v]||v})`),T={Text:e=>(0,E.jsx)(O.Text,{component:"div",className:"mantine-datatable-pagination-text",size:s,...e,children:k}),PageSizeSelector:e=>g?(0,E.jsx)(_e,{activeTextColor:l,activeBackgroundColor:c,size:s,label:h,values:g,value:A,onChange:p,...e}):(0,E.jsx)(E.Fragment,{}),Pagination:e=>(0,E.jsx)(O.Pagination,{classNames:{root:j("mantine-datatable-pagination-pages",{"mantine-datatable-pagination-pages-fetching":a||!f}),control:"mantine-datatable-pagination-pages-control"},style:l||c?e=>Pe({theme:e,paginationActiveTextColor:l,paginationActiveBackgroundColor:c}):void 0,withEdges:o,withControls:i,value:n,onChange:r,size:s,total:B,getControlProps:y,getItemProps:w,...e})},_={state:{paginationSize:s,page:n,totalPages:B,totalRecords:b,recordsPerPage:A,recordsLength:f,fetching:a,from:S,to:D,isWrapped:P},actions:{setPage:e=>r?.(e),setRecordsPerPage:p?e=>p(e):void 0},Controls:T};return(0,E.jsx)(O.Box,{px:C??"xs",py:"xs",className:j("mantine-datatable-pagination",e),style:[{flexDirection:P?"column":"row"},t],children:"function"==typeof x?x(_):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(T.Text,{}),(0,E.jsx)(T.PageSizeSelector,{}),(0,E.jsx)(T.Pagination,{})]})})}function ze({className:e,style:t,visibleMediaQuery:a,record:n,index:r,onClick:o,onDoubleClick:i,onContextMenu:l,noWrap:c,ellipsis:s,textAlign:d,width:m,accessor:u,render:b,defaultRender:A,customCellAttributes:p}){return $(a)?(0,E.jsx)(O.TableTd,{className:j({[re]:c||s,[oe]:s,[ie]:o||i,[le]:l,[se]:"left"===d,[de]:"center"===d,[me]:"right"===d},e),style:[{width:m,minWidth:m,maxWidth:m},t],onClick:o,onDoubleClick:i,onContextMenu:l,...p?.(n,r),children:b?b(n,r):A?A(n,r,u):X(n,u)}):null}function Re({open:e,colSpan:t,content:a,collapseProps:n}){let{expanded:r,visible:o}=function(e,t){let[a,n]=(0,x.useState)(e),[r,o]=(0,x.useState)(e),i=(0,P.useTimeout)(()=>n(!0),0),l=(0,P.useTimeout)(()=>o(!1),t||200);return(0,x.useEffect)(()=>{e?(l.clear(),o(!0),i.start()):(i.clear(),n(!1),l.start())},[i,l,e]),{expanded:a,visible:r}}(e,n?.transitionDuration);return o?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(O.TableTr,{}),(0,E.jsx)(O.TableTr,{children:(0,E.jsx)(O.TableTd,{className:"mantine-datatable-row-expansion-cell",colSpan:t,children:(0,E.jsx)(O.Collapse,{in:r,...n,children:(0,E.jsx)("div",{className:"mantine-datatable-row-expansion-cell-content",children:a()})})})})]}):null}function Me({className:e,style:t,record:a,index:n,trigger:r,onChange:o,withRightShadow:i,checkboxProps:l,getCheckboxProps:c,...s}){let d={...l,...c(a,n)},m=!s.disabled&&!d.disabled;return(0,E.jsx)(O.TableTd,{className:j("mantine-datatable-row-selector-cell",{[ie]:"cell"===r&&m},e),style:t,"data-shadow-visible":i||void 0,onClick:e=>{e.stopPropagation(),"cell"===r&&m&&o?.(e)},children:(0,E.jsx)(O.Checkbox,{classNames:m?{input:ie}:void 0,onChange:o,...s,...d})})}function Ne({record:e,index:t,columns:a,defaultColumnProps:n,defaultColumnRender:r,selectionTrigger:o,selectionVisible:i,selectionChecked:l,onSelectionChange:c,isRecordSelectable:s,selectionCheckboxProps:d,getSelectionCheckboxProps:m,onClick:u,onDoubleClick:b,onContextMenu:A,onCellClick:p,onCellDoubleClick:h,onCellContextMenu:g,expansion:f,customAttributes:C,color:v,backgroundColor:y,className:w,style:x,selectorCellShadowVisible:k,selectionColumnClassName:B,selectionColumnStyle:S,rowFactory:D}){let P=(0,E.jsxs)(E.Fragment,{children:[i&&(0,E.jsx)(Me,{className:B,style:S,record:e,index:t,trigger:o,withRightShadow:k,checked:l,disabled:!c||!!s&&!s(e,t),onChange:c,checkboxProps:d,getCheckboxProps:m}),a.map(({hidden:a,hiddenContent:o,...i},l)=>{if(a||o)return null;let{accessor:c,visibleMediaQuery:s,textAlign:d,noWrap:m,ellipsis:u,width:b,render:A,cellsClassName:f,cellsStyle:C,customCellAttributes:v}={...n,...i};return(0,E.jsx)(ze,{className:"function"==typeof f?f(e,t):f,style:C?.(e,t),visibleMediaQuery:s,record:e,index:t,onClick:p?a=>p({event:a,record:e,index:t,column:i,columnIndex:l}):void 0,onDoubleClick:h?a=>h({event:a,record:e,index:t,column:i,columnIndex:l}):void 0,onContextMenu:g?a=>g({event:a,record:e,index:t,column:i,columnIndex:l}):void 0,accessor:c,textAlign:d,noWrap:m,ellipsis:u,width:b,render:A,defaultRender:r,customCellAttributes:v},c)})]}),T=f&&(0,E.jsx)(Re,{colSpan:a.filter(({hidden:e})=>!e).length+(i?1:0),open:f.isRowExpanded(e),content:f.content({record:e,index:t}),collapseProps:f.collapseProps}),_=function({record:e,index:t,selectionChecked:a,onClick:n,onDoubleClick:r,onContextMenu:o,expansion:i,customAttributes:l,color:c,backgroundColor:s,className:d,style:m}){return{className:j("mantine-datatable-row",{[ie]:n||r||i?.isExpandable({record:e,index:t})&&i?.expandOnClick},{[le]:o},"function"==typeof d?d(e,t):d),"data-selected":a||void 0,onClick:a=>{if(i){let{isExpandable:a,isRowExpanded:n,expandOnClick:r,expandRow:o,collapseRow:l}=i;a({record:e,index:t})&&r&&(n(e)?l(e):o(e))}n?.({event:a,record:e,index:t})},onDoubleClick:r?a=>r({event:a,record:e,index:t}):void 0,onContextMenu:o?a=>o({event:a,record:e,index:t}):void 0,style:[c||s?a=>{let n=c?.(e,t),r=s?.(e,t);return function({theme:e,color:t,backgroundColor:a}){return{"--mantine-datatable-row-color-light":je(t,e,"light"),"--mantine-datatable-row-color-dark":je(t,e,"dark"),"--mantine-datatable-row-background-color-light":je(a,e,"light"),"--mantine-datatable-row-background-color-dark":je(a,e,"dark")}}({theme:a,color:n,backgroundColor:r})}:void 0,m?.(e,t)],...l?.(e,t)??{}}}({record:e,index:t,selectionChecked:l,onClick:u,onDoubleClick:b,onContextMenu:A,expansion:f,customAttributes:C,color:v,backgroundColor:y,className:w,style:x});return D?D({record:e,index:t,rowProps:_,children:P,expandedElement:T}):(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(O.TableTr,{..._,children:P}),T]})}function We({leftShadowBehind:e,rightShadowBehind:t,onScrollPositionChange:a,children:n,viewportRef:r,scrollAreaProps:o}){return(0,E.jsxs)(O.ScrollArea,{...o,viewportRef:r,classNames:{root:"mantine-datatable-scroll-area",scrollbar:"mantine-datatable-scroll-area-scrollbar",thumb:"mantine-datatable-scroll-area-thumb",corner:"mantine-datatable-scroll-area-corner"},onScrollPositionChange:a,children:[n,(0,E.jsx)(O.Box,{className:j("mantine-datatable-scroll-area-shadow","mantine-datatable-scroll-area-top-shadow")}),(0,E.jsx)("div",{className:j("mantine-datatable-scroll-area-shadow","mantine-datatable-scroll-area-left-shadow",{"mantine-datatable-scroll-area-shadow-behind":e})}),(0,E.jsx)("div",{className:j("mantine-datatable-scroll-area-shadow","mantine-datatable-scroll-area-right-shadow",{"mantine-datatable-scroll-area-shadow-behind":t})}),(0,E.jsx)(O.Box,{className:j("mantine-datatable-scroll-area-shadow","mantine-datatable-scroll-area-bottom-shadow")})]})}function Le({withTableBorder:e,borderRadius:t,textSelectionDisabled:a,height:n="100%",minHeight:r,maxHeight:o,shadow:i,verticalAlign:l="center",fetching:c,columns:s,storeColumnsKey:d,groups:m,pinFirstColumn:u,pinLastColumn:b,defaultColumnProps:A,defaultColumnRender:p,idAccessor:h="id",records:g,selectionTrigger:f="checkbox",selectedRecords:C,onSelectedRecordsChange:v,selectionColumnClassName:y,selectionColumnStyle:w,isRecordSelectable:k,selectionCheckboxProps:B,allRecordsSelectionCheckboxProps:S={"aria-label":"Select all records"},getRecordSelectionCheckboxProps:D=(e,t)=>({"aria-label":`Select record ${t+1}`}),sortStatus:T,sortIcons:_,onSortStatusChange:R,horizontalSpacing:K,page:$,onPageChange:J,totalRecords:X,recordsPerPage:ee,onRecordsPerPageChange:ae,recordsPerPageOptions:ne,recordsPerPageLabel:re="Records per page",paginationWithEdges:oe,paginationWithControls:ie,paginationActiveTextColor:le,paginationActiveBackgroundColor:se,paginationSize:de="sm",paginationText:me=({from:e,to:t,totalRecords:a})=>`${e} - ${t} / ${a}`,paginationWrapBreakpoint:ue="sm",getPaginationControlProps:be=e=>"previous"===e?{"aria-label":"Previous page"}:"next"===e?{"aria-label":"Next page"}:{},getPaginationItemProps:pe,renderPagination:he,loaderBackgroundBlur:ge,customLoader:fe,loaderSize:Ce,loaderType:ve,loaderColor:ye,loadingText:we="...",emptyState:xe,noRecordsText:ke="No records",noRecordsIcon:Be,highlightOnHover:je,striped:Pe,noHeader:Ee,onRowClick:Te,onRowDoubleClick:_e,onRowContextMenu:ze,onCellClick:Re,onCellDoubleClick:Me,onCellContextMenu:Le,onScroll:Fe,onScrollToTop:Ve,onScrollToBottom:Qe,onScrollToLeft:Ue,onScrollToRight:Ge,c:qe,backgroundColor:He,borderColor:Ke,rowBorderColor:$e,stripedColor:Je,highlightOnHoverColor:Ye,rowColor:Xe,rowBackgroundColor:Ze,rowExpansion:et,rowClassName:tt,rowStyle:at,customRowAttributes:nt,scrollViewportRef:rt,scrollAreaProps:ot,tableRef:it,bodyRef:lt,m:ct,my:st,mx:dt,mt,mb:ut,ml:bt,mr:At,className:pt,classNames:ht,style:gt,styles:ft,rowFactory:Ct,tableWrapper:vt,...yt}){let wt=(0,x.useMemo)(()=>m?te(m):s,[s,m]),[xt,kt]=(0,x.useState)(!1),{refs:Bt,onScroll:St}=function({scrollCallbacks:e,withRowBorders:t}){let a={root:(0,x.useRef)(null),table:(0,x.useRef)(null),scrollViewport:(0,x.useRef)(null),header:(0,x.useRef)(null),footer:(0,x.useRef)(null),selectionColumnHeader:(0,x.useRef)(null)},{root:n,table:r,scrollViewport:o,header:i,footer:l,selectionColumnHeader:c}=a,s=L({withRowBorders:t}),d=L(e),m=(0,x.useRef)(()=>{}),u=(0,x.useRef)(()=>{}),b=(0,x.useCallback)(e=>{d.current.onScroll?.(e),m.current()},[]);return(0,x.useEffect)(()=>H(i.current,e=>{G(n.current,F,`${e.height}px`)},()=>G(n.current,F,"0")),[i.current]),(0,x.useEffect)(()=>H(l.current,e=>{G(n.current,V,`${e.height}px`)},()=>G(n.current,V,"0")),[l.current]),(0,x.useEffect)(()=>H(c.current,e=>{G(n.current,Q,`${e.width}px`)},()=>G(n.current,Q,"0")),[c.current]),W(()=>{if(void 0===typeof window)return;let e={top:!0,bottom:!0,left:!0,right:!0},t={width:0,height:0},a={width:0,height:0};function i(t,a){let r=e[t];return e[t]=a,G(n.current,`--mantine-datatable-${t}-shadow-opacity`,a?"0":"1"),r}function l(){s.current.withRowBorders&&t.height{for(let n of e)switch(n.target.tagName){case"TABLE":t=q(n);break;case"DIV":a=q(n)}c(),function(){let e=t.height-a.height,r=e<0;G(n.current,"--mantine-datatable-footer-position",r?"relative":"sticky"),G(n.current,"--mantine-datatable-footer-bottom",r?`${e}px`:"0")}(),l()});return b.observe(r.current),b.observe(o.current),()=>{b.disconnect()}},[]),W(()=>{u.current()},[t]),{refs:a,onScroll:b}}({scrollCallbacks:{onScroll:Fe,onScrollToTop:Ve,onScrollToBottom:Qe,onScrollToLeft:Ue,onScrollToRight:Ge},withRowBorders:yt.withRowBorders}),Dt=N({key:d,columns:wt,headerRef:Bt.header,scrollViewportRef:Bt.scrollViewport,onFixedLayoutChange:kt}),jt=(0,P.useMergedRef)(Bt.table,it),Ot=(0,P.useMergedRef)(Bt.scrollViewport,rt),Pt=function({rowExpansion:e,records:t,idAccessor:a}){let n=[];if(e&&t){let{trigger:r,allowMultiple:o,initiallyExpanded:i}=e;t&&"always"===r?n=t.map(e=>Z(e,a)):i&&(n=t.filter((e,t)=>i({record:e,index:t})).map(e=>Z(e,a)),o||(n=[n[0]]))}let r,o,i=(0,x.useState)(n);if(e){let{expandable:t,trigger:n,allowMultiple:l,collapseProps:c,content:s}=e;e.expanded?({recordIds:r,onRecordIdsChange:o}=e.expanded):[r,o]=i;let d=e=>o?.(r.filter(t=>t!==Z(e,a)));return{expandOnClick:"always"!==n&&"never"!==n,isRowExpanded:e=>"always"===n||r.includes(Z(e,a)),isExpandable:({record:e,index:a})=>!t||t({record:e,index:a}),expandRow:e=>{let t=Z(e,a);o?.(l?[...r,t]:[t])},collapseRow:d,collapseProps:c,content:({record:e,index:t})=>()=>s({record:e,index:t,collapse:()=>d(e)})}}}({rowExpansion:et,records:g,idAccessor:h}),Et=(0,x.useRef)(!1),Tt=(0,x.useRef)($),_t=(0,x.useRef)(g),It=(0,x.useCallback)(e=>{Et.current=!0,_t.current=g,J(e)},[J,g]);(0,x.useEffect)(()=>{Tt.current!==$&&(Et.current=!0,_t.current=g,Tt.current=$)},[$,g]);let zt=g?.length;(0,x.useLayoutEffect)(()=>{if(!Et.current||c||g===_t.current)return;let e=Bt.scrollViewport.current;if(!e)return;let t=requestAnimationFrame(()=>{e.scrollTo({top:0,left:0}),Et.current=!1});return()=>cancelAnimationFrame(t)},[c,g,Bt.scrollViewport]);let Rt=g?.map(e=>Z(e,h)),Mt=!!C,Nt=C?.map(e=>Z(e,h)),Wt=void 0!==Rt&&void 0!==Nt&&Nt.length>0,Lt=k?g?.filter(k):g,Ft=Lt?.map(e=>Z(e,h)),Vt=Wt&&Ft.every(e=>Nt.includes(e)),Qt=Wt&&Ft.some(e=>Nt.includes(e)),Ut=(0,x.useCallback)(()=>{C&&v&&v(Vt?C.filter(e=>!Ft.includes(Z(e,h))):Y([...C,...Lt],e=>Z(e,h)))},[Vt,h,v,Ft,Lt,C]),{lastSelectionChangeIndex:Gt,setLastSelectionChangeIndex:qt}=function(e){let[t,a]=(0,x.useState)(null),n=e?.join(":")||"";return(0,x.useEffect)(()=>{a(null)},[n]),{lastSelectionChangeIndex:t,setLastSelectionChangeIndex:a}}(Rt),Ht=Mt&&!u,Kt={m:ct,my:st,mx:dt,mt,mb:ut,ml:bt,mr:At},$t=(0,x.useCallback)(({children:e})=>vt?vt({children:e}):e,[vt]);return(0,E.jsx)(I,{...Dt,children:(0,E.jsxs)(O.Box,{ref:Bt.root,...Kt,className:j("mantine-datatable",{"mantine-datatable-with-border":e},pt,ht?.root),style:[e=>({...Oe({theme:e,c:qe,backgroundColor:He,borderColor:Ke,rowBorderColor:$e,stripedColor:Je,highlightOnHoverColor:Ye}),borderRadius:e.radius[t]||t,boxShadow:e.shadows[i]||i,height:n,minHeight:r,maxHeight:o}),gt,ft?.root,{position:"relative"}],children:[(0,E.jsx)(We,{viewportRef:Ot,leftShadowBehind:Mt||!!u,rightShadowBehind:b,onScrollPositionChange:St,scrollAreaProps:ot,children:(0,E.jsx)($t,{children:(0,E.jsxs)(O.Table,{ref:jt,horizontalSpacing:K,className:j("mantine-datatable-table",{[ce]:a,"mantine-datatable-vertical-align-top":"top"===l,"mantine-datatable-vertical-align-bottom":"bottom"===l,"mantine-datatable-pin-last-column":b,"mantine-datatable-selection-column-visible":Mt,"mantine-datatable-pin-first-column":u,"mantine-datatable-resizable-columns":Dt.hasResizableColumns&&xt},ht?.table),style:{...ft?.table},"data-striped":zt&&Pe||void 0,"data-highlight-on-hover":je||void 0,...yt,children:[Ee?null:(0,E.jsx)(I,{...Dt,children:(0,E.jsx)(Se,{ref:Bt.header,selectionColumnHeaderRef:Bt.selectionColumnHeader,className:ht?.header,style:ft?.header,columns:wt,defaultColumnProps:A,groups:m,sortStatus:T,sortIcons:_,onSortStatusChange:R,selectionTrigger:f,selectionVisible:Mt,selectionChecked:Vt,selectionIndeterminate:Qt&&!Vt,onSelectionChange:Ut,selectionCheckboxProps:{...B,...S},selectorCellShadowVisible:Ht,selectionColumnClassName:y,selectionColumnStyle:w,withColumnBorders:yt.withColumnBorders})}),(0,E.jsx)("tbody",{ref:lt,children:zt?g.map((e,t)=>{let a,n=Z(e,h),r=Nt?.includes(n)||!1;return v&&C&&(a=a=>{if(a.nativeEvent.shiftKey&&null!==Gt){let e=g.filter(t>Gt?(e,a)=>a>=Gt&&a<=t&&(!k||k(e,a)):(e,a)=>a>=t&&a<=Gt&&(!k||k(e,a)));v(r?function(e,t,a){return e.filter(e=>!t.map(a).includes(a(e)))}(C,e,e=>Z(e,h)):Y([...C,...e],e=>Z(e,h)))}else v(r?C.filter(e=>Z(e,h)!==n):Y([...C,e],e=>Z(e,h)));qt(t)}),(0,E.jsx)(Ne,{record:e,index:t,columns:wt,defaultColumnProps:A,defaultColumnRender:p,selectionTrigger:f,selectionVisible:Mt,selectionChecked:r,onSelectionChange:a,isRecordSelectable:k,selectionCheckboxProps:B,getSelectionCheckboxProps:D,onClick:Te,onDoubleClick:_e,onCellClick:Re,onCellDoubleClick:Me,onContextMenu:ze,onCellContextMenu:Le,expansion:Pt,color:Xe,backgroundColor:Ze,className:tt,style:at,customAttributes:nt,selectorCellShadowVisible:Ht,selectionColumnClassName:y,selectionColumnStyle:w,idAccessor:h,rowFactory:Ct},n)}):(0,E.jsx)(z,{})}),wt.some(({footer:e})=>e)&&(0,E.jsx)(Ae,{ref:Bt.footer,className:ht?.footer,style:ft?.footer,columns:wt,defaultColumnProps:A,selectionVisible:Mt,selectorCellShadowVisible:Ht})]})})}),!(!$||!zt)&&(0,E.jsx)(Ie,{className:ht?.pagination,style:ft?.pagination,horizontalSpacing:K,fetching:c,page:$,onPageChange:It,totalRecords:X,recordsPerPage:ee,onRecordsPerPageChange:ae,recordsPerPageOptions:ne,recordsPerPageLabel:re,paginationWithEdges:oe,paginationWithControls:ie,paginationActiveTextColor:le,paginationActiveBackgroundColor:se,paginationSize:de,paginationText:me,paginationWrapBreakpoint:ue,getPaginationControlProps:be,getPaginationItemProps:pe,noRecordsText:ke,loadingText:we,recordsLength:zt,renderPagination:he}),(0,E.jsx)(De,{fetching:c,backgroundBlur:ge,customContent:fe,size:Ce,type:ve,color:ye}),(0,E.jsx)(M,{icon:Be,text:ke,active:!c&&!zt,children:xe})]})})}function Fe({className:e,children:t,isDragging:a,ref:n,...r}){let o=(0,x.useRef)(null),i=(0,P.useMergedRef)(o,n);return(0,x.useEffect)(()=>{if(!o.current||!a)return;let e=o.current.parentElement.parentElement.children[0].children[0];for(let t=0;te.length)&&(t=e.length);for(var a=0,n=Array(t);a=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,i=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return o=e.done,e},e:function(e){i=!0,r=e},f:function(){try{o||null==t.return||t.return()}finally{if(i)throw r}}}}(e);try{for(o.s();!(r=o.n()).done;){var i=r.value;if(ka(i,a)===t)return i;if(n){var l=mt(i,n);if(Array.isArray(l)){var c=bt(l,t,a,n);if(c)return c}}}}catch(e){o.e(e)}finally{o.f()}}},At=function(e,t,a,n,r,o){if(!Array.isArray(e))return{records:e,didUpdate:!1};var i=!1,l=e.map(function(e){var l=e;if(ka(e,a)===t&&(l=ut(e,n,r),i=!0),o){var c=mt(l,o);if(Array.isArray(c)){var s=At(c,t,a,n,r,o);s.didUpdate&&(l=ut(l,o,s.records),i=!0)}}return l});return{records:i?l:e,didUpdate:i}},pt=function(e,t){if(e===t)return!0;if(e instanceof Date||t instanceof Date)return String(e)===String(t);if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every(function(e,a){return pt(e,t[a])});if(e&&t&&"object"===et(e)&&"object"===et(t))try{return JSON.stringify(e)===JSON.stringify(t)}catch(e){return!1}return!1},ht=function(e){var t,a;return st(e)?"string"==typeof e.type?e.type:void 0:k().isValidElement(e)?"string"==typeof e.type?e.type:dt.has(e.type)?dt.get(e.type):(null===(t=e.type)||void 0===t?void 0:t.displayName)||(null===(a=e.type)||void 0===a?void 0:a.name):void 0},gt=function(e,t){if(e&&"object"===et(e)&&!Array.isArray(e)){if(Object.prototype.hasOwnProperty.call(e,t))return e[t];if(e.currentTarget&&Object.prototype.hasOwnProperty.call(e.currentTarget,t))return e.currentTarget[t];if(e.target&&Object.prototype.hasOwnProperty.call(e.target,t))return e.target[t]}return e},ft=function(e,t,a){if(e instanceof Date){var n=ht(a);return"date"===(null==t?void 0:t.presentation)||"date"===(null==t?void 0:t.type)||"DateInput"===n?e.toISOString().slice(0,10):e.toISOString()}return Array.isArray(e)?e.map(function(e){return ft(e,t,a)}):e},Ct={Checkbox:"checked",Switch:"checked"},vt=new Set(["Autocomplete","JsonInput","PasswordInput","PinInput","TextInput","Textarea"]),yt=new Set(["CheckboxGroup","MultiSelect","TagsInput"]),wt=new Set(["RangeSlider"]),xt=new Set(["DateInput","DatePickerInput","DateTimePicker","MonthPickerInput","TimeInput","YearPickerInput"]),kt=new Set(["ChipGroup","ColorInput","ColorPicker","NativeSelect","NumberInput","RadioGroup","Rating","SegmentedControl","Select"]),Bt=new Set([].concat(Je(vt),Je(yt),Je(wt),Je(xt),Je(kt),["Checkbox","Switch"])),St=new Set(["all","__all__"]),Dt=new Set([].concat(Je(yt),Je(xt),["Autocomplete","Select"])),jt=function(e,t){return e&&"object"===et(e)&&!Array.isArray(e)?Ge(Ge({},e),t):t},Ot=function(e,t){return e&&"object"===et(e)&&!Array.isArray(e)?Ge(Ge({},t),e):t},Pt=function(e){try{return JSON.stringify(e)}catch(t){return String(e)}},Et=function(e){if(!lt(e))return"string"==typeof e||"number"==typeof e?String(e):Pt(e)},Tt=function(e){return(k().isValidElement(e)||st(e))&&e.props||at},_t=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:tt,n=Et(Tt(e).id),r=a.length?a.join("."):"root";return n||"".concat((null==t?void 0:t.accessor)||"__filter__",":").concat(r)},It=function(e){var t=e.props||at;if(Object.prototype.hasOwnProperty.call(t,e.valueProp))return t[e.valueProp];var a="checked"===e.valueProp?"defaultChecked":"defaultValue";return Object.prototype.hasOwnProperty.call(t,a)?t[a]:void 0},zt=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:tt;if(k().isValidElement(e)||st(e)){var n=Tt(e),r=[];if(function(e){var t=Tt(e);if(!1===t.filterRegistration||!1===t.autoFilter)return!1;var a=ht(e),n="function"==typeof t.setProps&&t.setProps!==nt&&["value","defaultValue","checked","defaultChecked"].some(function(e){return Object.prototype.hasOwnProperty.call(t,e)});return Bt.has(a)||!0===t.filterRegistration||!0===t.autoFilter||n}(e)){var o=function(e,t){if("string"==typeof(null==e?void 0:e.filterValueProp))return e.filterValueProp;var a=ht(t);if(Ct[a])return Ct[a];var n=Tt(t);return Object.prototype.hasOwnProperty.call(n,"checked")||Object.prototype.hasOwnProperty.call(n,"defaultChecked")?"checked":"value"}(t,e);r.push({key:_t(e,t,a),path:a,props:n,typeName:ht(e),valueProp:o})}return r.concat(zt(n.children,t,[].concat(Je(a),["children"])))}return Array.isArray(e)?e.flatMap(function(e,n){return zt(e,t,[].concat(Je(a),[n]))}):tt},Rt=function(e,t,a,n,r){var o=ct(e)?Ge({},e):{};if(r<=1)return o[t]=n,o;var i=ct(o[t])?o[t]:{};return o[t]=Ge(Ge({},i),{},qe({},a,n)),o},Mt=function(e,t,a,n){if(!ct(e))return{hasValue:!1,value:void 0};if(!Object.prototype.hasOwnProperty.call(e,t))return{hasValue:!1,value:void 0};var r=e[t];return n<=1?ct(r)&&Object.prototype.hasOwnProperty.call(r,a)?{hasValue:!0,value:r[a]}:{hasValue:!0,value:r}:ct(r)&&Object.prototype.hasOwnProperty.call(r,a)?{hasValue:!0,value:r[a]}:{hasValue:!1,value:void 0}},Nt=function(e,t){if(!lt(t)&&pt(e,t))return!1;if(lt(e))return!1;if("boolean"==typeof e)return e;if("string"==typeof e){var a=e.trim();return""!==a&&!St.has(a.toLowerCase())}return Array.isArray(e)?e.some(function(e){return Nt(e,void 0)}):"object"!==et(e)||Object.values(e).some(function(e){return Nt(e,void 0)})},Wt=function(e,t){var a=(null==t?void 0:t.controls)||tt;return a.map(function(n){var r=Mt(e,t.accessor,n.key,a.length),o=r.hasValue?r.value:It(n),i=function(e,t){var a=e||at,n=t.props||at;return Object.prototype.hasOwnProperty.call(a,"filterEmptyValue")?a.filterEmptyValue:Object.prototype.hasOwnProperty.call(n,"filterEmptyValue")?n.filterEmptyValue:!wt.has(t.typeName)||lt(n.min)||lt(n.max)?void 0:[n.min,n.max]}(t.column,n);return Ge(Ge({},n),{},{emptyValue:i,value:o})}).filter(function(e){return Nt(e.value,e.emptyValue)})},Lt=function(e,t){return Wt(e,t).length>0},Ft=function(e){if(e instanceof Date)return e.getTime();if("number"==typeof e)return e;if("string"==typeof e){var t=e.trim(),a=Number(t);if(""!==t&&Number.isFinite(a))return a;if(function(e){return"string"==typeof e&&/^\d{4}-\d{2}-\d{2}/.test(e.trim())}(t)){var n=Date.parse(t);if(Number.isFinite(n))return n}return t.toLowerCase()}return e},Vt=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(Array.isArray(e))return e.some(function(e){return Vt(e,t,a)});if(Array.isArray(t))return t.some(function(t){return Vt(e,t,a)});var n=Ft(e),r=Ft(t);if("string"==typeof n||"string"==typeof r){var o=lt(n)?"":String(n),i=lt(r)?"":String(r);return a?o===i:o.toLowerCase()===i.toLowerCase()}return n===r},Qt=function(e,t){var a=Ft(e),n=Ft(t);return an?1:0},Ut=function(e){var t=function(e){var t,a,n;return[e.key,Et(null===(t=e.props)||void 0===t?void 0:t.id),null===(a=e.props)||void 0===a?void 0:a.label,null===(n=e.props)||void 0===n?void 0:n.placeholder].filter(Boolean).join(" ").toLowerCase()}(e);return/(from|start|minimum|min|after|earliest|lower)/.test(t)?"gte":/(to|end|maximum|max|before|latest|upper)/.test(t)?"lte":void 0},Gt=function(e,t,a){var n=Array.isArray(t)?t:[t];return Array.isArray(e)?e.some(function(e){return n.some(function(t){return Vt(e,t,a)})}):n.some(function(t){return Vt(e,t,a)})},qt=function(e,t,a){return!(lt(e)||Nt(t,void 0)&&Qt(e,t)<0||Nt(a,void 0)&&Qt(e,a)>0)},Ht=function(e,t,a){var n=Wt(t,a);if(!n.length)return!0;var r=a.column||at,o=r.filterAccessor||r.filterValueAccessor||a.accessor,i=mt(e,o);if(function(e,t){return!(t.length<2)&&(!!["between","range"].includes(e.filterOperator||e.filterMatchMode)||!!t.some(function(e){return Ut(e)})||t.every(function(e){return xt.has(e.typeName)||"NumberInput"===e.typeName}))}(r,n)){var l=function(e){var t,a;return e.forEach(function(e){var n=Ut(e);"lte"!==n?"gte"!==n?lt(t)?t=e.value:lt(a)&&(a=e.value):t=e.value:a=e.value}),[t,a]}(n),c=He(l,2),s=c[0],d=c[1];return qt(i,s,d)}return n.every(function(e){return function(e,t,a){var n=function(e,t){var a;return e.filterOperator||e.filterMatchMode||(null===(a=t.props)||void 0===a?void 0:a.filterOperator)||Ut(t)||(wt.has(t.typeName)||xt.has(t.typeName)&&Array.isArray(t.value)?"between":yt.has(t.typeName)?"in":vt.has(t.typeName)?"contains":Array.isArray(t.value)?"in":"equals")}(a,t),r=Boolean(a.filterCaseSensitive);if("function"==typeof a.filterPredicate)return Boolean(a.filterPredicate(e,t.value,{column:a,filter:t}));if("contains"===n)return function(e,t,a){var n=wa(e),r=String(t);return a?n.includes(r):n.toLowerCase().includes(r.toLowerCase())}(e,t.value,r);if("startsWith"===n){var o=wa(e),i=String(t.value);return r?o.startsWith(i):o.toLowerCase().startsWith(i.toLowerCase())}if("endsWith"===n){var l=wa(e),c=String(t.value);return r?l.endsWith(c):l.toLowerCase().endsWith(c.toLowerCase())}if("in"===n)return Gt(e,t.value,r);if("between"===n||"range"===n){var s=He(Array.isArray(t.value)?t.value:[void 0,t.value],2),d=s[0],m=s[1];return qt(e,d,m)}return"gte"===n?Qt(e,t.value)>=0:"gt"===n?Qt(e,t.value)>0:"lte"===n?Qt(e,t.value)<=0:"lt"===n?Qt(e,t.value)<0:"notIn"===n?!Gt(e,t.value,r):Vt(e,t.value,r)}(i,e,r)})},Kt=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:at,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:tt;if(k().isValidElement(e)){var r,o=e.props||at,i=Object.prototype.hasOwnProperty.call(o,"children")?Kt(o.children,t,a,[].concat(Je(n),["children"])):void 0,l=(null===(r=a.filterDefinitionsByAccessor)||void 0===r||null===(r=r[t.accessor])||void 0===r?void 0:r.controls)||tt,c=_t(e,t,n),s=l.find(function(e){return e.key===c}),d=Ge({},o);if(Object.prototype.hasOwnProperty.call(o,"children")&&(d.children=i),!s)return k().cloneElement(e,d);var m=Mt(a.filterValues,t.accessor,s.key,l.length),u=Object.prototype.hasOwnProperty.call(o,s.valueProp);(m.hasValue||u)&&(d[s.valueProp]=m.hasValue?m.value:o[s.valueProp]),d.comboboxProps=Ot(o.comboboxProps,{withinPortal:!1}),d.popoverProps=Ot(o.popoverProps,{withinPortal:!1});var b=o.setProps,A=o.onChange,p=function(e){"function"==typeof a.handleFilterValueChange&&a.handleFilterValueChange(t,s,e,l.length)};return d.setProps=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:at;e&&Object.prototype.hasOwnProperty.call(e,s.valueProp)&&p(e[s.valueProp]),"function"==typeof b&&b(e)},d.onChange=function(e){if(p(gt(e,s.valueProp)),"function"==typeof A){for(var t=arguments.length,a=new Array(t>1?t-1:0),n=1;n0&&void 0!==arguments[0]?arguments[0]:at;e&&Object.prototype.hasOwnProperty.call(e,i)&&r(e[i]),"function"==typeof d&&d(e)}),"onChange",function(e){if(r(gt(e,i)),"function"==typeof c){for(var t=arguments.length,a=new Array(t>1?t-1:0),n=1;nr?1:0},Zt={count:function(e,t){return t.length},sum:function(e){var t=e.map(function(e){return Number(e)}).filter(function(e){return Number.isFinite(e)});if(t.length)return t.reduce(function(e,t){return e+t},0)},mean:function(e){var t=e.map(function(e){return Number(e)}).filter(function(e){return Number.isFinite(e)});if(t.length)return t.reduce(function(e,t){return e+t},0)/t.length},median:function(e){var t=e.map(function(e){return Number(e)}).filter(function(e){return Number.isFinite(e)}).sort(function(e,t){return e-t});if(t.length){var a=Math.floor(t.length/2);return t.length%2==0?(t[a-1]+t[a])/2:t[a]}},min:function(e){var t=e.filter(function(e){return!lt(e)});if(t.length)return t.reduce(function(e,t){return Xt(t,e)<0?t:e})},max:function(e){var t=e.filter(function(e){return!lt(e)});if(t.length)return t.reduce(function(e,t){return Xt(t,e)>0?t:e})}},ea=function(e,t,a){return Array.isArray(a)&&a.length?a.reduce(function(e,a){var n=a.outputAccessor,r=a.sourceAccessor,o=a.aggregator,i=r?t.map(function(e){return mt(e,r)}):tt,l="string"==typeof o&&Object.prototype.hasOwnProperty.call(Zt,o.trim().toLowerCase())?Zt[o.trim().toLowerCase()]:function(e){if("function"==typeof e)return e;if("string"!=typeof e)return null;var t=e.trim();if(!t)return null;try{if(t.startsWith("lambda ")){var a=/^lambda\s*\(([^)]*)\)\s*:\s*([\s\S]+)$/.exec(t)||/^lambda\s+([^:]+)\s*:\s*([\s\S]+)$/.exec(t);if(a)return Function("return (".concat(a[1].trim(),") => (").concat(a[2].trim(),");"))()}return t.includes("=>")||t.startsWith("function")?Function("return (".concat(t,");"))():Function("values","records","groupRecord","outputAccessor",t)}catch(e){return null}}(o);if("function"!=typeof l)return e;var c=l(i,t,e,n);return lt(c)?e:Ge(Ge({},e),{},qe({},n,c))},e):e},ta=function(e){return Boolean((null==e?void 0:e.__group)||(null==e?void 0:e.__hierarchyParent))},aa=function(e,t,a){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:tt;if(!(Array.isArray(e)&&e.length&&Array.isArray(t)&&t.length))return tt;var r=function(e){return $e(e)||Xe(e)||Ye(e)||Ke()}(t),o=r[0],i=Ze(r).slice(1),l=[],c=new Map;return e.forEach(function(e){var t=mt(e,o),a="".concat(o,":").concat(Jt(t));if(!c.has(a)){var r=[].concat(Je(n),[{accessor:o,value:t}]),s={__group:!0,__groupAccessor:o,__groupId:Yt(r),__groupLevel:n.length,__groupPath:r,__groupValue:t,__hierarchyParent:!0,__groupedRecords:tt,__remainingGroupBy:i};lt(t)||(s[o]=t);var d={record:s,records:[]};c.set(a,d),l.push(d)}c.get(a).records.push(e)}),l.map(function(e){var t=e.record.__groupPath,n=i.length?aa(e.records,i,a,t):e.records.map(function(e){return Ge(Ge({},e),{},{__group:!1,__groupLevel:t.length,__leafRecords:[e]})}),r=i.length?n.flatMap(function(e){return e.__leafRecords||tt}):e.records;return ea(Ge(Ge({},e.record),{},{__children:n,__groupedRecords:r,__leafRecords:r}),r,a)})},na=function(e){return Array.isArray(e)?e.flatMap(function(e){return null!=e&&e.__group?[e.__groupId].concat(Je(na(e.__children))):tt}):tt},ra=function(e,t,a){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return Array.isArray(e)?e.map(function(e){var r=function(e,t){return!(!e||"string"!=typeof t||!t.trim())&&t.split(".").every(function(t){return!(null==e||"object"!==et(e)||!Object.prototype.hasOwnProperty.call(e,t)||(e=e[t],0))})}(e,t),o=r?mt(e,t):void 0,i=Array.isArray(o)?ra(o,t,a,n+1):tt,l=r?i.flatMap(function(e){return e.__leafRecords||tt}):[e],c=Ge(Ge({},e),{},{__children:i,__group:!1,__groupLevel:n,__groupedRecords:l,__hierarchyParent:r,__leafRecords:l});return r?ea(c,l,a):c}):tt},oa=function(e,t,a){return Array.isArray(e)?e.flatMap(function(e){if(!ta(e))return[e];var n=ka(e,a);return t.includes(n)?[e].concat(Je(oa(e.__children,t,a))):[e]}):tt},ia=function(e){return Array.isArray(e)?e.flatMap(function(e){return[e].concat(Je(ia(null==e?void 0:e.__children)))}):tt},la=function(){for(var e=arguments.length,t=new Array(e),a=0;a2&&void 0!==arguments[2]?arguments[2]:at,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:tt,r=function(e){var t,a,n,r=null==e?void 0:e.namespace,o=null==e?void 0:e.type;return r&&o&&"undefined"!=typeof window?"dash_html_components"===r||"dash.html"===r?String(o).toLowerCase():(n=o,(a=(null===(t=window)||void 0===t||null===(t=t[r])||void 0===t?void 0:t[o])||null)&&("function"==typeof a||"object"===et(a)&&null!==a)&&dt.set(a,n),a):null}(e);if(!r)return ma(e,t);var o=ma(e.props||at,t),i=Object.entries(o).reduce(function(e,r){var o=He(r,2),i=o[0],l=o[1];return"children"===i||(e[i]=pa(l,t,a,[].concat(Je(n),[i]))),e},{}),l="string"==typeof r||"function"==typeof i.setProps?i:Ge(Ge({},i),{},{setProps:nt}),c=ba(l,t,a),s=Object.prototype.hasOwnProperty.call(o,"children")?pa(o.children,t,a,[].concat(Je(n),["children"])):void 0;return Array.isArray(s)?k().createElement.apply(k(),[r,c].concat(Je(s))):lt(s)?k().createElement(r,c):k().createElement(r,c,s)},pa=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:at,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:tt;if(k().isValidElement(e)){var r=function(e){if(!k().isValidElement(e))return null;var t=e.props||at;return st(t.component)?t.component:st(t._dashprivate_layout)?t._dashprivate_layout:null}(e);if(r)return Aa(r,t,a,n);var o=Object.keys(e.props||{}).reduce(function(r,o){return"component"===o||"componentPath"===o||o.startsWith("_dashprivate_")?(r[o]=e.props[o],r):(r[o]=pa(e.props[o],t,a,[].concat(Je(n),[o])),r)},{});return k().cloneElement(e,ba(o,t,a))}return st(e)?Aa(e,t,a,n):Array.isArray(e)?e.map(function(e,r){return pa(e,t,a,[].concat(Je(n),[r]))}):e&&"object"===et(e)?Object.entries(e).reduce(function(e,r){var o=He(r,2),i=o[0],l=o[1];return e[i]=pa(l,t,a,[].concat(Je(n),[i])),e},{}):da(e,t)},ha=function(e,t,a,n){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:at;return{accessor:null==a?void 0:a.accessor,column:a,idAccessor:r.idAccessor,index:t,locale:n,record:e,recordId:ka(e,r.idAccessor),row:e,value:mt(e,null==a?void 0:a.accessor)}},ga=function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:at;return"function"==typeof e?e(t.record,t.index):pa(e,t,a)},fa=function(e,t,a,n,r){return ga(e,ha(t,a,n,r,arguments.length>5&&void 0!==arguments[5]?arguments[5]:at))},Ca=function(e,t,a){return ga(e,ha(void 0,void 0,t,a,arguments.length>3&&void 0!==arguments[3]?arguments[3]:at))},va=function(e,t,a){if(t.template)return ca(t.template,e);var n=mt(e,t.accessor);return"string"==typeof t.valueAccessor?mt(e,t.valueAccessor):function(e,t,a){if(lt(e))return t.emptyValue||"";var n=t.presentation||t.type||"text",r=t.locale||a,o=t.formatOptions||at;if("number"===n||"currency"===n||"percent"===n){var i=Number(e);if(Number.isNaN(i))return String(e);var l=Ge({},o);return"currency"===n?(l.style="currency",l.currency=t.currency||l.currency||"USD"):"percent"===n&&(l.style="percent"),lt(t.minimumFractionDigits)||(l.minimumFractionDigits=t.minimumFractionDigits),lt(t.maximumFractionDigits)||(l.maximumFractionDigits=t.maximumFractionDigits),new Intl.NumberFormat(r,l).format(i)}if("date"===n||"datetime"===n||"time"===n){var c=function(e){if(e instanceof Date)return e;var t=new Date(e);return Number.isNaN(t.getTime())?null:t}(e);if(!c)return String(e);var s=Ge({},o);return"date"===n?s.dateStyle=s.dateStyle||"medium":"datetime"===n?(s.dateStyle=s.dateStyle||"medium",s.timeStyle=s.timeStyle||"short"):"time"===n&&(s.timeStyle=s.timeStyle||"short"),new Intl.DateTimeFormat(r,s).format(c)}if("boolean"===n){var d=t.trueLabel||"Yes",m=t.falseLabel||"No";return e?d:m}return Array.isArray(e)?e.length?e.map(function(e){return lt(e)?"":"object"===et(e)?e.label||e.value||e.name||Pt(e):String(e)}).filter(Boolean).join(", "):t.emptyValue||"":"object"===et(e)?JSON.stringify(e):String(e)}(n,t,a)},ya=function(e){return"string"==typeof e?e.toLowerCase():e instanceof Date?e.getTime():e},wa=function(e){return lt(e)?"":Array.isArray(e)?e.map(wa).join(" "):"object"===et(e)?JSON.stringify(e):String(e)},xa=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:":";return e.map(function(e){return lt(e)?"":String(e)}).join(t)},ka=function(e,t){if(e){if(Object.prototype.hasOwnProperty.call(e,"__groupId"))return e.__groupId;if("function"==typeof t)return t(e);if(Array.isArray(t))return xa(t.map(function(t){return mt(e,t)}));if((a=t)&&"object"===et(a)&&!Array.isArray(a)){if("string"==typeof t.template)return ca(t.template,e);if(Array.isArray(t.accessors))return xa(t.accessors.map(function(t){return mt(e,t)}),t.separator);if("string"==typeof t.accessor)return mt(e,t.accessor)}var a;return mt(e,t||"id")}},Ba=function(e,t,a,n){return!!lt(a)||("function"==typeof a?Boolean(a(e,t)):Array.isArray(a)?a.some(function(a){return Ba(e,t,a,n)}):"string"==typeof a||"number"==typeof a?ka(e,n)===a:"object"===et(a)&&Object.entries(a).every(function(a){var r,o=He(a,2),i=o[0],l=o[1];return r="index"===i?t:"id"===i||"recordId"===i?ka(e,n):mt(e,i),Array.isArray(l)?l.includes(r):function(e,t){return!t||"object"!==et(t)||Array.isArray(t)?e===t:!(lt(e)&&["gt","gte","lt","lte","contains","startsWith","endsWith"].some(function(e){return Object.prototype.hasOwnProperty.call(t,e)})||Object.prototype.hasOwnProperty.call(t,"eq")&&e!==t.eq||Object.prototype.hasOwnProperty.call(t,"ne")&&e===t.ne||Object.prototype.hasOwnProperty.call(t,"gt")&&!(e>t.gt)||Object.prototype.hasOwnProperty.call(t,"gte")&&!(e>=t.gte)||Object.prototype.hasOwnProperty.call(t,"lt")&&!(e3&&void 0!==arguments[3]?arguments[3]:{}).merge,r=void 0!==n&&n;return"function"==typeof e?e:lt(e)?void 0:function(n,o){var i,l=Array.isArray(e)?e:[e];if(r){var c=l.reduce(function(e,r){var i=Sa(r,t,n,o,a);return i&&"object"===et(i)&&!Array.isArray(i)?Ge(Ge({},e),i):e},{});return Object.keys(c).length?c:void 0}return l.forEach(function(e){var r=Sa(e,t,n,o,a);lt(r)||(i=r)}),i}},ja=function(e,t,a,n){return"function"==typeof e?function(t,a){var r=e(t,a);return lt(r)?n:Boolean(r)}:lt(e)?void 0:function(r,o){var i=Array.isArray(e)?e:[e],l=n;return i.forEach(function(e){var n=Sa(e,t,r,o,a);lt(n)||(l=Boolean(n))}),l}},Oa=function(e,t){var a=ka(e.record,t),n={record:e.record,recordId:a,index:e.index,timestamp:Date.now()};return e.column&&(n.column=e.column,n.columnAccessor=e.column.accessor,n.columnIndex=e.columnIndex,n.value=mt(e.record,e.column.accessor)),n},Pa=function(e){return Array.isArray(e)?e.flatMap(function(e){return[].concat(Je(Array.isArray(null==e?void 0:e.columns)?e.columns:tt),Je(Pa(null==e?void 0:e.groups)))}):tt},Ea=function(e,t){if(Array.isArray(e))return e.map(function(e){var a=new Set(Array.isArray(null==e?void 0:e.columns)?e.columns.map(function(e){return null==e?void 0:e.accessor}).filter(Boolean):tt);return Ge(Ge({},e),{},{columns:(t||tt).filter(function(e){return a.has(null==e?void 0:e.accessor)}),groups:Array.isArray(null==e?void 0:e.groups)?Ea(e.groups,t):null==e?void 0:e.groups})})},Ta=function(e,t,a,n){var r,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:at,i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:at,l="function"==typeof e.filter?function(t){return Kt(e.filter(t),e,i)}:lt(e.filter)?e.filter:Kt(Ca(e.filter,e,t,n),e,i),c=lt(e.filtering)&&"function"==typeof i.isColumnFilterActive?i.isColumnFilterActive(e):e.filtering;return{accessor:e.accessor,title:e.title,textAlign:e.textAlign,sortable:e.sortable,sortKey:e.sortKey,draggable:e.draggable,toggleable:e.toggleable,resizable:e.resizable,defaultToggle:e.defaultToggle,filter:l,filtering:c,filterPopoverProps:e.filterPopoverProps,filterPopoverDisableClickOutside:null!==(r=e.filterPopoverDisableClickOutside)&&void 0!==r?r:"function"==typeof i.shouldDisableFilterPopoverClickOutside?i.shouldDisableFilterPopoverClickOutside(e):void 0,width:e.width,hidden:e.hidden,hiddenContent:e.hiddenContent,visibleMediaQuery:e.visibleMediaQuery,titleClassName:e.titleClassName,titleStyle:e.titleStyle,cellsClassName:j(e.cellsClassName),cellsStyle:"function"==typeof e.cellsStyle?e.cellsStyle:e.cellsStyle?function(){return e.cellsStyle}:void 0,customCellAttributes:Da(lt(e.cellAttributes)?e.customCellAttributes:e.cellAttributes,"attributes",n.idAccessor,{merge:!0}),footer:lt(e.footer)?e.footer:Ca(e.footer,e,t,n),footerClassName:e.footerClassName,footerStyle:e.footerStyle,ellipsis:e.ellipsis,noWrap:e.noWrap,render:function(r,i){var l,c,s=mt(r,e.accessor),d=va(r,e,t),m=e.presentation||e.type||"text",u=e.render;if(lt(u))if("badge"===m){var b=e.badgeColorAccessor?mt(r,e.badgeColorAccessor):e.badgeColor||"gray";l=k().createElement(O.Badge,{color:b,radius:e.badgeRadius||"sm",variant:e.badgeVariant||"light"},d)}else if("link"===m){var A=e.hrefAccessor?mt(r,e.hrefAccessor):ca(e.hrefTemplate,r);l=k().createElement(O.Anchor,{href:A,target:e.target||"_blank"},d)}else if("code"===m)l=k().createElement(O.Code,null,d);else if("progress"===m){var p=Number(s||0);l=k().createElement(O.Progress,{color:e.progressColor||"blue",radius:e.progressRadius||"xl",value:Number.isNaN(p)?0:p})}else"json"===m?l=k().createElement(O.Code,{style:{whiteSpace:"pre-wrap"}},JSON.stringify(s,null,2)):lt(a)?(c=e,l=["color","fw","size"].some(function(e){return!lt(c[e])})?k().createElement(O.Text,{c:e.color,component:"span",fw:e.fw,size:e.size},d):d):l=fa(a,r,i,e,t,n);else l=fa(u,r,i,e,t,n);if(!e.editable||!e.accessor||null!=r&&r.__group||"function"!=typeof(null==o?void 0:o.isEditingCell)||"function"!=typeof(null==o?void 0:o.handleValueChange)||"function"!=typeof(null==o?void 0:o.closeEditor))return l;var h=e.editor||k().createElement(O.TextInput,{size:"xs"}),g=fa(h,r,i,e,t,n);return k().createElement($t,{closeEditor:o.closeEditor,content:l,editor:g,editorDefinition:{column:e,editor:h},handleValueChange:function(t){return o.handleValueChange(r,e,ft(t,e,h))},isEditing:o.isEditingCell(r,e),value:s})}}},_a=function(e,t,a,n){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:at,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:at;return{id:e.id,title:e.title,textAlign:e.textAlign,className:e.className,style:e.style,columns:Array.isArray(e.columns)?e.columns.map(function(e){return Ta(e,t,a,n,r,o)}):void 0,groups:Array.isArray(e.groups)?e.groups.map(function(e){return _a(e,t,a,n,r,o)}):void 0}},Ia=function(e){var t,a=e.data,n=void 0===a?tt:a,r=e.columns,o=void 0===r?tt:r,i=e.groups,l=void 0===i?void 0:i,c=e.groupBy,s=void 0===c?void 0:c,d=e.childRowsAccessor,m=void 0===d?void 0:d,u=e.groupAggregations,b=void 0===u?void 0:u,A=e.idAccessor,p=void 0===A?"id":A,h=e.locale,g=void 0===h?"en-US":h,f=e.paginationMode,C=void 0===f?"client":f,v=e.sortMode,y=void 0===v?"client":v,w=e.searchMode,B=void 0===w?"client":w,S=e.filterMode,D=void 0===S?"client":S,P=e.recordsPerPage,E=void 0===P?10:P,T=e.pageSize,_=void 0===T?10:T,I=e.noRecordsText,z=void 0===I?"No records found":I,R=e.pageSizeOptions,M=void 0===R?[10,25,50]:R,W=e.recordsPerPageOptions,L=void 0===W?void 0:W,F=e.recordsPerPageLabel,V=void 0===F?"Rows per page":F,Q=e.paginationSize,U=void 0===Q?"sm":Q,G=(e.direction,e.selectionTrigger),q=void 0===G?void 0:G,H=e.tableProps,K=void 0===H?at:H,$=e.scrollAreaProps,J=void 0===$?at:$,Y=e.withRowBorders,X=void 0===Y||Y,Z=e.withTableBorder,ee=void 0===Z||Z,te=e.withColumnBorders,ae=void 0!==te&&te,ne=e.striped,re=void 0!==ne&&ne,oe=e.highlightOnHover,ie=void 0===oe||oe,le=e.textSelectionDisabled,ce=void 0!==le&&le,se=function(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(-1!==t.indexOf(n))continue;a[n]=e[n]}return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n0,ut=!dt&&Boolean(rt),ht=dt||ut,gt=me>0,ft=dt?aa(Ze,nt,ot):void 0,Ct=dt?na(ft):tt,vt=Array.isArray(null==Re?void 0:Re.initiallyExpandedRecordIds)?Re.initiallyExpandedRecordIds:tt,yt=E||_||10,wt=He((0,x.useState)(ge||1),2),xt=wt[0],kt=wt[1],Bt=He((0,x.useState)(yt),2),St=Bt[0],jt=Bt[1],Ot=He((0,x.useState)(Ce||null),2),Et=Ot[0],Tt=Ot[1],_t=He((0,x.useState)(Array.isArray(ye)?ye:tt),2),Mt=_t[0],Nt=_t[1],Wt=He((0,x.useState)(Array.isArray(we)?we:la(Ct,vt)),2),Ft=Wt[0],Vt=Wt[1],Qt=He((0,x.useState)(null),2),Ut=Qt[0],Gt=Qt[1],qt=(0,x.useDeferredValue)(Ae);(0,x.useEffect)(function(){lt(ge)||kt(ge)},[ge]),(0,x.useEffect)(function(){lt(E)&<(_)||jt(E||_)},[E,_]),(0,x.useEffect)(function(){Ce&&Tt(Ce)},[Ce]),(0,x.useEffect)(function(){Array.isArray(ye)&&Nt(ye)},[ye]),(0,x.useEffect)(function(){Array.isArray(we)&&Vt(we)},[we]);var Kt=lt(ge)?xt:ge,$t=lt(E)?lt(_)?St:_:E,Jt=Ce||Et,Yt=Array.isArray(ye)?ye:Mt,Xt=Array.isArray(we)?we:Ft,Zt=(0,x.useRef)(null),ea=He((0,x.useState)(null),2),sa=ea[0],da=ea[1],ma=He((0,x.useState)(null),2),ua=ma[0],ba=ma[1],Aa=Pa(l),pa=Array.isArray(o)&&o.length>0,fa=Array.isArray(l)&&l.length>0,xa=pa?o:Aa,Ba=N({key:se.storeColumnsKey,columns:xa}).effectiveColumns,Ia=Array.isArray(Ba)?Ba:xa,za=se.defaultColumnProps&&!lt(se.defaultColumnProps.filter)?Ia.map(function(e){var t,a;return lt(e.filter)?Ge(Ge({},e),{},{filter:se.defaultColumnProps.filter,filterPopoverProps:null!==(t=e.filterPopoverProps)&&void 0!==t?t:se.defaultColumnProps.filterPopoverProps,filterPopoverDisableClickOutside:null!==(a=e.filterPopoverDisableClickOutside)&&void 0!==a?a:se.defaultColumnProps.filterPopoverDisableClickOutside}):e}):Ia,Ra=Array.isArray(pe)?pe:Ia.filter(function(e){return!1!==e.searchable}).map(function(e){return e.accessor}).filter(Boolean),Ma={idAccessor:p},Na=function(e,t,a,n){return(e||tt).map(function(e){var r=t?Ge(Ge({},t),e):e,o=lt(null==e?void 0:e.filter)?null==t?void 0:t.filter:e.filter;if(null==e||!e.accessor||lt(o))return{accessor:null==e?void 0:e.accessor,column:r,controls:tt};var i="function"==typeof o?void 0:Ca(o,e,a,n);return{accessor:e.accessor,column:r,controls:i?zt(i,e):tt}})}(za,se.defaultColumnProps,g,Ma),Wa=Pt((Na||tt).map(function(e){return{accessor:e.accessor,controls:(e.controls||tt).map(function(e){return{defaultValue:It(e),key:e.key,typeName:e.typeName,valueProp:e.valueProp}})}})),La=(Na||tt).reduce(function(e,t){var a=t.controls||tt;return a.forEach(function(n){var r=It(n);lt(r)||Object.assign(e,Rt(e,t.accessor,n.key,r,a.length))}),e},{}),Fa=He((0,x.useState)(La),2),Va=Fa[0],Qa=Fa[1],Ua=(0,x.useRef)(ct(he)).current;(0,x.useEffect)(function(){Ua||Qa(function(e){return function(e,t){var a={};return(t||tt).forEach(function(t){var n;t.accessor&&null!==(n=t.controls)&&void 0!==n&&n.length&&Object.prototype.hasOwnProperty.call(e,t.accessor)&&(a[t.accessor]=e[t.accessor])}),a}(Ge(Ge({},La),e),Na)})},[Wa,Ua]);var Ga=Ua?he:Va,qa=Na.reduce(function(e,t){return t.accessor&&(e[t.accessor]=t),e},{}),Ha=function(e){Me&&Me(e)},Ka="client"===B?function(e,t,a){if(!t)return e;var n=String(t).trim().toLowerCase();return n?e.filter(function(e){return a.some(function(t){return wa(mt(e,t)).toLowerCase().includes(n)})}):e}(Ze,qt,Ra):Ze,$a="client"===D?function(e,t,a){var n=(a||tt).filter(function(e){return Lt(t,e)});return n.length?e.filter(function(e){return n.every(function(a){return Ht(e,t,a)})}):e}(Ka,Ga,Na):Ka,Ja="client"===y?function(e,t){if(!t||!t.columnAccessor)return e;var a="desc"===t.direction?-1:1,n=t.sortKey||t.columnAccessor,r=Je(e);return r.sort(function(e,t){var r=ya(mt(e,n)),o=ya(mt(t,n));return lt(r)&<(o)?0:lt(r)?1:lt(o)?-1:r>o?a:r3&&void 0!==arguments[3]?arguments[3]:0,r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"id",o=ta(t),i=o?ka(t,r):void 0,l=o&&!lt(i)&&Array.isArray(a)&&a.includes(i);return k().createElement(O.Box,{component:"span",className:"dash-mantine-datatable-group-cell",style:{paddingInlineStart:"".concat(20*Math.max(n,0),"px")}},k().createElement("span",{"aria-hidden":"true",className:j("dash-mantine-datatable-group-chevron",o?"dash-mantine-datatable-group-chevron-visible":"dash-mantine-datatable-group-chevron-spacer",l&&"dash-mantine-datatable-group-chevron-expanded")}),k().createElement(O.Box,{component:"span",className:"dash-mantine-datatable-group-cell-content"},e))}(null!=e&&e.__group&&(lt(o)||""===o)?String(null!==(n=e.__groupValue)&&void 0!==n?n:""):o,e,Xt,null!==(r=null==e?void 0:e.__groupLevel)&&void 0!==r?r:me,p)}})}):Cn,yn=fa?Ea(l,za):void 0,wn=fa?yn.map(function(e){return _a(e,g,pn,Ma,{closeEditor:sn,handleValueChange:mn,isEditingCell:dn},fn)}):void 0,xn=Re?{trigger:Re.trigger||"click",allowMultiple:Re.allowMultiple,expandable:function(e){var t=e.record,a=e.index;return!ta(t)&&("function"!=typeof Re.expandable||Re.expandable({record:t,index:a}))},initiallyExpanded:function(e){var t=e.record;return!ta(t)&&Array.isArray(Re.initiallyExpandedRecordIds)&&Re.initiallyExpandedRecordIds.includes(ka(t,p))},expanded:{recordIds:Xt,onRecordIdsChange:function(e){Ha(un(e))}},content:function(e){var t=e.record;return ta(t)?null:function(e,t,a){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:at;if(!e)return null;if(k().isValidElement(e)||Array.isArray(e)||st(e))return ga(e,ha(t,void 0,{accessor:"__rowExpansion__"},a,n),n);if("object"!==et(e))return ga(e,ha(t,void 0,{accessor:"__rowExpansion__"},a,n),n);if("json"===e.type){var r=e.accessor?mt(t,e.accessor):t;return k().createElement(O.Code,{block:!0,style:{whiteSpace:"pre-wrap"}},JSON.stringify(r,null,2))}if("text"===e.type){var o=e.template?ca(e.template,t):va(t,e,a);return k().createElement(O.Text,{size:"sm"},o)}var i=Array.isArray(e.fields)?e.fields:tt;return k().createElement(O.Paper,{p:"sm",radius:"sm",withBorder:!0},k().createElement(O.Stack,{gap:"xs"},e.title?k().createElement(O.Text,{fw:700},ca(e.title,t)):null,i.map(function(e){return k().createElement(O.Group,{align:"flex-start",gap:"xs",grow:!0,key:e.accessor||e.label,wrap:"nowrap"},k().createElement(O.Text,{c:"dimmed",fw:600,size:"sm",style:{minWidth:110}},e.label||e.accessor),k().createElement(O.Box,{style:{flex:1}},function(e,t,a){var n={accessor:e.accessor,template:e.template,presentation:e.presentation,type:e.type,locale:e.locale,currency:e.currency,formatOptions:e.formatOptions,trueLabel:e.trueLabel,falseLabel:e.falseLabel,emptyValue:e.emptyValue,minimumFractionDigits:e.minimumFractionDigits,maximumFractionDigits:e.maximumFractionDigits},r=va(t,n,a);return"code"===e.type?k().createElement(O.Code,null,r):k().createElement(O.Text,{c:e.color||"dimmed",fw:e.fw,size:e.size||"sm"},r)}(e,t,a)))})))}(Re.content||Re,t,g,Ma)}}:void 0,kn=ve?{sorted:lt(ve.sorted)?ve.sorted:Ca(ve.sorted,{accessor:"__sort_icon_sorted__"},g,Ma),unsorted:lt(ve.unsorted)?ve.unsorted:Ca(ve.unsorted,{accessor:"__sort_icon_unsorted__"},g,Ma)}:void 0,Bn=("string"==typeof Ne?k().createElement(O.Text,{c:"dimmed",ta:"center"},Ne):Ne&&"text"===Ne.type&&!Ne.namespace?k().createElement(O.Text,{c:"dimmed",ta:"center"},Ne.value):void 0)||((k().isValidElement(Ne)||Array.isArray(Ne)||st(Ne))&&!lt(Ne)?Ca(Ne,{accessor:"__empty_state__"},g,Ma):void 0),Sn=lt(Ne)&&!lt(We)?Ca(We,{accessor:"__no_records_icon__"},g,Ma):void 0,Dn=lt($e)?void 0:Ca($e,{accessor:"__custom_loader__"},g,Ma),jn=Ge(Ge({},(gn=se,it.reduce(function(e,t){return lt(gn[t])||(e[t]=gn[t]),e},{}))),{},{bg:lt(se.bg)?se.backgroundColor:se.bg,h:lt(se.h)?se.height:se.h,mih:lt(se.mih)?se.minHeight:se.mih,mah:lt(se.mah)?se.maxHeight:se.mah,radius:lt(se.borderRadius)?se.radius:se.borderRadius}),On=jn.mih,Pn=Ge({},jn);delete Pn.mih,delete Pn.minHeight;var En=Boolean(se.fetching)||!Array.isArray(tn)||0===tn.length?On:void 0,Tn=ht||gt?Ge(Ge({},K),{},{layout:(null==K?void 0:K.layout)||"fixed"}):K,_n=Da(Ee,"color",p),In=Da(Te,"backgroundColor",p),zn=function(e,t){return"function"==typeof e||"string"==typeof e?e:lt(e)?void 0:function(a,n){var r=(Array.isArray(e)?e:[e]).map(function(e){return Sa(e,"className",a,n,t)}).filter(Boolean);return r.length?j(r):void 0}}(_e,p),Rn=function(e,t){return"function"==typeof e?e:lt(e)?void 0:function(a,n){var r=(Array.isArray(e)?e:[e]).reduce(function(e,r){var o=Sa(r,"style",a,n,t);return o&&"object"===et(o)&&!Array.isArray(o)?Ge(Ge({},e),o):e},{});return Object.keys(r).length?r:void 0}}(Ie,p),Mn=Da(ze,"attributes",p,{merge:!0}),Nn=ht?function(e){return ka(e,p)}:function(e){return"function"==typeof e||"string"==typeof e?e:lt(e)?"id":function(t){return ka(t,e)}}(p),Wn=dt?void 0:q,Ln=Wn?function(e,t){return(null==e||!e.__group)&&(!rn||!rn(e,t))&&(!nn||nn(e,t))}:void 0,Fn=on&&Wn?function(e,t){return on(e,t)||at}:void 0,Vn="rtl"===se.direction?"rtl":"ltr";return k().createElement(O.DirectionProvider,{detectDirection:!1,initialDirection:Vn,key:"".concat(ue||"datatable","-").concat(Vn)},k().createElement(O.Box,{className:"dash-mantine-datatable-root",dir:Vn,mih:On,style:lt(On)?void 0:{display:"flex",flexDirection:"column"}},k().createElement(Le,Qe({},Pn,Tn,{id:ue,backgroundColor:jn.bg,bodyRef:se.bodyRef,borderColor:se.borderColor,borderRadius:jn.radius,c:se.c,className:j(Ye,Xe,ln&&"dash-mantine-datatable-row-drag-enabled",(ht||gt)&&"dash-mantine-datatable-grouped",gt&&"dash-mantine-datatable-grouped-child",re&&"dash-mantine-datatable-striped",ie&&"dash-mantine-datatable-highlight-on-hover"),classNames:se.classNames,columns:fa?void 0:vn,customLoader:Dn,customRowAttributes:Mn,defaultColumnProps:An,emptyState:Bn,fetching:se.fetching,groups:wn,height:jn.h,highlightOnHover:ie,highlightOnHoverColor:se.highlightOnHoverColor,idAccessor:Nn,isRecordSelectable:Ln,getRecordSelectionCheckboxProps:Fn,loadingText:Ke,loaderBackgroundBlur:se.loaderBackgroundBlur,loaderColor:se.loaderColor,loaderSize:se.loaderSize,loaderType:se.loaderType,maxHeight:jn.mah,mih:En,noHeader:se.noHeader,noRecordsIcon:Sn,noRecordsText:z,onCellClick:function(e){return Ha({cellClick:Oa(e,p)})},onCellContextMenu:function(e){return Ha({cellContextMenu:Oa(e,p)})},onCellDoubleClick:function(e){var t,a=Oa(e,p),n=Ia.find(function(e){return(null==e?void 0:e.accessor)===a.columnAccessor});null==n||!n.editable||null!==(t=e.record)&&void 0!==t&&t.__group||lt(a.recordId)?sn():Gt({columnAccessor:a.columnAccessor,recordId:a.recordId}),Ha({cellDoubleClick:a})},onPageChange:function(e){lt(ge)&&kt(e),Ha({page:e,pagination:{page:e,recordsPerPage:$t,totalRecords:Ya,timestamp:Date.now()}})},onRecordsPerPageChange:function(e){lt(E)&<(_)&&jt(e),lt(ge)&&kt(1),Ha({recordsPerPage:e,pageSize:e,page:1,pagination:{page:1,recordsPerPage:e,totalRecords:Ya,timestamp:Date.now()}})},onRowClick:function(e){return Ha(Ge(Ge({},ta(e.record)?function(e){var t=ka(e,p);if(lt(t))return at;var a=Xt.includes(t)?Xt.filter(function(e){return e!==t}):la(Xt,[t]);return un(a)}(e.record):at),{},{rowClick:Oa(e,p)}))},onRowContextMenu:function(e){return Ha({rowContextMenu:Oa(e,p)})},onRowDoubleClick:function(e){return Ha({rowDoubleClick:Oa(e,p)})},onScroll:function(e){return Ha({scrollPosition:Ge(Ge({},e),{},{timestamp:Date.now()})})},onScrollToBottom:function(){return Ha({scrollEdge:{edge:"bottom",timestamp:Date.now()}})},onScrollToLeft:function(){return Ha({scrollEdge:{edge:"left",timestamp:Date.now()}})},onScrollToRight:function(){return Ha({scrollEdge:{edge:"right",timestamp:Date.now()}})},onScrollToTop:function(){return Ha({scrollEdge:{edge:"top",timestamp:Date.now()}})},onSelectedRecordsChange:function(e){var t=e.map(function(e){return ka(e,p)});Array.isArray(ye)||Nt(t),Ha({selectedRecordIds:t,selectedRecords:e,lastSelectionChange:{recordIds:t,records:e,timestamp:Date.now()}})},onSortStatusChange:function(e){Ce||Tt(e),Ha({sortStatus:e,lastSortChange:Ge(Ge({},e),{},{timestamp:Date.now()})})},page:"none"===C?void 0:Kt,paginationActiveBackgroundColor:qe,paginationActiveTextColor:Ue,paginationSize:U,paginationWithControls:se.paginationWithControls,paginationWithEdges:se.paginationWithEdges,pinFirstColumn:se.pinFirstColumn,pinLastColumn:se.pinLastColumn,horizontalSpacing:se.horizontalSpacing,records:tn,recordsPerPage:"none"===C?void 0:$t,recordsPerPageLabel:V,recordsPerPageOptions:L||M||tt,rowBorderColor:se.rowBorderColor,rowColor:_n,rowBackgroundColor:In,rowClassName:zn,rowFactory:bn,rowExpansion:xn,rowStyle:Rn,scrollAreaProps:J,selectedRecords:Wn||Yt.length?an:void 0,allRecordsSelectionCheckboxProps:Se,selectionCheckboxProps:Be,selectionColumnClassName:xe,selectionColumnStyle:ke,selectionTrigger:Wn,shadow:se.shadow,sortIcons:kn,sortStatus:Jt,storeColumnsKey:se.storeColumnsKey,stickyHeader:se.stickyHeader,stickyHeaderOffset:se.stickyHeaderOffset,striped:re,stripedColor:se.stripedColor,style:se.style,styles:se.styles,tableRef:se.tableRef,textSelectionDisabled:ce,totalRecords:"none"===C?void 0:Ya,verticalSpacing:se.verticalSpacing,verticalAlign:se.verticalAlign,withRowBorders:X,withColumnBorders:ae,withTableBorder:ee}))))};Ia.propTypes={id:S().oneOfType([S().string,S().object]),data:S().arrayOf(S().object),records:S().arrayOf(S().object),columns:S().arrayOf(S().object),groups:S().arrayOf(S().object),groupBy:S().oneOfType([S().string,S().arrayOf(S().string)]),childRowsAccessor:S().string,groupAggregations:S().object,idAccessor:S().oneOfType([S().string,S().object,S().arrayOf(S().string)]),locale:S().string,direction:S().oneOf(["ltr","rtl"]),paginationMode:S().oneOf(["client","server","none"]),sortMode:S().oneOf(["client","server"]),searchMode:S().oneOf(["client","server"]),filterMode:S().oneOf(["client","server","none"]),searchQuery:S().string,searchableAccessors:S().arrayOf(S().string),filterValues:S().object,page:S().number,recordsPerPage:S().number,pageSize:S().number,totalRecords:S().number,sortStatus:S().object,selectedRecordIds:S().array,selectedRecords:S().array,expandedRecordIds:S().array,selectionTrigger:S().oneOf(["cell","checkbox"]),selectionColumnClassName:S().string,selectionColumnStyle:S().object,selectionCheckboxProps:S().object,allRecordsSelectionCheckboxProps:S().object,selectableRowRules:S().oneOfType([S().bool,S().object,S().array]),disabledSelectionRowRules:S().oneOfType([S().bool,S().object,S().array]),selectionCheckboxRules:S().oneOfType([S().object,S().array]),rowDragging:S().oneOfType([S().bool,S().object]),rowColor:S().oneOfType([S().string,S().object,S().array]),rowBackgroundColor:S().oneOfType([S().string,S().object,S().array]),rowClassName:S().oneOfType([S().string,S().object,S().array]),rowAttributes:S().oneOfType([S().object,S().array]),rowStyle:S().oneOfType([S().object,S().array]),rowExpansion:S().object,rowClick:S().object,rowDoubleClick:S().object,rowContextMenu:S().object,cellClick:S().object,cellDoubleClick:S().object,cellContextMenu:S().object,pagination:S().object,scrollPosition:S().object,scrollEdge:S().object,lastRowDragChange:S().object,lastSortChange:S().object,lastSelectionChange:S().object,lastExpansionChange:S().object,lastFilterChange:S().object,emptyState:S().oneOfType([S().string,S().object]),noRecordsIcon:S().any,noRecordsText:S().string,recordsPerPageOptions:S().arrayOf(S().number),pageSizeOptions:S().arrayOf(S().number),recordsPerPageLabel:S().string,paginationSize:S().oneOfType([S().string,S().number]),paginationActiveTextColor:S().oneOfType([S().string,S().object]),paginationActiveBackgroundColor:S().oneOfType([S().string,S().object]),loadingText:S().string,tableProps:S().object,scrollAreaProps:S().object,className:S().string,tableClassName:S().string,classNames:S().object,style:S().object,styles:S().object,radius:S().oneOfType([S().string,S().number]),height:S().oneOfType([S().string,S().number]),minHeight:S().oneOfType([S().string,S().number]),maxHeight:S().oneOfType([S().string,S().number]),shadow:S().string,bg:S().oneOfType([S().string,S().object]),c:S().oneOfType([S().string,S().object]),backgroundColor:S().oneOfType([S().string,S().object]),borderColor:S().oneOfType([S().string,S().object]),rowBorderColor:S().oneOfType([S().string,S().object]),stripedColor:S().oneOfType([S().string,S().object]),highlightOnHoverColor:S().oneOfType([S().string,S().object]),withRowBorders:S().bool,withTableBorder:S().bool,withColumnBorders:S().bool,horizontalSpacing:S().oneOfType([S().string,S().number]),verticalSpacing:S().oneOfType([S().string,S().number]),borderRadius:S().oneOfType([S().string,S().number]),striped:S().bool,highlightOnHover:S().bool,textSelectionDisabled:S().bool,fetching:S().bool,loaderBackgroundBlur:S().number,loaderSize:S().oneOfType([S().string,S().number]),loaderType:S().string,loaderColor:S().string,customLoader:S().any,noHeader:S().bool,pinFirstColumn:S().bool,pinLastColumn:S().bool,stickyHeader:S().bool,stickyHeaderOffset:S().oneOfType([S().string,S().number]),verticalAlign:S().oneOf(["top","center","bottom"]),paginationWithEdges:S().bool,paginationWithControls:S().bool,storeColumnsKey:S().string,defaultColumnProps:S().object,defaultColumnRender:S().any,sortIcons:S().object,bodyRef:S().any,tableRef:S().any,m:S().oneOfType([S().string,S().number]),mx:S().oneOfType([S().string,S().number]),my:S().oneOfType([S().string,S().number]),mt:S().oneOfType([S().string,S().number]),mb:S().oneOfType([S().string,S().number]),ms:S().oneOfType([S().string,S().number]),me:S().oneOfType([S().string,S().number]),ml:S().oneOfType([S().string,S().number]),mr:S().oneOfType([S().string,S().number]),p:S().oneOfType([S().string,S().number]),px:S().oneOfType([S().string,S().number]),py:S().oneOfType([S().string,S().number]),pt:S().oneOfType([S().string,S().number]),pb:S().oneOfType([S().string,S().number]),ps:S().oneOfType([S().string,S().number]),pe:S().oneOfType([S().string,S().number]),pl:S().oneOfType([S().string,S().number]),pr:S().oneOfType([S().string,S().number]),w:S().oneOfType([S().string,S().number]),miw:S().oneOfType([S().string,S().number]),maw:S().oneOfType([S().string,S().number]),h:S().oneOfType([S().string,S().number]),mih:S().oneOfType([S().string,S().number]),mah:S().oneOfType([S().string,S().number]),opacity:S().oneOfType([S().string,S().number]),ff:S().string,fz:S().oneOfType([S().string,S().number]),fw:S().oneOfType([S().string,S().number]),lts:S().oneOfType([S().string,S().number]),ta:S().string,lh:S().oneOfType([S().string,S().number]),fs:S().string,tt:S().string,display:S().string,flex:S().oneOfType([S().string,S().number]),bd:S().oneOfType([S().string,S().number]),bdrs:S().oneOfType([S().string,S().number]),td:S().string,bgsz:S().string,bgp:S().string,bgr:S().string,bga:S().string,pos:S().string,top:S().oneOfType([S().string,S().number]),left:S().oneOfType([S().string,S().number]),bottom:S().oneOfType([S().string,S().number]),right:S().oneOfType([S().string,S().number]),inset:S().oneOfType([S().string,S().number]),hiddenFrom:S().string,visibleFrom:S().string,setProps:S().func},Ia.dashChildrenUpdate=!0;const za=Ia;var Ra=za;window.dash_mantine_datatable=i})(); //# sourceMappingURL=dash_mantine_datatable.min.js.map \ No newline at end of file diff --git a/dash_mantine_datatable/dash_mantine_datatable.min.js.map b/dash_mantine_datatable/dash_mantine_datatable.min.js.map index 0a12460..9a0d3b0 100644 --- a/dash_mantine_datatable/dash_mantine_datatable.min.js.map +++ b/dash_mantine_datatable/dash_mantine_datatable.min.js.map @@ -1 +1 @@ -{"version":3,"file":"dash_mantine_datatable.min.js","mappings":"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","sources":["webpack:///./node_modules/mantine-datatable/dist/styles.layer.css","webpack:///./src/lib/styles/layers.css","webpack:///./node_modules/css-loader/dist/runtime/api.js","webpack:///./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack:///./node_modules/react/cjs/react-jsx-runtime.production.min.js","webpack:///./node_modules/react/jsx-runtime.js","webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack:///./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack:///./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack:///./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack:///./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack:///./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack:///external window \"React\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/compat","webpack:///webpack/runtime/nonce","webpack:///./node_modules/mantine-datatable/dist/styles.layer.css?addd","webpack:///./src/lib/styles/layers.css?e426","webpack:///external window \"PropTypes\"","webpack:///./node_modules/clsx/dist/clsx.mjs","webpack:///external window \"MantineCore\"","webpack:///external window \"MantineHooks\"","webpack:///./node_modules/mantine-datatable/dist/index.mjs","webpack:///./src/lib/components/DataTable.react.js","webpack:///./src/lib/index.js"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `@layer mantine-datatable{.mantine-datatable-nowrap{white-space:nowrap}.mantine-datatable-ellipsis{overflow:hidden;text-overflow:ellipsis}.mantine-datatable-pointer-cursor{cursor:pointer}.mantine-datatable-context-menu-cursor{cursor:context-menu}.mantine-datatable-text-selection-disabled{user-select:none}.mantine-datatable-text-align-left{text-align:left}.mantine-datatable-text-align-center{text-align:center}.mantine-datatable-text-align-right{text-align:right}.mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-light,var(--mantine-color-text)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-dark,var(--mantine-color-text)\n )}.mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-light,var(--mantine-color-body)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-dark,var(--mantine-color-body)\n )}.mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-light,var(--mantine-color-gray-3)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-dark,var(--mantine-color-dark-4)\n )}.mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-light,var(--mantine-datatable-border-color)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-dark,var(--mantine-datatable-border-color)\n )}.mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-light,var(--mantine-color-gray-0)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-dark,var(--mantine-color-dark-6)\n )}.mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-light,var(--mantine-color-gray-1)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-dark,var(--mantine-color-dark-5)\n )}.mantine-datatable{--mantine-datatable-selection-color:var(--mantine-primary-color-light);--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.05),transparent),linear-gradient(rgba(0,0,0,.05) 30%,transparent)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.25),transparent),linear-gradient(rgba(0,0,0,.25) 30%,transparent)}.mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.05),transparent),linear-gradient(270deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.25),transparent),linear-gradient(270deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.05)),linear-gradient(transparent 30%,rgba(0,0,0,.05))}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.25)),linear-gradient(transparent 30%,rgba(0,0,0,.25))}.mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.05),transparent),linear-gradient(90deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.25),transparent),linear-gradient(90deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-header-height:0;--mantine-datatable-footer-height:0;--mantine-datatable-selection-column-width:0;--mantine-datatable-top-shadow-opacity:0;--mantine-datatable-left-shadow-opacity:0;--mantine-datatable-bottom-shadow-opacity:0;--mantine-datatable-right-shadow-opacity:0;--mantine-datatable-footer-position:sticky;--mantine-datatable-footer-bottom:0;--mantine-datatable-last-row-border-bottom:unset;background:var(--mantine-datatable-background-color);color:var(--mantine-datatable-color);display:flex;flex-direction:column;overflow:hidden;position:relative}.mantine-datatable td,.mantine-datatable th{border-left:0}[dir=rtl] .mantine-datatable td,[dir=rtl] .mantine-datatable th{border-left:0;border-right:0}[dir=rtl] .mantine-datatable td:not(:first-of-type),[dir=rtl] .mantine-datatable th:not(:first-of-type){border-right:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-with-border{border:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-resizable-columns{table-layout:fixed}.mantine-datatable-resizable-columns th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mantine-datatable-pin-first-column td:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-resizable-columns th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible.mantine-datatable-resizable-columns th:nth-of-type(2),.mantine-datatable-pin-last-column td:last-of-type,.mantine-datatable-pin-last-column.mantine-datatable-resizable-columns th:last-of-type{overflow:visible}.mantine-datatable td[data-accessor=__selection__],.mantine-datatable th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable:not(.mantine-datatable-resizable-columns) th{max-width:none;min-width:auto;white-space:nowrap;width:auto}.mantine-datatable:not(.mantine-datatable-resizable-columns) td[data-accessor=__selection__],.mantine-datatable:not(.mantine-datatable-resizable-columns) th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable-table{background:var(--mantine-datatable-background-color);border-collapse:separate;border-spacing:0;color:inherit}.mantine-datatable-table td,.mantine-datatable-table th{border-color:var(--mantine-datatable-row-border-color)}.mantine-datatable-table tbody,.mantine-datatable-table td,.mantine-datatable-table tfoot,.mantine-datatable-table tfoot tr,.mantine-datatable-table th,.mantine-datatable-table thead,.mantine-datatable-table thead tr{background:inherit}.mantine-datatable-table[data-striped] tbody tr:nth-of-type(odd){background:var(--mantine-datatable-striped-color)}.mantine-datatable-table[data-highlight-on-hover] tbody tr:hover{background:var(--mantine-datatable-highlight-on-hover-color)}.mantine-datatable-table tbody tr:last-of-type{border-bottom:0}.mantine-datatable-table tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:var(--mantine-datatable-last-row-border-bottom)}.mantine-datatable-vertical-align-top td{vertical-align:top}.mantine-datatable-vertical-align-bottom td{vertical-align:bottom}.mantine-datatable-last-row-border-bottom-visible tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}}@layer mantine-datatable{.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,.mantine-datatable-pin-last-column th:last-of-type{position:sticky!important;right:calc(-.025rem*var(--mantine-scale));z-index:1;@-moz-document url-prefix(){right:0}}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type{left:calc(-.025rem*var(--mantine-scale));right:auto;@-moz-document url-prefix(){left:0}}.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,.mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-right:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\"\";left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);pointer-events:none;position:absolute;top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);border-right:0;left:100%;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto;z-index:2}.mantine-datatable-pin-last-column th:last-of-type:after,.mantine-datatable-pin-last-column tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):last-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tfoot th:last-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type{background:inherit}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\"\";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:var(--mantine-datatable-selection-column-width);position:sticky!important;z-index:1}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:auto;right:var(--mantine-datatable-selection-column-width)}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\"\";opacity:var(--mantine-datatable-left-shadow-opacity);pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);right:auto}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:0}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tfoot th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tfoot th:first-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type{background:inherit}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):before,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\"\";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-cell-resizable:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th.mantine-datatable-header-cell-resizable:first-of-type,.mantine-datatable-pin-last-column th.mantine-datatable-header-cell-resizable:last-of-type{position:sticky!important}.mantine-datatable-empty-row,.mantine-datatable-table[data-highlight-on-hover] tbody .mantine-datatable-empty-row:hover{background:transparent}.mantine-datatable-empty-state{bottom:0;color:var(--mantine-color-gray-6);flex-direction:column;left:0;pointer-events:none;position:absolute;right:0;top:0}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state{color:var(--mantine-color-dark-3)}.mantine-datatable-empty-state{opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);transition:opacity .2s}.mantine-datatable-empty-state[data-active]{opacity:1}.mantine-datatable-empty-state-icon{background:var(--mantine-color-gray-2);border-radius:50%;font-size:0;padding:var(--mantine-spacing-xs)}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state-icon{background:var(--mantine-color-dark-5)}.mantine-datatable-empty-state-icon{margin-bottom:calc(var(--mantine-spacing-xs)/2)}.mantine-datatable-footer{bottom:var(--mantine-datatable-footer-bottom);position:var(--mantine-datatable-footer-position);z-index:2}.mantine-datatable-footer th{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-footer-selector-placeholder-cell{left:0;position:sticky;width:0}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell{left:auto;right:0}.mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:\"\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-header{position:sticky;top:0;z-index:2}.mantine-datatable-header th{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-header-column-toggle-checkbox-label{user-select:none}.mantine-datatable-header-cell-sortable{cursor:pointer;transition:background .2s}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{.mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable{border-radius:calc(.375rem*var(--mantine-scale));cursor:grab;transition:all .2s}.mantine-datatable-header-cell-draggable:active{cursor:grabbing}.mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-2)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable-action-icon{cursor:inherit;margin:calc(-.125rem*var(--mantine-scale)) calc(.125rem*var(--mantine-scale)) 0}.mantine-datatable-header-cell-drag-over{background:var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-drag-over{background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-toggleable-icon{opacity:.1;transition:opacity .2s}.mantine-datatable-header-cell-toggleable:hover .mantine-datatable-header-cell-toggleable-icon{opacity:1}.mantine-datatable-header-cell-resizable{position:relative}.mantine-datatable-header-resizable-handle{background:transparent;bottom:0;cursor:col-resize;opacity:0;position:absolute;right:-6px;top:0;transition:opacity .2s;width:12px;z-index:0}.mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-gray-4);bottom:2px;content:\"\";left:5px;position:absolute;top:2px;width:2px}[data-mantine-color-scheme=dark] .mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-dark-4)}.mantine-datatable-header-resizable-handle:after{border-radius:1px;transition:background-color .2s}[dir=rtl] .mantine-datatable-header-resizable-handle:after{left:auto;right:5px}.mantine-datatable-header-resizable-handle:hover{opacity:1}.mantine-datatable-header-resizable-handle:hover:after{background:var(--mantine-primary-color-6)}.mantine-datatable-header-resizable-handle:active{opacity:1!important}.mantine-datatable-header-resizable-handle:active:after{background:var(--mantine-primary-color-7)}[dir=rtl] .mantine-datatable-header-resizable-handle{left:-6px;right:auto}.mantine-datatable-header-cell-toggleable.mantine-datatable-header-cell-resizable:hover .mantine-datatable-header-resizable-handle,tr:hover .mantine-datatable-header-resizable-handle{opacity:1}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){transition:background .1s}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{transition:background .1s}.mantine-datatable-header-cell-sortable-group{gap:.25em}.mantine-datatable-header-cell-sortable-text{flex-grow:1;min-width:0}.mantine-datatable-header-cell-sortable-icon{transition:transform .2s}.mantine-datatable-header-cell-sortable-icon-reversed{transform:scaleY(-1)}.mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-sortable-unsorted-icon{transition:color .2s}th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-6)}[data-mantine-color-scheme=dark] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-2)}.mantine-datatable-header-cell-filter-action-icon{border:0;color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-filter-action-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-filter-action-icon[data-active]{color:var(--mantine-color-text)}.mantine-datatable-header-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:\"\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-column-group-header-cell--needs-border{border-inline-end:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-loader{background:color-mix(in srgb,var(--mantine-datatable-background-color),transparent 25%);bottom:0;left:0;opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s;z-index:3}.mantine-datatable-loader-fetching{opacity:1;pointer-events:all}.mantine-datatable-page-size-selector-button-icon{margin:0 calc(-.25rem*var(--mantine-scale)) 0 calc(.125rem*var(--mantine-scale))}[dir=rtl] .mantine-datatable-page-size-selector-button-icon{margin:0 calc(.125rem*var(--mantine-scale)) 0 calc(-.25rem*var(--mantine-scale))}.mantine-datatable-page-size-selector-menu-arrow{z-index:-1}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-page-size-selector-active{background:var(--mantine-datatable-pagination-active-background-color);color:var(--mantine-datatable-pagination-active-text-color);opacity:1}.mantine-datatable-pagination{align-items:center;background:inherit;border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color);display:flex;gap:var(--mantine-spacing-xs);justify-content:space-between}.mantine-datatable-pagination-text{flex:1 1 auto}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-pagination-pages{opacity:1;transition:opacity .2s}.mantine-datatable-pagination-pages-fetching{opacity:0}.mantine-datatable-pagination-pages-control{border-color:var(--mantine-datatable-border-color);color:var(--mantine-datatable-color)}.mantine-datatable-pagination-pages-control[data-active]{background:var(--mantine-datatable-pagination-active-background-color);border-color:transparent;color:var(--mantine-datatable-pagination-active-text-color)}.mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-dark\n )}.mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-dark\n )}.mantine-datatable-row{background:var(--mantine-datatable-row-background-color,inherit);color:var(--mantine-datatable-row-color,inherit)}.mantine-datatable-row[data-with-row-border]:not(:last-of-type) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row[data-selected] td{background:var(--mantine-datatable-selection-color)}.mantine-datatable-row-expansion-cell{padding:0}tr:not(:last-of-type) .mantine-datatable-row-expansion-cell-content{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row-expansion-cell-content{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}[data-with-row-border] .mantine-datatable-row-expansion-cell-content{border-top:0}.mantine-datatable-row-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-row-selector-cell{left:auto;right:0}tr[data-selected] .mantine-datatable-row-selector-cell{background:inherit}tr[data-selected] .mantine-datatable-row-selector-cell:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\"\";left:0;position:absolute;right:0;top:0}.mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\"\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}tr[data-with-row-border] .mantine-datatable-row-selector-cell:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}tr:last-of-type .mantine-datatable-row-selector-cell:after{bottom:0}.mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-row-selector-cell-checkbox{cursor:pointer}.mantine-datatable-scroll-area{flex:1 1 100%}.mantine-datatable-scroll-area-corner{background:transparent}.mantine-datatable-scroll-area-thumb{z-index:3}.mantine-datatable-scroll-area-scrollbar[data-state=visible]{background:transparent}.mantine-datatable-scroll-area-scrollbar div:before{pointer-events:none}.mantine-datatable-scroll-area-shadow{pointer-events:none;position:absolute;transition:opacity .2s}.mantine-datatable-scroll-area-top-shadow{background:var(--mantine-datatable-shadow-background-top);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-top-shadow-opacity);right:0;top:var(--mantine-datatable-header-height);z-index:2}.mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-left);bottom:0;left:0;opacity:var(--mantine-datatable-left-shadow-opacity);top:0;width:var(--mantine-spacing-xs);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-left-shadow{left:auto}.mantine-datatable-scroll-area-right-shadow,[dir=rtl] .mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-right);opacity:var(--mantine-datatable-right-shadow-opacity);right:0}.mantine-datatable-scroll-area-right-shadow{bottom:0;top:0;width:calc(var(--mantine-spacing-xs)/2);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-right-shadow{background:var(--mantine-datatable-shadow-background-left);left:0;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto}.mantine-datatable-scroll-area-shadow-behind{z-index:0}.mantine-datatable-scroll-area-bottom-shadow{background:var(--mantine-datatable-shadow-background-bottom);bottom:var(--mantine-datatable-footer-height);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-bottom-shadow-opacity);right:0;z-index:2}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}`, \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/mantine-datatable/dist/styles.layer.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@layer mantine-datatable{.mantine-datatable-nowrap{white-space:nowrap}.mantine-datatable-ellipsis{overflow:hidden;text-overflow:ellipsis}.mantine-datatable-pointer-cursor{cursor:pointer}.mantine-datatable-context-menu-cursor{cursor:context-menu}.mantine-datatable-text-selection-disabled{user-select:none}.mantine-datatable-text-align-left{text-align:left}.mantine-datatable-text-align-center{text-align:center}.mantine-datatable-text-align-right{text-align:right}.mantine-datatable{--mantine-datatable-color:var(\\n --mantine-datatable-color-light,var(--mantine-color-text)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-color:var(\\n --mantine-datatable-color-dark,var(--mantine-color-text)\\n )}.mantine-datatable{--mantine-datatable-background-color:var(\\n --mantine-datatable-background-color-light,var(--mantine-color-body)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-background-color:var(\\n --mantine-datatable-background-color-dark,var(--mantine-color-body)\\n )}.mantine-datatable{--mantine-datatable-border-color:var(\\n --mantine-datatable-border-color-light,var(--mantine-color-gray-3)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-border-color:var(\\n --mantine-datatable-border-color-dark,var(--mantine-color-dark-4)\\n )}.mantine-datatable{--mantine-datatable-row-border-color:var(\\n --mantine-datatable-row-border-color-light,var(--mantine-datatable-border-color)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-row-border-color:var(\\n --mantine-datatable-row-border-color-dark,var(--mantine-datatable-border-color)\\n )}.mantine-datatable{--mantine-datatable-striped-color:var(\\n --mantine-datatable-striped-color-light,var(--mantine-color-gray-0)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-striped-color:var(\\n --mantine-datatable-striped-color-dark,var(--mantine-color-dark-6)\\n )}.mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\\n --mantine-datatable-highlight-on-hover-color-light,var(--mantine-color-gray-1)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\\n --mantine-datatable-highlight-on-hover-color-dark,var(--mantine-color-dark-5)\\n )}.mantine-datatable{--mantine-datatable-selection-color:var(--mantine-primary-color-light);--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.05),transparent),linear-gradient(rgba(0,0,0,.05) 30%,transparent)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.25),transparent),linear-gradient(rgba(0,0,0,.25) 30%,transparent)}.mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.05),transparent),linear-gradient(270deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.25),transparent),linear-gradient(270deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.05)),linear-gradient(transparent 30%,rgba(0,0,0,.05))}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.25)),linear-gradient(transparent 30%,rgba(0,0,0,.25))}.mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.05),transparent),linear-gradient(90deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.25),transparent),linear-gradient(90deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-header-height:0;--mantine-datatable-footer-height:0;--mantine-datatable-selection-column-width:0;--mantine-datatable-top-shadow-opacity:0;--mantine-datatable-left-shadow-opacity:0;--mantine-datatable-bottom-shadow-opacity:0;--mantine-datatable-right-shadow-opacity:0;--mantine-datatable-footer-position:sticky;--mantine-datatable-footer-bottom:0;--mantine-datatable-last-row-border-bottom:unset;background:var(--mantine-datatable-background-color);color:var(--mantine-datatable-color);display:flex;flex-direction:column;overflow:hidden;position:relative}.mantine-datatable td,.mantine-datatable th{border-left:0}[dir=rtl] .mantine-datatable td,[dir=rtl] .mantine-datatable th{border-left:0;border-right:0}[dir=rtl] .mantine-datatable td:not(:first-of-type),[dir=rtl] .mantine-datatable th:not(:first-of-type){border-right:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-with-border{border:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-resizable-columns{table-layout:fixed}.mantine-datatable-resizable-columns th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mantine-datatable-pin-first-column td:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-resizable-columns th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible.mantine-datatable-resizable-columns th:nth-of-type(2),.mantine-datatable-pin-last-column td:last-of-type,.mantine-datatable-pin-last-column.mantine-datatable-resizable-columns th:last-of-type{overflow:visible}.mantine-datatable td[data-accessor=__selection__],.mantine-datatable th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable:not(.mantine-datatable-resizable-columns) th{max-width:none;min-width:auto;white-space:nowrap;width:auto}.mantine-datatable:not(.mantine-datatable-resizable-columns) td[data-accessor=__selection__],.mantine-datatable:not(.mantine-datatable-resizable-columns) th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable-table{background:var(--mantine-datatable-background-color);border-collapse:separate;border-spacing:0;color:inherit}.mantine-datatable-table td,.mantine-datatable-table th{border-color:var(--mantine-datatable-row-border-color)}.mantine-datatable-table tbody,.mantine-datatable-table td,.mantine-datatable-table tfoot,.mantine-datatable-table tfoot tr,.mantine-datatable-table th,.mantine-datatable-table thead,.mantine-datatable-table thead tr{background:inherit}.mantine-datatable-table[data-striped] tbody tr:nth-of-type(odd){background:var(--mantine-datatable-striped-color)}.mantine-datatable-table[data-highlight-on-hover] tbody tr:hover{background:var(--mantine-datatable-highlight-on-hover-color)}.mantine-datatable-table tbody tr:last-of-type{border-bottom:0}.mantine-datatable-table tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:var(--mantine-datatable-last-row-border-bottom)}.mantine-datatable-vertical-align-top td{vertical-align:top}.mantine-datatable-vertical-align-bottom td{vertical-align:bottom}.mantine-datatable-last-row-border-bottom-visible tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}}@layer mantine-datatable{.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,.mantine-datatable-pin-last-column th:last-of-type{position:sticky!important;right:calc(-.025rem*var(--mantine-scale));z-index:1;@-moz-document url-prefix(){right:0}}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type{left:calc(-.025rem*var(--mantine-scale));right:auto;@-moz-document url-prefix(){left:0}}.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,.mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-right:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\\\"\\\";left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);pointer-events:none;position:absolute;top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);border-right:0;left:100%;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto;z-index:2}.mantine-datatable-pin-last-column th:last-of-type:after,.mantine-datatable-pin-last-column tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):last-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tfoot th:last-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type{background:inherit}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\\\"\\\";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:var(--mantine-datatable-selection-column-width);position:sticky!important;z-index:1}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:auto;right:var(--mantine-datatable-selection-column-width)}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\\\"\\\";opacity:var(--mantine-datatable-left-shadow-opacity);pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);right:auto}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:0}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tfoot th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tfoot th:first-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type{background:inherit}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):before,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\\\"\\\";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-cell-resizable:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th.mantine-datatable-header-cell-resizable:first-of-type,.mantine-datatable-pin-last-column th.mantine-datatable-header-cell-resizable:last-of-type{position:sticky!important}.mantine-datatable-empty-row,.mantine-datatable-table[data-highlight-on-hover] tbody .mantine-datatable-empty-row:hover{background:transparent}.mantine-datatable-empty-state{bottom:0;color:var(--mantine-color-gray-6);flex-direction:column;left:0;pointer-events:none;position:absolute;right:0;top:0}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state{color:var(--mantine-color-dark-3)}.mantine-datatable-empty-state{opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);transition:opacity .2s}.mantine-datatable-empty-state[data-active]{opacity:1}.mantine-datatable-empty-state-icon{background:var(--mantine-color-gray-2);border-radius:50%;font-size:0;padding:var(--mantine-spacing-xs)}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state-icon{background:var(--mantine-color-dark-5)}.mantine-datatable-empty-state-icon{margin-bottom:calc(var(--mantine-spacing-xs)/2)}.mantine-datatable-footer{bottom:var(--mantine-datatable-footer-bottom);position:var(--mantine-datatable-footer-position);z-index:2}.mantine-datatable-footer th{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-footer-selector-placeholder-cell{left:0;position:sticky;width:0}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell{left:auto;right:0}.mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:\\\"\\\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-header{position:sticky;top:0;z-index:2}.mantine-datatable-header th{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-header-column-toggle-checkbox-label{user-select:none}.mantine-datatable-header-cell-sortable{cursor:pointer;transition:background .2s}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{.mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable{border-radius:calc(.375rem*var(--mantine-scale));cursor:grab;transition:all .2s}.mantine-datatable-header-cell-draggable:active{cursor:grabbing}.mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-2)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable-action-icon{cursor:inherit;margin:calc(-.125rem*var(--mantine-scale)) calc(.125rem*var(--mantine-scale)) 0}.mantine-datatable-header-cell-drag-over{background:var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-drag-over{background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-toggleable-icon{opacity:.1;transition:opacity .2s}.mantine-datatable-header-cell-toggleable:hover .mantine-datatable-header-cell-toggleable-icon{opacity:1}.mantine-datatable-header-cell-resizable{position:relative}.mantine-datatable-header-resizable-handle{background:transparent;bottom:0;cursor:col-resize;opacity:0;position:absolute;right:-6px;top:0;transition:opacity .2s;width:12px;z-index:0}.mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-gray-4);bottom:2px;content:\\\"\\\";left:5px;position:absolute;top:2px;width:2px}[data-mantine-color-scheme=dark] .mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-dark-4)}.mantine-datatable-header-resizable-handle:after{border-radius:1px;transition:background-color .2s}[dir=rtl] .mantine-datatable-header-resizable-handle:after{left:auto;right:5px}.mantine-datatable-header-resizable-handle:hover{opacity:1}.mantine-datatable-header-resizable-handle:hover:after{background:var(--mantine-primary-color-6)}.mantine-datatable-header-resizable-handle:active{opacity:1!important}.mantine-datatable-header-resizable-handle:active:after{background:var(--mantine-primary-color-7)}[dir=rtl] .mantine-datatable-header-resizable-handle{left:-6px;right:auto}.mantine-datatable-header-cell-toggleable.mantine-datatable-header-cell-resizable:hover .mantine-datatable-header-resizable-handle,tr:hover .mantine-datatable-header-resizable-handle{opacity:1}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){transition:background .1s}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{transition:background .1s}.mantine-datatable-header-cell-sortable-group{gap:.25em}.mantine-datatable-header-cell-sortable-text{flex-grow:1;min-width:0}.mantine-datatable-header-cell-sortable-icon{transition:transform .2s}.mantine-datatable-header-cell-sortable-icon-reversed{transform:scaleY(-1)}.mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-sortable-unsorted-icon{transition:color .2s}th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-6)}[data-mantine-color-scheme=dark] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-2)}.mantine-datatable-header-cell-filter-action-icon{border:0;color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-filter-action-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-filter-action-icon[data-active]{color:var(--mantine-color-text)}.mantine-datatable-header-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:\\\"\\\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-column-group-header-cell--needs-border{border-inline-end:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-loader{background:color-mix(in srgb,var(--mantine-datatable-background-color),transparent 25%);bottom:0;left:0;opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s;z-index:3}.mantine-datatable-loader-fetching{opacity:1;pointer-events:all}.mantine-datatable-page-size-selector-button-icon{margin:0 calc(-.25rem*var(--mantine-scale)) 0 calc(.125rem*var(--mantine-scale))}[dir=rtl] .mantine-datatable-page-size-selector-button-icon{margin:0 calc(.125rem*var(--mantine-scale)) 0 calc(-.25rem*var(--mantine-scale))}.mantine-datatable-page-size-selector-menu-arrow{z-index:-1}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\\n )}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\\n )}.mantine-datatable-page-size-selector-active{background:var(--mantine-datatable-pagination-active-background-color);color:var(--mantine-datatable-pagination-active-text-color);opacity:1}.mantine-datatable-pagination{align-items:center;background:inherit;border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color);display:flex;gap:var(--mantine-spacing-xs);justify-content:space-between}.mantine-datatable-pagination-text{flex:1 1 auto}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\\n )}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\\n )}.mantine-datatable-pagination-pages{opacity:1;transition:opacity .2s}.mantine-datatable-pagination-pages-fetching{opacity:0}.mantine-datatable-pagination-pages-control{border-color:var(--mantine-datatable-border-color);color:var(--mantine-datatable-color)}.mantine-datatable-pagination-pages-control[data-active]{background:var(--mantine-datatable-pagination-active-background-color);border-color:transparent;color:var(--mantine-datatable-pagination-active-text-color)}.mantine-datatable-row{--mantine-datatable-row-color:var(\\n --mantine-datatable-row-color-light\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-color:var(\\n --mantine-datatable-row-color-dark\\n )}.mantine-datatable-row{--mantine-datatable-row-background-color:var(\\n --mantine-datatable-row-background-color-light\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-background-color:var(\\n --mantine-datatable-row-background-color-dark\\n )}.mantine-datatable-row{background:var(--mantine-datatable-row-background-color,inherit);color:var(--mantine-datatable-row-color,inherit)}.mantine-datatable-row[data-with-row-border]:not(:last-of-type) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row[data-selected] td{background:var(--mantine-datatable-selection-color)}.mantine-datatable-row-expansion-cell{padding:0}tr:not(:last-of-type) .mantine-datatable-row-expansion-cell-content{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row-expansion-cell-content{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}[data-with-row-border] .mantine-datatable-row-expansion-cell-content{border-top:0}.mantine-datatable-row-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-row-selector-cell{left:auto;right:0}tr[data-selected] .mantine-datatable-row-selector-cell{background:inherit}tr[data-selected] .mantine-datatable-row-selector-cell:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\\\"\\\";left:0;position:absolute;right:0;top:0}.mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\\\"\\\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}tr[data-with-row-border] .mantine-datatable-row-selector-cell:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}tr:last-of-type .mantine-datatable-row-selector-cell:after{bottom:0}.mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-row-selector-cell-checkbox{cursor:pointer}.mantine-datatable-scroll-area{flex:1 1 100%}.mantine-datatable-scroll-area-corner{background:transparent}.mantine-datatable-scroll-area-thumb{z-index:3}.mantine-datatable-scroll-area-scrollbar[data-state=visible]{background:transparent}.mantine-datatable-scroll-area-scrollbar div:before{pointer-events:none}.mantine-datatable-scroll-area-shadow{pointer-events:none;position:absolute;transition:opacity .2s}.mantine-datatable-scroll-area-top-shadow{background:var(--mantine-datatable-shadow-background-top);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-top-shadow-opacity);right:0;top:var(--mantine-datatable-header-height);z-index:2}.mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-left);bottom:0;left:0;opacity:var(--mantine-datatable-left-shadow-opacity);top:0;width:var(--mantine-spacing-xs);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-left-shadow{left:auto}.mantine-datatable-scroll-area-right-shadow,[dir=rtl] .mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-right);opacity:var(--mantine-datatable-right-shadow-opacity);right:0}.mantine-datatable-scroll-area-right-shadow{bottom:0;top:0;width:calc(var(--mantine-spacing-xs)/2);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-right-shadow{background:var(--mantine-datatable-shadow-background-left);left:0;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto}.mantine-datatable-scroll-area-shadow-behind{z-index:0}.mantine-datatable-scroll-area-bottom-shadow{background:var(--mantine-datatable-shadow-background-bottom);bottom:var(--mantine-datatable-footer-height);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-bottom-shadow-opacity);right:0;z-index:2}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `@layer mantine, mantine-datatable, dash-mantine-datatable;\n\n@layer dash-mantine-datatable {\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd),\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd) td {\n background: var(--mantine-datatable-striped-color);\n }\n\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover td {\n background: var(--mantine-datatable-highlight-on-hover-color);\n }\n\n .dash-mantine-datatable-striped .mantine-datatable-table tbody,\n .dash-mantine-datatable-striped .mantine-datatable-table tbody td,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody,\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody td {\n background: inherit;\n }\n\n .dash-mantine-datatable-row-drag-enabled .mantine-datatable-table tbody tr {\n transition:\n background-color 120ms ease,\n box-shadow 120ms ease,\n opacity 120ms ease;\n }\n\n .dash-mantine-datatable-row-draggable {\n cursor: grab;\n }\n\n .dash-mantine-datatable-row-draggable:active {\n cursor: grabbing;\n }\n\n .dash-mantine-datatable-row-dragging,\n .dash-mantine-datatable-row-dragging td {\n opacity: 0.75;\n }\n\n .dash-mantine-datatable-row-drag-over,\n .dash-mantine-datatable-row-drag-over td {\n background: color-mix(\n in srgb,\n var(--mantine-primary-color-1),\n var(--mantine-datatable-background-color) 35%\n );\n }\n\n .dash-mantine-datatable-row-drag-over td {\n box-shadow: inset 0 2px 0 var(--mantine-primary-color-filled);\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell {\n background: inherit;\n padding: 0;\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content {\n border-bottom: 0;\n border-top: 0;\n padding: 0;\n }\n\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content > * {\n margin: 0;\n }\n\n .dash-mantine-datatable-grouped-child {\n border-radius: 0;\n box-shadow: none;\n }\n\n .dash-mantine-datatable-grouped-child,\n .dash-mantine-datatable-grouped-child .mantine-datatable,\n .dash-mantine-datatable-grouped-child .mantine-datatable-table {\n background: transparent;\n }\n\n .dash-mantine-datatable-grouped-child .mantine-datatable-table td:first-child,\n .dash-mantine-datatable-grouped-child .mantine-datatable-table th:first-child {\n border-left: 0;\n }\n\n .dash-mantine-datatable-group-cell {\n align-items: center;\n display: inline-flex;\n gap: 8px;\n min-width: 0;\n }\n\n .dash-mantine-datatable-group-cell-content {\n min-width: 0;\n }\n\n .dash-mantine-datatable-group-chevron {\n border-bottom: 1.5px solid currentColor;\n border-right: 1.5px solid currentColor;\n color: var(--mantine-color-dimmed);\n display: inline-block;\n flex: 0 0 7px;\n height: 7px;\n margin-inline-start: 1px;\n transform: rotate(-45deg);\n transform-origin: 55% 55%;\n transition: transform 120ms ease;\n width: 7px;\n }\n\n .dash-mantine-datatable-group-chevron-spacer {\n opacity: 0;\n }\n\n .dash-mantine-datatable-group-chevron-visible {\n opacity: 1;\n }\n\n .dash-mantine-datatable-group-chevron-expanded {\n transform: rotate(45deg);\n }\n\n .dash-mantine-datatable-editable-cell {\n cursor: text;\n display: inline-block;\n min-width: 100%;\n }\n\n .dash-mantine-datatable-editable-cell-active {\n outline: 2px solid color-mix(\n in srgb,\n var(--mantine-primary-color-filled),\n transparent 55%\n );\n outline-offset: 2px;\n border-radius: 4px;\n }\n\n .dash-mantine-datatable-editable-dropdown {\n min-width: 180px;\n }\n\n .dash-mantine-datatable-editable-dropdown > * {\n width: 100%;\n }\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/lib/styles/layers.css\"],\"names\":[],\"mappings\":\"AAAA,yDAAyD;;AAEzD;IACI;;QAEI,kDAAkD;IACtD;;IAEA;;QAEI,6DAA6D;IACjE;;IAEA;;;;QAII,mBAAmB;IACvB;;IAEA;QACI;;;8BAGsB;IAC1B;;IAEA;QACI,YAAY;IAChB;;IAEA;QACI,gBAAgB;IACpB;;IAEA;;QAEI,aAAa;IACjB;;IAEA;;QAEI;;;;SAIC;IACL;;IAEA;QACI,6DAA6D;IACjE;;IAEA;QACI,mBAAmB;QACnB,UAAU;IACd;;IAEA;QACI,gBAAgB;QAChB,aAAa;QACb,UAAU;IACd;;IAEA;QACI,SAAS;IACb;;IAEA;QACI,gBAAgB;QAChB,gBAAgB;IACpB;;IAEA;;;QAGI,uBAAuB;IAC3B;;IAEA;;QAEI,cAAc;IAClB;;IAEA;QACI,mBAAmB;QACnB,oBAAoB;QACpB,QAAQ;QACR,YAAY;IAChB;;IAEA;QACI,YAAY;IAChB;;IAEA;QACI,uCAAuC;QACvC,sCAAsC;QACtC,kCAAkC;QAClC,qBAAqB;QACrB,aAAa;QACb,WAAW;QACX,wBAAwB;QACxB,yBAAyB;QACzB,yBAAyB;QACzB,gCAAgC;QAChC,UAAU;IACd;;IAEA;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;;IAEA;QACI,wBAAwB;IAC5B;;IAEA;QACI,YAAY;QACZ,qBAAqB;QACrB,eAAe;IACnB;;IAEA;QACI;;;;SAIC;QACD,mBAAmB;QACnB,kBAAkB;IACtB;;IAEA;QACI,gBAAgB;IACpB;;IAEA;QACI,WAAW;IACf;AACJ\",\"sourcesContent\":[\"@layer mantine, mantine-datatable, dash-mantine-datatable;\\n\\n@layer dash-mantine-datatable {\\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd),\\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd) td {\\n background: var(--mantine-datatable-striped-color);\\n }\\n\\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover,\\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover td {\\n background: var(--mantine-datatable-highlight-on-hover-color);\\n }\\n\\n .dash-mantine-datatable-striped .mantine-datatable-table tbody,\\n .dash-mantine-datatable-striped .mantine-datatable-table tbody td,\\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody,\\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody td {\\n background: inherit;\\n }\\n\\n .dash-mantine-datatable-row-drag-enabled .mantine-datatable-table tbody tr {\\n transition:\\n background-color 120ms ease,\\n box-shadow 120ms ease,\\n opacity 120ms ease;\\n }\\n\\n .dash-mantine-datatable-row-draggable {\\n cursor: grab;\\n }\\n\\n .dash-mantine-datatable-row-draggable:active {\\n cursor: grabbing;\\n }\\n\\n .dash-mantine-datatable-row-dragging,\\n .dash-mantine-datatable-row-dragging td {\\n opacity: 0.75;\\n }\\n\\n .dash-mantine-datatable-row-drag-over,\\n .dash-mantine-datatable-row-drag-over td {\\n background: color-mix(\\n in srgb,\\n var(--mantine-primary-color-1),\\n var(--mantine-datatable-background-color) 35%\\n );\\n }\\n\\n .dash-mantine-datatable-row-drag-over td {\\n box-shadow: inset 0 2px 0 var(--mantine-primary-color-filled);\\n }\\n\\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell {\\n background: inherit;\\n padding: 0;\\n }\\n\\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content {\\n border-bottom: 0;\\n border-top: 0;\\n padding: 0;\\n }\\n\\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content > * {\\n margin: 0;\\n }\\n\\n .dash-mantine-datatable-grouped-child {\\n border-radius: 0;\\n box-shadow: none;\\n }\\n\\n .dash-mantine-datatable-grouped-child,\\n .dash-mantine-datatable-grouped-child .mantine-datatable,\\n .dash-mantine-datatable-grouped-child .mantine-datatable-table {\\n background: transparent;\\n }\\n\\n .dash-mantine-datatable-grouped-child .mantine-datatable-table td:first-child,\\n .dash-mantine-datatable-grouped-child .mantine-datatable-table th:first-child {\\n border-left: 0;\\n }\\n\\n .dash-mantine-datatable-group-cell {\\n align-items: center;\\n display: inline-flex;\\n gap: 8px;\\n min-width: 0;\\n }\\n\\n .dash-mantine-datatable-group-cell-content {\\n min-width: 0;\\n }\\n\\n .dash-mantine-datatable-group-chevron {\\n border-bottom: 1.5px solid currentColor;\\n border-right: 1.5px solid currentColor;\\n color: var(--mantine-color-dimmed);\\n display: inline-block;\\n flex: 0 0 7px;\\n height: 7px;\\n margin-inline-start: 1px;\\n transform: rotate(-45deg);\\n transform-origin: 55% 55%;\\n transition: transform 120ms ease;\\n width: 7px;\\n }\\n\\n .dash-mantine-datatable-group-chevron-spacer {\\n opacity: 0;\\n }\\n\\n .dash-mantine-datatable-group-chevron-visible {\\n opacity: 1;\\n }\\n\\n .dash-mantine-datatable-group-chevron-expanded {\\n transform: rotate(45deg);\\n }\\n\\n .dash-mantine-datatable-editable-cell {\\n cursor: text;\\n display: inline-block;\\n min-width: 100%;\\n }\\n\\n .dash-mantine-datatable-editable-cell-active {\\n outline: 2px solid color-mix(\\n in srgb,\\n var(--mantine-primary-color-filled),\\n transparent 55%\\n );\\n outline-offset: 2px;\\n border-radius: 4px;\\n }\\n\\n .dash-mantine-datatable-editable-dropdown {\\n min-width: 180px;\\n }\\n\\n .dash-mantine-datatable-editable-dropdown > * {\\n width: 100%;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = window[\"React\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var getCurrentScript = function() {\n var script = document.currentScript;\n if (!script) {\n /* Shim for IE11 and below */\n /* Do not take into account async scripts and inline scripts */\n\n var doc_scripts = document.getElementsByTagName('script');\n var scripts = [];\n\n for (var i = 0; i < doc_scripts.length; i++) {\n scripts.push(doc_scripts[i]);\n }\n\n scripts = scripts.filter(function(s) { return !s.async && !s.text && !s.textContent; });\n script = scripts.slice(-1)[0];\n }\n\n return script;\n};\n\nvar isLocalScript = function(script) {\n return /\\/_dash-component-suites\\//.test(script.src);\n};\n\nObject.defineProperty(__webpack_require__, 'p', {\n get: (function () {\n var script = getCurrentScript();\n\n var url = script.src.split('/').slice(0, -1).join('/') + '/';\n\n return function() {\n return url;\n };\n })()\n});\n\nif (typeof jsonpScriptSrc !== 'undefined') {\n var __jsonpScriptSrc__ = jsonpScriptSrc;\n jsonpScriptSrc = function(chunkId) {\n var script = getCurrentScript();\n var isLocal = isLocalScript(script);\n\n var src = __jsonpScriptSrc__(chunkId);\n\n if(!isLocal) {\n return src;\n }\n\n var srcFragments = src.split('/');\n var fileFragments = srcFragments.slice(-1)[0].split('.');\n\n fileFragments.splice(1, 0, \"v0_1_0m1779798221\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","__webpack_require__.nc = undefined;","\n import API from \"!../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../css-loader/dist/cjs.js!./styles.layer.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../css-loader/dist/cjs.js!./styles.layer.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./layers.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./layers.css\";\n export default content && content.locals ? content.locals : undefined;\n","const __WEBPACK_NAMESPACE_OBJECT__ = window[\"PropTypes\"];","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t{let{children:t,columnsOrder:o,setColumnsOrder:n,columnsToggle:a,setColumnsToggle:r,resetColumnsOrder:l,resetColumnsToggle:c,setColumnWidth:m,setMultipleColumnWidths:u,resetColumnsWidth:f}=e,[p,d]=kt(\"\"),[s,i]=kt(\"\");return oa(Mt,{value:{sourceColumn:p,setSourceColumn:d,targetColumn:s,setTargetColumn:i,columnsToggle:a,setColumnsToggle:r,swapColumns:()=>{if(!o||!n||!p||!s)return;let h=o.indexOf(p),y=o.indexOf(s);if(h!==-1&&y!==-1){let v=o.splice(h,1)[0];o.splice(y,0,v),n([...o])}},resetColumnsOrder:l,resetColumnsToggle:c,setColumnWidth:m,setMultipleColumnWidths:u,resetColumnsWidth:f},children:t})};import{jsx as Et}from\"react/jsx-runtime\";function Nt(){return Et(\"tr\",{className:\"mantine-datatable-empty-row\",children:Et(\"td\",{})})}import{Center as aa,Text as ra}from\"@mantine/core\";import{jsx as Re,jsxs as na}from\"react/jsx-runtime\";function Lt(){return na(\"svg\",{width:\"24\",height:\"24\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[Re(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),Re(\"path\",{d:\"M12.983 8.978c3.955 -.182 7.017 -1.446 7.017 -2.978c0 -1.657 -3.582 -3 -8 -3c-1.661 0 -3.204 .19 -4.483 .515m-2.783 1.228c-.471 .382 -.734 .808 -.734 1.257c0 1.22 1.944 2.271 4.734 2.74\"}),Re(\"path\",{d:\"M4 6v6c0 1.657 3.582 3 8 3c.986 0 1.93 -.067 2.802 -.19m3.187 -.82c1.251 -.53 2.011 -1.228 2.011 -1.99v-6\"}),Re(\"path\",{d:\"M4 12v6c0 1.657 3.582 3 8 3c3.217 0 5.991 -.712 7.261 -1.74m.739 -3.26v-4\"}),Re(\"path\",{d:\"M3 3l18 18\"})]})}import{Fragment as la,jsx as We,jsxs as ia}from\"react/jsx-runtime\";function Wt({icon:e,text:t,active:o,children:n}){return We(aa,{className:\"mantine-datatable-empty-state\",\"data-active\":o||void 0,children:n||ia(la,{children:[e||We(\"div\",{className:\"mantine-datatable-empty-state-icon\",children:We(Lt,{})}),We(ra,{component:\"div\",size:\"sm\",c:\"dimmed\",children:t})]})})}import{TableTfoot as Ia,TableTr as Ha}from\"@mantine/core\";import Oa from\"clsx\";import{TableTh as ka}from\"@mantine/core\";import Ea from\"clsx\";import{useCallback as Ml,useRef as kl,useState as El}from\"react\";import{useLocalStorage as sa}from\"@mantine/hooks\";function It({key:e,columns:t=[],getInitialValueInEffect:o=!0}){function n(p,d){let s=[];return p.forEach(i=>{d.find(g=>g.accessor===i)&&s.push(i)}),d.forEach(i=>{s.includes(i.accessor)||s.push(i.accessor)}),s}let a=t&&t.map(p=>p.accessor)||[],[r,l]=sa({key:e?`${e}-columns-order`:\"\",defaultValue:e?a:void 0,getInitialValueInEffect:o});function c(p){e&&l(p)}let m=()=>{c(a)};if(!e)return{columnsOrder:r,setColumnsOrder:c,resetColumnsOrder:m};let u=n(r,t),f=JSON.stringify(r);return JSON.stringify(u)!==f&&c(u),{columnsOrder:u,setColumnsOrder:c,resetColumnsOrder:m}}import{useLocalStorage as ca}from\"@mantine/hooks\";import{useCallback as re,useEffect as st,useMemo as Ie,useRef as Ht,useState as Ot}from\"react\";function _t({key:e,columns:t=[],getInitialValueInEffect:o=!0,headerRef:n,onFixedLayoutChange:a}){let r=Ht(!1),l=Ht({}),[c,m]=Ot(!0),u=Ie(()=>t.some(b=>b.resizable&&!b.hidden&&b.accessor!==\"__selection__\"),[t]),f=Ie(()=>t.filter(b=>b.resizable&&!b.hidden&&b.accessor!==\"__selection__\"),[t]),p=Ie(()=>f.some(b=>b.width===void 0||b.width===\"\"||b.width===\"initial\"),[f]),d=re(()=>t.filter(b=>b.accessor!==\"__selection__\").map(b=>({[b.accessor]:b.width??\"auto\"})),[t]),[s,i]=ca({key:e?`${e}-columns-width`:\"\",defaultValue:e?d():void 0,getInitialValueInEffect:!1}),[g,h]=Ot(()=>d());st(()=>{m(!1)},[]);let y=re(()=>{if(!n?.current||c)return{};let b=n.current,x=Array.from(b.querySelectorAll(\"th[data-accessor]\")),k={};return x.forEach(E=>{let L=E.getAttribute(\"data-accessor\");if(!L||L===\"__selection__\")return;let C=f.find(w=>w.accessor===L);if(C&&(C.width===void 0||C.width===\"\"||C.width===\"initial\")){let w=E.getBoundingClientRect();k[L]=Math.round(w.width)}}),k},[n,f,c]),v=re(b=>{let x=b.filter(E=>E.accessor!==\"__selection__\"),k=g.map(E=>{let L=Object.keys(E)[0],C=x.find(w=>w.accessor===L);return C?{[L]:C.width}:E});h(k),e&&i(k)},[g,e,i]),M=re(b=>{v(b)},[v]),R=re(()=>{if(!(!n?.current||!a||c))if(p)a(!1),requestAnimationFrame(()=>{requestAnimationFrame(()=>{let b=y();l.current={...l.current,...b};let x=t.filter(k=>k.accessor!==\"__selection__\").map(k=>{let E=k.accessor,L=s?.find(w=>Object.keys(w)[0]===E);if(L&&L[E]!==\"auto\")return{[E]:L[E]};let C=b[E];return C?{[E]:`${C}px`}:{[E]:k.width??\"auto\"}});h(x),setTimeout(()=>{a(!0),r.current=!0},10)})});else{let b=t.filter(x=>x.accessor!==\"__selection__\").map(x=>({[x.accessor]:x.width??\"auto\"}));h(b),a(!0),r.current=!0}},[n,a,c,p,y,t,s]),W=R;st(()=>{if(!u||!a||c){a?.(!1);return}r.current=!1;let b=setTimeout(()=>{R()},50);return()=>clearTimeout(b)},[u,a,c,R]),st(()=>{c||!e||!o||s&&s.length>0&&h(s)},[c,e,o,s]);let D=re(()=>{e&&i(d()),l.current={},r.current=!1,a&&(a(!1),setTimeout(()=>{R()},10))},[e,i,d,a,R]),T=re((b,x)=>{v([{accessor:b,width:x}])},[v]),P=Ie(()=>u?g.filter(b=>{let x=Object.keys(b)[0];return f.some(k=>k.accessor===x)}).every(b=>{let x=Object.values(b)[0];return x===\"auto\"||x===\"initial\"}):!1,[u,g,f]);return{columnsWidth:g,setColumnsWidth:v,setColumnWidth:T,setMultipleColumnWidths:M,resetColumnsWidth:D,hasResizableColumns:u,allResizableWidthsInitial:P,measureAndSetColumnWidths:W}}import{useMemo as da}from\"react\";import{useLocalStorage as ua}from\"@mantine/hooks\";function At({key:e,columns:t=[],getInitialValueInEffect:o=!0}){function n(p,d){let s=[];return p.forEach(i=>{d.find(g=>g.accessor===i.accessor)&&s.push(i)}),d.forEach(i=>{s.find(g=>g.accessor===i.accessor)||s.push({accessor:i.accessor,defaultToggle:i.defaultToggle||!0,toggleable:i.toggleable,toggled:i.defaultToggle===void 0?!0:i.defaultToggle})}),s}let a=t&&t.map(p=>({accessor:p.accessor,defaultToggle:p.defaultToggle||!0,toggleable:p.toggleable,toggled:p.defaultToggle===void 0?!0:p.defaultToggle})),[r,l]=ua({key:e?`${e}-columns-toggle`:\"\",defaultValue:e?a:void 0,getInitialValueInEffect:o});function c(p){e&&l(p)}let m=()=>{c(a)};if(!e)return{columnsToggle:r,setColumnsToggle:c,resetColumnsToggle:m};let u=n(r,t),f=JSON.stringify(r);return JSON.stringify(u)!==f&&c(u),{columnsToggle:u,setColumnsToggle:c,resetColumnsToggle:m}}var zt=({key:e,columns:t=[],getInitialValueInEffect:o=!0,headerRef:n,scrollViewportRef:a,onFixedLayoutChange:r})=>{let{columnsOrder:l,setColumnsOrder:c,resetColumnsOrder:m}=It({key:e,columns:t,getInitialValueInEffect:o}),{columnsToggle:u,setColumnsToggle:f,resetColumnsToggle:p}=At({key:e,columns:t,getInitialValueInEffect:o}),{columnsWidth:d,setColumnsWidth:s,setColumnWidth:i,setMultipleColumnWidths:g,resetColumnsWidth:h,hasResizableColumns:y,allResizableWidthsInitial:v,measureAndSetColumnWidths:M}=_t({key:e,columns:t,getInitialValueInEffect:o,headerRef:n,scrollViewportRef:a,onFixedLayoutChange:r});return{effectiveColumns:da(()=>l?l.map(T=>t.find(P=>P.accessor===T)).map(T=>({...T,hidden:T?.hidden||!u.find(P=>P.accessor===T?.accessor)?.toggled})).map(T=>T?.accessor===\"__selection__\"?T:{...T,width:d.find(P=>P[T?.accessor])?.[T?.accessor]}):t,[t,l,u,d]),setColumnsOrder:c,columnsOrder:l,resetColumnsOrder:m,columnsToggle:u,setColumnsToggle:f,resetColumnsToggle:p,columnsWidth:d,setColumnsWidth:s,setColumnWidth:i,setMultipleColumnWidths:g,resetColumnsWidth:h,hasResizableColumns:y,allResizableWidthsInitial:v,measureAndSetColumnWidths:M}};import{rem as ba}from\"@mantine/core\";import{useCallback as Ta,useEffect as dt,useRef as K}from\"react\";import{useEffect as ma,useLayoutEffect as pa}from\"react\";var ct=typeof window<\"u\"?pa:ma;import{useRef as fa}from\"react\";function ut(e){let t=fa(e);return t.current=e,t}var Bt=\"--mantine-datatable-header-height\",Vt=\"--mantine-datatable-footer-height\",Gt=\"--mantine-datatable-selection-column-width\",Ft=\"--mantine-datatable-last-row-border-bottom\";function G(e,t,o){e?.style.setProperty(t,o)}function pt(e){let t=e.borderBoxSize?.[0]||e.contentBoxSize?.[0];return t?{width:t.inlineSize,height:t.blockSize}:{width:e.contentRect.width,height:e.contentRect.height}}function mt(e,t,o){if(e){let n=new ResizeObserver(a=>{let r=a[0];r&&t(pt(r))});return n.observe(e),()=>{n.disconnect(),o()}}}function $t({scrollCallbacks:e,withRowBorders:t}){let o={root:K(null),table:K(null),scrollViewport:K(null),header:K(null),footer:K(null),selectionColumnHeader:K(null)},{root:n,table:a,scrollViewport:r,header:l,footer:c,selectionColumnHeader:m}=o,u=ut({withRowBorders:t}),f=ut(e),p=K(()=>{}),d=K(()=>{}),s=Ta(i=>{f.current.onScroll?.(i),p.current()},[]);return dt(()=>mt(l.current,i=>{G(n.current,Bt,`${i.height}px`)},()=>G(n.current,Bt,\"0\")),[l.current]),dt(()=>mt(c.current,i=>{G(n.current,Vt,`${i.height}px`)},()=>G(n.current,Vt,\"0\")),[c.current]),dt(()=>mt(m.current,i=>{G(n.current,Gt,`${i.width}px`)},()=>G(n.current,Gt,\"0\")),[m.current]),ct(()=>{if(typeof window===void 0)return;let i={top:!0,bottom:!0,left:!0,right:!0},g={width:0,height:0},h={width:0,height:0};function y(D,T){let P=i[D];return i[D]=T,G(n.current,`--mantine-datatable-${D}-shadow-opacity`,T?\"0\":\"1\"),P}function v(){let D=g.height-h.height,T=D<0;G(n.current,\"--mantine-datatable-footer-position\",T?\"relative\":\"sticky\"),G(n.current,\"--mantine-datatable-footer-bottom\",T?`${D}px`:\"0\")}function M(){u.current.withRowBorders&&g.height{for(let T of D)switch(T.target.tagName){case\"TABLE\":{g=pt(T);break}case\"DIV\":{h=pt(T);break}}R(),v(),M()});return W.observe(a.current),W.observe(r.current),()=>{W.disconnect()}},[]),ct(()=>{d.current()},[t]),{refs:o,onScroll:s}}import{useEffect as ga,useState as ha}from\"react\";function Xt(e){let[t,o]=ha(null),n=e?.join(\":\")||\"\";return ga(()=>{o(null)},[n]),{lastSelectionChangeIndex:t,setLastSelectionChangeIndex:o}}import{useEffect as Ca,useRef as ya,useState as Da}from\"react\";function xa(e,t){let o=()=>{t(e.map(a=>a.matches))},n=e.map(a=>{try{return a.addEventListener(\"change\",o),()=>a.removeEventListener(\"change\",o)}catch{return a.addListener(o),()=>a.removeListener(o)}});return()=>{n.forEach(a=>a())}}function wa(e,t){return t||(typeof window<\"u\"&&\"matchMedia\"in window?e.map(o=>window.matchMedia(o).matches):e.map(()=>!1))}function Ut(e,t,{getInitialValueInEffect:o}={getInitialValueInEffect:!0}){let[n,a]=Da(o?t:wa(e,t)),r=ya(null);return Ca(()=>{if(\"matchMedia\"in window)return r.current=e.map(l=>window.matchMedia(l)),a(r.current.map(l=>l.matches)),xa(r.current,l=>{a(l)})},[e]),n}import{useMantineTheme as Sa}from\"@mantine/core\";import{useMemo as Qt}from\"react\";function Kt(e){let t=Sa(),o=Qt(()=>e.map(a=>(typeof a==\"function\"?a(t):a)??\"\"),[e,t]),n=Qt(()=>e.map(()=>!0),[e]);return Ut(o,n)}import{useMantineTheme as Ra}from\"@mantine/core\";import{useMediaQuery as Pa}from\"@mantine/hooks\";function J(e){let t=Ra(),o=typeof e==\"function\"?e(t):e;return Pa(o||\"\",!0)}import{useState as va}from\"react\";function de(e){let t=e.replace(/([a-z\\d])([A-Z]+)/g,\"$1 $2\").replace(/\\W|_/g,\" \").trim().toLowerCase();return`${t.charAt(0).toUpperCase()}${t.slice(1)}`}function Jt(e,t,o){return e.filter(n=>!t.map(o).includes(o(n)))}function He(e,t){return e.filter((o,n,a)=>n===a.findIndex(r=>t(o)===t(r)))}function ft(e,t){return t?t.match(/([^[.\\]])+/g).reduce((n,a)=>n&&n[a],e):void 0}function _(e,t){return typeof t==\"string\"?ft(e,t):t(e)}function ui(e,t){let o=structuredClone(t),n=o[e.source.index];return e.destination&&(o.splice(e.source.index,1),o.splice(e.destination.index,0,n)),o}function di(e,t){let o=structuredClone(t),n=e.destination;if(!n)return o;let a=o[e.source.index],r=o[n.index];return o.splice(n.index,1,a),o.splice(e.source.index,1,r),o}function bt(e){return!e||e.length===0?0:Math.max(...e.map(t=>t.groups&&t.groups.length>0?1+bt(t.groups):1))}function Pe(e){let t=[];for(let o of e)o.columns&&o.columns.length>0?t.push(...o.columns.filter(n=>n!=null)):o.groups&&o.groups.length>0&&t.push(...Pe(o.groups));return t.filter(o=>o!=null)}function Oe(e,t){return e.columns&&e.columns.length>0?e.columns.filter((o,n)=>o.hidden?!1:t?t[n]!==!1:!0).length:e.groups&&e.groups.length>0?e.groups.reduce((o,n)=>o+Oe(n,t),0):0}function Tt(e,t,o=0){if(o===t)return[...e];let n=[];for(let a of e)a.groups&&a.groups.length>0&&n.push(...Tt(a.groups,t,o+1));return n}function jt(e,t,o){return o?!e||t:!1}function Zt({rowExpansion:e,records:t,idAccessor:o}){let n=[];if(e&&t){let{trigger:c,allowMultiple:m,initiallyExpanded:u}=e;t&&c===\"always\"?n=t.map(f=>_(f,o)):u&&(n=t.filter((f,p)=>u({record:f,index:p})).map(f=>_(f,o)),m||(n=[n[0]]))}let a,r,l=va(n);if(e){let{expandable:c,trigger:m,allowMultiple:u,collapseProps:f,content:p}=e;e.expanded?{recordIds:a,onRecordIdsChange:r}=e.expanded:[a,r]=l;let d=s=>r?.(a.filter(i=>i!==_(s,o)));return{expandOnClick:m!==\"always\"&&m!==\"never\",isRowExpanded:s=>m===\"always\"?!0:a.includes(_(s,o)),isExpandable:({record:s,index:i})=>c?c({record:s,index:i}):!0,expandRow:s=>{let i=_(s,o);r?.(u?[...a,i]:[i])},collapseRow:d,collapseProps:f,content:({record:s,index:i})=>()=>p({record:s,index:i,collapse:()=>d(s)})}}}import{useTimeout as Yt}from\"@mantine/hooks\";import{useEffect as Ma,useState as qt}from\"react\";function eo(e,t){let[o,n]=qt(e),[a,r]=qt(e),l=Yt(()=>n(!0),0),c=Yt(()=>r(!1),t||200);return Ma(()=>{e?(c.clear(),r(!0),l.start()):(l.clear(),n(!1),c.start())},[l,c,e]),{expanded:o,visible:a}}var me=\"mantine-datatable-nowrap\",pe=\"mantine-datatable-ellipsis\",X=\"mantine-datatable-pointer-cursor\",_e=\"mantine-datatable-context-menu-cursor\",to=\"mantine-datatable-text-selection-disabled\",j=\"mantine-datatable-text-align-left\",Z=\"mantine-datatable-text-align-center\",Y=\"mantine-datatable-text-align-right\";import{jsx as Na}from\"react/jsx-runtime\";function oo({className:e,style:t,visibleMediaQuery:o,title:n,noWrap:a,ellipsis:r,textAlign:l,width:c}){return J(o)?Na(ka,{className:Ea({[me]:a||r,[pe]:r,[j]:l===\"left\",[Z]:l===\"center\",[Y]:l===\"right\"},e),style:[{width:c,minWidth:c,maxWidth:c},t],children:n}):null}import{TableTh as La}from\"@mantine/core\";import{jsx as Wa}from\"react/jsx-runtime\";function no({shadowVisible:e}){return Wa(La,{className:\"mantine-datatable-footer-selector-placeholder-cell\",\"data-shadow-visible\":e||void 0})}import{jsx as gt,jsxs as _a}from\"react/jsx-runtime\";function ao({className:e,style:t,columns:o,defaultColumnProps:n,selectionVisible:a,selectorCellShadowVisible:r,ref:l}){return gt(Ia,{ref:l,className:Oa(\"mantine-datatable-footer\",e),style:t,children:_a(Ha,{children:[a&>(no,{shadowVisible:r}),o.map(({hidden:c,...m})=>{if(c)return null;let{accessor:u,visibleMediaQuery:f,textAlign:p,width:d,footer:s,footerClassName:i,footerStyle:g,noWrap:h,ellipsis:y}={...n,...m};return gt(oo,{className:i,style:g,visibleMediaQuery:f,textAlign:p,width:d,title:s,noWrap:h,ellipsis:y},u)})]})})}import{Checkbox as pr,Group as fr,Popover as br,PopoverDropdown as Tr,PopoverTarget as gr,Stack as hr,TableThead as Cr,TableTr as wo}from\"@mantine/core\";import yr from\"clsx\";import{useState as Dr}from\"react\";import{TableTh as Aa}from\"@mantine/core\";import za from\"clsx\";import{useMemo as Ae}from\"react\";import{jsx as Ba}from\"react/jsx-runtime\";function ro({group:{id:e,columns:t,groups:o,title:n,textAlign:a,className:r,style:l},maxDepth:c,currentDepth:m,previousGroups:u,isLastGroup:f,withColumnBorders:p=!1,totalTableColumns:d}){let s=Ae(()=>t&&t.length>0?t:o&&o.length>0?Pe([{id:e,columns:t,groups:o}]):[],[t,o,e]),i=Ae(()=>s.map(({visibleMediaQuery:D})=>D),[s]),g=Kt(i),h=Ae(()=>Oe({id:e,columns:t,groups:o},g),[e,t,o,g]),y=Ae(()=>u.reduce((D,T)=>D+Oe(T,g),0),[u,g]),M=o&&o.length>0?1:c-m,R=y+h0?Ba(Aa,{colSpan:h,rowSpan:M>1?M:void 0,className:za(\"mantine-datatable-column-group-header-cell\",{[j]:a===\"left\",[Z]:a===\"center\",[Y]:a===\"right\",\"mantine-datatable-column-group-header-cell--needs-border\":W},r),style:l,children:n??de(e)}):null}import{ActionIcon as Co,Box as nr,Center as Ge,Flex as ar,Group as rr,TableTh as lr}from\"@mantine/core\";import Fe from\"clsx\";import{useRef as ir,useState as sr}from\"react\";import{ActionIcon as Fa,Popover as $a,PopoverDropdown as Xa,PopoverTarget as Ua}from\"@mantine/core\";import{useClickOutside as Qa,useDisclosure as Ka}from\"@mantine/hooks\";import{jsx as lo,jsxs as Va}from\"react/jsx-runtime\";function io(){return Va(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[lo(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),lo(\"path\",{d:\"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z\"})]})}import{jsx as so,jsxs as Ga}from\"react/jsx-runtime\";function co(){return Ga(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[so(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),so(\"path\",{d:\"M20 3h-16a1 1 0 0 0 -1 1v2.227l.008 .223a3 3 0 0 0 .772 1.795l4.22 4.641v8.114a1 1 0 0 0 1.316 .949l6 -2l.108 -.043a1 1 0 0 0 .576 -.906v-6.586l4.121 -4.12a3 3 0 0 0 .879 -2.123v-2.171a1 1 0 0 0 -1 -1z\",strokeWidth:\"0\",fill:\"currentColor\"})]})}import{jsx as ze,jsxs as Ja}from\"react/jsx-runtime\";function uo({children:e,isActive:t,filterPopoverProps:o,filterPopoverDisableClickOutside:n}){let[a,{close:r,toggle:l}]=Ka(!1),c=t?co:io,m=Qa(r);return n&&(m=void 0),Ja($a,{withArrow:!0,shadow:\"md\",opened:a,onClose:r,trapFocus:!0,...o,children:[ze(Ua,{children:ze(Fa,{className:\"mantine-datatable-header-cell-filter-action-icon\",\"data-active\":t||void 0,size:\"sm\",variant:\"default\",onClick:u=>{u.preventDefault(),l()},onKeyDown:u=>u.stopPropagation(),children:ze(c,{})})}),ze(Xa,{ref:m,onClick:u=>u.stopPropagation(),onKeyDown:u=>u.stopPropagation(),children:typeof e==\"function\"?e({close:r}):e})]})}import{useDirection as ja}from\"@mantine/core\";import{useCallback as mo,useRef as po,useState as Za}from\"react\";import{jsx as Ya}from\"react/jsx-runtime\";var fo=e=>{let{accessor:t,columnRef:o}=e,[n,a]=Za(!1),r=po(0),l=po({current:0,next:0}),{dir:c}=ja(),m=c===\"rtl\",{setMultipleColumnWidths:u}=ue(),f=mo(d=>{if(d.preventDefault(),d.stopPropagation(),!o.current)return;let s=o.current,i=s.nextElementSibling;for(;i;){let W=i.getAttribute(\"data-accessor\");if(W&&W!==\"__selection__\")break;i=i.nextElementSibling}if(!i)return;let g=i.getAttribute(\"data-accessor\");if(!g)return;let h=g===\"__selection__\";a(!0),r.current=d.clientX;let y=s.offsetWidth,v=i.offsetWidth;l.current={current:y,next:v};let M=W=>{if(!o.current)return;let D=o.current,T=D.nextElementSibling;if(!T)return;let P=W.clientX-r.current;m&&(P=-P);let b=50,x=l.current.current-b,k=l.current.next-b,E=Math.max(-x,Math.min(P,k)),L=l.current.current+E,C=l.current.next-E;D.style.width=`${L}px`,T.style.width=`${C}px`,D.style.minWidth=`${L}px`,D.style.maxWidth=`${L}px`,T.style.minWidth=`${C}px`,T.style.maxWidth=`${C}px`},R=()=>{if(!o.current)return;let W=o.current,D=W.nextElementSibling;a(!1),document.body.style.cursor=\"initial\",document.body.style.userSelect=\"initial\";let T=parseInt(W.style.width)||W.offsetWidth,P=D?parseInt(D.style.width)||D.offsetWidth:0,b=[{accessor:t,width:`${T}px`}];if(D&&!h){let x=D.getAttribute(\"data-accessor\");x&&b.push({accessor:x,width:`${P}px`})}setTimeout(()=>{u(b)},0),document.removeEventListener(\"mousemove\",M),document.removeEventListener(\"mouseup\",R)};document.body.style.cursor=\"col-resize\",document.body.style.userSelect=\"none\",document.addEventListener(\"mousemove\",M),document.addEventListener(\"mouseup\",R)},[t,o,m,u]),p=mo(()=>{if(!o.current)return;let d=o.current,s=d.nextElementSibling;d.style.width=\"\",d.style.minWidth=\"\",d.style.maxWidth=\"\";let i=[{accessor:t,width:\"auto\"}];if(s){s.style.width=\"\",s.style.minWidth=\"\",s.style.maxWidth=\"\";let g=s.getAttribute(\"data-accessor\");g&&g!==\"__selection__\"&&i.push({accessor:g,width:\"auto\"})}setTimeout(()=>{u(i)},0)},[t,o,u]);return Ya(\"div\",{className:\"mantine-datatable-header-resizable-handle\",style:{cursor:n?\"col-resize\":void 0},onMouseDown:f,onDoubleClick:p,onClick:d=>d.stopPropagation(),title:\"Drag to resize column, double-click to reset\"})};import{jsx as Be,jsxs as qa}from\"react/jsx-runtime\";function bo(){return qa(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[Be(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),Be(\"path\",{d:\"M12 5l0 14\"}),Be(\"path\",{d:\"M16 9l-4 -4\"}),Be(\"path\",{d:\"M8 9l4 -4\"})]})}import{jsx as Ve,jsxs as er}from\"react/jsx-runtime\";function To(){return er(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[Ve(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),Ve(\"path\",{d:\"M8 7l4 -4l4 4\"}),Ve(\"path\",{d:\"M8 17l4 4l4 -4\"}),Ve(\"path\",{d:\"M12 3l0 18\"})]})}import{jsx as le,jsxs as tr}from\"react/jsx-runtime\";function go(){return tr(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[le(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),le(\"path\",{d:\"M9 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M9 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M9 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M15 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M15 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M15 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"})]})}import{jsx as ht,jsxs as or}from\"react/jsx-runtime\";function ho(){return or(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[ht(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),ht(\"path\",{d:\"M18 6l-12 12\"}),ht(\"path\",{d:\"M6 6l12 12\"})]})}import{Fragment as cr,jsx as z,jsxs as Ct}from\"react/jsx-runtime\";function yo({className:e,style:t,accessor:o,visibleMediaQuery:n,title:a,sortable:r,draggable:l,toggleable:c,resizable:m,sortIcons:u,textAlign:f,width:p,sortStatus:d,onSortStatusChange:s,filter:i,filterPopoverProps:g,filterPopoverDisableClickOutside:h,filtering:y,sortKey:v}){let{setSourceColumn:M,setTargetColumn:R,swapColumns:W,setColumnsToggle:D}=ue(),[T,P]=sr(!1),b=ir(null);if(!J(n))return null;let x=a??de(o),k=typeof x==\"string\"?x:void 0,E=r&&s?H=>{H?.defaultPrevented||s({sortKey:v,columnAccessor:o,direction:d?.columnAccessor===o?d.direction===\"asc\"?\"desc\":\"asc\":d?.direction??\"asc\"})}:void 0,L=H=>{H.stopPropagation(),M(o),P(!1)},C=H=>{H.preventDefault(),R(o),P(!0)},w=()=>{R(o),P(!1),W()},S=()=>{P(!0)},I=()=>{P(!1)},A=H=>{H.stopPropagation(),D(F=>F.map(U=>U.accessor===o?{...U,toggled:!1}:U))};return Ct(lr,{\"data-accessor\":o,className:Fe({\"mantine-datatable-header-cell-sortable\":r,\"mantine-datatable-header-cell-toggleable\":c,\"mantine-datatable-header-cell-resizable\":m},e),style:[{width:p,...m?{}:{minWidth:p,maxWidth:p}},t],role:r?\"button\":void 0,tabIndex:r?0:void 0,onClick:E,onKeyDown:H=>H.key===\"Enter\"&&E?.(),ref:b,children:[Ct(rr,{className:\"mantine-datatable-header-cell-sortable-group\",justify:\"space-between\",wrap:\"nowrap\",children:[Ct(ar,{align:\"center\",w:\"100%\",className:Fe({\"mantine-datatable-header-cell-draggable\":l,\"mantine-datatable-header-cell-drag-over\":T}),draggable:l,onDragStart:l?L:void 0,onDragEnter:l?S:void 0,onDragOver:l?C:void 0,onDrop:l?w:void 0,onDragLeave:l?I:void 0,children:[l?z(Ge,{role:\"img\",\"aria-label\":\"Drag column\",children:z(Co,{className:\"mantine-datatable-header-cell-draggable-action-icon\",variant:\"subtle\",size:\"xs\",onClick:H=>{H.stopPropagation()},children:z(go,{})})}):null,z(nr,{className:Fe(\"mantine-datatable-header-cell-sortable-text\",{[j]:f===\"left\",[Z]:f===\"center\",[Y]:f===\"right\"},me,pe),title:k,children:x})]}),c?z(Ge,{className:\"mantine-datatable-header-cell-toggleable-icon\",role:\"img\",\"aria-label\":\"Toggle column\",children:z(Co,{size:\"xs\",variant:\"light\",onClick:A,children:z(ho,{})})}):null,r||d?.columnAccessor===o?z(cr,{children:d?.columnAccessor===o?z(Ge,{className:Fe(\"mantine-datatable-header-cell-sortable-icon\",{\"mantine-datatable-header-cell-sortable-icon-reversed\":d.direction===\"desc\"}),role:\"img\",\"aria-label\":`Sorted ${d.direction===\"desc\"?\"descending\":\"ascending\"}`,children:u?.sorted||z(bo,{})}):z(Ge,{className:\"mantine-datatable-header-cell-sortable-unsorted-icon\",role:\"img\",\"aria-label\":\"Not sorted\",children:u?.unsorted||z(To,{})})}):null,i?z(uo,{filterPopoverProps:g,isActive:!!y,filterPopoverDisableClickOutside:h,children:i}):null]}),m&&o!==\"__selection__\"?z(fo,{accessor:o,columnRef:b}):null]})}import{Checkbox as ur,TableTh as dr}from\"@mantine/core\";import mr from\"clsx\";import{jsx as Do}from\"react/jsx-runtime\";function xo({className:e,style:t,trigger:o,shadowVisible:n,checked:a,indeterminate:r,checkboxProps:l,onChange:c,rowSpan:m,ref:u}){let f=!l.disabled;return Do(dr,{ref:u,className:mr(\"mantine-datatable-header-selector-cell\",{[X]:o===\"cell\"&&f},e),style:t,rowSpan:m,\"data-shadow-visible\":n||void 0,\"data-accessor\":\"__selection__\",onClick:o===\"cell\"&&f?c:void 0,children:Do(ur,{classNames:f?{input:X}:void 0,checked:a,indeterminate:r,onChange:c,...l,disabled:!(c||l.onChange)||l.disabled})})}import{jsx as q,jsxs as $e}from\"react/jsx-runtime\";function So({selectionColumnHeaderRef:e,className:t,style:o,sortStatus:n,sortIcons:a,onSortStatusChange:r,columns:l,defaultColumnProps:c,groups:m,selectionTrigger:u,selectionVisible:f,selectionChecked:p,selectionIndeterminate:d,onSelectionChange:s,selectionCheckboxProps:i,selectorCellShadowVisible:g,selectionColumnClassName:h,selectionColumnStyle:y,withColumnBorders:v=!1,ref:M}){let R=m?bt(m):0,W=R>0?R+1:1,D=f?q(xo,{ref:e,className:h,style:y,trigger:u,shadowVisible:g,checked:p,indeterminate:d,checkboxProps:i,onChange:s,rowSpan:m?W:void 0}):null,{columnsToggle:T,setColumnsToggle:P}=ue(),[b,x]=Dr(!1),k=l.some(C=>C.toggleable),E=k?Object.fromEntries(l.map(({accessor:C,title:w})=>[C,w??de(String(C))])):void 0,L=$e(Cr,{className:yr(\"mantine-datatable-header\",t),style:o,ref:M,onContextMenu:k?C=>{C.preventDefault(),x(w=>!w)}:void 0,children:[m&&Array.from({length:R},(C,w)=>{let S=Tt(m,w);return $e(wo,{children:[w===0&&D,S.map((I,A)=>q(ro,{group:I,maxDepth:R,currentDepth:w,previousGroups:S.slice(0,A),isLastGroup:A===S.length-1,withColumnBorders:v,totalTableColumns:l.length},I.id))]},`group-depth-${w}`)}),$e(wo,{children:[!m&&D,l.map(({hidden:C,...w},S)=>{if(C)return null;let{accessor:I,visibleMediaQuery:A,textAlign:H,width:F,title:U,sortable:fe,draggable:be,toggleable:Te,resizable:ge,titleClassName:te,titleStyle:he,filter:Ce,filterPopoverProps:Q,filterPopoverDisableClickOutside:Je,filtering:je,sortKey:Ze}={...c,...w};return q(yo,{accessor:I,className:te,style:he,visibleMediaQuery:A,textAlign:H,width:F,title:U,sortable:fe,draggable:be,toggleable:Te,resizable:ge&&SC.toggleable).map(C=>q(fr,{children:q(pr,{classNames:{label:\"mantine-datatable-header-column-toggle-checkbox-label\"},size:\"xs\",label:E[C.accessor],checked:C.toggled,onChange:w=>{P(T.map(S=>S.accessor===C.accessor?{...S,toggled:w.currentTarget.checked}:S))}})},C.accessor))})})]}):L}import{Center as xr,Loader as wr}from\"@mantine/core\";import Sr from\"clsx\";import{jsx as Ro}from\"react/jsx-runtime\";function Po({fetching:e,customContent:t,backgroundBlur:o,size:n,type:a,color:r}){return Ro(xr,{className:Sr(\"mantine-datatable-loader\",{\"mantine-datatable-loader-fetching\":e}),style:[{backdropFilter:o?`blur(${o}px)`:void 0}],children:e&&(t||Ro(wr,{size:n,type:a,color:r}))})}import{Box as Ir,Pagination as Hr,Text as Or,rem as _r}from\"@mantine/core\";import Io from\"clsx\";import{Button as vr,Group as Mr,Menu as kr,MenuDropdown as Er,MenuItem as Nr,MenuTarget as Lr,Text as Eo,rem as ve}from\"@mantine/core\";import Wr from\"clsx\";import{parseThemeColor as Rr}from\"@mantine/core\";function O(e,t,o){return e?Rr({color:typeof e==\"object\"?e[o]:e,theme:t}).value:void 0}function vo({theme:e,c:t,backgroundColor:o,borderColor:n,rowBorderColor:a,stripedColor:r,highlightOnHoverColor:l}){return{\"--mantine-datatable-color-light\":O(t,e,\"light\"),\"--mantine-datatable-color-dark\":O(t,e,\"dark\"),\"--mantine-datatable-background-color-light\":O(o,e,\"light\"),\"--mantine-datatable-background-color-dark\":O(o,e,\"dark\"),\"--mantine-datatable-border-color-light\":O(n,e,\"light\"),\"--mantine-datatable-border-color-dark\":O(n,e,\"dark\"),\"--mantine-datatable-row-border-color-light\":O(a,e,\"light\"),\"--mantine-datatable-row-border-color-dark\":O(a,e,\"dark\"),\"--mantine-datatable-striped-color-light\":O(r,e,\"light\"),\"--mantine-datatable-striped-color-dark\":O(r,e,\"dark\"),\"--mantine-datatable-highlight-on-hover-color-light\":O(l,e,\"light\"),\"--mantine-datatable-highlight-on-hover-color-dark\":O(l,e,\"dark\")}}function Xe({theme:e,paginationActiveTextColor:t,paginationActiveBackgroundColor:o}){return{\"--mantine-datatable-pagination-active-text-color-light\":O(t,e,\"light\"),\"--mantine-datatable-pagination-active-text-color-dark\":O(t,e,\"dark\"),\"--mantine-datatable-pagination-active-background-color-light\":O(o,e,\"light\"),\"--mantine-datatable-pagination-active-background-color-dark\":O(o,e,\"dark\")}}function Mo({theme:e,color:t,backgroundColor:o}){return{\"--mantine-datatable-row-color-light\":O(t,e,\"light\"),\"--mantine-datatable-row-color-dark\":O(t,e,\"dark\"),\"--mantine-datatable-row-background-color-light\":O(o,e,\"light\"),\"--mantine-datatable-row-background-color-dark\":O(o,e,\"dark\")}}import{jsx as yt,jsxs as Pr}from\"react/jsx-runtime\";function ko(){return Pr(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[yt(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),yt(\"path\",{d:\"M8 9l4 -4l4 4\"}),yt(\"path\",{d:\"M16 15l-4 4l-4 -4\"})]})}import{jsx as ie,jsxs as Lo}from\"react/jsx-runtime\";var No={xs:ve(22),sm:ve(26),md:ve(32),lg:ve(38),xl:ve(44)};function Wo({size:e,label:t,values:o,value:n,activeTextColor:a,activeBackgroundColor:r,onChange:l}){return Lo(Mr,{gap:\"xs\",children:[ie(Eo,{component:\"div\",size:e,children:t}),Lo(kr,{withinPortal:!0,withArrow:!0,offset:2,classNames:{arrow:\"mantine-datatable-page-size-selector-menu-arrow\"},children:[ie(Lr,{children:ie(vr,{size:e,variant:\"default\",classNames:{section:\"mantine-datatable-page-size-selector-button-icon\"},rightSection:ie(ko,{}),style:[{fontWeight:\"normal\"},c=>({height:No[e],paddingLeft:c.spacing[e],paddingRight:c.spacing[e]})],children:n})}),ie(Er,{children:o.map(c=>{let m=c===n;return ie(Nr,{className:Wr({\"mantine-datatable-page-size-selector-active\":m}),style:[{height:No[e]},m&&(a||r)?u=>Xe({theme:u,paginationActiveTextColor:a,paginationActiveBackgroundColor:r}):void 0],disabled:m,onClick:()=>l(c),children:ie(Eo,{component:\"div\",size:e,children:c})},c)})})]})]})}import{Fragment as Ho,jsx as ee,jsxs as Ar}from\"react/jsx-runtime\";function Oo({className:e,style:t,fetching:o,page:n,onPageChange:a,paginationWithEdges:r,paginationWithControls:l,paginationActiveTextColor:c,paginationActiveBackgroundColor:m,paginationSize:u,loadingText:f,noRecordsText:p,paginationText:d,totalRecords:s,recordsPerPage:i,onRecordsPerPageChange:g,recordsPerPageLabel:h,recordsPerPageOptions:y,recordsLength:v,horizontalSpacing:M,paginationWrapBreakpoint:R,getPaginationControlProps:W,getPaginationItemProps:D,renderPagination:T}){let P;if(s){let S=(n-1)*i+1,I=S+(v||0)-1;P=d({from:S,to:I,totalRecords:s})}else P=o?f:p;let b=s&&i?Math.max(1,Math.ceil(s/i)):1,x=s?(n-1)*(i??0)+1:void 0,k=s?(x??1)+(v??0)-1:void 0,L=!J(({breakpoints:S})=>`(min-width: ${typeof R==\"number\"?`${_r(R)}rem`:S[R]||R})`),C={Text:S=>ee(Or,{component:\"div\",className:\"mantine-datatable-pagination-text\",size:u,...S,children:P}),PageSizeSelector:S=>y?ee(Wo,{activeTextColor:c,activeBackgroundColor:m,size:u,label:h,values:y,value:i,onChange:g,...S}):ee(Ho,{}),Pagination:S=>ee(Hr,{classNames:{root:Io(\"mantine-datatable-pagination-pages\",{\"mantine-datatable-pagination-pages-fetching\":o||!v}),control:\"mantine-datatable-pagination-pages-control\"},style:c||m?I=>Xe({theme:I,paginationActiveTextColor:c,paginationActiveBackgroundColor:m}):void 0,withEdges:r,withControls:l,value:n,onChange:a,size:u,total:b,getControlProps:W,getItemProps:D,...S})},w={state:{paginationSize:u,page:n,totalPages:b,totalRecords:s,recordsPerPage:i,recordsLength:v,fetching:o,from:x,to:k,isWrapped:L},actions:{setPage:S=>a?.(S),setRecordsPerPage:g?S=>g(S):void 0},Controls:C};return ee(Ir,{px:M??\"xs\",py:\"xs\",className:Io(\"mantine-datatable-pagination\",e),style:[{flexDirection:L?\"column\":\"row\"},t],children:typeof T==\"function\"?T(w):Ar(Ho,{children:[ee(C.Text,{}),ee(C.PageSizeSelector,{}),ee(C.Pagination,{})]})})}import{TableTr as Jr}from\"@mantine/core\";import jr from\"clsx\";import{TableTd as zr}from\"@mantine/core\";import Br from\"clsx\";import{jsx as Vr}from\"react/jsx-runtime\";function _o({className:e,style:t,visibleMediaQuery:o,record:n,index:a,onClick:r,onDoubleClick:l,onContextMenu:c,noWrap:m,ellipsis:u,textAlign:f,width:p,accessor:d,render:s,defaultRender:i,customCellAttributes:g}){return J(o)?Vr(zr,{className:Br({[me]:m||u,[pe]:u,[X]:r||l,[_e]:c,[j]:f===\"left\",[Z]:f===\"center\",[Y]:f===\"right\"},e),style:[{width:p,minWidth:p,maxWidth:p},t],onClick:r,onDoubleClick:l,onContextMenu:c,...g?.(n,a),children:s?s(n,a):i?i(n,a,d):ft(n,d)}):null}import{Collapse as Gr,TableTd as Fr,TableTr as Ao}from\"@mantine/core\";import{Fragment as $r,jsx as Me,jsxs as Xr}from\"react/jsx-runtime\";function zo({open:e,colSpan:t,content:o,collapseProps:n}){let{expanded:a,visible:r}=eo(e,n?.transitionDuration);return r?Xr($r,{children:[Me(Ao,{}),Me(Ao,{children:Me(Fr,{className:\"mantine-datatable-row-expansion-cell\",colSpan:t,children:Me(Gr,{in:a,...n,children:Me(\"div\",{className:\"mantine-datatable-row-expansion-cell-content\",children:o()})})})})]}):null}import{Checkbox as Ur,TableTd as Qr}from\"@mantine/core\";import Kr from\"clsx\";import{jsx as Bo}from\"react/jsx-runtime\";function Vo({className:e,style:t,record:o,index:n,trigger:a,onChange:r,withRightShadow:l,checkboxProps:c,getCheckboxProps:m,...u}){let f={...c,...m(o,n)},p=!u.disabled&&!f.disabled,d=s=>{s.stopPropagation(),a===\"cell\"&&p&&r?.(s)};return Bo(Qr,{className:Kr(\"mantine-datatable-row-selector-cell\",{[X]:a===\"cell\"&&p},e),style:t,\"data-shadow-visible\":l||void 0,onClick:d,children:Bo(Ur,{classNames:p?{input:X}:void 0,onChange:r,...u,...f})})}import{Fragment as Go,jsx as Ue,jsxs as Fo}from\"react/jsx-runtime\";function $o({record:e,index:t,columns:o,defaultColumnProps:n,defaultColumnRender:a,selectionTrigger:r,selectionVisible:l,selectionChecked:c,onSelectionChange:m,isRecordSelectable:u,selectionCheckboxProps:f,getSelectionCheckboxProps:p,onClick:d,onDoubleClick:s,onContextMenu:i,onCellClick:g,onCellDoubleClick:h,onCellContextMenu:y,expansion:v,customAttributes:M,color:R,backgroundColor:W,className:D,style:T,selectorCellShadowVisible:P,selectionColumnClassName:b,selectionColumnStyle:x,rowFactory:k}){let E=Fo(Go,{children:[l&&Ue(Vo,{className:b,style:x,record:e,index:t,trigger:r,withRightShadow:P,checked:c,disabled:!m||(u?!u(e,t):!1),onChange:m,checkboxProps:f,getCheckboxProps:p}),o.map(({hidden:w,hiddenContent:S,...I},A)=>{if(w||S)return null;let{accessor:H,visibleMediaQuery:F,textAlign:U,noWrap:fe,ellipsis:be,width:Te,render:ge,cellsClassName:te,cellsStyle:he,customCellAttributes:Ce}={...n,...I};return Ue(_o,{className:typeof te==\"function\"?te(e,t):te,style:he?.(e,t),visibleMediaQuery:F,record:e,index:t,onClick:g?Q=>g({event:Q,record:e,index:t,column:I,columnIndex:A}):void 0,onDoubleClick:h?Q=>h({event:Q,record:e,index:t,column:I,columnIndex:A}):void 0,onContextMenu:y?Q=>y({event:Q,record:e,index:t,column:I,columnIndex:A}):void 0,accessor:H,textAlign:U,noWrap:fe,ellipsis:be,width:Te,render:ge,defaultRender:a,customCellAttributes:Ce},H)})]}),L=v&&Ue(zo,{colSpan:o.filter(({hidden:w})=>!w).length+(l?1:0),open:v.isRowExpanded(e),content:v.content({record:e,index:t}),collapseProps:v.collapseProps}),C=Zr({record:e,index:t,selectionChecked:c,onClick:d,onDoubleClick:s,onContextMenu:i,expansion:v,customAttributes:M,color:R,backgroundColor:W,className:D,style:T});return k?k({record:e,index:t,rowProps:C,children:E,expandedElement:L}):Fo(Go,{children:[Ue(Jr,{...C,children:E}),L]})}function Zr({record:e,index:t,selectionChecked:o,onClick:n,onDoubleClick:a,onContextMenu:r,expansion:l,customAttributes:c,color:m,backgroundColor:u,className:f,style:p}){return{className:jr(\"mantine-datatable-row\",{[X]:n||a||l?.isExpandable({record:e,index:t})&&l?.expandOnClick},{[_e]:r},typeof f==\"function\"?f(e,t):f),\"data-selected\":o||void 0,onClick:d=>{if(l){let{isExpandable:s,isRowExpanded:i,expandOnClick:g,expandRow:h,collapseRow:y}=l;s({record:e,index:t})&&g&&(i(e)?y(e):h(e))}n?.({event:d,record:e,index:t})},onDoubleClick:a?d=>a({event:d,record:e,index:t}):void 0,onContextMenu:r?d=>r({event:d,record:e,index:t}):void 0,style:[m||u?d=>{let s=m?.(e,t),i=u?.(e,t);return Mo({theme:d,color:s,backgroundColor:i})}:void 0,p?.(e,t)],...c?.(e,t)??{}}}import{Box as Xo,ScrollArea as Yr}from\"@mantine/core\";import Qe from\"clsx\";import{jsx as Ke,jsxs as qr}from\"react/jsx-runtime\";function Uo({leftShadowBehind:e,rightShadowBehind:t,onScrollPositionChange:o,children:n,viewportRef:a,scrollAreaProps:r}){return qr(Yr,{...r,viewportRef:a,classNames:{root:\"mantine-datatable-scroll-area\",scrollbar:\"mantine-datatable-scroll-area-scrollbar\",thumb:\"mantine-datatable-scroll-area-thumb\",corner:\"mantine-datatable-scroll-area-corner\"},onScrollPositionChange:o,children:[n,Ke(Xo,{className:Qe(\"mantine-datatable-scroll-area-shadow\",\"mantine-datatable-scroll-area-top-shadow\")}),Ke(\"div\",{className:Qe(\"mantine-datatable-scroll-area-shadow\",\"mantine-datatable-scroll-area-left-shadow\",{\"mantine-datatable-scroll-area-shadow-behind\":e})}),Ke(\"div\",{className:Qe(\"mantine-datatable-scroll-area-shadow\",\"mantine-datatable-scroll-area-right-shadow\",{\"mantine-datatable-scroll-area-shadow-behind\":t})}),Ke(Xo,{className:Qe(\"mantine-datatable-scroll-area-shadow\",\"mantine-datatable-scroll-area-bottom-shadow\")})]})}import{jsx as B,jsxs as Jo}from\"react/jsx-runtime\";function ll({withTableBorder:e,borderRadius:t,textSelectionDisabled:o,height:n=\"100%\",minHeight:a,maxHeight:r,shadow:l,verticalAlign:c=\"center\",fetching:m,columns:u,storeColumnsKey:f,groups:p,pinFirstColumn:d,pinLastColumn:s,defaultColumnProps:i,defaultColumnRender:g,idAccessor:h=\"id\",records:y,selectionTrigger:v=\"checkbox\",selectedRecords:M,onSelectedRecordsChange:R,selectionColumnClassName:W,selectionColumnStyle:D,isRecordSelectable:T,selectionCheckboxProps:P,allRecordsSelectionCheckboxProps:b={\"aria-label\":\"Select all records\"},getRecordSelectionCheckboxProps:x=(V,xe)=>({\"aria-label\":`Select record ${xe+1}`}),sortStatus:k,sortIcons:E,onSortStatusChange:L,horizontalSpacing:C,page:w,onPageChange:S,totalRecords:I,recordsPerPage:A,onRecordsPerPageChange:H,recordsPerPageOptions:F,recordsPerPageLabel:U=\"Records per page\",paginationWithEdges:fe,paginationWithControls:be,paginationActiveTextColor:Te,paginationActiveBackgroundColor:ge,paginationSize:te=\"sm\",paginationText:he=({from:V,to:xe,totalRecords:et})=>`${V} - ${xe} / ${et}`,paginationWrapBreakpoint:Ce=\"sm\",getPaginationControlProps:Q=V=>V===\"previous\"?{\"aria-label\":\"Previous page\"}:V===\"next\"?{\"aria-label\":\"Next page\"}:{},getPaginationItemProps:Je,renderPagination:je,loaderBackgroundBlur:Ze,customLoader:jo,loaderSize:Zo,loaderType:Yo,loaderColor:qo,loadingText:en=\"...\",emptyState:tn,noRecordsText:wt=\"No records\",noRecordsIcon:on,highlightOnHover:nn,striped:an,noHeader:rn,onRowClick:ln,onRowDoubleClick:sn,onRowContextMenu:cn,onCellClick:un,onCellDoubleClick:dn,onCellContextMenu:mn,onScroll:pn,onScrollToTop:fn,onScrollToBottom:bn,onScrollToLeft:Tn,onScrollToRight:gn,c:hn,backgroundColor:Cn,borderColor:yn,rowBorderColor:Dn,stripedColor:xn,highlightOnHoverColor:wn,rowColor:Sn,rowBackgroundColor:Rn,rowExpansion:Pn,rowClassName:vn,rowStyle:Mn,customRowAttributes:kn,scrollViewportRef:En,scrollAreaProps:Nn,tableRef:Ln,bodyRef:Wn,m:In,my:Hn,mx:On,mt:_n,mb:An,ml:zn,mr:Bn,className:Vn,classNames:ye,style:Gn,styles:De,rowFactory:Fn,tableWrapper:Ye,...qe}){let V=al(()=>p?Pe(p):u,[u,p]),[xe,et]=rl(!1),{refs:$,onScroll:$n}=$t({scrollCallbacks:{onScroll:pn,onScrollToTop:fn,onScrollToBottom:bn,onScrollToLeft:Tn,onScrollToRight:gn},withRowBorders:qe.withRowBorders}),tt=zt({key:f,columns:V,headerRef:$.header,scrollViewportRef:$.scrollViewport,onFixedLayoutChange:et}),Xn=Qo($.table,Ln),Un=Qo($.scrollViewport,En),Qn=Zt({rowExpansion:Pn,records:y,idAccessor:h}),ke=xt(!1),St=xt(w),ot=xt(y),Kn=Dt(N=>{ke.current=!0,ot.current=y,S(N)},[S,y]);ol(()=>{St.current!==w&&(ke.current=!0,ot.current=y,St.current=w)},[w,y]);let we=y?.length;nl(()=>{if(!ke.current||m||y===ot.current)return;let N=$.scrollViewport.current;if(!N)return;let oe=requestAnimationFrame(()=>{N.scrollTo({top:0,left:0}),ke.current=!1});return()=>cancelAnimationFrame(oe)},[m,y,$.scrollViewport]);let Rt=y?.map(N=>_(N,h)),se=!!M,Se=M?.map(N=>_(N,h)),Pt=Rt!==void 0&&Se!==void 0&&Se.length>0,nt=T?y?.filter(T):y,Ee=nt?.map(N=>_(N,h)),Ne=Pt&&Ee.every(N=>Se.includes(N)),Jn=Pt&&Ee.some(N=>Se.includes(N)),jn=Dt(()=>{M&&R&&R(Ne?M.filter(N=>!Ee.includes(_(N,h))):He([...M,...nt],N=>_(N,h)))},[Ne,h,R,Ee,nt,M]),{lastSelectionChangeIndex:Le,setLastSelectionChangeIndex:Zn}=Xt(Rt),at=se&&!d,Yn={m:In,my:Hn,mx:On,mt:_n,mb:An,ml:zn,mr:Bn},qn=Dt(({children:N})=>Ye?Ye({children:N}):N,[Ye]);return B(it,{...tt,children:Jo(el,{ref:$.root,...Yn,className:Ko(\"mantine-datatable\",{\"mantine-datatable-with-border\":e},Vn,ye?.root),style:[N=>({...vo({theme:N,c:hn,backgroundColor:Cn,borderColor:yn,rowBorderColor:Dn,stripedColor:xn,highlightOnHoverColor:wn}),borderRadius:N.radius[t]||t,boxShadow:N.shadows[l]||l,height:n,minHeight:a,maxHeight:r}),Gn,De?.root,{position:\"relative\"}],children:[B(Uo,{viewportRef:Un,leftShadowBehind:se||!!d,rightShadowBehind:s,onScrollPositionChange:$n,scrollAreaProps:Nn,children:B(qn,{children:Jo(tl,{ref:Xn,horizontalSpacing:C,className:Ko(\"mantine-datatable-table\",{[to]:o,\"mantine-datatable-vertical-align-top\":c===\"top\",\"mantine-datatable-vertical-align-bottom\":c===\"bottom\",\"mantine-datatable-pin-last-column\":s,\"mantine-datatable-selection-column-visible\":se,\"mantine-datatable-pin-first-column\":d,\"mantine-datatable-resizable-columns\":tt.hasResizableColumns&&xe},ye?.table),style:{...De?.table},\"data-striped\":we&&an||void 0,\"data-highlight-on-hover\":nn||void 0,...qe,children:[rn?null:B(it,{...tt,children:B(So,{ref:$.header,selectionColumnHeaderRef:$.selectionColumnHeader,className:ye?.header,style:De?.header,columns:V,defaultColumnProps:i,groups:p,sortStatus:k,sortIcons:E,onSortStatusChange:L,selectionTrigger:v,selectionVisible:se,selectionChecked:Ne,selectionIndeterminate:Jn&&!Ne,onSelectionChange:jn,selectionCheckboxProps:{...P,...b},selectorCellShadowVisible:at,selectionColumnClassName:W,selectionColumnStyle:D,withColumnBorders:qe.withColumnBorders})}),B(\"tbody\",{ref:Wn,children:we?y.map((N,oe)=>{let rt=_(N,h),lt=Se?.includes(rt)||!1,vt;return R&&M&&(vt=ea=>{if(ea.nativeEvent.shiftKey&&Le!==null){let ce=y.filter(oe>Le?(ne,ae)=>ae>=Le&&ae<=oe&&(T?T(ne,ae):!0):(ne,ae)=>ae>=oe&&ae<=Le&&(T?T(ne,ae):!0));R(lt?Jt(M,ce,ne=>_(ne,h)):He([...M,...ce],ne=>_(ne,h)))}else R(lt?M.filter(ce=>_(ce,h)!==rt):He([...M,N],ce=>_(ce,h)));Zn(oe)}),B($o,{record:N,index:oe,columns:V,defaultColumnProps:i,defaultColumnRender:g,selectionTrigger:v,selectionVisible:se,selectionChecked:lt,onSelectionChange:vt,isRecordSelectable:T,selectionCheckboxProps:P,getSelectionCheckboxProps:x,onClick:ln,onDoubleClick:sn,onCellClick:un,onCellDoubleClick:dn,onContextMenu:cn,onCellContextMenu:mn,expansion:Qn,color:Sn,backgroundColor:Rn,className:vn,style:Mn,customAttributes:kn,selectorCellShadowVisible:at,selectionColumnClassName:W,selectionColumnStyle:D,idAccessor:h,rowFactory:Fn},rt)}):B(Nt,{})}),V.some(({footer:N})=>N)&&B(ao,{ref:$.footer,className:ye?.footer,style:De?.footer,columns:V,defaultColumnProps:i,selectionVisible:se,selectorCellShadowVisible:at})]})})}),!!(w&&we)&&B(Oo,{className:ye?.pagination,style:De?.pagination,horizontalSpacing:C,fetching:m,page:w,onPageChange:Kn,totalRecords:I,recordsPerPage:A,onRecordsPerPageChange:H,recordsPerPageOptions:F,recordsPerPageLabel:U,paginationWithEdges:fe,paginationWithControls:be,paginationActiveTextColor:Te,paginationActiveBackgroundColor:ge,paginationSize:te,paginationText:he,paginationWrapBreakpoint:Ce,getPaginationControlProps:Q,getPaginationItemProps:Je,noRecordsText:wt,loadingText:en,recordsLength:we,renderPagination:je}),B(Po,{fetching:m,backgroundBlur:Ze,customContent:jo,size:Zo,type:Yo,color:qo}),B(Wt,{icon:on,text:wt,active:!m&&!we,children:tn})]})})}import{TableTr as il}from\"@mantine/core\";import{useMergedRef as sl}from\"@mantine/hooks\";import{useEffect as cl,useRef as ul}from\"react\";import{jsx as ml}from\"react/jsx-runtime\";function dl({className:e,children:t,isDragging:o,ref:n,...a}){let r=ul(null),l=sl(r,n);return cl(()=>{if(!r.current||!o)return;let f=r.current.parentElement.parentElement.children[0].children[0];for(let p=0;p {};\nconst GROUP_RECORD_PREFIX = '__group__';\nconst GROUP_INDENT_SIZE = 20;\r\nconst TEMPLATE_TOKEN_PATTERN = /\\{([^}]+)\\}/g;\r\nconst ROOT_STYLE_PROP_NAMES = [\r\n 'm',\r\n 'mx',\r\n 'my',\r\n 'mt',\r\n 'mb',\r\n 'ms',\r\n 'me',\r\n 'ml',\r\n 'mr',\r\n 'p',\r\n 'px',\r\n 'py',\r\n 'pt',\r\n 'pb',\r\n 'ps',\r\n 'pe',\r\n 'pl',\r\n 'pr',\r\n 'w',\r\n 'miw',\r\n 'maw',\r\n 'h',\r\n 'mih',\r\n 'mah',\r\n 'bg',\r\n 'opacity',\r\n 'ff',\r\n 'fz',\r\n 'fw',\r\n 'lts',\r\n 'ta',\r\n 'lh',\r\n 'fs',\r\n 'tt',\r\n 'display',\r\n 'flex',\r\n 'bd',\r\n 'bdrs',\r\n 'td',\r\n 'bgsz',\r\n 'bgp',\r\n 'bgr',\r\n 'bga',\r\n 'pos',\r\n 'top',\r\n 'left',\r\n 'bottom',\r\n 'right',\r\n 'inset',\r\n 'hiddenFrom',\r\n 'visibleFrom',\r\n];\r\n\r\nconst isNil = (value) => value === null || value === undefined;\n\nconst isPlainObject = (value) =>\n value && typeof value === 'object' && !Array.isArray(value);\n\nconst pickDefinedProps = (source, keys) =>\n keys.reduce((accumulator, key) => {\n if (!isNil(source[key])) {\n accumulator[key] = source[key];\n }\n\r\n return accumulator;\r\n }, {});\r\n\r\nconst hasAnyDefinedProp = (source, keys) => keys.some((key) => !isNil(source[key]));\r\n\r\nconst reorderByIndices = (records, sourceIndex, destinationIndex) => {\r\n if (\r\n !Array.isArray(records) ||\r\n sourceIndex === destinationIndex ||\r\n sourceIndex < 0 ||\r\n destinationIndex < 0\r\n ) {\r\n return records;\r\n }\r\n\r\n const nextRecords = [...records];\r\n const [movedRecord] = nextRecords.splice(sourceIndex, 1);\r\n nextRecords.splice(destinationIndex, 0, movedRecord);\r\n return nextRecords;\r\n};\r\n\r\nconst isInteractiveDragTarget = (target) =>\r\n Boolean(\r\n target?.closest?.(\r\n 'a, button, input, textarea, select, option, [role=\"button\"], [contenteditable=\"true\"]'\r\n )\r\n );\r\n\r\nconst isDryComponent = (value) =>\n Boolean(\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n value.type &&\r\n value.namespace &&\r\n value.props\n );\n\nconst DASH_COMPONENT_TYPE_NAMES = new WeakMap();\n\nconst trackDashComponentType = (componentType, typeName) => {\n if (\n componentType &&\n (typeof componentType === 'function' ||\n (typeof componentType === 'object' && componentType !== null))\n ) {\n DASH_COMPONENT_TYPE_NAMES.set(componentType, typeName);\n }\n\n return componentType;\n};\n\nconst isMaterializedDashComponent = (node) =>\n React.isValidElement(node) && DASH_COMPONENT_TYPE_NAMES.has(node.type);\n\nconst getAccessorValue = (record, accessor) => {\n if (!record || !accessor) {\r\n return undefined;\r\n }\r\n\r\n if (typeof accessor !== 'string') {\r\n return record[accessor];\r\n }\r\n\r\n return accessor.split('.').reduce((accumulator, key) => {\r\n if (accumulator === null || accumulator === undefined) {\r\n return undefined;\r\n }\r\n\r\n return accumulator[key];\r\n }, record);\r\n};\r\n\r\nconst setAccessorValue = (record, accessor, value) => {\r\n if (!record || typeof accessor !== 'string' || !accessor.trim()) {\r\n return record;\r\n }\r\n\r\n const keys = accessor.split('.');\r\n const nextRecord = Array.isArray(record) ? [...record] : { ...record };\r\n let currentTarget = nextRecord;\r\n let currentSource = record;\r\n\r\n keys.forEach((key, index) => {\r\n if (index === keys.length - 1) {\r\n currentTarget[key] = value;\r\n return;\r\n }\r\n\r\n const sourceValue =\r\n currentSource &&\r\n typeof currentSource === 'object' &&\r\n Object.prototype.hasOwnProperty.call(currentSource, key)\r\n ? currentSource[key]\r\n : undefined;\r\n const nextValue = Array.isArray(sourceValue)\r\n ? [...sourceValue]\r\n : sourceValue && typeof sourceValue === 'object'\r\n ? { ...sourceValue }\r\n : {};\r\n\r\n currentTarget[key] = nextValue;\r\n currentTarget = nextValue;\r\n currentSource = sourceValue;\r\n });\r\n\r\n return nextRecord;\r\n};\r\n\r\nconst findRecordInCollection = (\r\n records,\r\n recordId,\r\n idAccessor,\r\n childRowsAccessor\r\n) => {\r\n if (!Array.isArray(records)) {\r\n return undefined;\r\n }\r\n\r\n for (const record of records) {\r\n if (getRecordId(record, idAccessor) === recordId) {\r\n return record;\r\n }\r\n\r\n if (childRowsAccessor) {\r\n const children = getAccessorValue(record, childRowsAccessor);\r\n if (Array.isArray(children)) {\r\n const nestedMatch = findRecordInCollection(\r\n children,\r\n recordId,\r\n idAccessor,\r\n childRowsAccessor\r\n );\r\n\r\n if (nestedMatch) {\r\n return nestedMatch;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst updateRecordValueInCollection = (\r\n records,\r\n recordId,\r\n idAccessor,\r\n accessor,\r\n value,\r\n childRowsAccessor\r\n) => {\r\n if (!Array.isArray(records)) {\r\n return { records, didUpdate: false };\r\n }\r\n\r\n let didUpdate = false;\r\n const nextRecords = records.map((record) => {\r\n let nextRecord = record;\r\n\r\n if (getRecordId(record, idAccessor) === recordId) {\r\n nextRecord = setAccessorValue(record, accessor, value);\r\n didUpdate = true;\r\n }\r\n\r\n if (childRowsAccessor) {\r\n const childRows = getAccessorValue(nextRecord, childRowsAccessor);\r\n\r\n if (Array.isArray(childRows)) {\r\n const updatedChildren = updateRecordValueInCollection(\r\n childRows,\r\n recordId,\r\n idAccessor,\r\n accessor,\r\n value,\r\n childRowsAccessor\r\n );\r\n\r\n if (updatedChildren.didUpdate) {\r\n nextRecord = setAccessorValue(\r\n nextRecord,\r\n childRowsAccessor,\r\n updatedChildren.records\r\n );\r\n didUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n return nextRecord;\r\n });\r\n\r\n return {\r\n records: didUpdate ? nextRecords : records,\r\n didUpdate,\r\n };\r\n};\r\n\r\nconst areEditableValuesEqual = (left, right) => {\r\n if (left === right) {\r\n return true;\r\n }\r\n\r\n if (left instanceof Date || right instanceof Date) {\r\n return String(left) === String(right);\r\n }\r\n\r\n if (Array.isArray(left) && Array.isArray(right)) {\r\n return (\r\n left.length === right.length &&\r\n left.every((item, index) =>\r\n areEditableValuesEqual(item, right[index])\r\n )\r\n );\r\n }\r\n\r\n if (\r\n left &&\r\n right &&\r\n typeof left === 'object' &&\r\n typeof right === 'object'\r\n ) {\r\n try {\r\n return JSON.stringify(left) === JSON.stringify(right);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getEditorTypeName = (node) => {\r\n if (isDryComponent(node)) {\r\n return typeof node.type === 'string' ? node.type : undefined;\r\n }\r\n\r\n if (!React.isValidElement(node)) {\r\n return undefined;\r\n }\r\n\r\n if (typeof node.type === 'string') {\n return node.type;\n }\n\n if (DASH_COMPONENT_TYPE_NAMES.has(node.type)) {\n return DASH_COMPONENT_TYPE_NAMES.get(node.type);\n }\n\n return node.type?.displayName || node.type?.name;\n};\n\r\nconst resolveEditorValueProp = (column, editorDefinition) => {\r\n if (typeof column?.editorValueProp === 'string') {\r\n return column.editorValueProp;\r\n }\r\n\r\n const editorTypeName = getEditorTypeName(editorDefinition);\r\n\r\n if (editorTypeName === 'Checkbox' || editorTypeName === 'Switch') {\r\n return 'checked';\r\n }\r\n\r\n return 'value';\r\n};\r\n\r\nconst extractEditorValue = (nextValue, valueProp) => {\r\n if (\r\n nextValue &&\r\n typeof nextValue === 'object' &&\r\n !Array.isArray(nextValue)\r\n ) {\r\n if (Object.prototype.hasOwnProperty.call(nextValue, valueProp)) {\r\n return nextValue[valueProp];\r\n }\r\n\r\n if (\r\n nextValue.currentTarget &&\r\n Object.prototype.hasOwnProperty.call(\r\n nextValue.currentTarget,\r\n valueProp\r\n )\r\n ) {\r\n return nextValue.currentTarget[valueProp];\r\n }\r\n\r\n if (\r\n nextValue.target &&\r\n Object.prototype.hasOwnProperty.call(nextValue.target, valueProp)\r\n ) {\r\n return nextValue.target[valueProp];\r\n }\r\n }\r\n\r\n return nextValue;\r\n};\r\n\r\nconst normalizeEditableValue = (value, column, editorDefinition) => {\r\n if (value instanceof Date) {\r\n const editorTypeName = getEditorTypeName(editorDefinition);\r\n\r\n if (\r\n column?.presentation === 'date' ||\r\n column?.type === 'date' ||\r\n editorTypeName === 'DateInput'\r\n ) {\r\n return value.toISOString().slice(0, 10);\r\n }\r\n\r\n return value.toISOString();\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) =>\r\n normalizeEditableValue(item, column, editorDefinition)\r\n );\r\n }\r\n\r\n return value;\r\n};\r\n\r\nconst isTextLikeEditor = (editorDefinition) =>\n ['TextInput', 'Textarea', 'NumberInput', 'PasswordInput'].includes(\n getEditorTypeName(editorDefinition)\n );\n\nconst FILTER_VALUE_PROP_BY_TYPE = {\n Checkbox: 'checked',\n Switch: 'checked',\n};\n\nconst FILTER_TEXT_CONTROL_TYPES = new Set([\n 'Autocomplete',\n 'JsonInput',\n 'PasswordInput',\n 'PinInput',\n 'TextInput',\n 'Textarea',\n]);\n\nconst FILTER_MULTI_CONTROL_TYPES = new Set([\n 'CheckboxGroup',\n 'MultiSelect',\n 'TagsInput',\n]);\n\nconst FILTER_RANGE_CONTROL_TYPES = new Set(['RangeSlider']);\n\nconst FILTER_DATE_CONTROL_TYPES = new Set([\n 'DateInput',\n 'DatePickerInput',\n 'DateTimePicker',\n 'MonthPickerInput',\n 'TimeInput',\n 'YearPickerInput',\n]);\n\nconst FILTER_EQUALITY_CONTROL_TYPES = new Set([\n 'ChipGroup',\n 'ColorInput',\n 'ColorPicker',\n 'NativeSelect',\n 'NumberInput',\n 'RadioGroup',\n 'Rating',\n 'SegmentedControl',\n 'Select',\n]);\n\nconst FILTER_CONTROL_TYPES = new Set([\n ...FILTER_TEXT_CONTROL_TYPES,\n ...FILTER_MULTI_CONTROL_TYPES,\n ...FILTER_RANGE_CONTROL_TYPES,\n ...FILTER_DATE_CONTROL_TYPES,\n ...FILTER_EQUALITY_CONTROL_TYPES,\n 'Checkbox',\n 'Switch',\n]);\n\nconst FILTER_INACTIVE_STRING_VALUES = new Set(['all', '__all__']);\n\nconst mergeEditorNestedProps = (value, overrides) =>\n value && typeof value === 'object' && !Array.isArray(value)\n ? { ...value, ...overrides }\n : overrides;\n\nconst mergeFilterNestedProps = (value, defaults) =>\n value && typeof value === 'object' && !Array.isArray(value)\n ? { ...defaults, ...value }\n : defaults;\n\r\nconst enhanceEditorNode = (\n editorNode,\n column,\n editorDefinition,\n value,\n handleValueChange,\r\n closeEditor\r\n) => {\r\n if (!React.isValidElement(editorNode)) {\r\n return editorNode;\r\n }\r\n\r\n const valueProp = resolveEditorValueProp(column, editorDefinition);\r\n const existingProps = editorNode.props || EMPTY_OBJECT;\r\n const originalOnChange = existingProps.onChange;\r\n const originalOnKeyDown = existingProps.onKeyDown;\r\n const nextProps = {\r\n ...existingProps,\r\n [valueProp]: value,\r\n autoFocus: false,\r\n comboboxProps: mergeEditorNestedProps(existingProps.comboboxProps, {\r\n withinPortal: true,\r\n zIndex: 1100,\r\n }),\r\n popoverProps: mergeEditorNestedProps(existingProps.popoverProps, {\r\n withinPortal: true,\r\n zIndex: 1100,\r\n }),\r\n onChange: (nextValue, ...args) => {\r\n handleValueChange(extractEditorValue(nextValue, valueProp));\r\n\r\n if (typeof originalOnChange === 'function') {\r\n originalOnChange(nextValue, ...args);\r\n }\r\n },\r\n onKeyDown: (event) => {\r\n if (event?.key === 'Escape') {\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n closeEditor();\r\n } else if (event?.key === 'Enter' && isTextLikeEditor(editorDefinition)) {\r\n closeEditor();\r\n }\r\n\r\n if (typeof originalOnKeyDown === 'function') {\r\n originalOnKeyDown(event);\r\n }\r\n },\r\n };\r\n\n return React.cloneElement(editorNode, nextProps);\n};\n\nconst safeStringify = (value) => {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nconst serializeComponentId = (id) => {\n if (isNil(id)) {\n return undefined;\n }\n\n if (typeof id === 'string' || typeof id === 'number') {\n return String(id);\n }\n\n return safeStringify(id);\n};\n\nconst getNodeProps = (node) => {\n if (React.isValidElement(node) || isDryComponent(node)) {\n return node.props || EMPTY_OBJECT;\n }\n\n return EMPTY_OBJECT;\n};\n\nconst resolveFilterValueProp = (column, filterNode) => {\n if (typeof column?.filterValueProp === 'string') {\n return column.filterValueProp;\n }\n\n const typeName = getEditorTypeName(filterNode);\n\n if (FILTER_VALUE_PROP_BY_TYPE[typeName]) {\n return FILTER_VALUE_PROP_BY_TYPE[typeName];\n }\n\n const props = getNodeProps(filterNode);\n\n if (\n Object.prototype.hasOwnProperty.call(props, 'checked') ||\n Object.prototype.hasOwnProperty.call(props, 'defaultChecked')\n ) {\n return 'checked';\n }\n\n return 'value';\n};\n\nconst isFilterControlNode = (node) => {\n const props = getNodeProps(node);\n\n if (props.filterRegistration === false || props.autoFilter === false) {\n return false;\n }\n\n const typeName = getEditorTypeName(node);\n const hasDashValueProp =\n typeof props.setProps === 'function' &&\n props.setProps !== NOOP_SET_PROPS &&\n ['value', 'defaultValue', 'checked', 'defaultChecked'].some((key) =>\n Object.prototype.hasOwnProperty.call(props, key)\n );\n\n return (\n FILTER_CONTROL_TYPES.has(typeName) ||\n props.filterRegistration === true ||\n props.autoFilter === true ||\n hasDashValueProp\n );\n};\n\nconst getFilterControlKey = (node, column, nodePath = EMPTY_ARRAY) => {\n const serializedId = serializeComponentId(getNodeProps(node).id);\n const pathKey = nodePath.length ? nodePath.join('.') : 'root';\n return serializedId || `${column?.accessor || '__filter__'}:${pathKey}`;\n};\n\nconst getFilterDefaultValue = (control) => {\n const props = control.props || EMPTY_OBJECT;\n\n if (Object.prototype.hasOwnProperty.call(props, control.valueProp)) {\n return props[control.valueProp];\n }\n\n const defaultValueProp =\n control.valueProp === 'checked' ? 'defaultChecked' : 'defaultValue';\n\n if (Object.prototype.hasOwnProperty.call(props, defaultValueProp)) {\n return props[defaultValueProp];\n }\n\n return undefined;\n};\n\nconst collectFilterControls = (node, column, nodePath = EMPTY_ARRAY) => {\n if (React.isValidElement(node) || isDryComponent(node)) {\n const props = getNodeProps(node);\n const controls = [];\n\n if (isFilterControlNode(node)) {\n const valueProp = resolveFilterValueProp(column, node);\n controls.push({\n key: getFilterControlKey(node, column, nodePath),\n path: nodePath,\n props,\n typeName: getEditorTypeName(node),\n valueProp,\n });\n }\n\n return controls.concat(\n collectFilterControls(props.children, column, [\n ...nodePath,\n 'children',\n ])\n );\n }\n\n if (Array.isArray(node)) {\n return node.flatMap((child, index) =>\n collectFilterControls(child, column, [...nodePath, index])\n );\n }\n\n return EMPTY_ARRAY;\n};\n\nconst buildFilterDefinitions = (\n columns,\n defaultColumnProps,\n locale,\n renderOptions\n) =>\n (columns || EMPTY_ARRAY).map((column) => {\n const effectiveColumn = defaultColumnProps\n ? { ...defaultColumnProps, ...column }\n : column;\n const filterTemplate = !isNil(column?.filter)\n ? column.filter\n : defaultColumnProps?.filter;\n\n if (!column?.accessor || isNil(filterTemplate)) {\n return {\n accessor: column?.accessor,\n column: effectiveColumn,\n controls: EMPTY_ARRAY,\n };\n }\n\n const resolvedFilter =\n typeof filterTemplate === 'function'\n ? undefined\n : resolveStaticTemplateNode(\n filterTemplate,\n column,\n locale,\n renderOptions\n );\n\n return {\n accessor: column.accessor,\n column: effectiveColumn,\n controls: resolvedFilter\n ? collectFilterControls(resolvedFilter, column)\n : EMPTY_ARRAY,\n };\n });\n\nconst getFilterDefinitionsKey = (definitions) =>\n safeStringify(\n (definitions || EMPTY_ARRAY).map((definition) => ({\n accessor: definition.accessor,\n controls: (definition.controls || EMPTY_ARRAY).map((control) => ({\n defaultValue: getFilterDefaultValue(control),\n key: control.key,\n typeName: control.typeName,\n valueProp: control.valueProp,\n })),\n }))\n );\n\nconst setFilterValueInCollection = (\n filterValues,\n accessor,\n filterKey,\n value,\n inputCount\n) => {\n const nextValues = isPlainObject(filterValues) ? { ...filterValues } : {};\n\n if (inputCount <= 1) {\n nextValues[accessor] = value;\n return nextValues;\n }\n\n const currentColumnValue = isPlainObject(nextValues[accessor])\n ? nextValues[accessor]\n : {};\n\n nextValues[accessor] = {\n ...currentColumnValue,\n [filterKey]: value,\n };\n\n return nextValues;\n};\n\nconst getFilterValueFromCollection = (\n filterValues,\n accessor,\n filterKey,\n inputCount\n) => {\n if (!isPlainObject(filterValues)) {\n return { hasValue: false, value: undefined };\n }\n\n if (!Object.prototype.hasOwnProperty.call(filterValues, accessor)) {\n return { hasValue: false, value: undefined };\n }\n\n const columnValue = filterValues[accessor];\n\n if (inputCount <= 1) {\n if (\n isPlainObject(columnValue) &&\n Object.prototype.hasOwnProperty.call(columnValue, filterKey)\n ) {\n return { hasValue: true, value: columnValue[filterKey] };\n }\n\n return { hasValue: true, value: columnValue };\n }\n\n if (\n isPlainObject(columnValue) &&\n Object.prototype.hasOwnProperty.call(columnValue, filterKey)\n ) {\n return { hasValue: true, value: columnValue[filterKey] };\n }\n\n return { hasValue: false, value: undefined };\n};\n\nconst buildInitialFilterValues = (definitions) =>\n (definitions || EMPTY_ARRAY).reduce((filterValues, definition) => {\n const controls = definition.controls || EMPTY_ARRAY;\n\n controls.forEach((control) => {\n const value = getFilterDefaultValue(control);\n\n if (isNil(value)) {\n return;\n }\n\n Object.assign(\n filterValues,\n setFilterValueInCollection(\n filterValues,\n definition.accessor,\n control.key,\n value,\n controls.length\n )\n );\n });\n\n return filterValues;\n }, {});\n\nconst syncFilterValuesWithDefinitions = (filterValues, definitions) => {\n const nextValues = {};\n\n (definitions || EMPTY_ARRAY).forEach((definition) => {\n if (\n definition.accessor &&\n definition.controls?.length &&\n Object.prototype.hasOwnProperty.call(filterValues, definition.accessor)\n ) {\n nextValues[definition.accessor] = filterValues[definition.accessor];\n }\n });\n\n return nextValues;\n};\n\nconst resolveFilterEmptyValue = (column, control) => {\n const resolvedColumn = column || EMPTY_OBJECT;\n const props = control.props || EMPTY_OBJECT;\n\n if (Object.prototype.hasOwnProperty.call(resolvedColumn, 'filterEmptyValue')) {\n return resolvedColumn.filterEmptyValue;\n }\n\n if (Object.prototype.hasOwnProperty.call(props, 'filterEmptyValue')) {\n return props.filterEmptyValue;\n }\n\n if (\n FILTER_RANGE_CONTROL_TYPES.has(control.typeName) &&\n !isNil(props.min) &&\n !isNil(props.max)\n ) {\n return [props.min, props.max];\n }\n\n return undefined;\n};\n\nconst isFilterValueActive = (value, emptyValue) => {\n if (!isNil(emptyValue) && areEditableValuesEqual(value, emptyValue)) {\n return false;\n }\n\n if (isNil(value)) {\n return false;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n const normalizedValue = value.trim();\n return (\n normalizedValue !== '' &&\n !FILTER_INACTIVE_STRING_VALUES.has(normalizedValue.toLowerCase())\n );\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => isFilterValueActive(item, undefined));\n }\n\n if (typeof value === 'object') {\n return Object.values(value).some((item) =>\n isFilterValueActive(item, undefined)\n );\n }\n\n return true;\n};\n\nconst getActiveColumnFilterEntries = (filterValues, definition) => {\n const controls = definition?.controls || EMPTY_ARRAY;\n\n return controls\n .map((control) => {\n const valueInfo = getFilterValueFromCollection(\n filterValues,\n definition.accessor,\n control.key,\n controls.length\n );\n const value = valueInfo.hasValue\n ? valueInfo.value\n : getFilterDefaultValue(control);\n const emptyValue = resolveFilterEmptyValue(definition.column, control);\n\n return {\n ...control,\n emptyValue,\n value,\n };\n })\n .filter((entry) => isFilterValueActive(entry.value, entry.emptyValue));\n};\n\nconst isColumnFilterActive = (filterValues, definition) =>\n getActiveColumnFilterEntries(filterValues, definition).length > 0;\n\nconst isDateLikeString = (value) =>\n typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value.trim());\n\nconst normalizeFilterComparableValue = (value) => {\n if (value instanceof Date) {\n return value.getTime();\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'string') {\n const normalizedValue = value.trim();\n const numericValue = Number(normalizedValue);\n\n if (normalizedValue !== '' && Number.isFinite(numericValue)) {\n return numericValue;\n }\n\n if (isDateLikeString(normalizedValue)) {\n const dateValue = Date.parse(normalizedValue);\n\n if (Number.isFinite(dateValue)) {\n return dateValue;\n }\n }\n\n return normalizedValue.toLowerCase();\n }\n\n return value;\n};\n\nconst filterValuesEqual = (left, right, caseSensitive = false) => {\n if (Array.isArray(left)) {\n return left.some((item) => filterValuesEqual(item, right, caseSensitive));\n }\n\n if (Array.isArray(right)) {\n return right.some((item) => filterValuesEqual(left, item, caseSensitive));\n }\n\n const normalizedLeft = normalizeFilterComparableValue(left);\n const normalizedRight = normalizeFilterComparableValue(right);\n\n if (typeof normalizedLeft === 'string' || typeof normalizedRight === 'string') {\n const leftText = isNil(normalizedLeft) ? '' : String(normalizedLeft);\n const rightText = isNil(normalizedRight) ? '' : String(normalizedRight);\n\n return caseSensitive\n ? leftText === rightText\n : leftText.toLowerCase() === rightText.toLowerCase();\n }\n\n return normalizedLeft === normalizedRight;\n};\n\nconst compareFilterValues = (left, right) => {\n const normalizedLeft = normalizeFilterComparableValue(left);\n const normalizedRight = normalizeFilterComparableValue(right);\n\n if (normalizedLeft < normalizedRight) {\n return -1;\n }\n\n if (normalizedLeft > normalizedRight) {\n return 1;\n }\n\n return 0;\n};\n\nconst getFilterEntryText = (entry) =>\n [\n entry.key,\n serializeComponentId(entry.props?.id),\n entry.props?.label,\n entry.props?.placeholder,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n\nconst inferBoundOperator = (entry) => {\n const entryText = getFilterEntryText(entry);\n\n if (/(from|start|minimum|min|after|earliest|lower)/.test(entryText)) {\n return 'gte';\n }\n\n if (/(to|end|maximum|max|before|latest|upper)/.test(entryText)) {\n return 'lte';\n }\n\n return undefined;\n};\n\nconst inferFilterOperator = (column, entry) => {\n const configuredOperator =\n column.filterOperator || column.filterMatchMode || entry.props?.filterOperator;\n\n if (configuredOperator) {\n return configuredOperator;\n }\n\n const boundOperator = inferBoundOperator(entry);\n\n if (boundOperator) {\n return boundOperator;\n }\n\n if (FILTER_RANGE_CONTROL_TYPES.has(entry.typeName)) {\n return 'between';\n }\n\n if (\n FILTER_DATE_CONTROL_TYPES.has(entry.typeName) &&\n Array.isArray(entry.value)\n ) {\n return 'between';\n }\n\n if (FILTER_MULTI_CONTROL_TYPES.has(entry.typeName)) {\n return 'in';\n }\n\n if (FILTER_TEXT_CONTROL_TYPES.has(entry.typeName)) {\n return 'contains';\n }\n\n if (Array.isArray(entry.value)) {\n return 'in';\n }\n\n return 'equals';\n};\n\nconst matchesContainsFilter = (recordValue, filterValue, caseSensitive) => {\n const haystack = toSearchableText(recordValue);\n const needle = String(filterValue);\n\n return caseSensitive\n ? haystack.includes(needle)\n : haystack.toLowerCase().includes(needle.toLowerCase());\n};\n\nconst matchesInFilter = (recordValue, filterValue, caseSensitive) => {\n const filterItems = Array.isArray(filterValue) ? filterValue : [filterValue];\n\n if (Array.isArray(recordValue)) {\n return recordValue.some((item) =>\n filterItems.some((filterItem) =>\n filterValuesEqual(item, filterItem, caseSensitive)\n )\n );\n }\n\n return filterItems.some((filterItem) =>\n filterValuesEqual(recordValue, filterItem, caseSensitive)\n );\n};\n\nconst matchesBetweenFilter = (recordValue, lowerValue, upperValue) => {\n if (isNil(recordValue)) {\n return false;\n }\n\n if (isFilterValueActive(lowerValue, undefined)) {\n if (compareFilterValues(recordValue, lowerValue) < 0) {\n return false;\n }\n }\n\n if (isFilterValueActive(upperValue, undefined)) {\n if (compareFilterValues(recordValue, upperValue) > 0) {\n return false;\n }\n }\n\n return true;\n};\n\nconst matchesSingleColumnFilter = (recordValue, entry, column) => {\n const operator = inferFilterOperator(column, entry);\n const caseSensitive = Boolean(column.filterCaseSensitive);\n\n if (typeof column.filterPredicate === 'function') {\n return Boolean(\n column.filterPredicate(recordValue, entry.value, {\n column,\n filter: entry,\n })\n );\n }\n\n if (operator === 'contains') {\n return matchesContainsFilter(recordValue, entry.value, caseSensitive);\n }\n\n if (operator === 'startsWith') {\n const haystack = toSearchableText(recordValue);\n const needle = String(entry.value);\n return caseSensitive\n ? haystack.startsWith(needle)\n : haystack.toLowerCase().startsWith(needle.toLowerCase());\n }\n\n if (operator === 'endsWith') {\n const haystack = toSearchableText(recordValue);\n const needle = String(entry.value);\n return caseSensitive\n ? haystack.endsWith(needle)\n : haystack.toLowerCase().endsWith(needle.toLowerCase());\n }\n\n if (operator === 'in') {\n return matchesInFilter(recordValue, entry.value, caseSensitive);\n }\n\n if (operator === 'between' || operator === 'range') {\n const [lowerValue, upperValue] = Array.isArray(entry.value)\n ? entry.value\n : [undefined, entry.value];\n return matchesBetweenFilter(recordValue, lowerValue, upperValue);\n }\n\n if (operator === 'gte') {\n return compareFilterValues(recordValue, entry.value) >= 0;\n }\n\n if (operator === 'gt') {\n return compareFilterValues(recordValue, entry.value) > 0;\n }\n\n if (operator === 'lte') {\n return compareFilterValues(recordValue, entry.value) <= 0;\n }\n\n if (operator === 'lt') {\n return compareFilterValues(recordValue, entry.value) < 0;\n }\n\n if (operator === 'notIn') {\n return !matchesInFilter(recordValue, entry.value, caseSensitive);\n }\n\n return filterValuesEqual(recordValue, entry.value, caseSensitive);\n};\n\nconst getRangeBoundsFromEntries = (entries) => {\n let lowerValue;\n let upperValue;\n\n entries.forEach((entry) => {\n const operator = inferBoundOperator(entry);\n\n if (operator === 'lte') {\n upperValue = entry.value;\n return;\n }\n\n if (operator === 'gte') {\n lowerValue = entry.value;\n return;\n }\n\n if (isNil(lowerValue)) {\n lowerValue = entry.value;\n } else if (isNil(upperValue)) {\n upperValue = entry.value;\n }\n });\n\n return [lowerValue, upperValue];\n};\n\nconst shouldUseRangeEntries = (column, entries) => {\n if (entries.length < 2) {\n return false;\n }\n\n if (['between', 'range'].includes(column.filterOperator || column.filterMatchMode)) {\n return true;\n }\n\n if (entries.some((entry) => inferBoundOperator(entry))) {\n return true;\n }\n\n return entries.every(\n (entry) =>\n FILTER_DATE_CONTROL_TYPES.has(entry.typeName) ||\n entry.typeName === 'NumberInput'\n );\n};\n\nconst matchesColumnFilters = (record, filterValues, definition) => {\n const activeEntries = getActiveColumnFilterEntries(filterValues, definition);\n\n if (!activeEntries.length) {\n return true;\n }\n\n const column = definition.column || EMPTY_OBJECT;\n const accessor =\n column.filterAccessor || column.filterValueAccessor || definition.accessor;\n const recordValue = getAccessorValue(record, accessor);\n\n if (shouldUseRangeEntries(column, activeEntries)) {\n const [lowerValue, upperValue] = getRangeBoundsFromEntries(activeEntries);\n return matchesBetweenFilter(recordValue, lowerValue, upperValue);\n }\n\n return activeEntries.every((entry) =>\n matchesSingleColumnFilter(recordValue, entry, column)\n );\n};\n\nconst filterRecordsByColumnFilters = (records, filterValues, definitions) => {\n const activeDefinitions = (definitions || EMPTY_ARRAY).filter((definition) =>\n isColumnFilterActive(filterValues, definition)\n );\n\n if (!activeDefinitions.length) {\n return records;\n }\n\n return records.filter((record) =>\n activeDefinitions.every((definition) =>\n matchesColumnFilters(record, filterValues, definition)\n )\n );\n};\n\nconst enhanceFilterNode = (\n filterNode,\n column,\n filterOptions = EMPTY_OBJECT,\n nodePath = EMPTY_ARRAY\n) => {\n if (React.isValidElement(filterNode)) {\n const existingProps = filterNode.props || EMPTY_OBJECT;\n const enhancedChildren = Object.prototype.hasOwnProperty.call(\n existingProps,\n 'children'\n )\n ? enhanceFilterNode(\n existingProps.children,\n column,\n filterOptions,\n [...nodePath, 'children']\n )\n : undefined;\n const controls =\n filterOptions.filterDefinitionsByAccessor?.[column.accessor]?.controls ||\n EMPTY_ARRAY;\n const controlKey = getFilterControlKey(filterNode, column, nodePath);\n const control = controls.find((item) => item.key === controlKey);\n const nextProps = { ...existingProps };\n\n if (Object.prototype.hasOwnProperty.call(existingProps, 'children')) {\n nextProps.children = enhancedChildren;\n }\n\n if (!control) {\n return React.cloneElement(filterNode, nextProps);\n }\n\n const valueInfo = getFilterValueFromCollection(\n filterOptions.filterValues,\n column.accessor,\n control.key,\n controls.length\n );\n const hasExistingValue = Object.prototype.hasOwnProperty.call(\n existingProps,\n control.valueProp\n );\n\n if (valueInfo.hasValue || hasExistingValue) {\n nextProps[control.valueProp] = valueInfo.hasValue\n ? valueInfo.value\n : existingProps[control.valueProp];\n }\n\n nextProps.comboboxProps = mergeFilterNestedProps(\n existingProps.comboboxProps,\n { withinPortal: false }\n );\n nextProps.popoverProps = mergeFilterNestedProps(\n existingProps.popoverProps,\n { withinPortal: false }\n );\n\n const originalSetProps = existingProps.setProps;\n const originalOnChange = existingProps.onChange;\n const handleFilterChange = (nextValue) => {\n if (typeof filterOptions.handleFilterValueChange === 'function') {\n filterOptions.handleFilterValueChange(\n column,\n control,\n nextValue,\n controls.length\n );\n }\n };\n\n nextProps.setProps = (nextChildProps = EMPTY_OBJECT) => {\n if (\n nextChildProps &&\n Object.prototype.hasOwnProperty.call(\n nextChildProps,\n control.valueProp\n )\n ) {\n handleFilterChange(nextChildProps[control.valueProp]);\n }\n\n if (typeof originalSetProps === 'function') {\n originalSetProps(nextChildProps);\n }\n };\n\n if (\n typeof originalOnChange === 'function' ||\n (typeof originalSetProps !== 'function' &&\n !isMaterializedDashComponent(filterNode))\n ) {\n nextProps.onChange = (nextValue, ...args) => {\n handleFilterChange(\n extractEditorValue(nextValue, control.valueProp)\n );\n\n if (typeof originalOnChange === 'function') {\n originalOnChange(nextValue, ...args);\n }\n };\n }\n\n return React.cloneElement(filterNode, nextProps);\n }\n\n if (Array.isArray(filterNode)) {\n return filterNode.map((child, index) =>\n enhanceFilterNode(child, column, filterOptions, [...nodePath, index])\n );\n }\n\n return filterNode;\n};\n\nconst EditableCellPopover = ({\n content,\n editor,\n editorDefinition,\n isEditing,\r\n closeEditor,\r\n handleValueChange,\r\n value,\r\n}) => {\r\n const dropdownRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (!isEditing || !dropdownRef.current) {\r\n return undefined;\r\n }\r\n\r\n const frameId = window.requestAnimationFrame(() => {\r\n const focusTarget = dropdownRef.current?.querySelector(\r\n 'input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [role=\"textbox\"], [type=\"radio\"]:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\r\n );\r\n\r\n if (!focusTarget || typeof focusTarget.focus !== 'function') {\r\n return;\r\n }\r\n\r\n try {\r\n focusTarget.focus({ preventScroll: true });\r\n } catch {\r\n focusTarget.focus();\r\n }\r\n });\r\n\r\n return () => window.cancelAnimationFrame(frameId);\r\n }, [isEditing]);\r\n\r\n return (\r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n event.stopPropagation()}\r\n onDoubleClick={(event) => event.stopPropagation()}\r\n onMouseDown={(event) => event.stopPropagation()}\r\n p=\"xs\"\r\n >\r\n \r\n {enhanceEditorNode(\r\n editor,\r\n editorDefinition?.column,\r\n editorDefinition?.editor,\r\n value,\r\n handleValueChange,\r\n closeEditor\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst normalizeGroupBy = (value) => {\r\n if (typeof value === 'string') {\r\n const normalizedAccessor = value.trim();\r\n return normalizedAccessor ? [normalizedAccessor] : EMPTY_ARRAY;\r\n }\r\n\r\n if (!Array.isArray(value)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return value\r\n .map((accessor) =>\r\n typeof accessor === 'string' ? accessor.trim() : ''\r\n )\r\n .filter(Boolean);\r\n};\r\n\r\nconst serializeGroupValue = (value) => {\r\n if (value instanceof Date) {\r\n return value.toISOString();\r\n }\r\n\r\n if (isNil(value)) {\r\n return '';\r\n }\r\n\r\n if (typeof value === 'object') {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n\r\n return String(value);\r\n};\r\n\r\nconst buildGroupRecordId = (path) =>\r\n [GROUP_RECORD_PREFIX]\r\n .concat(\r\n path.map(\r\n ({ accessor, value }) =>\r\n `${accessor}=${serializeGroupValue(value)}`\r\n )\r\n )\r\n .join('|');\r\n\r\nconst hasAccessorPath = (record, accessor) => {\r\n if (!record || typeof accessor !== 'string' || !accessor.trim()) {\r\n return false;\r\n }\r\n\r\n return accessor.split('.').every((key) => {\r\n if (\r\n record === null ||\r\n record === undefined ||\r\n typeof record !== 'object' ||\r\n !Object.prototype.hasOwnProperty.call(record, key)\r\n ) {\r\n return false;\r\n }\r\n\r\n record = record[key];\r\n return true;\r\n });\r\n};\r\n\r\nconst normalizeChildRowsAccessor = (value) => {\r\n if (typeof value !== 'string') {\r\n return undefined;\r\n }\r\n\r\n const normalizedAccessor = value.trim();\r\n return normalizedAccessor || undefined;\r\n};\r\n\r\nconst compareAggregationValues = (left, right) => {\r\n const normalizeComparableValue = (value) => {\r\n if (value instanceof Date) {\r\n return value.getTime();\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const numericValue = Number(value);\r\n if (Number.isFinite(numericValue) && value.trim() !== '') {\r\n return numericValue;\r\n }\r\n\r\n return value;\r\n }\r\n\r\n return String(value);\r\n };\r\n\r\n const normalizedLeft = normalizeComparableValue(left);\r\n const normalizedRight = normalizeComparableValue(right);\r\n\r\n if (normalizedLeft < normalizedRight) {\r\n return -1;\r\n }\r\n\r\n if (normalizedLeft > normalizedRight) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst compileCustomAggregator = (value) => {\r\n if (typeof value === 'function') {\r\n return value;\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n const source = value.trim();\r\n\r\n if (!source) {\r\n return null;\r\n }\r\n\r\n try {\r\n if (source.startsWith('lambda ')) {\r\n const lambdaMatch =\r\n /^lambda\\s*\\(([^)]*)\\)\\s*:\\s*([\\s\\S]+)$/.exec(source) ||\r\n /^lambda\\s+([^:]+)\\s*:\\s*([\\s\\S]+)$/.exec(source);\r\n\r\n if (lambdaMatch) {\r\n return Function(\r\n `return (${lambdaMatch[1].trim()}) => (${lambdaMatch[2].trim()});`\r\n )();\r\n }\r\n }\r\n\r\n if (source.includes('=>') || source.startsWith('function')) {\r\n return Function(`return (${source});`)();\r\n }\r\n\r\n return Function(\r\n 'values',\r\n 'records',\r\n 'groupRecord',\r\n 'outputAccessor',\r\n source\r\n );\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\nconst BUILT_IN_GROUP_AGGREGATORS = {\r\n count: (_values, records) => records.length,\r\n sum: (values) => {\r\n const numericValues = values\r\n .map((value) => Number(value))\r\n .filter((value) => Number.isFinite(value));\r\n\r\n if (!numericValues.length) {\r\n return undefined;\r\n }\r\n\r\n return numericValues.reduce((sum, value) => sum + value, 0);\r\n },\r\n mean: (values) => {\r\n const numericValues = values\r\n .map((value) => Number(value))\r\n .filter((value) => Number.isFinite(value));\r\n\r\n if (!numericValues.length) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n numericValues.reduce((sum, value) => sum + value, 0) /\r\n numericValues.length\r\n );\r\n },\r\n median: (values) => {\r\n const numericValues = values\r\n .map((value) => Number(value))\r\n .filter((value) => Number.isFinite(value))\r\n .sort((left, right) => left - right);\r\n\r\n if (!numericValues.length) {\r\n return undefined;\r\n }\r\n\r\n const middleIndex = Math.floor(numericValues.length / 2);\r\n\r\n return numericValues.length % 2 === 0\r\n ? (numericValues[middleIndex - 1] + numericValues[middleIndex]) / 2\r\n : numericValues[middleIndex];\r\n },\r\n min: (values) => {\r\n const comparableValues = values.filter((value) => !isNil(value));\r\n\r\n if (!comparableValues.length) {\r\n return undefined;\r\n }\r\n\r\n return comparableValues.reduce((currentMin, value) =>\r\n compareAggregationValues(value, currentMin) < 0 ? value : currentMin\r\n );\r\n },\r\n max: (values) => {\r\n const comparableValues = values.filter((value) => !isNil(value));\r\n\r\n if (!comparableValues.length) {\r\n return undefined;\r\n }\r\n\r\n return comparableValues.reduce((currentMax, value) =>\r\n compareAggregationValues(value, currentMax) > 0 ? value : currentMax\r\n );\r\n },\r\n};\r\n\r\nconst normalizeGroupAggregations = (value) => {\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return Object.entries(value).flatMap(([outputAccessor, definition]) => {\r\n if (isNil(definition)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n if (typeof definition === 'string' || typeof definition === 'function') {\r\n return [\r\n {\r\n outputAccessor,\r\n sourceAccessor: outputAccessor,\r\n aggregator: definition,\r\n },\r\n ];\r\n }\r\n\r\n if (typeof definition !== 'object' || Array.isArray(definition)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return [\r\n {\r\n outputAccessor,\r\n sourceAccessor:\r\n typeof definition.accessor === 'string' &&\r\n definition.accessor.trim()\r\n ? definition.accessor.trim()\r\n : outputAccessor,\r\n aggregator:\r\n definition.fn ??\r\n definition.aggregator ??\r\n definition.operation ??\r\n definition.lambda ??\r\n definition.function ??\r\n definition.value,\r\n },\r\n ];\r\n });\r\n};\r\n\r\nconst applyGroupAggregations = (record, leafRecords, aggregationDefinitions) => {\r\n if (!Array.isArray(aggregationDefinitions) || !aggregationDefinitions.length) {\r\n return record;\r\n }\r\n\r\n return aggregationDefinitions.reduce((nextRecord, definition) => {\r\n const { outputAccessor, sourceAccessor, aggregator } = definition;\r\n const values = sourceAccessor\r\n ? leafRecords.map((leafRecord) => getAccessorValue(leafRecord, sourceAccessor))\r\n : EMPTY_ARRAY;\r\n const normalizedAggregator =\r\n typeof aggregator === 'string' &&\r\n Object.prototype.hasOwnProperty.call(\r\n BUILT_IN_GROUP_AGGREGATORS,\r\n aggregator.trim().toLowerCase()\r\n )\r\n ? BUILT_IN_GROUP_AGGREGATORS[aggregator.trim().toLowerCase()]\r\n : compileCustomAggregator(aggregator);\r\n\r\n if (typeof normalizedAggregator !== 'function') {\r\n return nextRecord;\r\n }\r\n\r\n const aggregatedValue = normalizedAggregator(\r\n values,\r\n leafRecords,\r\n nextRecord,\r\n outputAccessor\r\n );\r\n\r\n if (isNil(aggregatedValue)) {\r\n return nextRecord;\r\n }\r\n\r\n return {\r\n ...nextRecord,\r\n [outputAccessor]: aggregatedValue,\r\n };\r\n }, record);\r\n};\r\n\r\nconst isInlineHierarchyParentRecord = (record) =>\r\n Boolean(record?.__group || record?.__hierarchyParent);\r\n\r\nconst buildGroupedRecords = (\r\n records,\r\n accessors,\r\n aggregationDefinitions,\r\n path = EMPTY_ARRAY\r\n) => {\r\n if (\r\n !Array.isArray(records) ||\r\n !records.length ||\r\n !Array.isArray(accessors) ||\r\n !accessors.length\r\n ) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n const [accessor, ...remainingAccessors] = accessors;\r\n const groupedEntries = [];\r\n const groupedRecordsByKey = new Map();\r\n\r\n records.forEach((record) => {\r\n const groupValue = getAccessorValue(record, accessor);\r\n const groupKey = `${accessor}:${serializeGroupValue(groupValue)}`;\r\n\r\n if (!groupedRecordsByKey.has(groupKey)) {\r\n const groupPath = [...path, { accessor, value: groupValue }];\r\n const groupRecord = {\r\n __group: true,\r\n __groupAccessor: accessor,\r\n __groupId: buildGroupRecordId(groupPath),\r\n __groupLevel: path.length,\r\n __groupPath: groupPath,\r\n __groupValue: groupValue,\r\n __hierarchyParent: true,\r\n __groupedRecords: EMPTY_ARRAY,\r\n __remainingGroupBy: remainingAccessors,\r\n };\r\n\r\n if (!isNil(groupValue)) {\r\n groupRecord[accessor] = groupValue;\r\n }\r\n\r\n const nextEntry = {\r\n record: groupRecord,\r\n records: [],\r\n };\r\n\r\n groupedRecordsByKey.set(groupKey, nextEntry);\r\n groupedEntries.push(nextEntry);\r\n }\r\n\r\n groupedRecordsByKey.get(groupKey).records.push(record);\r\n });\r\n\r\n return groupedEntries.map((entry) => {\r\n const childPath = entry.record.__groupPath;\r\n const childRecords = remainingAccessors.length\r\n ? buildGroupedRecords(\r\n entry.records,\r\n remainingAccessors,\r\n aggregationDefinitions,\r\n childPath\r\n )\r\n : entry.records.map((record) => ({\r\n ...record,\r\n __group: false,\r\n __groupLevel: childPath.length,\r\n __leafRecords: [record],\r\n }));\r\n const leafRecords = remainingAccessors.length\r\n ? childRecords.flatMap((record) => record.__leafRecords || EMPTY_ARRAY)\r\n : entry.records;\r\n\r\n return applyGroupAggregations(\r\n {\r\n ...entry.record,\r\n __children: childRecords,\r\n __groupedRecords: leafRecords,\r\n __leafRecords: leafRecords,\r\n },\r\n leafRecords,\r\n aggregationDefinitions\r\n );\r\n });\r\n};\r\n\r\nconst collectGroupedRecordIds = (records) => {\r\n if (!Array.isArray(records)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return records.flatMap((record) =>\r\n record?.__group\r\n ? [\r\n record.__groupId,\r\n ...collectGroupedRecordIds(record.__children),\r\n ]\r\n : EMPTY_ARRAY\r\n );\r\n};\r\n\r\nconst buildChildRowsRecords = (\r\n records,\r\n childRowsAccessor,\r\n aggregationDefinitions,\r\n level = 0\r\n) => {\r\n if (!Array.isArray(records)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return records.map((record) => {\r\n const hasChildrenAccessor = hasAccessorPath(record, childRowsAccessor);\r\n const rawChildren = hasChildrenAccessor\r\n ? getAccessorValue(record, childRowsAccessor)\r\n : undefined;\r\n const childRecords = Array.isArray(rawChildren)\r\n ? buildChildRowsRecords(\r\n rawChildren,\r\n childRowsAccessor,\r\n aggregationDefinitions,\r\n level + 1\r\n )\r\n : EMPTY_ARRAY;\r\n const leafRecords = hasChildrenAccessor\r\n ? childRecords.flatMap((childRecord) => childRecord.__leafRecords || EMPTY_ARRAY)\r\n : [record];\r\n const nextRecord = {\r\n ...record,\r\n __children: childRecords,\r\n __group: false,\r\n __groupLevel: level,\r\n __groupedRecords: leafRecords,\r\n __hierarchyParent: hasChildrenAccessor,\r\n __leafRecords: leafRecords,\r\n };\r\n\r\n return hasChildrenAccessor\r\n ? applyGroupAggregations(\r\n nextRecord,\r\n leafRecords,\r\n aggregationDefinitions\r\n )\r\n : nextRecord;\r\n });\r\n};\r\n\r\nconst flattenGroupedRecords = (records, expandedRecordIds, idAccessor) => {\r\n if (!Array.isArray(records)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return records.flatMap((record) => {\r\n if (!isInlineHierarchyParentRecord(record)) {\r\n return [record];\r\n }\r\n\r\n const recordId = getRecordId(record, idAccessor);\r\n const isExpanded = expandedRecordIds.includes(recordId);\r\n\r\n return isExpanded\r\n ? [\r\n record,\r\n ...flattenGroupedRecords(\r\n record.__children,\r\n expandedRecordIds,\r\n idAccessor\r\n ),\r\n ]\r\n : [record];\r\n });\r\n};\r\n\r\nconst collectHierarchyRecords = (records) => {\r\n if (!Array.isArray(records)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return records.flatMap((record) => [\r\n record,\r\n ...collectHierarchyRecords(record?.__children),\r\n ]);\r\n};\r\n\r\nconst mergeExpandedRecordIds = (...lists) =>\r\n Array.from(\r\n new Set(\r\n lists.flatMap((list) => (Array.isArray(list) ? list : EMPTY_ARRAY))\r\n )\r\n );\r\n\r\nconst wrapGroupedCellContent = (\r\n content,\r\n record,\r\n expandedRecordIds,\r\n groupLevel = 0\r\n) => {\r\n const isGroupRecord = Boolean(record?.__group);\r\n const isExpanded = isGroupRecord\r\n ? expandedRecordIds.includes(record.__groupId)\r\n : false;\r\n\r\n return (\r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n );\r\n};\r\n\r\nconst interpolateTemplate = (template, record) => {\r\n if (!template || typeof template !== 'string') {\r\n return template;\r\n }\r\n\r\n return template.replace(/\\{([^}]+)\\}/g, (_, accessor) => {\r\n const value = getAccessorValue(record, accessor.trim());\r\n return isNil(value) ? '' : String(value);\r\n });\r\n};\r\n\r\nconst getTemplateValue = (context, accessor) => {\r\n const normalizedAccessor = accessor.trim();\r\n\r\n if (!normalizedAccessor) {\r\n return undefined;\r\n }\r\n\r\n if (normalizedAccessor === 'record' || normalizedAccessor === 'row') {\r\n return context.record;\r\n }\r\n\r\n if (normalizedAccessor === 'value') {\r\n return context.value;\r\n }\r\n\r\n if (normalizedAccessor === 'index') {\r\n return context.index;\r\n }\r\n\r\n if (normalizedAccessor === 'accessor') {\r\n return context.accessor;\r\n }\r\n\r\n if (normalizedAccessor === 'column') {\r\n return context.column;\r\n }\r\n\r\n if (normalizedAccessor === 'locale') {\r\n return context.locale;\r\n }\r\n\r\n if (normalizedAccessor.startsWith('record.')) {\r\n return getAccessorValue(context.record, normalizedAccessor.slice(7));\r\n }\r\n\r\n if (normalizedAccessor.startsWith('row.')) {\r\n return getAccessorValue(context.record, normalizedAccessor.slice(4));\r\n }\r\n\r\n if (normalizedAccessor.startsWith('column.')) {\r\n return getAccessorValue(context.column, normalizedAccessor.slice(7));\r\n }\r\n\r\n const directContextValue = getAccessorValue(context, normalizedAccessor);\r\n\r\n if (!isNil(directContextValue)) {\r\n return directContextValue;\r\n }\r\n\r\n return getAccessorValue(context.record, normalizedAccessor);\r\n};\r\n\r\nconst interpolateTemplateValue = (value, context) => {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n\r\n const matches = Array.from(value.matchAll(TEMPLATE_TOKEN_PATTERN));\r\n\r\n if (!matches.length) {\r\n return value;\r\n }\r\n\r\n if (matches.length === 1 && matches[0][0] === value) {\r\n return getTemplateValue(context, matches[0][1]);\r\n }\r\n\r\n return value.replace(TEMPLATE_TOKEN_PATTERN, (_, accessor) => {\r\n const resolvedValue = getTemplateValue(context, accessor);\r\n return isNil(resolvedValue) ? '' : String(resolvedValue);\r\n });\r\n};\r\n\r\nconst interpolateDryComponentNode = (node, context) => {\r\n if (Array.isArray(node)) {\r\n return node.map((item) => interpolateDryComponentNode(item, context));\r\n }\r\n\r\n if (isDryComponent(node)) {\r\n return {\r\n ...node,\r\n props: interpolateDryComponentNode(node.props, context),\r\n };\r\n }\r\n\r\n if (node && typeof node === 'object') {\r\n return Object.entries(node).reduce((accumulator, [key, value]) => {\r\n accumulator[key] = interpolateDryComponentNode(value, context);\r\n return accumulator;\r\n }, {});\r\n }\r\n\r\n return interpolateTemplateValue(node, context);\r\n};\r\n\r\nconst resolveDashComponentType = (node) => {\r\n const namespace = node?.namespace;\r\n const type = node?.type;\r\n\r\n if (!namespace || !type || typeof window === 'undefined') {\r\n return null;\r\n }\r\n\r\n if (namespace === 'dash_html_components' || namespace === 'dash.html') {\n return String(type).toLowerCase();\n }\n\n return trackDashComponentType(window?.[namespace]?.[type] || null, type);\n};\n\r\nconst normalizeTemplateAction = (value) => {\r\n if (typeof value !== 'string') {\r\n return undefined;\r\n }\r\n\r\n const normalized = value\r\n .replace(/-row$/, '')\r\n .replace(/[-_]+/g, ' ')\r\n .trim();\r\n\r\n return normalized || value;\r\n};\r\n\r\nconst buildTemplateClickPayload = (context, componentProps) => {\r\n const payload = buildEventPayload(\r\n {\r\n record: context.record,\r\n index: context.index,\r\n column: context.column,\r\n },\r\n context.idAccessor\r\n );\r\n const templateId = componentProps?.id;\r\n\r\n payload.trigger = 'templateClick';\r\n payload.templateId = templateId;\r\n\r\n if (\r\n templateId &&\r\n typeof templateId === 'object' &&\r\n !Array.isArray(templateId) &&\r\n typeof templateId.type === 'string'\r\n ) {\r\n payload.actionType = templateId.type;\r\n payload.action = normalizeTemplateAction(templateId.type);\r\n }\r\n\r\n return payload;\r\n};\r\n\r\nconst withTemplateClickHandler = (componentProps, context, renderOptions) => {\r\n if (\r\n isNil(componentProps?.id) ||\r\n isNil(componentProps?.n_clicks) ||\r\n typeof renderOptions?.updateProps !== 'function'\r\n ) {\r\n return componentProps;\r\n }\r\n\r\n const originalOnClick = componentProps.onClick;\r\n\r\n return {\r\n ...componentProps,\r\n onClick: (event) => {\r\n if (event?.stopPropagation) {\r\n event.stopPropagation();\r\n }\r\n\r\n renderOptions.updateProps({\r\n cellClick: buildTemplateClickPayload(context, componentProps),\r\n });\r\n\r\n if (typeof originalOnClick === 'function') {\r\n originalOnClick(event);\r\n }\r\n },\r\n };\r\n};\r\n\r\nconst materializeDashComponent = (\n node,\n context,\n renderOptions = EMPTY_OBJECT,\n nodePath = EMPTY_ARRAY\r\n) => {\r\n const componentType = resolveDashComponentType(node);\r\n\r\n if (!componentType) {\r\n return interpolateDryComponentNode(node, context);\r\n }\r\n\r\n const interpolatedProps = interpolateDryComponentNode(node.props || EMPTY_OBJECT, context);\r\n const nextProps = Object.entries(interpolatedProps).reduce(\r\n (accumulator, [key, value]) => {\r\n if (key === 'children') {\r\n return accumulator;\r\n }\r\n\r\n accumulator[key] = renderTemplateNode(value, context, renderOptions, [\r\n ...nodePath,\r\n key,\r\n ]);\r\n return accumulator;\r\n },\r\n {}\r\n );\r\n const componentProps =\n typeof componentType === 'string' ||\n typeof nextProps.setProps === 'function'\n ? nextProps\n : { ...nextProps, setProps: NOOP_SET_PROPS };\n const resolvedProps = withTemplateClickHandler(\n componentProps,\n context,\n renderOptions\n );\n const renderedChildren = Object.prototype.hasOwnProperty.call(\r\n interpolatedProps,\r\n 'children'\r\n )\r\n ? renderTemplateNode(interpolatedProps.children, context, renderOptions, [\r\n ...nodePath,\r\n 'children',\r\n ])\r\n : undefined;\r\n\r\n if (Array.isArray(renderedChildren)) {\r\n return React.createElement(componentType, resolvedProps, ...renderedChildren);\r\n }\r\n\r\n if (!isNil(renderedChildren)) {\r\n return React.createElement(componentType, resolvedProps, renderedChildren);\r\n }\r\n\r\n return React.createElement(componentType, resolvedProps);\r\n};\r\n\r\nconst renderTemplateNode = (\r\n node,\r\n context,\r\n renderOptions = EMPTY_OBJECT,\r\n nodePath = EMPTY_ARRAY\r\n) => {\r\n if (React.isValidElement(node)) {\r\n const nextProps = Object.keys(node.props || {}).reduce(\r\n (accumulator, key) => {\r\n accumulator[key] = renderTemplateNode(\r\n node.props[key],\r\n context,\r\n renderOptions,\r\n [...nodePath, key]\r\n );\r\n return accumulator;\r\n },\r\n {}\r\n );\r\n\r\n return React.cloneElement(\r\n node,\r\n withTemplateClickHandler(nextProps, context, renderOptions)\r\n );\r\n }\r\n\r\n if (isDryComponent(node)) {\r\n return materializeDashComponent(node, context, renderOptions, nodePath);\r\n }\r\n\r\n if (Array.isArray(node)) {\r\n return node.map((item, index) =>\r\n renderTemplateNode(item, context, renderOptions, [...nodePath, index])\r\n );\r\n }\r\n\r\n if (node && typeof node === 'object') {\r\n return Object.entries(node).reduce((accumulator, [key, value]) => {\r\n accumulator[key] = renderTemplateNode(value, context, renderOptions, [\r\n ...nodePath,\r\n key,\r\n ]);\r\n return accumulator;\r\n }, {});\r\n }\r\n\r\n return interpolateTemplateValue(node, context);\r\n};\r\n\r\nconst buildTemplateContext = (record, index, column, locale, options = EMPTY_OBJECT) => ({\r\n accessor: column?.accessor,\r\n column,\r\n idAccessor: options.idAccessor,\r\n index,\r\n locale,\r\n record,\r\n recordId: getRecordId(record, options.idAccessor),\r\n row: record,\r\n value: getAccessorValue(record, column?.accessor),\r\n});\r\n\r\nconst resolveTemplateNode = (\r\n template,\r\n context,\r\n options = EMPTY_OBJECT\r\n) => {\r\n if (typeof template === 'function') {\r\n return template(context.record, context.index);\r\n }\r\n\r\n return renderTemplateNode(template, context, options);\r\n};\r\n\r\nconst resolveTemplateRender = (\r\n template,\r\n record,\r\n index,\r\n column,\r\n locale,\r\n options = EMPTY_OBJECT\r\n) =>\r\n resolveTemplateNode(\r\n template,\r\n buildTemplateContext(record, index, column, locale, options)\r\n );\r\n\r\nconst resolveStaticTemplateNode = (template, column, locale, options = EMPTY_OBJECT) =>\r\n resolveTemplateNode(\r\n template,\r\n buildTemplateContext(undefined, undefined, column, locale, options)\r\n );\r\n\r\nconst toDate = (value) => {\r\n if (value instanceof Date) {\r\n return value;\r\n }\r\n\r\n const nextDate = new Date(value);\r\n return Number.isNaN(nextDate.getTime()) ? null : nextDate;\r\n};\r\n\r\nconst formatPrimitiveValue = (value, column, locale) => {\r\n if (isNil(value)) {\r\n return column.emptyValue || '';\r\n }\r\n\r\n const presentation = column.presentation || column.type || 'text';\r\n const effectiveLocale = column.locale || locale;\r\n const intlOptions = column.formatOptions || EMPTY_OBJECT;\r\n\r\n if (\r\n presentation === 'number' ||\r\n presentation === 'currency' ||\r\n presentation === 'percent'\r\n ) {\r\n const numericValue = Number(value);\r\n\r\n if (Number.isNaN(numericValue)) {\r\n return String(value);\r\n }\r\n\r\n const options = { ...intlOptions };\r\n\r\n if (presentation === 'currency') {\r\n options.style = 'currency';\r\n options.currency = column.currency || options.currency || 'USD';\r\n } else if (presentation === 'percent') {\r\n options.style = 'percent';\r\n }\r\n\r\n if (!isNil(column.minimumFractionDigits)) {\r\n options.minimumFractionDigits = column.minimumFractionDigits;\r\n }\r\n\r\n if (!isNil(column.maximumFractionDigits)) {\r\n options.maximumFractionDigits = column.maximumFractionDigits;\r\n }\r\n\r\n return new Intl.NumberFormat(effectiveLocale, options).format(\r\n numericValue\r\n );\r\n }\r\n\r\n if (\r\n presentation === 'date' ||\r\n presentation === 'datetime' ||\r\n presentation === 'time'\r\n ) {\r\n const dateValue = toDate(value);\r\n\r\n if (!dateValue) {\r\n return String(value);\r\n }\r\n\r\n const options = { ...intlOptions };\r\n\r\n if (presentation === 'date') {\r\n options.dateStyle = options.dateStyle || 'medium';\r\n } else if (presentation === 'datetime') {\r\n options.dateStyle = options.dateStyle || 'medium';\r\n options.timeStyle = options.timeStyle || 'short';\r\n } else if (presentation === 'time') {\r\n options.timeStyle = options.timeStyle || 'short';\r\n }\r\n\r\n return new Intl.DateTimeFormat(effectiveLocale, options).format(\r\n dateValue\r\n );\r\n }\r\n\r\n if (presentation === 'boolean') {\r\n const trueLabel = column.trueLabel || 'Yes';\r\n const falseLabel = column.falseLabel || 'No';\r\n return value ? trueLabel : falseLabel;\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return JSON.stringify(value);\r\n }\r\n\r\n return String(value);\r\n};\r\n\r\nconst buildDisplayValue = (record, column, locale) => {\r\n if (column.template) {\r\n return interpolateTemplate(column.template, record);\r\n }\r\n\r\n const accessorValue = getAccessorValue(record, column.accessor);\r\n\r\n if (typeof column.valueAccessor === 'string') {\r\n return getAccessorValue(record, column.valueAccessor);\r\n }\r\n\r\n return formatPrimitiveValue(accessorValue, column, locale);\r\n};\r\n\r\nconst renderFieldValue = (field, record, locale) => {\r\n const derivedField = {\r\n accessor: field.accessor,\r\n template: field.template,\r\n presentation: field.presentation,\r\n type: field.type,\r\n locale: field.locale,\r\n currency: field.currency,\r\n formatOptions: field.formatOptions,\r\n trueLabel: field.trueLabel,\r\n falseLabel: field.falseLabel,\r\n emptyValue: field.emptyValue,\r\n minimumFractionDigits: field.minimumFractionDigits,\r\n maximumFractionDigits: field.maximumFractionDigits,\r\n };\r\n\r\n const value = buildDisplayValue(record, derivedField, locale);\r\n\r\n if (field.type === 'code') {\r\n return {value};\r\n }\r\n\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n};\r\n\r\nconst renderExpansionContent = (\r\n config,\r\n record,\r\n locale,\r\n options = EMPTY_OBJECT\r\n) => {\r\n if (!config) {\r\n return null;\r\n }\r\n\r\n if (\r\n React.isValidElement(config) ||\r\n Array.isArray(config) ||\r\n isDryComponent(config)\r\n ) {\r\n return resolveTemplateNode(\r\n config,\r\n buildTemplateContext(\r\n record,\r\n undefined,\r\n { accessor: '__rowExpansion__' },\r\n locale,\r\n options\r\n ),\r\n options\r\n );\r\n }\r\n\r\n if (typeof config !== 'object') {\r\n return resolveTemplateNode(\r\n config,\r\n buildTemplateContext(\r\n record,\r\n undefined,\r\n { accessor: '__rowExpansion__' },\r\n locale,\r\n options\r\n ),\r\n options\r\n );\r\n }\r\n\r\n if (config.type === 'json') {\r\n const jsonValue = config.accessor\r\n ? getAccessorValue(record, config.accessor)\r\n : record;\r\n\r\n return (\r\n \r\n {JSON.stringify(jsonValue, null, 2)}\r\n \r\n );\r\n }\r\n\r\n if (config.type === 'text') {\r\n const textValue = config.template\r\n ? interpolateTemplate(config.template, record)\r\n : buildDisplayValue(record, config, locale);\r\n\r\n return {textValue};\r\n }\r\n\r\n const fields = Array.isArray(config.fields) ? config.fields : EMPTY_ARRAY;\r\n\r\n return (\r\n \r\n \r\n {config.title ? (\r\n {interpolateTemplate(config.title, record)}\r\n ) : null}\r\n {fields.map((field) => (\r\n \r\n \r\n {field.label || field.accessor}\r\n \r\n \r\n {renderFieldValue(field, record, locale)}\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nconst toComparableValue = (value) => {\r\n if (typeof value === 'string') {\r\n return value.toLowerCase();\r\n }\r\n\r\n if (value instanceof Date) {\r\n return value.getTime();\r\n }\r\n\r\n return value;\r\n};\r\n\r\nconst sortRecords = (records, sortStatus) => {\r\n if (!sortStatus || !sortStatus.columnAccessor) {\r\n return records;\r\n }\r\n\r\n const direction = sortStatus.direction === 'desc' ? -1 : 1;\r\n const accessor = sortStatus.sortKey || sortStatus.columnAccessor;\r\n const sorted = [...records];\r\n\r\n sorted.sort((left, right) => {\r\n const leftValue = toComparableValue(getAccessorValue(left, accessor));\r\n const rightValue = toComparableValue(getAccessorValue(right, accessor));\r\n\r\n if (isNil(leftValue) && isNil(rightValue)) {\r\n return 0;\r\n }\r\n\r\n if (isNil(leftValue)) {\r\n return 1;\r\n }\r\n\r\n if (isNil(rightValue)) {\r\n return -1;\r\n }\r\n\r\n if (leftValue > rightValue) {\r\n return direction;\r\n }\r\n\r\n if (leftValue < rightValue) {\r\n return -direction;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n return sorted;\r\n};\r\n\r\nconst toSearchableText = (value) => {\r\n if (isNil(value)) {\r\n return '';\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map(toSearchableText).join(' ');\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return JSON.stringify(value);\r\n }\r\n\r\n return String(value);\r\n};\r\n\r\nconst filterRecords = (records, query, accessors) => {\r\n if (!query) {\r\n return records;\r\n }\r\n\r\n const normalizedQuery = String(query).trim().toLowerCase();\r\n\r\n if (!normalizedQuery) {\r\n return records;\r\n }\r\n\r\n return records.filter((record) =>\r\n accessors.some((accessor) =>\r\n toSearchableText(getAccessorValue(record, accessor))\r\n .toLowerCase()\r\n .includes(normalizedQuery)\r\n )\r\n );\r\n};\r\n\r\nconst isCompositeIdAccessor = (value) =>\r\n value && typeof value === 'object' && !Array.isArray(value);\r\n\r\nconst joinRecordIdParts = (values, separator = ':') =>\r\n values.map((value) => (isNil(value) ? '' : String(value))).join(separator);\r\n\r\nconst getRecordId = (record, idAccessor) => {\r\n if (!record) {\r\n return undefined;\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(record, '__groupId')) {\r\n return record.__groupId;\r\n }\r\n\r\n if (typeof idAccessor === 'function') {\r\n return idAccessor(record);\r\n }\r\n\r\n if (Array.isArray(idAccessor)) {\r\n return joinRecordIdParts(\r\n idAccessor.map((accessor) => getAccessorValue(record, accessor))\r\n );\r\n }\r\n\r\n if (isCompositeIdAccessor(idAccessor)) {\r\n if (typeof idAccessor.template === 'string') {\r\n return interpolateTemplate(idAccessor.template, record);\r\n }\r\n\r\n if (Array.isArray(idAccessor.accessors)) {\r\n return joinRecordIdParts(\r\n idAccessor.accessors.map((accessor) =>\r\n getAccessorValue(record, accessor)\r\n ),\r\n idAccessor.separator\r\n );\r\n }\r\n\r\n if (typeof idAccessor.accessor === 'string') {\r\n return getAccessorValue(record, idAccessor.accessor);\r\n }\r\n }\r\n\r\n return getAccessorValue(record, idAccessor || 'id');\r\n};\r\n\r\nconst isRowRule = (value) =>\r\n value &&\r\n typeof value === 'object' &&\r\n !Array.isArray(value) &&\r\n (Object.prototype.hasOwnProperty.call(value, 'selector') ||\r\n Object.prototype.hasOwnProperty.call(value, 'when'));\r\n\r\nconst matchesSelectorCondition = (actualValue, condition) => {\r\n if (!condition || typeof condition !== 'object' || Array.isArray(condition)) {\r\n return actualValue === condition;\r\n }\r\n\r\n if (\r\n isNil(actualValue) &&\r\n ['gt', 'gte', 'lt', 'lte', 'contains', 'startsWith', 'endsWith'].some(\r\n (key) => Object.prototype.hasOwnProperty.call(condition, key)\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'eq') &&\r\n actualValue !== condition.eq\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'ne') &&\r\n actualValue === condition.ne\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'gt') &&\r\n !(actualValue > condition.gt)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'gte') &&\r\n !(actualValue >= condition.gte)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'lt') &&\r\n !(actualValue < condition.lt)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'lte') &&\r\n !(actualValue <= condition.lte)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'in') &&\r\n (!Array.isArray(condition.in) || !condition.in.includes(actualValue))\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'notIn') &&\r\n Array.isArray(condition.notIn) &&\r\n condition.notIn.includes(actualValue)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(condition, 'contains')) {\r\n const haystack = toSearchableText(actualValue);\r\n if (!haystack.includes(String(condition.contains))) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(condition, 'startsWith')) {\r\n const haystack = toSearchableText(actualValue);\r\n if (!haystack.startsWith(String(condition.startsWith))) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(condition, 'endsWith')) {\r\n const haystack = toSearchableText(actualValue);\r\n if (!haystack.endsWith(String(condition.endsWith))) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst matchesRowSelector = (record, index, selector, idAccessor) => {\r\n if (isNil(selector)) {\r\n return true;\r\n }\r\n\r\n if (typeof selector === 'function') {\r\n return Boolean(selector(record, index));\r\n }\r\n\r\n if (Array.isArray(selector)) {\r\n return selector.some((childSelector) =>\r\n matchesRowSelector(record, index, childSelector, idAccessor)\r\n );\r\n }\r\n\r\n if (typeof selector === 'string' || typeof selector === 'number') {\r\n return getRecordId(record, idAccessor) === selector;\r\n }\r\n\r\n if (typeof selector === 'object') {\r\n return Object.entries(selector).every(([accessor, expectedValue]) => {\r\n let actualValue;\r\n\r\n if (accessor === 'index') {\r\n actualValue = index;\r\n } else if (accessor === 'id' || accessor === 'recordId') {\r\n actualValue = getRecordId(record, idAccessor);\r\n } else {\r\n actualValue = getAccessorValue(record, accessor);\r\n }\r\n\r\n if (Array.isArray(expectedValue)) {\r\n return expectedValue.includes(actualValue);\r\n }\r\n\r\n return matchesSelectorCondition(actualValue, expectedValue);\r\n });\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getRowRuleValue = (rule, fallbackKey) => {\r\n if (Object.prototype.hasOwnProperty.call(rule, 'value')) {\r\n return rule.value;\r\n }\r\n\r\n if (\r\n fallbackKey &&\r\n Object.prototype.hasOwnProperty.call(rule, fallbackKey)\r\n ) {\r\n return rule[fallbackKey];\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst resolveRowRuleEntryValue = (\r\n entry,\r\n fallbackKey,\r\n record,\r\n index,\r\n idAccessor\r\n) => {\r\n if (!isRowRule(entry)) {\r\n return entry;\r\n }\r\n\r\n const selector = Object.prototype.hasOwnProperty.call(entry, 'selector')\r\n ? entry.selector\r\n : entry.when;\r\n\r\n if (!matchesRowSelector(record, index, selector, idAccessor)) {\r\n return undefined;\r\n }\r\n\r\n return getRowRuleValue(entry, fallbackKey);\r\n};\r\n\r\nconst buildRowValueResolver = (\r\n value,\r\n fallbackKey,\r\n idAccessor,\r\n { merge = false } = {}\r\n) => {\r\n if (typeof value === 'function') {\r\n return value;\r\n }\r\n\r\n if (isNil(value)) {\r\n return undefined;\r\n }\r\n\r\n return (record, index) => {\r\n const entries = Array.isArray(value) ? value : [value];\r\n\r\n if (merge) {\r\n const mergedValue = entries.reduce((accumulator, entry) => {\r\n const resolvedValue = resolveRowRuleEntryValue(\r\n entry,\r\n fallbackKey,\r\n record,\r\n index,\r\n idAccessor\r\n );\r\n\r\n if (\r\n resolvedValue &&\r\n typeof resolvedValue === 'object' &&\r\n !Array.isArray(resolvedValue)\r\n ) {\r\n return { ...accumulator, ...resolvedValue };\r\n }\r\n\r\n return accumulator;\r\n }, {});\r\n\r\n return Object.keys(mergedValue).length ? mergedValue : undefined;\r\n }\r\n\r\n let resolvedValue;\r\n entries.forEach((entry) => {\r\n const nextValue = resolveRowRuleEntryValue(\r\n entry,\r\n fallbackKey,\r\n record,\r\n index,\r\n idAccessor\r\n );\r\n\r\n if (!isNil(nextValue)) {\r\n resolvedValue = nextValue;\r\n }\r\n });\r\n\r\n return resolvedValue;\r\n };\r\n};\r\n\r\nconst buildRowClassNameResolver = (value, idAccessor) => {\r\n if (typeof value === 'function' || typeof value === 'string') {\r\n return value;\r\n }\r\n\r\n if (isNil(value)) {\r\n return undefined;\r\n }\r\n\r\n return (record, index) => {\r\n const entries = Array.isArray(value) ? value : [value];\r\n const classNames = entries\r\n .map((entry) =>\r\n resolveRowRuleEntryValue(\r\n entry,\r\n 'className',\r\n record,\r\n index,\r\n idAccessor\r\n )\r\n )\r\n .filter(Boolean);\r\n\r\n return classNames.length ? clsx(classNames) : undefined;\r\n };\r\n};\r\n\r\nconst buildRowStyleResolver = (value, idAccessor) => {\r\n if (typeof value === 'function') {\r\n return value;\r\n }\r\n\r\n if (isNil(value)) {\r\n return undefined;\r\n }\r\n\r\n return (record, index) => {\r\n const entries = Array.isArray(value) ? value : [value];\r\n const mergedStyle = entries.reduce((accumulator, entry) => {\r\n const nextStyle = resolveRowRuleEntryValue(\r\n entry,\r\n 'style',\r\n record,\r\n index,\r\n idAccessor\r\n );\r\n\r\n if (\r\n nextStyle &&\r\n typeof nextStyle === 'object' &&\r\n !Array.isArray(nextStyle)\r\n ) {\r\n return { ...accumulator, ...nextStyle };\r\n }\r\n\r\n return accumulator;\r\n }, {});\r\n\r\n return Object.keys(mergedStyle).length ? mergedStyle : undefined;\r\n };\r\n};\r\n\r\nconst buildRowBooleanResolver = (\r\n value,\r\n fallbackKey,\r\n idAccessor,\r\n defaultValue\r\n) => {\r\n if (typeof value === 'function') {\r\n return (record, index) => {\r\n const resolvedValue = value(record, index);\r\n return isNil(resolvedValue) ? defaultValue : Boolean(resolvedValue);\r\n };\r\n }\r\n\r\n if (isNil(value)) {\r\n return undefined;\r\n }\r\n\r\n return (record, index) => {\r\n const entries = Array.isArray(value) ? value : [value];\r\n let resolvedValue = defaultValue;\r\n\r\n entries.forEach((entry) => {\r\n const nextValue = resolveRowRuleEntryValue(\r\n entry,\r\n fallbackKey,\r\n record,\r\n index,\r\n idAccessor\r\n );\r\n\r\n if (!isNil(nextValue)) {\r\n resolvedValue = Boolean(nextValue);\r\n }\r\n });\r\n\r\n return resolvedValue;\r\n };\r\n};\r\n\r\nconst resolveMantineIdAccessor = (idAccessor) => {\r\n if (typeof idAccessor === 'function' || typeof idAccessor === 'string') {\r\n return idAccessor;\r\n }\r\n\r\n if (isNil(idAccessor)) {\r\n return 'id';\r\n }\r\n\r\n return (record) => getRecordId(record, idAccessor);\r\n};\r\n\r\nconst buildEventPayload = (params, idAccessor) => {\r\n const recordId = getRecordId(params.record, idAccessor);\r\n const payload = {\r\n record: params.record,\r\n recordId,\r\n index: params.index,\r\n timestamp: Date.now(),\r\n };\r\n\r\n if (params.column) {\r\n payload.column = params.column;\r\n payload.columnAccessor = params.column.accessor;\r\n payload.columnIndex = params.columnIndex;\r\n payload.value = getAccessorValue(params.record, params.column.accessor);\r\n }\r\n\r\n return payload;\r\n};\r\n\r\nconst flattenGroupColumns = (groupDefinitions) => {\r\n if (!Array.isArray(groupDefinitions)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return groupDefinitions.flatMap((group) => [\r\n ...(Array.isArray(group?.columns) ? group.columns : EMPTY_ARRAY),\r\n ...flattenGroupColumns(group?.groups),\r\n ]);\r\n};\r\n\r\nconst syncGroupsWithEffectiveColumns = (groupDefinitions, effectiveColumns) => {\r\n if (!Array.isArray(groupDefinitions)) {\r\n return undefined;\r\n }\r\n\r\n return groupDefinitions.map((group) => {\r\n const groupAccessors = new Set(\r\n Array.isArray(group?.columns)\r\n ? group.columns.map((column) => column?.accessor).filter(Boolean)\r\n : EMPTY_ARRAY\r\n );\r\n\r\n return {\r\n ...group,\r\n columns: (effectiveColumns || EMPTY_ARRAY).filter((column) =>\r\n groupAccessors.has(column?.accessor)\r\n ),\r\n groups: Array.isArray(group?.groups)\r\n ? syncGroupsWithEffectiveColumns(group.groups, effectiveColumns)\r\n : group?.groups,\r\n };\r\n });\r\n};\r\n\r\nconst buildColumn = (\n column,\n locale,\n defaultColumnRender,\n renderOptions,\n editingOptions = EMPTY_OBJECT,\n filterOptions = EMPTY_OBJECT\n) => {\n const resolvedFilter =\n typeof column.filter === 'function'\n ? (params) =>\n enhanceFilterNode(\n column.filter(params),\n column,\n filterOptions\n )\n : isNil(column.filter)\n ? column.filter\n : enhanceFilterNode(\n resolveStaticTemplateNode(\n column.filter,\n column,\n locale,\n renderOptions\n ),\n column,\n filterOptions\n );\n const resolvedFiltering = !isNil(column.filtering)\n ? column.filtering\n : typeof filterOptions.isColumnFilterActive === 'function'\n ? filterOptions.isColumnFilterActive(column)\n : column.filtering;\n\n return {\n accessor: column.accessor,\n title: column.title,\n textAlign: column.textAlign,\n sortable: column.sortable,\n sortKey: column.sortKey,\n draggable: column.draggable,\n toggleable: column.toggleable,\n resizable: column.resizable,\n defaultToggle: column.defaultToggle,\n filter: resolvedFilter,\n filtering: resolvedFiltering,\n filterPopoverProps: column.filterPopoverProps,\n filterPopoverDisableClickOutside:\n column.filterPopoverDisableClickOutside,\n width: column.width,\n hidden: column.hidden,\n hiddenContent: column.hiddenContent,\n visibleMediaQuery: column.visibleMediaQuery,\n titleClassName: column.titleClassName,\n titleStyle: column.titleStyle,\n cellsClassName: clsx(column.cellsClassName),\n cellsStyle:\n typeof column.cellsStyle === 'function'\n ? column.cellsStyle\n : column.cellsStyle\n ? () => column.cellsStyle\n : undefined,\n customCellAttributes: buildRowValueResolver(\n !isNil(column.cellAttributes)\n ? column.cellAttributes\n : column.customCellAttributes,\n 'attributes',\n renderOptions.idAccessor,\n { merge: true }\n ),\n footer: isNil(column.footer)\n ? column.footer\n : resolveStaticTemplateNode(\n column.footer,\n column,\n locale,\n renderOptions\n ),\n footerClassName: column.footerClassName,\n footerStyle: column.footerStyle,\n ellipsis: column.ellipsis,\n noWrap: column.noWrap,\n render: (record, index) => {\n const rawValue = getAccessorValue(record, column.accessor);\n const formattedValue = buildDisplayValue(record, column, locale);\n const presentation = column.presentation || column.type || 'text';\n const customRender = column.render;\n let content;\n\r\n if (!isNil(customRender)) {\r\n content = resolveTemplateRender(\r\n customRender,\r\n record,\r\n index,\r\n column,\r\n locale,\r\n renderOptions\r\n );\r\n } else if (presentation === 'badge') {\r\n const badgeColor = column.badgeColorAccessor\r\n ? getAccessorValue(record, column.badgeColorAccessor)\r\n : column.badgeColor || 'gray';\r\n\r\n content = (\r\n \r\n {formattedValue}\r\n \r\n );\r\n } else if (presentation === 'link') {\r\n const href = column.hrefAccessor\r\n ? getAccessorValue(record, column.hrefAccessor)\r\n : interpolateTemplate(column.hrefTemplate, record);\r\n\r\n content = (\r\n \r\n {formattedValue}\r\n \r\n );\r\n } else if (presentation === 'code') {\r\n content = {formattedValue};\r\n } else if (presentation === 'progress') {\r\n const progressValue = Number(rawValue || 0);\r\n content = (\r\n \r\n );\r\n } else if (presentation === 'json') {\r\n content = (\r\n \r\n {JSON.stringify(rawValue, null, 2)}\r\n \r\n );\r\n } else if (!isNil(defaultColumnRender)) {\r\n content = resolveTemplateRender(\r\n defaultColumnRender,\r\n record,\r\n index,\r\n column,\r\n locale,\r\n renderOptions\r\n );\r\n } else if (!hasAnyDefinedProp(column, ['color', 'fw', 'size'])) {\r\n content = formattedValue;\r\n } else {\r\n content = (\r\n \r\n {formattedValue}\r\n \r\n );\r\n }\r\n\r\n if (\r\n !column.editable ||\r\n !column.accessor ||\r\n record?.__group ||\r\n typeof editingOptions?.isEditingCell !== 'function' ||\r\n typeof editingOptions?.handleValueChange !== 'function' ||\r\n typeof editingOptions?.closeEditor !== 'function'\r\n ) {\r\n return content;\r\n }\r\n\r\n const editorDefinition = column.editor || ;\r\n const editorNode = resolveTemplateRender(\r\n editorDefinition,\r\n record,\r\n index,\r\n column,\r\n locale,\r\n renderOptions\r\n );\r\n\r\n return (\r\n \r\n editingOptions.handleValueChange(\r\n record,\r\n column,\r\n normalizeEditableValue(nextValue, column, editorDefinition)\r\n )\r\n }\r\n isEditing={editingOptions.isEditingCell(record, column)}\r\n value={rawValue}\n />\n );\n },\n };\n};\n\nconst buildGroup = (\n group,\n locale,\n defaultColumnRender,\n renderOptions,\n editingOptions = EMPTY_OBJECT,\n filterOptions = EMPTY_OBJECT\n) => ({\n id: group.id,\r\n title: group.title,\r\n textAlign: group.textAlign,\r\n className: group.className,\r\n style: group.style,\r\n columns: Array.isArray(group.columns)\r\n ? group.columns.map((column) =>\r\n buildColumn(\r\n column,\r\n locale,\r\n defaultColumnRender,\n renderOptions,\n editingOptions,\n filterOptions\n )\n )\n : undefined,\n groups: Array.isArray(group.groups)\r\n ? group.groups.map((childGroup) =>\r\n buildGroup(\r\n childGroup,\r\n locale,\r\n defaultColumnRender,\n renderOptions,\n editingOptions,\n filterOptions\n )\n )\n : undefined,\n});\n\r\nconst DataTable = ({\r\n data = EMPTY_ARRAY,\r\n columns = EMPTY_ARRAY,\r\n groups = undefined,\r\n groupBy = undefined,\r\n childRowsAccessor = undefined,\r\n groupAggregations = undefined,\r\n idAccessor = 'id',\r\n locale = 'en-US',\r\n paginationMode = 'client',\n sortMode = 'client',\n searchMode = 'client',\n filterMode = 'client',\n recordsPerPage = 10,\n pageSize = 10,\r\n noRecordsText = 'No records found',\r\n pageSizeOptions = [10, 25, 50],\r\n recordsPerPageOptions = undefined,\r\n recordsPerPageLabel = 'Rows per page',\r\n paginationSize = 'sm',\r\n direction = 'ltr',\r\n selectionTrigger = undefined,\r\n tableProps = EMPTY_OBJECT,\r\n scrollAreaProps = EMPTY_OBJECT,\r\n withRowBorders = true,\r\n withTableBorder = true,\r\n withColumnBorders = false,\r\n striped = false,\r\n highlightOnHover = true,\r\n textSelectionDisabled = false,\r\n ...props\r\n}) => {\r\n const {\r\n __groupLevel = 0,\r\n id,\r\n records,\r\n searchQuery,\n searchableAccessors,\n filterValues,\n page,\n totalRecords,\r\n sortStatus,\r\n sortIcons,\r\n selectedRecordIds,\r\n expandedRecordIds,\r\n selectionColumnClassName,\r\n selectionColumnStyle,\r\n selectionCheckboxProps,\r\n allRecordsSelectionCheckboxProps,\r\n selectableRowRules,\r\n disabledSelectionRowRules,\r\n selectionCheckboxRules,\r\n rowDragging,\r\n rowColor,\r\n rowBackgroundColor,\r\n rowClassName,\r\n rowStyle,\r\n rowAttributes,\r\n rowExpansion,\r\n setProps,\r\n emptyState,\r\n noRecordsIcon,\r\n paginationActiveTextColor,\r\n paginationActiveBackgroundColor,\r\n loadingText,\r\n customLoader,\r\n className,\r\n tableClassName,\r\n } = props;\r\n\r\n const allRecords = Array.isArray(records)\r\n ? records\r\n : Array.isArray(data)\r\n ? data\r\n : EMPTY_ARRAY;\r\n const normalizedGroupBy = normalizeGroupBy(groupBy);\r\n const normalizedChildRowsAccessor = normalizeChildRowsAccessor(childRowsAccessor);\r\n const normalizedGroupAggregations = normalizeGroupAggregations(groupAggregations);\r\n const hasRowGrouping = normalizedGroupBy.length > 0;\r\n const hasChildRowsHierarchy =\r\n !hasRowGrouping && Boolean(normalizedChildRowsAccessor);\r\n const hasInlineHierarchy = hasRowGrouping || hasChildRowsHierarchy;\r\n const isGroupedChildTable = __groupLevel > 0;\r\n const groupedRecordsForAllRows = hasRowGrouping\r\n ? buildGroupedRecords(\r\n allRecords,\r\n normalizedGroupBy,\r\n normalizedGroupAggregations\r\n )\r\n : undefined;\r\n const initialGroupedExpandedIds = hasRowGrouping\r\n ? collectGroupedRecordIds(groupedRecordsForAllRows)\r\n : EMPTY_ARRAY;\r\n const initialRowExpansionIds = Array.isArray(\r\n rowExpansion?.initiallyExpandedRecordIds\r\n )\r\n ? rowExpansion.initiallyExpandedRecordIds\r\n : EMPTY_ARRAY;\r\n const initialPageSize = recordsPerPage || pageSize || 10;\r\n\r\n const [internalPage, setInternalPage] = useState(page || 1);\r\n const [internalRecordsPerPage, setInternalRecordsPerPage] =\r\n useState(initialPageSize);\r\n const [internalSortStatus, setInternalSortStatus] = useState(\r\n sortStatus || null\r\n );\r\n const [internalSelectedIds, setInternalSelectedIds] = useState(\r\n Array.isArray(selectedRecordIds) ? selectedRecordIds : EMPTY_ARRAY\r\n );\r\n const [internalExpandedIds, setInternalExpandedIds] = useState(\r\n Array.isArray(expandedRecordIds)\r\n ? expandedRecordIds\r\n : mergeExpandedRecordIds(\r\n initialGroupedExpandedIds,\r\n initialRowExpansionIds\r\n )\r\n );\r\n const [activeEditableCell, setActiveEditableCell] = useState(null);\r\n\r\n const deferredSearchQuery = useDeferredValue(searchQuery);\r\n\r\n useEffect(() => {\r\n if (!isNil(page)) {\r\n setInternalPage(page);\r\n }\r\n }, [page]);\r\n\r\n useEffect(() => {\r\n if (!isNil(recordsPerPage) || !isNil(pageSize)) {\r\n setInternalRecordsPerPage(recordsPerPage || pageSize);\r\n }\r\n }, [recordsPerPage, pageSize]);\r\n\r\n useEffect(() => {\r\n if (sortStatus) {\r\n setInternalSortStatus(sortStatus);\r\n }\r\n }, [sortStatus]);\r\n\r\n useEffect(() => {\r\n if (Array.isArray(selectedRecordIds)) {\r\n setInternalSelectedIds(selectedRecordIds);\r\n }\r\n }, [selectedRecordIds]);\r\n\r\n useEffect(() => {\r\n if (Array.isArray(expandedRecordIds)) {\r\n setInternalExpandedIds(expandedRecordIds);\r\n }\r\n }, [expandedRecordIds]);\r\n\r\n const currentPage = isNil(page) ? internalPage : page;\r\n const currentRecordsPerPage = !isNil(recordsPerPage)\r\n ? recordsPerPage\r\n : !isNil(pageSize)\r\n ? pageSize\r\n : internalRecordsPerPage;\r\n const currentSortStatus = sortStatus || internalSortStatus;\r\n const currentSelectedIds = Array.isArray(selectedRecordIds)\r\n ? selectedRecordIds\r\n : internalSelectedIds;\r\n const currentExpandedIds = Array.isArray(expandedRecordIds)\r\n ? expandedRecordIds\r\n : internalExpandedIds;\r\n const rowDragSourceIdRef = useRef(null);\r\n const [draggedRowId, setDraggedRowId] = useState(null);\r\n const [dragOverRowId, setDragOverRowId] = useState(null);\r\n\r\n const groupedColumns = flattenGroupColumns(groups);\r\n const hasTopLevelColumns = Array.isArray(columns) && columns.length > 0;\r\n const hasGroups = Array.isArray(groups) && groups.length > 0;\r\n const sourceColumns = hasTopLevelColumns ? columns : groupedColumns;\r\n const { effectiveColumns } = useDataTableColumns({\r\n key: props.storeColumnsKey,\r\n columns: sourceColumns,\r\n });\r\n const resolvedColumns = Array.isArray(effectiveColumns)\n ? effectiveColumns\n : sourceColumns;\n const resolvedFilterColumns =\n props.defaultColumnProps && !isNil(props.defaultColumnProps.filter)\n ? resolvedColumns.map((column) =>\n isNil(column.filter)\n ? {\n ...column,\n filter: props.defaultColumnProps.filter,\n filterPopoverProps:\n column.filterPopoverProps ??\n props.defaultColumnProps.filterPopoverProps,\n filterPopoverDisableClickOutside:\n column.filterPopoverDisableClickOutside ??\n props.defaultColumnProps\n .filterPopoverDisableClickOutside,\n }\n : column\n )\n : resolvedColumns;\n const resolvedSearchableAccessors = Array.isArray(searchableAccessors)\n ? searchableAccessors\n : resolvedColumns\n .filter((column) => column.searchable !== false)\n .map((column) => column.accessor)\n .filter(Boolean);\n const templateRenderOptions = {\n idAccessor,\n };\n const columnFilterDefinitions = buildFilterDefinitions(\n resolvedFilterColumns,\n props.defaultColumnProps,\n locale,\n templateRenderOptions\n );\n const filterDefinitionsKey = getFilterDefinitionsKey(\n columnFilterDefinitions\n );\n const initialFilterValues = buildInitialFilterValues(\n columnFilterDefinitions\n );\n const [internalFilterValues, setInternalFilterValues] =\n useState(initialFilterValues);\n const filterValuesControlledRef = useRef(isPlainObject(filterValues));\n const filterValuesControlled = filterValuesControlledRef.current;\n\n useEffect(() => {\n if (filterValuesControlled) {\n return;\n }\n\n setInternalFilterValues((currentValues) =>\n syncFilterValuesWithDefinitions(\n { ...initialFilterValues, ...currentValues },\n columnFilterDefinitions\n )\n );\n }, [filterDefinitionsKey, filterValuesControlled]);\n\n const currentFilterValues = filterValuesControlled\n ? filterValues\n : internalFilterValues;\n const filterDefinitionsByAccessor = columnFilterDefinitions.reduce(\n (accumulator, definition) => {\n if (definition.accessor) {\n accumulator[definition.accessor] = definition;\n }\n\n return accumulator;\n },\n {}\n );\n\n const updateProps = (nextProps) => {\n if (setProps) {\n setProps(nextProps);\n }\n };\n\n const handleFilterValueChange = (\n column,\n control,\n nextValue,\n inputCount\n ) => {\n if (!column?.accessor || !control?.key) {\n return;\n }\n\n const nextFilterValues = setFilterValueInCollection(\n currentFilterValues,\n column.accessor,\n control.key,\n nextValue,\n inputCount || 1\n );\n const shouldResetPage = currentPage !== 1;\n\n if (!filterValuesControlled) {\n setInternalFilterValues(nextFilterValues);\n }\n\n if (shouldResetPage && isNil(page)) {\n setInternalPage(1);\n }\n\n updateProps({\n filterValues: nextFilterValues,\n lastFilterChange: {\n columnAccessor: column.accessor,\n filterKey: control.key,\n value: nextValue,\n columnFilterValue: nextFilterValues[column.accessor],\n active: isColumnFilterActive(\n nextFilterValues,\n filterDefinitionsByAccessor[column.accessor]\n ),\n timestamp: Date.now(),\n },\n ...(shouldResetPage ? { page: 1 } : EMPTY_OBJECT),\n });\n };\n\n const clientSearchFilteredRecords =\n searchMode === 'client'\n ? filterRecords(allRecords, deferredSearchQuery, resolvedSearchableAccessors)\n : allRecords;\n const clientFilteredRecords =\n filterMode === 'client'\n ? filterRecordsByColumnFilters(\n clientSearchFilteredRecords,\n currentFilterValues,\n columnFilterDefinitions\n )\n : clientSearchFilteredRecords;\n const clientSortedRecords =\n sortMode === 'client'\n ? sortRecords(clientFilteredRecords, currentSortStatus)\n : clientFilteredRecords;\n\r\n const computedTotalRecords =\r\n paginationMode === 'client'\r\n ? clientSortedRecords.length\r\n : totalRecords;\r\n\r\n const paginatedRecords =\r\n paginationMode === 'client'\r\n ? clientSortedRecords.slice(\r\n Math.max(currentPage - 1, 0) * currentRecordsPerPage,\r\n Math.max(currentPage - 1, 0) * currentRecordsPerPage +\r\n currentRecordsPerPage\r\n )\r\n : clientSortedRecords;\r\n const groupedRecords = hasRowGrouping\r\n ? buildGroupedRecords(\r\n paginatedRecords,\r\n normalizedGroupBy,\r\n normalizedGroupAggregations\r\n )\r\n : undefined;\r\n const childRowsRecords = hasChildRowsHierarchy\r\n ? buildChildRowsRecords(\r\n paginatedRecords,\r\n normalizedChildRowsAccessor,\r\n normalizedGroupAggregations\r\n )\r\n : undefined;\r\n const displayedRecords = hasRowGrouping\r\n ? flattenGroupedRecords(groupedRecords, currentExpandedIds, idAccessor)\r\n : hasChildRowsHierarchy\r\n ? flattenGroupedRecords(\r\n childRowsRecords,\r\n currentExpandedIds,\r\n idAccessor\r\n )\r\n : paginatedRecords;\r\n\r\n const selectableRecords = hasChildRowsHierarchy\r\n ? collectHierarchyRecords(childRowsRecords)\r\n : allRecords;\r\n const selectedRecordsPayload = selectableRecords.filter((record) =>\r\n currentSelectedIds.includes(getRecordId(record, idAccessor))\r\n );\r\n const selectableRowResolver = buildRowBooleanResolver(\r\n selectableRowRules,\r\n 'selectable',\r\n idAccessor,\r\n true\r\n );\r\n const disabledSelectionRowResolver = buildRowBooleanResolver(\r\n disabledSelectionRowRules,\r\n 'disabled',\r\n idAccessor,\r\n false\r\n );\r\n const selectionCheckboxPropsResolver = buildRowValueResolver(\n selectionCheckboxRules,\n 'checkboxProps',\n idAccessor,\n { merge: true }\n );\n const rowDraggingEnabled = Boolean(rowDragging) && !hasInlineHierarchy;\n\n const clearRowDraggingState = () => {\n rowDragSourceIdRef.current = null;\r\n setDraggedRowId(null);\r\n setDragOverRowId(null);\r\n };\r\n\r\n const closeEditableCell = () => {\r\n setActiveEditableCell(null);\r\n };\r\n\r\n const isEditingCell = (record, column) =>\r\n Boolean(\r\n activeEditableCell &&\r\n activeEditableCell.recordId === getRecordId(record, idAccessor) &&\r\n activeEditableCell.columnAccessor === column?.accessor\r\n );\r\n\r\n const handleEditableCellValueChange = (record, column, nextValue) => {\r\n const recordId = getRecordId(record, idAccessor);\r\n\r\n if (isNil(recordId) || !column?.accessor) {\r\n return;\r\n }\r\n\r\n const currentRecord = findRecordInCollection(\r\n allRecords,\r\n recordId,\r\n idAccessor,\r\n normalizedChildRowsAccessor\r\n );\r\n\r\n if (!currentRecord) {\r\n return;\r\n }\r\n\r\n const currentValue = getAccessorValue(currentRecord, column.accessor);\r\n\r\n if (areEditableValuesEqual(currentValue, nextValue)) {\r\n return;\r\n }\r\n\r\n const updatedRecords = updateRecordValueInCollection(\r\n allRecords,\r\n recordId,\r\n idAccessor,\r\n column.accessor,\r\n nextValue,\r\n normalizedChildRowsAccessor\r\n );\r\n\r\n if (!updatedRecords.didUpdate) {\r\n return;\r\n }\r\n\r\n updateProps({\r\n data: updatedRecords.records,\r\n records: updatedRecords.records,\r\n });\r\n };\r\n\r\n const handleCellDoubleClick = (params) => {\r\n const payload = buildEventPayload(params, idAccessor);\r\n const matchingColumn = resolvedColumns.find(\r\n (column) => column?.accessor === payload.columnAccessor\r\n );\r\n\r\n if (\r\n matchingColumn?.editable &&\r\n !params.record?.__group &&\r\n !isNil(payload.recordId)\r\n ) {\r\n setActiveEditableCell({\r\n columnAccessor: payload.columnAccessor,\r\n recordId: payload.recordId,\r\n });\r\n } else {\r\n closeEditableCell();\r\n }\r\n\r\n updateProps({\r\n cellDoubleClick: payload,\r\n });\r\n };\r\n\r\n const handlePageChange = (nextPage) => {\r\n if (isNil(page)) {\r\n setInternalPage(nextPage);\r\n }\r\n\r\n updateProps({\r\n page: nextPage,\r\n pagination: {\r\n page: nextPage,\r\n recordsPerPage: currentRecordsPerPage,\r\n totalRecords: computedTotalRecords,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n };\r\n\r\n const handleRecordsPerPageChange = (nextRecordsPerPage) => {\r\n if (isNil(recordsPerPage) && isNil(pageSize)) {\r\n setInternalRecordsPerPage(nextRecordsPerPage);\r\n }\r\n\r\n if (isNil(page)) {\r\n setInternalPage(1);\r\n }\r\n\r\n updateProps({\r\n recordsPerPage: nextRecordsPerPage,\r\n pageSize: nextRecordsPerPage,\r\n page: 1,\r\n pagination: {\r\n page: 1,\r\n recordsPerPage: nextRecordsPerPage,\r\n totalRecords: computedTotalRecords,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n };\r\n\r\n const handleSortStatusChange = (nextSortStatus) => {\r\n if (!sortStatus) {\r\n setInternalSortStatus(nextSortStatus);\r\n }\r\n\r\n updateProps({\r\n sortStatus: nextSortStatus,\r\n lastSortChange: {\r\n ...nextSortStatus,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n };\r\n\r\n const handleSelectedRecordsChange = (nextSelectedRecords) => {\r\n const nextSelectedIds = nextSelectedRecords.map((record) =>\r\n getRecordId(record, idAccessor)\r\n );\r\n\r\n if (!Array.isArray(selectedRecordIds)) {\r\n setInternalSelectedIds(nextSelectedIds);\r\n }\r\n\r\n updateProps({\r\n selectedRecordIds: nextSelectedIds,\r\n selectedRecords: nextSelectedRecords,\r\n lastSelectionChange: {\r\n recordIds: nextSelectedIds,\r\n records: nextSelectedRecords,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n };\r\n\r\n const buildExpandedRecordProps = (nextExpandedRecordIds) => ({\r\n expandedRecordIds: nextExpandedRecordIds,\r\n lastExpansionChange: {\r\n recordIds: nextExpandedRecordIds,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n\r\n const syncExpandedRecordIds = (nextExpandedRecordIds) => {\r\n if (!Array.isArray(expandedRecordIds)) {\r\n setInternalExpandedIds(nextExpandedRecordIds);\r\n }\r\n\r\n return buildExpandedRecordProps(nextExpandedRecordIds);\r\n };\r\n\r\n const handleExpandedRecordIdsChange = (nextExpandedRecordIds) => {\r\n updateProps(syncExpandedRecordIds(nextExpandedRecordIds));\r\n };\r\n\r\n const toggleInlineHierarchyRecord = (record) => {\r\n const recordId = getRecordId(record, idAccessor);\r\n\r\n if (isNil(recordId)) {\r\n return EMPTY_OBJECT;\r\n }\r\n\r\n const nextExpandedRecordIds = currentExpandedIds.includes(recordId)\r\n ? currentExpandedIds.filter((expandedId) => expandedId !== recordId)\r\n : mergeExpandedRecordIds(currentExpandedIds, [recordId]);\r\n\r\n return syncExpandedRecordIds(nextExpandedRecordIds);\r\n };\r\n\r\n const handleRowDragStart = (event, record) => {\r\n if (!rowDraggingEnabled || isInteractiveDragTarget(event.target)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const recordId = getRecordId(record, idAccessor);\r\n rowDragSourceIdRef.current = recordId;\r\n setDraggedRowId(recordId);\r\n setDragOverRowId(recordId);\r\n\r\n if (event.dataTransfer) {\r\n event.dataTransfer.effectAllowed = 'move';\r\n event.dataTransfer.dropEffect = 'move';\r\n\r\n try {\r\n event.dataTransfer.setData('text/plain', String(recordId));\r\n } catch {\r\n // Some browsers restrict custom drag payloads for table rows.\r\n }\r\n }\r\n };\r\n\r\n const handleRowDragOver = (event, record) => {\r\n if (!rowDraggingEnabled || !rowDragSourceIdRef.current) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n\r\n const recordId = getRecordId(record, idAccessor);\r\n if (recordId !== dragOverRowId) {\r\n setDragOverRowId(recordId);\r\n }\r\n };\r\n\r\n const handleRowDrop = (event, record) => {\r\n if (!rowDraggingEnabled || !rowDragSourceIdRef.current) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n const sourceRecordId = rowDragSourceIdRef.current;\r\n const destinationRecordId = getRecordId(record, idAccessor);\r\n const sourceIndex = allRecords.findIndex(\r\n (row) => getRecordId(row, idAccessor) === sourceRecordId\r\n );\r\n const destinationIndex = allRecords.findIndex(\r\n (row) => getRecordId(row, idAccessor) === destinationRecordId\r\n );\r\n\r\n if (\r\n sourceIndex === -1 ||\r\n destinationIndex === -1 ||\r\n sourceIndex === destinationIndex\r\n ) {\r\n clearRowDraggingState();\r\n return;\r\n }\r\n\r\n const reorderedRecords = reorderByIndices(\r\n allRecords,\r\n sourceIndex,\r\n destinationIndex\r\n );\r\n\r\n updateProps({\r\n data: reorderedRecords,\r\n records: reorderedRecords,\r\n lastRowDragChange: {\r\n sourceIndex,\r\n destinationIndex,\r\n record: allRecords[sourceIndex],\r\n recordId: sourceRecordId,\r\n records: reorderedRecords,\r\n recordIds: reorderedRecords.map((row) =>\r\n getRecordId(row, idAccessor)\r\n ),\r\n timestamp: Date.now(),\r\n },\r\n });\r\n\r\n clearRowDraggingState();\r\n };\r\n\r\n const builtRowFactory = rowDraggingEnabled\r\n ? ({ record, index, rowProps, children, expandedElement }) => {\r\n const recordId = getRecordId(record, idAccessor);\r\n\r\n return (\r\n \r\n \r\n handleRowDragOver(event, record, index)\r\n }\r\n onDragStart={(event) =>\r\n handleRowDragStart(event, record, index)\r\n }\r\n onDrop={(event) => handleRowDrop(event, record, index)}\r\n >\r\n {children}\r\n \r\n {expandedElement}\r\n \r\n );\r\n }\r\n : undefined;\r\n\r\n useEffect(() => {\r\n if (!rowDraggingEnabled) {\r\n clearRowDraggingState();\r\n }\r\n }, [rowDraggingEnabled]);\r\n\r\n useEffect(() => {\r\n if (!activeEditableCell) {\r\n return;\r\n }\r\n\r\n const hasActiveColumn = resolvedColumns.some(\r\n (column) => column?.accessor === activeEditableCell.columnAccessor\r\n );\r\n const hasActiveRecord = displayedRecords.some(\r\n (record) =>\r\n !record?.__group &&\r\n getRecordId(record, idAccessor) === activeEditableCell.recordId\r\n );\r\n\r\n if (!hasActiveColumn || !hasActiveRecord) {\r\n closeEditableCell();\r\n }\r\n }, [activeEditableCell, displayedRecords, idAccessor, resolvedColumns]);\r\n\r\n const resolvedDefaultColumnProps = props.defaultColumnProps\r\n ? { ...props.defaultColumnProps }\r\n : undefined;\r\n const resolvedDefaultColumnRender = !isNil(props.defaultColumnRender)\r\n ? props.defaultColumnRender\r\n : resolvedDefaultColumnProps && !isNil(resolvedDefaultColumnProps.render)\r\n ? resolvedDefaultColumnProps.render\r\n : undefined;\r\n\r\n if (\r\n resolvedDefaultColumnProps &&\r\n Object.prototype.hasOwnProperty.call(resolvedDefaultColumnProps, 'render')\r\n ) {\r\n delete resolvedDefaultColumnProps.render;\r\n }\r\n\r\n if (\r\n resolvedDefaultColumnProps &&\r\n !isNil(resolvedDefaultColumnProps.filter) &&\r\n typeof resolvedDefaultColumnProps.filter !== 'function'\r\n ) {\r\n resolvedDefaultColumnProps.filter = resolveStaticTemplateNode(\r\n resolvedDefaultColumnProps.filter,\r\n { accessor: '__default_filter__' },\r\n locale,\r\n templateRenderOptions\r\n );\r\n }\r\n\r\n if (\r\n resolvedDefaultColumnProps &&\r\n !isNil(resolvedDefaultColumnProps.footer)\r\n ) {\r\n resolvedDefaultColumnProps.footer = resolveStaticTemplateNode(\r\n resolvedDefaultColumnProps.footer,\r\n { accessor: '__default_footer__' },\r\n locale,\r\n templateRenderOptions\r\n );\r\n }\r\n\r\n if (resolvedDefaultColumnProps) {\n const defaultCellAttributes = !isNil(resolvedDefaultColumnProps.cellAttributes)\n ? resolvedDefaultColumnProps.cellAttributes\n : resolvedDefaultColumnProps.customCellAttributes;\n\r\n if (!isNil(defaultCellAttributes)) {\r\n resolvedDefaultColumnProps.customCellAttributes =\r\n buildRowValueResolver(\r\n defaultCellAttributes,\r\n 'attributes',\r\n idAccessor,\r\n { merge: true }\r\n );\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(\r\n resolvedDefaultColumnProps,\r\n 'cellAttributes'\r\n )\r\n ) {\r\n delete resolvedDefaultColumnProps.cellAttributes;\n }\n }\n\n const filterOptions = {\n filterDefinitionsByAccessor,\n filterValues: currentFilterValues,\n handleFilterValueChange,\n isColumnFilterActive: (column) =>\n isColumnFilterActive(\n currentFilterValues,\n filterDefinitionsByAccessor[column.accessor]\n ),\n };\n\n const builtColumns = resolvedFilterColumns.map((column) =>\n buildColumn(\n column,\n locale,\n resolvedDefaultColumnRender,\n templateRenderOptions,\n {\r\n closeEditor: closeEditableCell,\n handleValueChange: handleEditableCellValueChange,\n isEditingCell,\n },\n filterOptions\n )\n );\n const builtGroupedColumns =\r\n hasInlineHierarchy || isGroupedChildTable\r\n ? builtColumns.map((column, columnIndex) => {\r\n if (columnIndex !== 0) {\r\n return column;\r\n }\r\n\r\n const originalRender = column.render;\r\n\r\n return {\r\n ...column,\r\n render: (record, index) => {\r\n const renderedContent = originalRender(record, index);\r\n const resolvedContent =\r\n record?.__group &&\r\n (isNil(renderedContent) || renderedContent === '')\r\n ? String(record.__groupValue ?? '')\r\n : renderedContent;\r\n\r\n return wrapGroupedCellContent(\r\n resolvedContent,\r\n record,\r\n currentExpandedIds,\r\n record?.__groupLevel ?? __groupLevel\r\n );\r\n },\r\n };\r\n })\r\n : builtColumns;\r\n const resolvedGroups = hasGroups\n ? syncGroupsWithEffectiveColumns(groups, resolvedFilterColumns)\n : undefined;\n const builtGroups = hasGroups\n ? resolvedGroups.map((group) =>\n buildGroup(\n group,\n locale,\n resolvedDefaultColumnRender,\n templateRenderOptions,\n {\n closeEditor: closeEditableCell,\n handleValueChange: handleEditableCellValueChange,\n isEditingCell,\n },\n filterOptions\n )\n )\n : undefined;\n\r\n const builtRowExpansion = rowExpansion\r\n ? {\r\n trigger: rowExpansion.trigger || 'click',\r\n allowMultiple: rowExpansion.allowMultiple,\r\n expandable: ({ record, index }) =>\r\n !isInlineHierarchyParentRecord(record) &&\r\n (typeof rowExpansion.expandable === 'function'\r\n ? rowExpansion.expandable({ record, index })\r\n : true),\r\n initiallyExpanded: ({ record }) =>\r\n !isInlineHierarchyParentRecord(record) &&\r\n Array.isArray(rowExpansion.initiallyExpandedRecordIds) &&\r\n rowExpansion.initiallyExpandedRecordIds.includes(\r\n getRecordId(record, idAccessor)\r\n ),\r\n expanded: {\r\n recordIds: currentExpandedIds,\r\n onRecordIdsChange: handleExpandedRecordIdsChange,\r\n },\r\n content: ({ record }) =>\r\n isInlineHierarchyParentRecord(record)\r\n ? null\r\n : renderExpansionContent(\r\n rowExpansion.content || rowExpansion,\r\n record,\r\n locale,\r\n templateRenderOptions\r\n ),\r\n }\r\n : undefined;\r\n\r\n const resolvedSortIcons = sortIcons\r\n ? {\r\n sorted: isNil(sortIcons.sorted)\r\n ? sortIcons.sorted\r\n : resolveStaticTemplateNode(\r\n sortIcons.sorted,\r\n { accessor: '__sort_icon_sorted__' },\r\n locale,\r\n templateRenderOptions\r\n ),\r\n unsorted: isNil(sortIcons.unsorted)\r\n ? sortIcons.unsorted\r\n : resolveStaticTemplateNode(\r\n sortIcons.unsorted,\r\n { accessor: '__sort_icon_unsorted__' },\r\n locale,\r\n templateRenderOptions\r\n ),\r\n }\r\n : undefined;\r\n\r\n const emptyStateNode =\r\n typeof emptyState === 'string' ? (\r\n \r\n {emptyState}\r\n \r\n ) : emptyState && emptyState.type === 'text' && !emptyState.namespace ? (\r\n \r\n {emptyState.value}\r\n \r\n ) : undefined;\r\n const resolvedEmptyStateNode =\r\n emptyStateNode ||\r\n ((React.isValidElement(emptyState) ||\r\n Array.isArray(emptyState) ||\r\n isDryComponent(emptyState)) &&\r\n !isNil(emptyState)\r\n ? resolveStaticTemplateNode(\r\n emptyState,\r\n { accessor: '__empty_state__' },\r\n locale,\r\n templateRenderOptions\r\n )\r\n : undefined);\r\n const resolvedNoRecordsIcon =\r\n isNil(emptyState) && !isNil(noRecordsIcon)\r\n ? resolveStaticTemplateNode(\r\n noRecordsIcon,\r\n { accessor: '__no_records_icon__' },\r\n locale,\r\n templateRenderOptions\r\n )\r\n : undefined;\r\n const resolvedCustomLoader = !isNil(customLoader)\r\n ? resolveStaticTemplateNode(\r\n customLoader,\r\n { accessor: '__custom_loader__' },\r\n locale,\r\n templateRenderOptions\r\n )\r\n : undefined;\r\n\r\n const rootStyleProps = pickDefinedProps(props, ROOT_STYLE_PROP_NAMES);\r\n const resolvedRootProps = {\r\n ...rootStyleProps,\r\n bg: isNil(props.bg) ? props.backgroundColor : props.bg,\r\n h: isNil(props.h) ? props.height : props.h,\r\n mih: isNil(props.mih) ? props.minHeight : props.mih,\r\n mah: isNil(props.mah) ? props.maxHeight : props.mah,\r\n radius: isNil(props.borderRadius) ? props.radius : props.borderRadius,\r\n };\r\n const resolvedTableProps =\r\n hasInlineHierarchy || isGroupedChildTable\r\n ? {\r\n ...tableProps,\r\n layout: tableProps?.layout || 'fixed',\r\n }\r\n : tableProps;\r\n const resolvedRowColor = buildRowValueResolver(\r\n rowColor,\r\n 'color',\r\n idAccessor\r\n );\r\n const resolvedRowBackgroundColor = buildRowValueResolver(\r\n rowBackgroundColor,\r\n 'backgroundColor',\r\n idAccessor\r\n );\r\n const resolvedRowClassName = buildRowClassNameResolver(\r\n rowClassName,\r\n idAccessor\r\n );\r\n const resolvedRowStyle = buildRowStyleResolver(rowStyle, idAccessor);\r\n const resolvedRowAttributes = buildRowValueResolver(\r\n rowAttributes,\r\n 'attributes',\r\n idAccessor,\r\n { merge: true }\r\n );\r\n const resolvedMantineIdAccessor = hasInlineHierarchy\r\n ? (record) => getRecordId(record, idAccessor)\r\n : resolveMantineIdAccessor(idAccessor);\r\n const resolvedSelectionTrigger = hasRowGrouping\r\n ? undefined\r\n : selectionTrigger;\r\n const isRecordSelectable = resolvedSelectionTrigger\r\n ? (record, index) => {\r\n if (record?.__group) {\r\n return false;\r\n }\r\n\r\n if (\r\n disabledSelectionRowResolver &&\r\n disabledSelectionRowResolver(record, index)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (selectableRowResolver) {\r\n return selectableRowResolver(record, index);\r\n }\r\n\r\n return true;\r\n }\r\n : undefined;\r\n const getRecordSelectionCheckboxProps =\r\n selectionCheckboxPropsResolver && resolvedSelectionTrigger\r\n ? (record, index) =>\r\n selectionCheckboxPropsResolver(record, index) || EMPTY_OBJECT\r\n : undefined;\r\n const layoutDirection = props.direction === 'rtl' ? 'rtl' : 'ltr';\r\n\r\n return (\r\n \r\n \r\n \r\n updateProps({\r\n cellClick: buildEventPayload(params, idAccessor),\r\n })\r\n }\r\n onCellContextMenu={(params) =>\r\n updateProps({\r\n cellContextMenu: buildEventPayload(\r\n params,\r\n idAccessor\r\n ),\r\n })\r\n }\r\n onCellDoubleClick={handleCellDoubleClick}\r\n onPageChange={handlePageChange}\r\n onRecordsPerPageChange={handleRecordsPerPageChange}\r\n onRowClick={(params) =>\r\n updateProps({\r\n ...(isInlineHierarchyParentRecord(params.record)\r\n ? toggleInlineHierarchyRecord(params.record)\r\n : EMPTY_OBJECT),\r\n rowClick: buildEventPayload(params, idAccessor),\r\n })\r\n }\r\n onRowContextMenu={(params) =>\r\n updateProps({\r\n rowContextMenu: buildEventPayload(\r\n params,\r\n idAccessor\r\n ),\r\n })\r\n }\r\n onRowDoubleClick={(params) =>\r\n updateProps({\r\n rowDoubleClick: buildEventPayload(\r\n params,\r\n idAccessor\r\n ),\r\n })\r\n }\r\n onScroll={(position) =>\r\n updateProps({\r\n scrollPosition: {\r\n ...position,\r\n timestamp: Date.now(),\r\n },\r\n })\r\n }\r\n onScrollToBottom={() =>\r\n updateProps({\r\n scrollEdge: { edge: 'bottom', timestamp: Date.now() },\r\n })\r\n }\r\n onScrollToLeft={() =>\r\n updateProps({\r\n scrollEdge: { edge: 'left', timestamp: Date.now() },\r\n })\r\n }\r\n onScrollToRight={() =>\r\n updateProps({\r\n scrollEdge: { edge: 'right', timestamp: Date.now() },\r\n })\r\n }\r\n onScrollToTop={() =>\r\n updateProps({\r\n scrollEdge: { edge: 'top', timestamp: Date.now() },\r\n })\r\n }\r\n onSelectedRecordsChange={handleSelectedRecordsChange}\r\n onSortStatusChange={handleSortStatusChange}\r\n page={paginationMode === 'none' ? undefined : currentPage}\r\n paginationActiveBackgroundColor={\r\n paginationActiveBackgroundColor\r\n }\r\n paginationActiveTextColor={paginationActiveTextColor}\r\n paginationSize={paginationSize}\r\n paginationWithControls={props.paginationWithControls}\r\n paginationWithEdges={props.paginationWithEdges}\r\n pinFirstColumn={props.pinFirstColumn}\r\n pinLastColumn={props.pinLastColumn}\r\n horizontalSpacing={props.horizontalSpacing}\r\n records={displayedRecords}\r\n recordsPerPage={\r\n paginationMode === 'none'\r\n ? undefined\r\n : currentRecordsPerPage\r\n }\r\n recordsPerPageLabel={recordsPerPageLabel}\r\n recordsPerPageOptions={\r\n recordsPerPageOptions || pageSizeOptions || EMPTY_ARRAY\r\n }\r\n rowBorderColor={props.rowBorderColor}\r\n rowColor={resolvedRowColor}\r\n rowBackgroundColor={resolvedRowBackgroundColor}\r\n rowClassName={resolvedRowClassName}\r\n rowFactory={builtRowFactory}\r\n rowExpansion={builtRowExpansion}\r\n rowStyle={resolvedRowStyle}\r\n scrollAreaProps={scrollAreaProps}\r\n selectedRecords={\r\n resolvedSelectionTrigger || currentSelectedIds.length\r\n ? selectedRecordsPayload\r\n : undefined\r\n }\r\n allRecordsSelectionCheckboxProps={\r\n allRecordsSelectionCheckboxProps\r\n }\r\n selectionCheckboxProps={selectionCheckboxProps}\r\n selectionColumnClassName={selectionColumnClassName}\r\n selectionColumnStyle={selectionColumnStyle}\r\n selectionTrigger={resolvedSelectionTrigger}\r\n shadow={props.shadow}\r\n sortIcons={resolvedSortIcons}\r\n sortStatus={currentSortStatus}\r\n storeColumnsKey={props.storeColumnsKey}\r\n stickyHeader={props.stickyHeader}\r\n stickyHeaderOffset={props.stickyHeaderOffset}\r\n striped={props.striped}\r\n stripedColor={props.stripedColor}\r\n style={props.style}\r\n styles={props.styles}\r\n tableRef={props.tableRef}\r\n textSelectionDisabled={props.textSelectionDisabled}\r\n totalRecords={\r\n paginationMode === 'none'\r\n ? undefined\r\n : computedTotalRecords\r\n }\r\n verticalSpacing={props.verticalSpacing}\r\n verticalAlign={props.verticalAlign}\r\n withRowBorders={props.withRowBorders}\r\n withColumnBorders={props.withColumnBorders}\r\n withTableBorder={props.withTableBorder}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\n\r\nDataTable.propTypes = {\r\n /**\r\n * The ID used to identify this component in Dash callbacks.\r\n */\r\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n\r\n /**\r\n * Table records. `data` is the preferred Dash-facing alias.\r\n */\r\n data: PropTypes.arrayOf(PropTypes.object),\r\n\r\n /**\r\n * Optional alias for `data`, matching the original Mantine DataTable API.\r\n */\r\n records: PropTypes.arrayOf(PropTypes.object),\r\n\r\n /**\r\n * Column definitions. Each column may also define a Dash-friendly\r\n * `presentation` such as `text`, `number`, `currency`, `date`,\r\n * `datetime`, `badge`, `link`, `code`, `json` or `progress`.\r\n * Set `editable=True` to enable double-click editing, and pass a Dash\r\n * input component to `editor` when you want a custom in-place editor.\r\n */\r\n columns: PropTypes.arrayOf(PropTypes.object),\r\n\r\n /**\r\n * Optional column groups matching Mantine DataTable grouped headers.\r\n */\r\n groups: PropTypes.arrayOf(PropTypes.object),\r\n\r\n /**\r\n * Row grouping accessor or accessors. Grouped rows render inline nested\r\n * parents inside a single table, while leaf rows can still use\r\n * `rowExpansion` for detail panels.\r\n */\r\n groupBy: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.arrayOf(PropTypes.string),\r\n ]),\r\n\r\n /**\r\n * Nested child-record accessor for already hierarchical data. When set,\r\n * rows with this accessor render inline child rows using the same\r\n * indentation and expand/collapse affordance as `groupBy`.\r\n */\r\n childRowsAccessor: PropTypes.string,\r\n\r\n /**\r\n * Per-column aggregation mapping for parent rows. Values may be one of the\r\n * built-in aggregations (`sum`, `mean`, `median`, `min`, `max`, `count`) or\r\n * a custom client-side function / function source string.\r\n */\r\n groupAggregations: PropTypes.object,\r\n\r\n /**\r\n * Record identifier accessor. Defaults to `id`.\r\n */\r\n idAccessor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n PropTypes.arrayOf(PropTypes.string),\r\n ]),\r\n\r\n /**\r\n * Locale used for number and date formatting.\r\n */\r\n locale: PropTypes.string,\r\n /**\r\n * Layout direction. Set to `rtl` to render the table in a right-to-left\r\n * Mantine direction context.\r\n */\r\n direction: PropTypes.oneOf(['ltr', 'rtl']),\r\n\r\n paginationMode: PropTypes.oneOf(['client', 'server', 'none']),\n sortMode: PropTypes.oneOf(['client', 'server']),\n searchMode: PropTypes.oneOf(['client', 'server']),\n filterMode: PropTypes.oneOf(['client', 'server', 'none']),\n searchQuery: PropTypes.string,\n searchableAccessors: PropTypes.arrayOf(PropTypes.string),\n filterValues: PropTypes.object,\n page: PropTypes.number,\n recordsPerPage: PropTypes.number,\r\n pageSize: PropTypes.number,\r\n totalRecords: PropTypes.number,\r\n sortStatus: PropTypes.object,\r\n selectedRecordIds: PropTypes.array,\r\n selectedRecords: PropTypes.array,\r\n expandedRecordIds: PropTypes.array,\r\n selectionTrigger: PropTypes.oneOf(['cell', 'checkbox']),\r\n selectionColumnClassName: PropTypes.string,\r\n selectionColumnStyle: PropTypes.object,\r\n selectionCheckboxProps: PropTypes.object,\r\n allRecordsSelectionCheckboxProps: PropTypes.object,\r\n selectableRowRules: PropTypes.oneOfType([\r\n PropTypes.bool,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n disabledSelectionRowRules: PropTypes.oneOfType([\r\n PropTypes.bool,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n selectionCheckboxRules: PropTypes.oneOfType([\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n\r\n /**\r\n * Enables Dash-native row reordering. Pass `true` or a configuration object.\r\n * The reordered list is written back to both `data` and `records`, and the\r\n * latest drag payload is exposed through `lastRowDragChange`.\r\n */\r\n rowDragging: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),\r\n\r\n /**\r\n * Row text color. Accepts a static Mantine color or Dash-safe rule objects.\r\n */\r\n rowColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n\r\n /**\r\n * Row background color. Accepts a static color or Dash-safe rule objects.\r\n */\r\n rowBackgroundColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n\r\n /**\r\n * Row class names. Accepts a static className or Dash-safe rule objects.\r\n */\r\n rowClassName: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n rowAttributes: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\r\n\r\n /**\r\n * Row inline styles. Accepts a static style object or Dash-safe rule objects.\r\n */\r\n rowStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\r\n rowExpansion: PropTypes.object,\r\n rowClick: PropTypes.object,\r\n rowDoubleClick: PropTypes.object,\r\n rowContextMenu: PropTypes.object,\r\n cellClick: PropTypes.object,\r\n cellDoubleClick: PropTypes.object,\r\n cellContextMenu: PropTypes.object,\r\n pagination: PropTypes.object,\r\n scrollPosition: PropTypes.object,\r\n scrollEdge: PropTypes.object,\r\n lastRowDragChange: PropTypes.object,\n lastSortChange: PropTypes.object,\n lastSelectionChange: PropTypes.object,\n lastExpansionChange: PropTypes.object,\n lastFilterChange: PropTypes.object,\n emptyState: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n noRecordsIcon: PropTypes.any,\r\n noRecordsText: PropTypes.string,\r\n recordsPerPageOptions: PropTypes.arrayOf(PropTypes.number),\r\n pageSizeOptions: PropTypes.arrayOf(PropTypes.number),\r\n recordsPerPageLabel: PropTypes.string,\r\n paginationSize: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n paginationActiveTextColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n ]),\r\n paginationActiveBackgroundColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n ]),\r\n loadingText: PropTypes.string,\r\n tableProps: PropTypes.object,\r\n scrollAreaProps: PropTypes.object,\r\n className: PropTypes.string,\r\n tableClassName: PropTypes.string,\r\n classNames: PropTypes.object,\r\n style: PropTypes.object,\r\n styles: PropTypes.object,\r\n radius: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n minHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n maxHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n shadow: PropTypes.string,\r\n bg: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n c: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n backgroundColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n borderColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n rowBorderColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n stripedColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n highlightOnHoverColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n ]),\r\n withRowBorders: PropTypes.bool,\r\n withTableBorder: PropTypes.bool,\r\n withColumnBorders: PropTypes.bool,\r\n horizontalSpacing: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.number,\r\n ]),\r\n verticalSpacing: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n borderRadius: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n striped: PropTypes.bool,\r\n highlightOnHover: PropTypes.bool,\r\n textSelectionDisabled: PropTypes.bool,\r\n fetching: PropTypes.bool,\r\n loaderBackgroundBlur: PropTypes.number,\r\n loaderSize: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n loaderType: PropTypes.string,\r\n loaderColor: PropTypes.string,\r\n customLoader: PropTypes.any,\r\n noHeader: PropTypes.bool,\r\n pinFirstColumn: PropTypes.bool,\r\n pinLastColumn: PropTypes.bool,\r\n stickyHeader: PropTypes.bool,\r\n stickyHeaderOffset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n verticalAlign: PropTypes.oneOf(['top', 'center', 'bottom']),\r\n paginationWithEdges: PropTypes.bool,\r\n paginationWithControls: PropTypes.bool,\r\n /**\r\n * Local-storage key used by Mantine DataTable to persist\r\n * draggable / toggleable / resizable column state.\r\n */\r\n storeColumnsKey: PropTypes.string,\r\n defaultColumnProps: PropTypes.object,\r\n defaultColumnRender: PropTypes.any,\r\n sortIcons: PropTypes.object,\r\n bodyRef: PropTypes.any,\r\n tableRef: PropTypes.any,\r\n m: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mx: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n my: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mt: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mb: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ms: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n me: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ml: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mr: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n p: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n px: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n py: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pt: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pb: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ps: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pe: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pl: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pr: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n w: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n miw: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n maw: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n h: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mih: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mah: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n opacity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ff: PropTypes.string,\r\n fz: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n fw: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n lts: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ta: PropTypes.string,\r\n lh: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n fs: PropTypes.string,\r\n tt: PropTypes.string,\r\n display: PropTypes.string,\r\n flex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n bd: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n bdrs: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n td: PropTypes.string,\r\n bgsz: PropTypes.string,\r\n bgp: PropTypes.string,\r\n bgr: PropTypes.string,\r\n bga: PropTypes.string,\r\n pos: PropTypes.string,\r\n top: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n left: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n bottom: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n right: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n inset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n hiddenFrom: PropTypes.string,\r\n visibleFrom: PropTypes.string,\r\n\r\n /**\r\n * Dash-assigned callback that reports property changes back to Dash.\r\n */\r\n setProps: PropTypes.func,\r\n};\r\n\r\nDataTable.dashChildrenUpdate = true;\r\n\r\nexport default DataTable;\r\n\r\nexport const defaultProps = DataTable.defaultProps;\r\nexport const propTypes = DataTable.propTypes;\r\n","import 'mantine-datatable/styles.layer.css';\nimport './styles/layers.css';\n\nimport DataTable from './components/DataTable.react';\n\nexport { DataTable };\nexport const DashMantineDatatable = DataTable;\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","exports","cssWithMappingToString","list","toString","this","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","f","Symbol","for","l","m","Object","prototype","hasOwnProperty","n","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","p","key","ref","__self","__source","q","c","a","g","b","d","e","h","call","defaultProps","$$typeof","type","props","_owner","current","Fragment","jsx","jsxs","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","getTarget","Error","appendChild","element","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","o","defineProperty","enumerable","get","prop","r","toStringTag","value","url","getCurrentScript","script","currentScript","doc_scripts","getElementsByTagName","scripts","filter","s","async","text","textContent","slice","src","split","jsonpScriptSrc","__jsonpScriptSrc__","chunkId","isLocal","test","srcFragments","fileFragments","nc","locals","t","Array","isArray","arguments","Mt","ue","it","children","columnsOrder","setColumnsOrder","columnsToggle","setColumnsToggle","resetColumnsOrder","resetColumnsToggle","setColumnWidth","setMultipleColumnWidths","u","resetColumnsWidth","sourceColumn","setSourceColumn","targetColumn","setTargetColumn","swapColumns","indexOf","y","v","Nt","className","Lt","width","height","viewBox","strokeWidth","stroke","fill","strokeLinecap","strokeLinejoin","Wt","icon","active","component","size","zt","columns","getInitialValueInEffect","headerRef","scrollViewportRef","onFixedLayoutChange","accessor","defaultValue","forEach","find","includes","It","defaultToggle","toggleable","toggled","At","columnsWidth","setColumnsWidth","hasResizableColumns","allResizableWidthsInitial","measureAndSetColumnWidths","M","some","resizable","hidden","x","from","querySelectorAll","E","L","getAttribute","C","w","getBoundingClientRect","Math","round","keys","R","requestAnimationFrame","setTimeout","W","clearTimeout","D","T","P","every","values","_t","effectiveColumns","ct","ut","Bt","Vt","Gt","Ft","G","setProperty","pt","borderBoxSize","contentBoxSize","inlineSize","blockSize","contentRect","mt","ResizeObserver","observe","disconnect","Ut","matchMedia","matches","wa","addEventListener","removeEventListener","addListener","removeListener","xa","J","de","replace","trim","toLowerCase","charAt","toUpperCase","He","findIndex","ft","match","reduce","_","bt","max","groups","Pe","Oe","Tt","me","pe","X","_e","to","j","Z","Y","oo","visibleMediaQuery","title","noWrap","ellipsis","textAlign","minWidth","maxWidth","no","shadowVisible","ao","defaultColumnProps","selectionVisible","selectorCellShadowVisible","footer","footerClassName","footerStyle","ro","group","maxDepth","currentDepth","previousGroups","isLastGroup","withColumnBorders","totalTableColumns","Kt","jt","colSpan","rowSpan","io","co","uo","isActive","filterPopoverProps","filterPopoverDisableClickOutside","close","toggle","withArrow","shadow","opened","onClose","trapFocus","variant","onClick","preventDefault","onKeyDown","stopPropagation","fo","columnRef","next","dir","nextElementSibling","clientX","offsetWidth","min","body","cursor","userSelect","parseInt","onMouseDown","onDoubleClick","bo","To","go","ho","yo","sortable","draggable","sortIcons","sortStatus","onSortStatusChange","filtering","sortKey","H","defaultPrevented","columnAccessor","direction","role","tabIndex","justify","wrap","align","onDragStart","onDragEnter","onDragOver","onDrop","onDragLeave","F","U","sorted","unsorted","xo","trigger","checked","indeterminate","checkboxProps","onChange","disabled","classNames","input","So","selectionColumnHeaderRef","selectionTrigger","selectionChecked","selectionIndeterminate","onSelectionChange","selectionCheckboxProps","selectionColumnClassName","selectionColumnStyle","fromEntries","String","onContextMenu","S","I","A","fe","be","Te","ge","titleClassName","te","titleStyle","he","Ce","Q","Je","je","Ze","position","label","currentTarget","Po","fetching","customContent","backgroundBlur","color","backdropFilter","O","theme","vo","backgroundColor","borderColor","rowBorderColor","stripedColor","highlightOnHoverColor","Xe","paginationActiveTextColor","paginationActiveBackgroundColor","ko","No","xs","sm","md","lg","xl","Wo","activeTextColor","activeBackgroundColor","gap","withinPortal","offset","arrow","section","rightSection","fontWeight","paddingLeft","spacing","paddingRight","Oo","page","onPageChange","paginationWithEdges","paginationWithControls","paginationSize","loadingText","noRecordsText","paginationText","totalRecords","recordsPerPage","onRecordsPerPageChange","recordsPerPageLabel","recordsPerPageOptions","recordsLength","horizontalSpacing","paginationWrapBreakpoint","getPaginationControlProps","getPaginationItemProps","renderPagination","ceil","breakpoints","Text","PageSizeSelector","Pagination","root","control","withEdges","withControls","total","getControlProps","getItemProps","state","totalPages","isWrapped","actions","setPage","setRecordsPerPage","Controls","px","py","flexDirection","_o","record","render","defaultRender","customCellAttributes","zo","open","collapseProps","expanded","visible","clear","start","eo","transitionDuration","in","Vo","withRightShadow","getCheckboxProps","$o","defaultColumnRender","isRecordSelectable","getSelectionCheckboxProps","onCellClick","onCellDoubleClick","onCellContextMenu","expansion","customAttributes","rowFactory","hiddenContent","cellsClassName","cellsStyle","event","column","columnIndex","isRowExpanded","isExpandable","expandOnClick","expandRow","collapseRow","Mo","Zr","rowProps","expandedElement","Uo","leftShadowBehind","rightShadowBehind","onScrollPositionChange","viewportRef","scrollAreaProps","scrollbar","thumb","corner","ll","withTableBorder","borderRadius","textSelectionDisabled","minHeight","maxHeight","verticalAlign","storeColumnsKey","pinFirstColumn","pinLastColumn","idAccessor","records","selectedRecords","onSelectedRecordsChange","allRecordsSelectionCheckboxProps","getRecordSelectionCheckboxProps","V","xe","et","loaderBackgroundBlur","customLoader","jo","loaderSize","Zo","loaderType","Yo","loaderColor","qo","en","emptyState","tn","wt","noRecordsIcon","on","highlightOnHover","nn","striped","an","noHeader","rn","onRowClick","ln","onRowDoubleClick","sn","onRowContextMenu","cn","un","dn","mn","onScroll","pn","onScrollToTop","fn","onScrollToBottom","bn","onScrollToLeft","Tn","onScrollToRight","gn","hn","Cn","yn","Dn","xn","wn","rowColor","Sn","rowBackgroundColor","Rn","rowExpansion","Pn","rowClassName","vn","rowStyle","Mn","customRowAttributes","kn","En","Nn","tableRef","Ln","bodyRef","Wn","In","my","Hn","mx","On","mb","An","ml","zn","mr","Bn","Vn","ye","Gn","styles","De","Fn","tableWrapper","Ye","qe","refs","$","$n","scrollCallbacks","withRowBorders","table","scrollViewport","header","selectionColumnHeader","top","bottom","left","right","scrollTop","scrollLeft","getComputedStyle","scrollWidth","abs","tagName","$t","tt","Xn","Un","Qn","allowMultiple","initiallyExpanded","expandable","recordIds","onRecordIdsChange","collapse","Zt","ke","St","ot","Kn","N","we","oe","scrollTo","cancelAnimationFrame","Rt","se","Se","Pt","nt","Ee","Ne","Jn","jn","lastSelectionChangeIndex","Le","setLastSelectionChangeIndex","Zn","Xt","at","Yn","qn","radius","boxShadow","shadows","vt","rt","lt","ea","nativeEvent","shiftKey","ce","ne","ae","Jt","pagination","dl","isDragging","parentElement","EMPTY_ARRAY","EMPTY_OBJECT","NOOP_SET_PROPS","GROUP_RECORD_PREFIX","TEMPLATE_TOKEN_PATTERN","ROOT_STYLE_PROP_NAMES","isNil","isPlainObject","_typeof","isDryComponent","Boolean","namespace","DASH_COMPONENT_TYPE_NAMES","WeakMap","getAccessorValue","accumulator","setAccessorValue","nextRecord","_toConsumableArray","_objectSpread","currentSource","sourceValue","nextValue","findRecordInCollection","recordId","childRowsAccessor","_step","_iterator","_createForOfIteratorHelper","done","getRecordId","nestedMatch","err","updateRecordValueInCollection","didUpdate","nextRecords","childRows","updatedChildren","areEditableValuesEqual","Date","_unused","getEditorTypeName","node","_node$type","_node$type2","React","has","displayName","name","extractEditorValue","valueProp","normalizeEditableValue","editorDefinition","editorTypeName","presentation","toISOString","FILTER_VALUE_PROP_BY_TYPE","Checkbox","Switch","FILTER_TEXT_CONTROL_TYPES","Set","FILTER_MULTI_CONTROL_TYPES","FILTER_RANGE_CONTROL_TYPES","FILTER_DATE_CONTROL_TYPES","FILTER_EQUALITY_CONTROL_TYPES","FILTER_CONTROL_TYPES","FILTER_INACTIVE_STRING_VALUES","mergeEditorNestedProps","overrides","mergeFilterNestedProps","defaults","safeStringify","_unused2","serializeComponentId","getNodeProps","getFilterControlKey","nodePath","serializedId","pathKey","getFilterDefaultValue","defaultValueProp","collectFilterControls","controls","filterRegistration","autoFilter","typeName","hasDashValueProp","setProps","isFilterControlNode","filterNode","filterValueProp","resolveFilterValueProp","path","flatMap","child","setFilterValueInCollection","filterValues","filterKey","inputCount","nextValues","currentColumnValue","_defineProperty","getFilterValueFromCollection","hasValue","columnValue","isFilterValueActive","emptyValue","normalizedValue","getActiveColumnFilterEntries","valueInfo","resolvedColumn","filterEmptyValue","resolveFilterEmptyValue","entry","isColumnFilterActive","normalizeFilterComparableValue","getTime","numericValue","Number","isFinite","isDateLikeString","dateValue","parse","filterValuesEqual","caseSensitive","normalizedLeft","normalizedRight","leftText","rightText","compareFilterValues","inferBoundOperator","entryText","_entry$props","_entry$props2","_entry$props3","placeholder","getFilterEntryText","matchesInFilter","recordValue","filterValue","filterItems","filterItem","matchesBetweenFilter","lowerValue","upperValue","matchesColumnFilters","activeEntries","filterAccessor","filterValueAccessor","entries","filterOperator","filterMatchMode","shouldUseRangeEntries","_getRangeBoundsFromEn","operator","getRangeBoundsFromEntries","_getRangeBoundsFromEn2","_slicedToArray","_entry$props4","inferFilterOperator","filterCaseSensitive","filterPredicate","haystack","toSearchableText","needle","matchesContainsFilter","startsWith","endsWith","_ref2","matchesSingleColumnFilter","enhanceFilterNode","filterOptions","_filterOptions$filter","existingProps","enhancedChildren","filterDefinitionsByAccessor","controlKey","nextProps","hasExistingValue","comboboxProps","popoverProps","originalSetProps","originalOnChange","handleFilterChange","handleFilterValueChange","nextChildProps","_len2","args","_key2","EditableCellPopover","_ref3","editor","isEditing","closeEditor","handleValueChange","dropdownRef","useRef","useEffect","frameId","_dropdownRef$current","focusTarget","focus","preventScroll","_unused3","Popover","closeOnClickOutside","onDismiss","portalProps","reuseTargetNode","zIndex","Target","Box","clsx","Dropdown","editorNode","editorValueProp","resolveEditorValueProp","originalOnKeyDown","_len","_key","isTextLikeEditor","enhanceEditorNode","serializeGroupValue","_unused4","buildGroupRecordId","_ref4","compareAggregationValues","normalizeComparableValue","BUILT_IN_GROUP_AGGREGATORS","_values","sum","numericValues","mean","median","sort","middleIndex","floor","comparableValues","currentMin","currentMax","applyGroupAggregations","leafRecords","aggregationDefinitions","outputAccessor","sourceAccessor","aggregator","leafRecord","normalizedAggregator","source","lambdaMatch","exec","Function","_unused5","compileCustomAggregator","aggregatedValue","isInlineHierarchyParentRecord","__group","__hierarchyParent","buildGroupedRecords","accessors","_accessors","_toArray","remainingAccessors","_arrayLikeToArray","groupedEntries","groupedRecordsByKey","Map","groupValue","groupKey","groupPath","groupRecord","__groupAccessor","__groupId","__groupLevel","__groupPath","__groupValue","__groupedRecords","__remainingGroupBy","nextEntry","set","childPath","childRecords","__leafRecords","__children","collectGroupedRecordIds","buildChildRowsRecords","level","hasChildrenAccessor","hasAccessorPath","rawChildren","childRecord","flattenGroupedRecords","expandedRecordIds","collectHierarchyRecords","mergeExpandedRecordIds","_len3","lists","_key3","interpolateTemplate","template","getTemplateValue","context","normalizedAccessor","locale","directContextValue","interpolateTemplateValue","matchAll","resolvedValue","interpolateDryComponentNode","_ref1","_ref10","buildTemplateClickPayload","componentProps","payload","buildEventPayload","templateId","actionType","action","normalizeTemplateAction","withTemplateClickHandler","renderOptions","n_clicks","updateProps","originalOnClick","cellClick","renderTemplateNode","componentType","_window","resolveDashComponentType","interpolatedProps","_ref11","_ref12","resolvedProps","renderedChildren","materializeDashComponent","_ref13","_ref14","buildTemplateContext","row","resolveTemplateNode","resolveTemplateRender","resolveStaticTemplateNode","buildDisplayValue","accessorValue","valueAccessor","effectiveLocale","intlOptions","formatOptions","isNaN","currency","minimumFractionDigits","maximumFractionDigits","Intl","NumberFormat","format","nextDate","toDate","dateStyle","timeStyle","DateTimeFormat","trueLabel","falseLabel","formatPrimitiveValue","toComparableValue","joinRecordIdParts","separator","matchesRowSelector","selector","childSelector","_ref15","actualValue","_ref16","expectedValue","condition","eq","gt","gte","lte","notIn","contains","matchesSelectorCondition","resolveRowRuleEntryValue","fallbackKey","when","rule","getRowRuleValue","buildRowValueResolver","_ref17$merge","merge","mergedValue","buildRowBooleanResolver","params","timestamp","now","flattenGroupColumns","groupDefinitions","syncGroupsWithEffectiveColumns","groupAccessors","buildColumn","editingOptions","resolvedFilter","resolvedFiltering","cellAttributes","rawValue","formattedValue","customRender","badgeColor","badgeColorAccessor","Badge","badgeRadius","badgeVariant","href","hrefAccessor","hrefTemplate","Anchor","Code","progressValue","Progress","progressColor","progressRadius","whiteSpace","fw","editable","isEditingCell","TextInput","buildGroup","childGroup","DataTable","_ref18","_ref18$data","_ref18$columns","_ref18$groups","_ref18$groupBy","groupBy","_ref18$childRowsAcces","_ref18$groupAggregati","groupAggregations","_ref18$idAccessor","_ref18$locale","_ref18$paginationMode","paginationMode","_ref18$sortMode","sortMode","_ref18$searchMode","searchMode","_ref18$filterMode","filterMode","_ref18$recordsPerPage","_ref18$pageSize","pageSize","_ref18$noRecordsText","_ref18$pageSizeOption","pageSizeOptions","_ref18$recordsPerPage2","_ref18$recordsPerPage3","_ref18$paginationSize","_ref18$selectionTrigg","_ref18$tableProps","tableProps","_ref18$scrollAreaProp","_objectWithoutProperties","_excluded","_props$__groupLevel","searchQuery","searchableAccessors","selectedRecordIds","selectableRowRules","disabledSelectionRowRules","selectionCheckboxRules","rowDragging","rowAttributes","tableClassName","allRecords","normalizedGroupBy","normalizeGroupBy","normalizedChildRowsAccessor","normalizeChildRowsAccessor","normalizedGroupAggregations","_ref5","_ref7","_ref8","_ref9","_ref0","_definition$fn","_ref6","operation","lambda","hasRowGrouping","hasChildRowsHierarchy","hasInlineHierarchy","isGroupedChildTable","groupedRecordsForAllRows","initialGroupedExpandedIds","initialRowExpansionIds","initiallyExpandedRecordIds","initialPageSize","_useState2","useState","internalPage","setInternalPage","_useState4","internalRecordsPerPage","setInternalRecordsPerPage","_useState6","internalSortStatus","setInternalSortStatus","_useState8","internalSelectedIds","setInternalSelectedIds","_useState0","internalExpandedIds","setInternalExpandedIds","_useState10","activeEditableCell","setActiveEditableCell","deferredSearchQuery","useDeferredValue","currentPage","currentRecordsPerPage","currentSortStatus","currentSelectedIds","currentExpandedIds","rowDragSourceIdRef","_useState12","draggedRowId","setDraggedRowId","_useState14","dragOverRowId","setDragOverRowId","groupedColumns","hasTopLevelColumns","hasGroups","sourceColumns","useDataTableColumns","resolvedColumns","resolvedFilterColumns","_column$filterPopover","_column$filterPopover2","resolvedSearchableAccessors","searchable","templateRenderOptions","columnFilterDefinitions","effectiveColumn","filterTemplate","buildFilterDefinitions","filterDefinitionsKey","initialFilterValues","assign","_useState16","internalFilterValues","setInternalFilterValues","filterValuesControlled","currentValues","definitions","_definition$controls","syncFilterValuesWithDefinitions","currentFilterValues","clientSearchFilteredRecords","query","normalizedQuery","filterRecords","clientFilteredRecords","activeDefinitions","filterRecordsByColumnFilters","clientSortedRecords","leftValue","rightValue","sortRecords","computedTotalRecords","paginatedRecords","groupedRecords","childRowsRecords","displayedRecords","selectedRecordsPayload","selectableRowResolver","disabledSelectionRowResolver","selectionCheckboxPropsResolver","rowDraggingEnabled","clearRowDraggingState","closeEditableCell","handleEditableCellValueChange","currentRecord","currentValue","updatedRecords","syncExpandedRecordIds","nextExpandedRecordIds","lastExpansionChange","buildExpandedRecordProps","builtRowFactory","_ref19","DataTableDraggableRow","_extends","onDragEnd","dataTransfer","dropEffect","handleRowDragOver","_target$closest","closest","effectAllowed","setData","_unused6","handleRowDragStart","sourceRecordId","destinationRecordId","sourceIndex","destinationIndex","reorderedRecords","movedRecord","reorderByIndices","lastRowDragChange","handleRowDrop","hasActiveColumn","hasActiveRecord","resolvedDefaultColumnProps","resolvedDefaultColumnRender","defaultCellAttributes","nextFilterValues","shouldResetPage","lastFilterChange","columnFilterValue","builtColumns","builtGroupedColumns","originalRender","_record$__groupValue","_record$__groupLevel","renderedContent","groupLevel","isGroupRecord","isExpanded","paddingInlineStart","wrapGroupedCellContent","resolvedGroups","builtGroups","builtRowExpansion","_ref20","_ref21","_ref22","config","jsonValue","block","textValue","fields","Paper","withBorder","Stack","field","Group","grow","flex","derivedField","renderFieldValue","renderExpansionContent","resolvedSortIcons","resolvedEmptyStateNode","ta","resolvedNoRecordsIcon","resolvedCustomLoader","resolvedRootProps","bg","mih","mah","resolvedTableProps","layout","resolvedRowColor","resolvedRowBackgroundColor","resolvedRowClassName","buildRowClassNameResolver","resolvedRowStyle","mergedStyle","nextStyle","buildRowStyleResolver","resolvedRowAttributes","resolvedMantineIdAccessor","resolveMantineIdAccessor","resolvedSelectionTrigger","layoutDirection","DirectionProvider","detectDirection","initialDirection","MantineDataTable","cellContextMenu","_params$record","matchingColumn","cellDoubleClick","nextPage","nextRecordsPerPage","expandedId","toggleInlineHierarchyRecord","rowClick","rowContextMenu","rowDoubleClick","scrollPosition","scrollEdge","edge","nextSelectedRecords","nextSelectedIds","lastSelectionChange","nextSortStatus","lastSortChange","stickyHeader","stickyHeaderOffset","verticalSpacing","propTypes","PropTypes","ms","pb","ps","pl","pr","miw","maw","opacity","ff","fz","lts","lh","fs","display","bd","bdrs","td","bgsz","bgp","bgr","bga","pos","inset","hiddenFrom","visibleFrom","dashChildrenUpdate","DashMantineDatatable"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"dash_mantine_datatable.min.js","mappings":"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","sources":["webpack:///./node_modules/mantine-datatable/dist/styles.layer.css","webpack:///./src/lib/styles/layers.css","webpack:///./node_modules/css-loader/dist/runtime/api.js","webpack:///./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack:///./node_modules/react/cjs/react-jsx-runtime.production.min.js","webpack:///./node_modules/react/jsx-runtime.js","webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack:///./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack:///./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack:///./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack:///./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack:///./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack:///external window \"React\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/compat","webpack:///webpack/runtime/nonce","webpack:///./node_modules/mantine-datatable/dist/styles.layer.css?addd","webpack:///./src/lib/styles/layers.css?e426","webpack:///external window \"PropTypes\"","webpack:///./node_modules/clsx/dist/clsx.mjs","webpack:///external window \"MantineCore\"","webpack:///external window \"MantineHooks\"","webpack:///./node_modules/mantine-datatable/dist/index.mjs","webpack:///./src/lib/components/DataTable.react.js","webpack:///./src/lib/index.js"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `@layer mantine-datatable{.mantine-datatable-nowrap{white-space:nowrap}.mantine-datatable-ellipsis{overflow:hidden;text-overflow:ellipsis}.mantine-datatable-pointer-cursor{cursor:pointer}.mantine-datatable-context-menu-cursor{cursor:context-menu}.mantine-datatable-text-selection-disabled{user-select:none}.mantine-datatable-text-align-left{text-align:left}.mantine-datatable-text-align-center{text-align:center}.mantine-datatable-text-align-right{text-align:right}.mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-light,var(--mantine-color-text)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-color:var(\n --mantine-datatable-color-dark,var(--mantine-color-text)\n )}.mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-light,var(--mantine-color-body)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-background-color:var(\n --mantine-datatable-background-color-dark,var(--mantine-color-body)\n )}.mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-light,var(--mantine-color-gray-3)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-border-color:var(\n --mantine-datatable-border-color-dark,var(--mantine-color-dark-4)\n )}.mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-light,var(--mantine-datatable-border-color)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-row-border-color:var(\n --mantine-datatable-row-border-color-dark,var(--mantine-datatable-border-color)\n )}.mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-light,var(--mantine-color-gray-0)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-striped-color:var(\n --mantine-datatable-striped-color-dark,var(--mantine-color-dark-6)\n )}.mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-light,var(--mantine-color-gray-1)\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\n --mantine-datatable-highlight-on-hover-color-dark,var(--mantine-color-dark-5)\n )}.mantine-datatable{--mantine-datatable-selection-color:var(--mantine-primary-color-light);--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.05),transparent),linear-gradient(rgba(0,0,0,.05) 30%,transparent)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.25),transparent),linear-gradient(rgba(0,0,0,.25) 30%,transparent)}.mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.05),transparent),linear-gradient(270deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.25),transparent),linear-gradient(270deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.05)),linear-gradient(transparent 30%,rgba(0,0,0,.05))}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.25)),linear-gradient(transparent 30%,rgba(0,0,0,.25))}.mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.05),transparent),linear-gradient(90deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.25),transparent),linear-gradient(90deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-header-height:0;--mantine-datatable-footer-height:0;--mantine-datatable-selection-column-width:0;--mantine-datatable-top-shadow-opacity:0;--mantine-datatable-left-shadow-opacity:0;--mantine-datatable-bottom-shadow-opacity:0;--mantine-datatable-right-shadow-opacity:0;--mantine-datatable-footer-position:sticky;--mantine-datatable-footer-bottom:0;--mantine-datatable-last-row-border-bottom:unset;background:var(--mantine-datatable-background-color);color:var(--mantine-datatable-color);display:flex;flex-direction:column;overflow:hidden;position:relative}.mantine-datatable td,.mantine-datatable th{border-left:0}[dir=rtl] .mantine-datatable td,[dir=rtl] .mantine-datatable th{border-left:0;border-right:0}[dir=rtl] .mantine-datatable td:not(:first-of-type),[dir=rtl] .mantine-datatable th:not(:first-of-type){border-right:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-with-border{border:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-resizable-columns{table-layout:fixed}.mantine-datatable-resizable-columns th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mantine-datatable-pin-first-column td:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-resizable-columns th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible.mantine-datatable-resizable-columns th:nth-of-type(2),.mantine-datatable-pin-last-column td:last-of-type,.mantine-datatable-pin-last-column.mantine-datatable-resizable-columns th:last-of-type{overflow:visible}.mantine-datatable td[data-accessor=__selection__],.mantine-datatable th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable:not(.mantine-datatable-resizable-columns) th{max-width:none;min-width:auto;white-space:nowrap;width:auto}.mantine-datatable:not(.mantine-datatable-resizable-columns) td[data-accessor=__selection__],.mantine-datatable:not(.mantine-datatable-resizable-columns) th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable-table{background:var(--mantine-datatable-background-color);border-collapse:separate;border-spacing:0;color:inherit}.mantine-datatable-table td,.mantine-datatable-table th{border-color:var(--mantine-datatable-row-border-color)}.mantine-datatable-table tbody,.mantine-datatable-table td,.mantine-datatable-table tfoot,.mantine-datatable-table tfoot tr,.mantine-datatable-table th,.mantine-datatable-table thead,.mantine-datatable-table thead tr{background:inherit}.mantine-datatable-table[data-striped] tbody tr:nth-of-type(odd){background:var(--mantine-datatable-striped-color)}.mantine-datatable-table[data-highlight-on-hover] tbody tr:hover{background:var(--mantine-datatable-highlight-on-hover-color)}.mantine-datatable-table tbody tr:last-of-type{border-bottom:0}.mantine-datatable-table tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:var(--mantine-datatable-last-row-border-bottom)}.mantine-datatable-vertical-align-top td{vertical-align:top}.mantine-datatable-vertical-align-bottom td{vertical-align:bottom}.mantine-datatable-last-row-border-bottom-visible tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}}@layer mantine-datatable{.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,.mantine-datatable-pin-last-column th:last-of-type{position:sticky!important;right:calc(-.025rem*var(--mantine-scale));z-index:1;@-moz-document url-prefix(){right:0}}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type{left:calc(-.025rem*var(--mantine-scale));right:auto;@-moz-document url-prefix(){left:0}}.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,.mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-right:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\"\";left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);pointer-events:none;position:absolute;top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);border-right:0;left:100%;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto;z-index:2}.mantine-datatable-pin-last-column th:last-of-type:after,.mantine-datatable-pin-last-column tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):last-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tfoot th:last-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type{background:inherit}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\"\";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:var(--mantine-datatable-selection-column-width);position:sticky!important;z-index:1}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:auto;right:var(--mantine-datatable-selection-column-width)}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\"\";opacity:var(--mantine-datatable-left-shadow-opacity);pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);right:auto}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:0}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tfoot th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tfoot th:first-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type{background:inherit}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):before,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\"\";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-cell-resizable:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th.mantine-datatable-header-cell-resizable:first-of-type,.mantine-datatable-pin-last-column th.mantine-datatable-header-cell-resizable:last-of-type{position:sticky!important}.mantine-datatable-empty-row,.mantine-datatable-table[data-highlight-on-hover] tbody .mantine-datatable-empty-row:hover{background:transparent}.mantine-datatable-empty-state{bottom:0;color:var(--mantine-color-gray-6);flex-direction:column;left:0;pointer-events:none;position:absolute;right:0;top:0}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state{color:var(--mantine-color-dark-3)}.mantine-datatable-empty-state{opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);transition:opacity .2s}.mantine-datatable-empty-state[data-active]{opacity:1}.mantine-datatable-empty-state-icon{background:var(--mantine-color-gray-2);border-radius:50%;font-size:0;padding:var(--mantine-spacing-xs)}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state-icon{background:var(--mantine-color-dark-5)}.mantine-datatable-empty-state-icon{margin-bottom:calc(var(--mantine-spacing-xs)/2)}.mantine-datatable-footer{bottom:var(--mantine-datatable-footer-bottom);position:var(--mantine-datatable-footer-position);z-index:2}.mantine-datatable-footer th{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-footer-selector-placeholder-cell{left:0;position:sticky;width:0}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell{left:auto;right:0}.mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:\"\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-header{position:sticky;top:0;z-index:2}.mantine-datatable-header th{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-header-column-toggle-checkbox-label{user-select:none}.mantine-datatable-header-cell-sortable{cursor:pointer;transition:background .2s}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{.mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable{border-radius:calc(.375rem*var(--mantine-scale));cursor:grab;transition:all .2s}.mantine-datatable-header-cell-draggable:active{cursor:grabbing}.mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-2)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable-action-icon{cursor:inherit;margin:calc(-.125rem*var(--mantine-scale)) calc(.125rem*var(--mantine-scale)) 0}.mantine-datatable-header-cell-drag-over{background:var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-drag-over{background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-toggleable-icon{opacity:.1;transition:opacity .2s}.mantine-datatable-header-cell-toggleable:hover .mantine-datatable-header-cell-toggleable-icon{opacity:1}.mantine-datatable-header-cell-resizable{position:relative}.mantine-datatable-header-resizable-handle{background:transparent;bottom:0;cursor:col-resize;opacity:0;position:absolute;right:-6px;top:0;transition:opacity .2s;width:12px;z-index:0}.mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-gray-4);bottom:2px;content:\"\";left:5px;position:absolute;top:2px;width:2px}[data-mantine-color-scheme=dark] .mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-dark-4)}.mantine-datatable-header-resizable-handle:after{border-radius:1px;transition:background-color .2s}[dir=rtl] .mantine-datatable-header-resizable-handle:after{left:auto;right:5px}.mantine-datatable-header-resizable-handle:hover{opacity:1}.mantine-datatable-header-resizable-handle:hover:after{background:var(--mantine-primary-color-6)}.mantine-datatable-header-resizable-handle:active{opacity:1!important}.mantine-datatable-header-resizable-handle:active:after{background:var(--mantine-primary-color-7)}[dir=rtl] .mantine-datatable-header-resizable-handle{left:-6px;right:auto}.mantine-datatable-header-cell-toggleable.mantine-datatable-header-cell-resizable:hover .mantine-datatable-header-resizable-handle,tr:hover .mantine-datatable-header-resizable-handle{opacity:1}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){transition:background .1s}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{transition:background .1s}.mantine-datatable-header-cell-sortable-group{gap:.25em}.mantine-datatable-header-cell-sortable-text{flex-grow:1;min-width:0}.mantine-datatable-header-cell-sortable-icon{transition:transform .2s}.mantine-datatable-header-cell-sortable-icon-reversed{transform:scaleY(-1)}.mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-sortable-unsorted-icon{transition:color .2s}th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-6)}[data-mantine-color-scheme=dark] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-2)}.mantine-datatable-header-cell-filter-action-icon{border:0;color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-filter-action-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-filter-action-icon[data-active]{color:var(--mantine-color-text)}.mantine-datatable-header-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:\"\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-column-group-header-cell--needs-border{border-inline-end:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-loader{background:color-mix(in srgb,var(--mantine-datatable-background-color),transparent 25%);bottom:0;left:0;opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s;z-index:3}.mantine-datatable-loader-fetching{opacity:1;pointer-events:all}.mantine-datatable-page-size-selector-button-icon{margin:0 calc(-.25rem*var(--mantine-scale)) 0 calc(.125rem*var(--mantine-scale))}[dir=rtl] .mantine-datatable-page-size-selector-button-icon{margin:0 calc(.125rem*var(--mantine-scale)) 0 calc(-.25rem*var(--mantine-scale))}.mantine-datatable-page-size-selector-menu-arrow{z-index:-1}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-page-size-selector-active{background:var(--mantine-datatable-pagination-active-background-color);color:var(--mantine-datatable-pagination-active-text-color);opacity:1}.mantine-datatable-pagination{align-items:center;background:inherit;border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color);display:flex;gap:var(--mantine-spacing-xs);justify-content:space-between}.mantine-datatable-pagination-text{flex:1 1 auto}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\n )}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\n )}.mantine-datatable-pagination-pages{opacity:1;transition:opacity .2s}.mantine-datatable-pagination-pages-fetching{opacity:0}.mantine-datatable-pagination-pages-control{border-color:var(--mantine-datatable-border-color);color:var(--mantine-datatable-color)}.mantine-datatable-pagination-pages-control[data-active]{background:var(--mantine-datatable-pagination-active-background-color);border-color:transparent;color:var(--mantine-datatable-pagination-active-text-color)}.mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-color:var(\n --mantine-datatable-row-color-dark\n )}.mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-light\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-background-color:var(\n --mantine-datatable-row-background-color-dark\n )}.mantine-datatable-row{background:var(--mantine-datatable-row-background-color,inherit);color:var(--mantine-datatable-row-color,inherit)}.mantine-datatable-row[data-with-row-border]:not(:last-of-type) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row[data-selected] td{background:var(--mantine-datatable-selection-color)}.mantine-datatable-row-expansion-cell{padding:0}tr:not(:last-of-type) .mantine-datatable-row-expansion-cell-content{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row-expansion-cell-content{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}[data-with-row-border] .mantine-datatable-row-expansion-cell-content{border-top:0}.mantine-datatable-row-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-row-selector-cell{left:auto;right:0}tr[data-selected] .mantine-datatable-row-selector-cell{background:inherit}tr[data-selected] .mantine-datatable-row-selector-cell:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\"\";left:0;position:absolute;right:0;top:0}.mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\"\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}tr[data-with-row-border] .mantine-datatable-row-selector-cell:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}tr:last-of-type .mantine-datatable-row-selector-cell:after{bottom:0}.mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-row-selector-cell-checkbox{cursor:pointer}.mantine-datatable-scroll-area{flex:1 1 100%}.mantine-datatable-scroll-area-corner{background:transparent}.mantine-datatable-scroll-area-thumb{z-index:3}.mantine-datatable-scroll-area-scrollbar[data-state=visible]{background:transparent}.mantine-datatable-scroll-area-scrollbar div:before{pointer-events:none}.mantine-datatable-scroll-area-shadow{pointer-events:none;position:absolute;transition:opacity .2s}.mantine-datatable-scroll-area-top-shadow{background:var(--mantine-datatable-shadow-background-top);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-top-shadow-opacity);right:0;top:var(--mantine-datatable-header-height);z-index:2}.mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-left);bottom:0;left:0;opacity:var(--mantine-datatable-left-shadow-opacity);top:0;width:var(--mantine-spacing-xs);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-left-shadow{left:auto}.mantine-datatable-scroll-area-right-shadow,[dir=rtl] .mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-right);opacity:var(--mantine-datatable-right-shadow-opacity);right:0}.mantine-datatable-scroll-area-right-shadow{bottom:0;top:0;width:calc(var(--mantine-spacing-xs)/2);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-right-shadow{background:var(--mantine-datatable-shadow-background-left);left:0;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto}.mantine-datatable-scroll-area-shadow-behind{z-index:0}.mantine-datatable-scroll-area-bottom-shadow{background:var(--mantine-datatable-shadow-background-bottom);bottom:var(--mantine-datatable-footer-height);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-bottom-shadow-opacity);right:0;z-index:2}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}`, \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/mantine-datatable/dist/styles.layer.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"@layer mantine-datatable{.mantine-datatable-nowrap{white-space:nowrap}.mantine-datatable-ellipsis{overflow:hidden;text-overflow:ellipsis}.mantine-datatable-pointer-cursor{cursor:pointer}.mantine-datatable-context-menu-cursor{cursor:context-menu}.mantine-datatable-text-selection-disabled{user-select:none}.mantine-datatable-text-align-left{text-align:left}.mantine-datatable-text-align-center{text-align:center}.mantine-datatable-text-align-right{text-align:right}.mantine-datatable{--mantine-datatable-color:var(\\n --mantine-datatable-color-light,var(--mantine-color-text)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-color:var(\\n --mantine-datatable-color-dark,var(--mantine-color-text)\\n )}.mantine-datatable{--mantine-datatable-background-color:var(\\n --mantine-datatable-background-color-light,var(--mantine-color-body)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-background-color:var(\\n --mantine-datatable-background-color-dark,var(--mantine-color-body)\\n )}.mantine-datatable{--mantine-datatable-border-color:var(\\n --mantine-datatable-border-color-light,var(--mantine-color-gray-3)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-border-color:var(\\n --mantine-datatable-border-color-dark,var(--mantine-color-dark-4)\\n )}.mantine-datatable{--mantine-datatable-row-border-color:var(\\n --mantine-datatable-row-border-color-light,var(--mantine-datatable-border-color)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-row-border-color:var(\\n --mantine-datatable-row-border-color-dark,var(--mantine-datatable-border-color)\\n )}.mantine-datatable{--mantine-datatable-striped-color:var(\\n --mantine-datatable-striped-color-light,var(--mantine-color-gray-0)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-striped-color:var(\\n --mantine-datatable-striped-color-dark,var(--mantine-color-dark-6)\\n )}.mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\\n --mantine-datatable-highlight-on-hover-color-light,var(--mantine-color-gray-1)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-highlight-on-hover-color:var(\\n --mantine-datatable-highlight-on-hover-color-dark,var(--mantine-color-dark-5)\\n )}.mantine-datatable{--mantine-datatable-selection-color:var(--mantine-primary-color-light);--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.05),transparent),linear-gradient(rgba(0,0,0,.05) 30%,transparent)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-top:linear-gradient(rgba(0,0,0,.25),transparent),linear-gradient(rgba(0,0,0,.25) 30%,transparent)}.mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.05),transparent),linear-gradient(270deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-right:linear-gradient(270deg,rgba(0,0,0,.25),transparent),linear-gradient(270deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.05)),linear-gradient(transparent 30%,rgba(0,0,0,.05))}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-bottom:linear-gradient(transparent,rgba(0,0,0,.25)),linear-gradient(transparent 30%,rgba(0,0,0,.25))}.mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.05),transparent),linear-gradient(90deg,rgba(0,0,0,.05),transparent 30%)}[data-mantine-color-scheme=dark] .mantine-datatable{--mantine-datatable-shadow-background-left:linear-gradient(90deg,rgba(0,0,0,.25),transparent),linear-gradient(90deg,rgba(0,0,0,.25),transparent 30%)}.mantine-datatable{--mantine-datatable-header-height:0;--mantine-datatable-footer-height:0;--mantine-datatable-selection-column-width:0;--mantine-datatable-top-shadow-opacity:0;--mantine-datatable-left-shadow-opacity:0;--mantine-datatable-bottom-shadow-opacity:0;--mantine-datatable-right-shadow-opacity:0;--mantine-datatable-footer-position:sticky;--mantine-datatable-footer-bottom:0;--mantine-datatable-last-row-border-bottom:unset;background:var(--mantine-datatable-background-color);color:var(--mantine-datatable-color);display:flex;flex-direction:column;overflow:hidden;position:relative}.mantine-datatable td,.mantine-datatable th{border-left:0}[dir=rtl] .mantine-datatable td,[dir=rtl] .mantine-datatable th{border-left:0;border-right:0}[dir=rtl] .mantine-datatable td:not(:first-of-type),[dir=rtl] .mantine-datatable th:not(:first-of-type){border-right:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-with-border{border:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-resizable-columns{table-layout:fixed}.mantine-datatable-resizable-columns th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mantine-datatable-pin-first-column td:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-resizable-columns th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible.mantine-datatable-resizable-columns th:nth-of-type(2),.mantine-datatable-pin-last-column td:last-of-type,.mantine-datatable-pin-last-column.mantine-datatable-resizable-columns th:last-of-type{overflow:visible}.mantine-datatable td[data-accessor=__selection__],.mantine-datatable th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable:not(.mantine-datatable-resizable-columns) th{max-width:none;min-width:auto;white-space:nowrap;width:auto}.mantine-datatable:not(.mantine-datatable-resizable-columns) td[data-accessor=__selection__],.mantine-datatable:not(.mantine-datatable-resizable-columns) th[data-accessor=__selection__]{max-width:44px!important;min-width:44px!important;width:44px!important}.mantine-datatable-table{background:var(--mantine-datatable-background-color);border-collapse:separate;border-spacing:0;color:inherit}.mantine-datatable-table td,.mantine-datatable-table th{border-color:var(--mantine-datatable-row-border-color)}.mantine-datatable-table tbody,.mantine-datatable-table td,.mantine-datatable-table tfoot,.mantine-datatable-table tfoot tr,.mantine-datatable-table th,.mantine-datatable-table thead,.mantine-datatable-table thead tr{background:inherit}.mantine-datatable-table[data-striped] tbody tr:nth-of-type(odd){background:var(--mantine-datatable-striped-color)}.mantine-datatable-table[data-highlight-on-hover] tbody tr:hover{background:var(--mantine-datatable-highlight-on-hover-color)}.mantine-datatable-table tbody tr:last-of-type{border-bottom:0}.mantine-datatable-table tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:var(--mantine-datatable-last-row-border-bottom)}.mantine-datatable-vertical-align-top td{vertical-align:top}.mantine-datatable-vertical-align-bottom td{vertical-align:bottom}.mantine-datatable-last-row-border-bottom-visible tr:last-of-type:not(.mantine-datatable-empty-row) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}}@layer mantine-datatable{.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,.mantine-datatable-pin-last-column th:last-of-type{position:sticky!important;right:calc(-.025rem*var(--mantine-scale));z-index:1;@-moz-document url-prefix(){right:0}}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type{left:calc(-.025rem*var(--mantine-scale));right:auto;@-moz-document url-prefix(){left:0}}.mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,.mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-right:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\\\"\\\";left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);pointer-events:none;position:absolute;top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-last-column td:not(.mantine-datatable-row-expansion-cell):last-of-type:after,[dir=rtl] .mantine-datatable-pin-last-column th:last-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);border-right:0;left:100%;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto;z-index:2}.mantine-datatable-pin-last-column th:last-of-type:after,.mantine-datatable-pin-last-column tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):last-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tfoot th:last-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type{background:inherit}.mantine-datatable-pin-last-column tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):last-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\\\"\\\";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:var(--mantine-datatable-selection-column-width);position:sticky!important;z-index:1}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2),[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type{left:auto;right:var(--mantine-datatable-selection-column-width)}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\\\"\\\";opacity:var(--mantine-datatable-left-shadow-opacity);pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th:first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr:not(:nth-of-type(2)) th:nth-of-type(2):after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after,[dir=rtl] .mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);opacity:var(--mantine-datatable-right-shadow-opacity);right:auto}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:0}[dir=rtl] .mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-column-group-header-cell:nth-of-type(2):after,.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th:first-of-type:after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-with-row-border]:not(:last-of-type) td:not(.mantine-datatable-row-expansion-cell):first-of-type:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tfoot th:nth-of-type(2):after,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tfoot th:first-of-type:after{top:calc(-.0625rem*var(--mantine-scale))}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type{background:inherit}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):nth-of-type(2):before,.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) tr[data-selected] td:not(.mantine-datatable-row-expansion-cell):first-of-type:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\\\"\\\";left:0;position:absolute;right:0;top:0}.mantine-datatable-pin-first-column.mantine-datatable-selection-column-visible th.mantine-datatable-header-cell-resizable:nth-of-type(2),.mantine-datatable-pin-first-column:not(.mantine-datatable-selection-column-visible) th.mantine-datatable-header-cell-resizable:first-of-type,.mantine-datatable-pin-last-column th.mantine-datatable-header-cell-resizable:last-of-type{position:sticky!important}.mantine-datatable-empty-row,.mantine-datatable-table[data-highlight-on-hover] tbody .mantine-datatable-empty-row:hover{background:transparent}.mantine-datatable-empty-state{bottom:0;color:var(--mantine-color-gray-6);flex-direction:column;left:0;pointer-events:none;position:absolute;right:0;top:0}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state{color:var(--mantine-color-dark-3)}.mantine-datatable-empty-state{opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);transition:opacity .2s}.mantine-datatable-empty-state[data-active]{opacity:1}.mantine-datatable-empty-state-icon{background:var(--mantine-color-gray-2);border-radius:50%;font-size:0;padding:var(--mantine-spacing-xs)}[data-mantine-color-scheme=dark] .mantine-datatable-empty-state-icon{background:var(--mantine-color-dark-5)}.mantine-datatable-empty-state-icon{margin-bottom:calc(var(--mantine-spacing-xs)/2)}.mantine-datatable-footer{bottom:var(--mantine-datatable-footer-bottom);position:var(--mantine-datatable-footer-position);z-index:2}.mantine-datatable-footer th{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-footer-selector-placeholder-cell{left:0;position:sticky;width:0}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell{left:auto;right:0}.mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:\\\"\\\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-footer-selector-placeholder-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-header{position:sticky;top:0;z-index:2}.mantine-datatable-header th{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color)}.mantine-datatable-header-column-toggle-checkbox-label{user-select:none}.mantine-datatable-header-cell-sortable{cursor:pointer;transition:background .2s}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{.mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable{border-radius:calc(.375rem*var(--mantine-scale));cursor:grab;transition:all .2s}.mantine-datatable-header-cell-draggable:active{cursor:grabbing}.mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-gray-2)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)){background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-draggable-action-icon{cursor:inherit;margin:calc(-.125rem*var(--mantine-scale)) calc(.125rem*var(--mantine-scale)) 0}.mantine-datatable-header-cell-drag-over{background:var(--mantine-color-gray-3)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-drag-over{background:var(--mantine-color-dark-6)}.mantine-datatable-header-cell-toggleable-icon{opacity:.1;transition:opacity .2s}.mantine-datatable-header-cell-toggleable:hover .mantine-datatable-header-cell-toggleable-icon{opacity:1}.mantine-datatable-header-cell-resizable{position:relative}.mantine-datatable-header-resizable-handle{background:transparent;bottom:0;cursor:col-resize;opacity:0;position:absolute;right:-6px;top:0;transition:opacity .2s;width:12px;z-index:0}.mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-gray-4);bottom:2px;content:\\\"\\\";left:5px;position:absolute;top:2px;width:2px}[data-mantine-color-scheme=dark] .mantine-datatable-header-resizable-handle:after{background:var(--mantine-color-dark-4)}.mantine-datatable-header-resizable-handle:after{border-radius:1px;transition:background-color .2s}[dir=rtl] .mantine-datatable-header-resizable-handle:after{left:auto;right:5px}.mantine-datatable-header-resizable-handle:hover{opacity:1}.mantine-datatable-header-resizable-handle:hover:after{background:var(--mantine-primary-color-6)}.mantine-datatable-header-resizable-handle:active{opacity:1!important}.mantine-datatable-header-resizable-handle:active:after{background:var(--mantine-primary-color-7)}[dir=rtl] .mantine-datatable-header-resizable-handle{left:-6px;right:auto}.mantine-datatable-header-cell-toggleable.mantine-datatable-header-cell-resizable:hover .mantine-datatable-header-resizable-handle,tr:hover .mantine-datatable-header-resizable-handle{opacity:1}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active){transition:background .1s}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-blue-0)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{background:var(--mantine-color-dark-7)}.mantine-datatable-header-cell-resizable:has(.mantine-datatable-header-resizable-handle:active)+th{transition:background .1s}.mantine-datatable-header-cell-sortable-group{gap:.25em}.mantine-datatable-header-cell-sortable-text{flex-grow:1;min-width:0}.mantine-datatable-header-cell-sortable-icon{transition:transform .2s}.mantine-datatable-header-cell-sortable-icon-reversed{transform:scaleY(-1)}.mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-sortable-unsorted-icon{transition:color .2s}th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-gray-6)}[data-mantine-color-scheme=dark] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon{color:var(--mantine-color-dark-2)}.mantine-datatable-header-cell-filter-action-icon{border:0;color:var(--mantine-color-gray-5)}[data-mantine-color-scheme=dark] .mantine-datatable-header-cell-filter-action-icon{color:var(--mantine-color-dark-3)}.mantine-datatable-header-cell-filter-action-icon[data-active]{color:var(--mantine-color-text)}.mantine-datatable-header-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-header-selector-cell{left:auto;right:0}.mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:calc(-.0625rem*var(--mantine-scale));content:\\\"\\\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-header-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}.mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-header-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-column-group-header-cell--needs-border{border-inline-end:1px solid var(--mantine-datatable-row-border-color)}.mantine-datatable-loader{background:color-mix(in srgb,var(--mantine-datatable-background-color),transparent 25%);bottom:0;left:0;opacity:0;padding-bottom:var(--mantine-datatable-footer-height,0);padding-top:var(--mantine-datatable-header-height,0);pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s;z-index:3}.mantine-datatable-loader-fetching{opacity:1;pointer-events:all}.mantine-datatable-page-size-selector-button-icon{margin:0 calc(-.25rem*var(--mantine-scale)) 0 calc(.125rem*var(--mantine-scale))}[dir=rtl] .mantine-datatable-page-size-selector-button-icon{margin:0 calc(.125rem*var(--mantine-scale)) 0 calc(-.25rem*var(--mantine-scale))}.mantine-datatable-page-size-selector-menu-arrow{z-index:-1}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-text-color:var(\\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\\n )}.mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-page-size-selector-active{--mantine-datatable-pagination-active-background-color:var(\\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\\n )}.mantine-datatable-page-size-selector-active{background:var(--mantine-datatable-pagination-active-background-color);color:var(--mantine-datatable-pagination-active-text-color);opacity:1}.mantine-datatable-pagination{align-items:center;background:inherit;border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-border-color);display:flex;gap:var(--mantine-spacing-xs);justify-content:space-between}.mantine-datatable-pagination-text{flex:1 1 auto}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\\n --mantine-datatable-pagination-active-text-color-light,var(--mantine-color-white)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-text-color:var(\\n --mantine-datatable-pagination-active-text-color-dark,var(--mantine-color-white)\\n )}.mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\\n --mantine-datatable-pagination-active-background-color-light,var(--mantine-primary-color-filled)\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-pagination-pages{--mantine-datatable-pagination-active-background-color:var(\\n --mantine-datatable-pagination-active-background-color-dark,var(--mantine-primary-color-filled)\\n )}.mantine-datatable-pagination-pages{opacity:1;transition:opacity .2s}.mantine-datatable-pagination-pages-fetching{opacity:0}.mantine-datatable-pagination-pages-control{border-color:var(--mantine-datatable-border-color);color:var(--mantine-datatable-color)}.mantine-datatable-pagination-pages-control[data-active]{background:var(--mantine-datatable-pagination-active-background-color);border-color:transparent;color:var(--mantine-datatable-pagination-active-text-color)}.mantine-datatable-row{--mantine-datatable-row-color:var(\\n --mantine-datatable-row-color-light\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-color:var(\\n --mantine-datatable-row-color-dark\\n )}.mantine-datatable-row{--mantine-datatable-row-background-color:var(\\n --mantine-datatable-row-background-color-light\\n )}[data-mantine-color-scheme=dark] .mantine-datatable-row{--mantine-datatable-row-background-color:var(\\n --mantine-datatable-row-background-color-dark\\n )}.mantine-datatable-row{background:var(--mantine-datatable-row-background-color,inherit);color:var(--mantine-datatable-row-color,inherit)}.mantine-datatable-row[data-with-row-border]:not(:last-of-type) td{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row[data-selected] td{background:var(--mantine-datatable-selection-color)}.mantine-datatable-row-expansion-cell{padding:0}tr:not(:last-of-type) .mantine-datatable-row-expansion-cell-content{border-bottom:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}.mantine-datatable-row-expansion-cell-content{border-top:calc(.0625rem*var(--mantine-scale)) solid var(--mantine-datatable-row-border-color)}[data-with-row-border] .mantine-datatable-row-expansion-cell-content{border-top:0}.mantine-datatable-row-selector-cell{left:0;max-width:44px;min-width:44px;padding:var(--mantine-spacing-xs);position:sticky;text-align:center;width:44px;z-index:1}[dir=rtl] .mantine-datatable-row-selector-cell{left:auto;right:0}tr[data-selected] .mantine-datatable-row-selector-cell{background:inherit}tr[data-selected] .mantine-datatable-row-selector-cell:before{background:var(--mantine-datatable-selection-color);bottom:0;content:\\\"\\\";left:0;position:absolute;right:0;top:0}.mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-left);border-left:1px solid var(--mantine-datatable-row-border-color);bottom:0;content:\\\"\\\";opacity:0;pointer-events:none;position:absolute;right:calc(var(--mantine-spacing-xs)*-1);top:0;transition:opacity .2s;width:var(--mantine-spacing-xs)}[dir=rtl] .mantine-datatable-row-selector-cell:after{background:var(--mantine-datatable-shadow-background-right);border-left:0;border-right:1px solid var(--mantine-datatable-row-border-color);left:calc(var(--mantine-spacing-xs)*-1);right:auto}tr[data-with-row-border] .mantine-datatable-row-selector-cell:after{bottom:calc(-.0625rem*var(--mantine-scale));top:calc(-.0625rem*var(--mantine-scale))}tr:last-of-type .mantine-datatable-row-selector-cell:after{bottom:0}.mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-left-shadow-opacity)}[dir=rtl] .mantine-datatable-row-selector-cell[data-shadow-visible]:after{opacity:var(--mantine-datatable-right-shadow-opacity)}.mantine-datatable-row-selector-cell-checkbox{cursor:pointer}.mantine-datatable-scroll-area{flex:1 1 100%}.mantine-datatable-scroll-area-corner{background:transparent}.mantine-datatable-scroll-area-thumb{z-index:3}.mantine-datatable-scroll-area-scrollbar[data-state=visible]{background:transparent}.mantine-datatable-scroll-area-scrollbar div:before{pointer-events:none}.mantine-datatable-scroll-area-shadow{pointer-events:none;position:absolute;transition:opacity .2s}.mantine-datatable-scroll-area-top-shadow{background:var(--mantine-datatable-shadow-background-top);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-top-shadow-opacity);right:0;top:var(--mantine-datatable-header-height);z-index:2}.mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-left);bottom:0;left:0;opacity:var(--mantine-datatable-left-shadow-opacity);top:0;width:var(--mantine-spacing-xs);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-left-shadow{left:auto}.mantine-datatable-scroll-area-right-shadow,[dir=rtl] .mantine-datatable-scroll-area-left-shadow{background:var(--mantine-datatable-shadow-background-right);opacity:var(--mantine-datatable-right-shadow-opacity);right:0}.mantine-datatable-scroll-area-right-shadow{bottom:0;top:0;width:calc(var(--mantine-spacing-xs)/2);z-index:3}[dir=rtl] .mantine-datatable-scroll-area-right-shadow{background:var(--mantine-datatable-shadow-background-left);left:0;opacity:var(--mantine-datatable-left-shadow-opacity);right:auto}.mantine-datatable-scroll-area-shadow-behind{z-index:0}.mantine-datatable-scroll-area-bottom-shadow{background:var(--mantine-datatable-shadow-background-bottom);bottom:var(--mantine-datatable-footer-height);height:calc(var(--mantine-spacing-xs)/2);left:0;opacity:var(--mantine-datatable-bottom-shadow-opacity);right:0;z-index:2}}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}@layer mantine-datatable{}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `@layer mantine, mantine-datatable, dash-mantine-datatable;\r\n\r\n@layer dash-mantine-datatable {\r\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd),\r\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd) td {\r\n background: var(--mantine-datatable-striped-color);\r\n }\r\n\r\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover,\r\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover td {\r\n background: var(--mantine-datatable-highlight-on-hover-color);\r\n }\r\n\r\n .dash-mantine-datatable-striped .mantine-datatable-table tbody,\r\n .dash-mantine-datatable-striped .mantine-datatable-table tbody td,\r\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody,\r\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody td {\r\n background: inherit;\r\n }\r\n\r\n .dash-mantine-datatable-row-drag-enabled .mantine-datatable-table tbody tr {\r\n transition:\r\n background-color 120ms ease,\r\n box-shadow 120ms ease,\r\n opacity 120ms ease;\r\n }\r\n\r\n .dash-mantine-datatable-row-draggable {\r\n cursor: grab;\r\n }\r\n\r\n .dash-mantine-datatable-row-draggable:active {\r\n cursor: grabbing;\r\n }\r\n\r\n .dash-mantine-datatable-row-dragging,\r\n .dash-mantine-datatable-row-dragging td {\r\n opacity: 0.75;\r\n }\r\n\r\n .dash-mantine-datatable-row-drag-over,\r\n .dash-mantine-datatable-row-drag-over td {\r\n background: color-mix(\r\n in srgb,\r\n var(--mantine-primary-color-1),\r\n var(--mantine-datatable-background-color) 35%\r\n );\r\n }\r\n\r\n .dash-mantine-datatable-row-drag-over td {\r\n box-shadow: inset 0 2px 0 var(--mantine-primary-color-filled);\r\n }\r\n\r\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell {\r\n background: inherit;\r\n padding: 0;\r\n }\r\n\r\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content {\r\n border-bottom: 0;\r\n border-top: 0;\r\n padding: 0;\r\n }\r\n\r\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content > * {\r\n margin: 0;\r\n }\r\n\r\n .dash-mantine-datatable-grouped-child {\r\n border-radius: 0;\r\n box-shadow: none;\r\n }\r\n\r\n .dash-mantine-datatable-grouped-child,\r\n .dash-mantine-datatable-grouped-child .mantine-datatable,\r\n .dash-mantine-datatable-grouped-child .mantine-datatable-table {\r\n background: transparent;\r\n }\r\n\r\n .dash-mantine-datatable-grouped-child .mantine-datatable-table td:first-child,\r\n .dash-mantine-datatable-grouped-child .mantine-datatable-table th:first-child {\r\n border-left: 0;\r\n }\r\n\r\n .dash-mantine-datatable-group-cell {\r\n align-items: center;\r\n display: inline-flex;\r\n gap: 8px;\r\n min-width: 0;\r\n }\r\n\r\n .dash-mantine-datatable-group-cell-content {\r\n min-width: 0;\r\n }\r\n\r\n .dash-mantine-datatable-group-chevron {\r\n border-bottom: 1.5px solid currentColor;\r\n border-right: 1.5px solid currentColor;\r\n color: var(--mantine-color-dimmed);\r\n display: inline-block;\r\n flex: 0 0 7px;\r\n height: 7px;\r\n margin-inline-start: 1px;\r\n transform: rotate(-45deg);\r\n transform-origin: 55% 55%;\r\n transition: transform 120ms ease;\r\n width: 7px;\r\n }\r\n\r\n .dash-mantine-datatable-group-chevron-spacer {\r\n opacity: 0;\r\n }\r\n\r\n .dash-mantine-datatable-group-chevron-visible {\r\n opacity: 1;\r\n }\r\n\r\n .dash-mantine-datatable-group-chevron-expanded {\r\n transform: rotate(45deg);\r\n }\r\n\r\n .dash-mantine-datatable-editable-cell {\r\n cursor: text;\r\n display: inline-block;\r\n min-width: 100%;\r\n }\r\n\r\n .dash-mantine-datatable-editable-cell-active {\r\n outline: 2px solid color-mix(\r\n in srgb,\r\n var(--mantine-primary-color-filled),\r\n transparent 55%\r\n );\r\n outline-offset: 2px;\r\n border-radius: 4px;\r\n }\r\n\r\n .dash-mantine-datatable-editable-dropdown {\r\n min-width: 180px;\r\n }\r\n\r\n .dash-mantine-datatable-editable-dropdown > * {\r\n width: 100%;\r\n }\r\n\r\n /* Keep minHeight on the wrapper from stretching body rows. */\r\n .dash-mantine-datatable-root > .mantine-datatable {\r\n flex: 0 0 auto;\r\n }\r\n\r\n /* Empty/loading overlays are absolutely positioned; fill the wrapper so\r\n noRecords/emptyState text can center inside the configured minHeight. */\r\n .dash-mantine-datatable-root:has(.mantine-datatable-empty-state[data-active])\r\n > .mantine-datatable,\r\n .dash-mantine-datatable-root:has(.mantine-datatable-loader-background)\r\n > .mantine-datatable {\r\n flex: 1 1 auto;\r\n min-height: 100%;\r\n }\r\n\r\n .dash-mantine-datatable-root .mantine-datatable-table tbody tr {\r\n height: auto;\r\n }\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/lib/styles/layers.css\"],\"names\":[],\"mappings\":\"AAAA,yDAAyD;;AAEzD;IACI;;QAEI,kDAAkD;IACtD;;IAEA;;QAEI,6DAA6D;IACjE;;IAEA;;;;QAII,mBAAmB;IACvB;;IAEA;QACI;;;8BAGsB;IAC1B;;IAEA;QACI,YAAY;IAChB;;IAEA;QACI,gBAAgB;IACpB;;IAEA;;QAEI,aAAa;IACjB;;IAEA;;QAEI;;;;SAIC;IACL;;IAEA;QACI,6DAA6D;IACjE;;IAEA;QACI,mBAAmB;QACnB,UAAU;IACd;;IAEA;QACI,gBAAgB;QAChB,aAAa;QACb,UAAU;IACd;;IAEA;QACI,SAAS;IACb;;IAEA;QACI,gBAAgB;QAChB,gBAAgB;IACpB;;IAEA;;;QAGI,uBAAuB;IAC3B;;IAEA;;QAEI,cAAc;IAClB;;IAEA;QACI,mBAAmB;QACnB,oBAAoB;QACpB,QAAQ;QACR,YAAY;IAChB;;IAEA;QACI,YAAY;IAChB;;IAEA;QACI,uCAAuC;QACvC,sCAAsC;QACtC,kCAAkC;QAClC,qBAAqB;QACrB,aAAa;QACb,WAAW;QACX,wBAAwB;QACxB,yBAAyB;QACzB,yBAAyB;QACzB,gCAAgC;QAChC,UAAU;IACd;;IAEA;QACI,UAAU;IACd;;IAEA;QACI,UAAU;IACd;;IAEA;QACI,wBAAwB;IAC5B;;IAEA;QACI,YAAY;QACZ,qBAAqB;QACrB,eAAe;IACnB;;IAEA;QACI;;;;SAIC;QACD,mBAAmB;QACnB,kBAAkB;IACtB;;IAEA;QACI,gBAAgB;IACpB;;IAEA;QACI,WAAW;IACf;;IAEA,6DAA6D;IAC7D;QACI,cAAc;IAClB;;IAEA;8EAC0E;IAC1E;;;;QAII,cAAc;QACd,gBAAgB;IACpB;;IAEA;QACI,YAAY;IAChB;AACJ\",\"sourcesContent\":[\"@layer mantine, mantine-datatable, dash-mantine-datatable;\\r\\n\\r\\n@layer dash-mantine-datatable {\\r\\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd),\\r\\n .dash-mantine-datatable-striped .mantine-datatable-table tbody tr:nth-of-type(odd) td {\\r\\n background: var(--mantine-datatable-striped-color);\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover,\\r\\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody tr:hover td {\\r\\n background: var(--mantine-datatable-highlight-on-hover-color);\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-striped .mantine-datatable-table tbody,\\r\\n .dash-mantine-datatable-striped .mantine-datatable-table tbody td,\\r\\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody,\\r\\n .dash-mantine-datatable-highlight-on-hover .mantine-datatable-table tbody td {\\r\\n background: inherit;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-row-drag-enabled .mantine-datatable-table tbody tr {\\r\\n transition:\\r\\n background-color 120ms ease,\\r\\n box-shadow 120ms ease,\\r\\n opacity 120ms ease;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-row-draggable {\\r\\n cursor: grab;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-row-draggable:active {\\r\\n cursor: grabbing;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-row-dragging,\\r\\n .dash-mantine-datatable-row-dragging td {\\r\\n opacity: 0.75;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-row-drag-over,\\r\\n .dash-mantine-datatable-row-drag-over td {\\r\\n background: color-mix(\\r\\n in srgb,\\r\\n var(--mantine-primary-color-1),\\r\\n var(--mantine-datatable-background-color) 35%\\r\\n );\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-row-drag-over td {\\r\\n box-shadow: inset 0 2px 0 var(--mantine-primary-color-filled);\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell {\\r\\n background: inherit;\\r\\n padding: 0;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content {\\r\\n border-bottom: 0;\\r\\n border-top: 0;\\r\\n padding: 0;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-grouped .mantine-datatable-row-expansion-cell-content > * {\\r\\n margin: 0;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-grouped-child {\\r\\n border-radius: 0;\\r\\n box-shadow: none;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-grouped-child,\\r\\n .dash-mantine-datatable-grouped-child .mantine-datatable,\\r\\n .dash-mantine-datatable-grouped-child .mantine-datatable-table {\\r\\n background: transparent;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-grouped-child .mantine-datatable-table td:first-child,\\r\\n .dash-mantine-datatable-grouped-child .mantine-datatable-table th:first-child {\\r\\n border-left: 0;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-group-cell {\\r\\n align-items: center;\\r\\n display: inline-flex;\\r\\n gap: 8px;\\r\\n min-width: 0;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-group-cell-content {\\r\\n min-width: 0;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-group-chevron {\\r\\n border-bottom: 1.5px solid currentColor;\\r\\n border-right: 1.5px solid currentColor;\\r\\n color: var(--mantine-color-dimmed);\\r\\n display: inline-block;\\r\\n flex: 0 0 7px;\\r\\n height: 7px;\\r\\n margin-inline-start: 1px;\\r\\n transform: rotate(-45deg);\\r\\n transform-origin: 55% 55%;\\r\\n transition: transform 120ms ease;\\r\\n width: 7px;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-group-chevron-spacer {\\r\\n opacity: 0;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-group-chevron-visible {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-group-chevron-expanded {\\r\\n transform: rotate(45deg);\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-editable-cell {\\r\\n cursor: text;\\r\\n display: inline-block;\\r\\n min-width: 100%;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-editable-cell-active {\\r\\n outline: 2px solid color-mix(\\r\\n in srgb,\\r\\n var(--mantine-primary-color-filled),\\r\\n transparent 55%\\r\\n );\\r\\n outline-offset: 2px;\\r\\n border-radius: 4px;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-editable-dropdown {\\r\\n min-width: 180px;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-editable-dropdown > * {\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n /* Keep minHeight on the wrapper from stretching body rows. */\\r\\n .dash-mantine-datatable-root > .mantine-datatable {\\r\\n flex: 0 0 auto;\\r\\n }\\r\\n\\r\\n /* Empty/loading overlays are absolutely positioned; fill the wrapper so\\r\\n noRecords/emptyState text can center inside the configured minHeight. */\\r\\n .dash-mantine-datatable-root:has(.mantine-datatable-empty-state[data-active])\\r\\n > .mantine-datatable,\\r\\n .dash-mantine-datatable-root:has(.mantine-datatable-loader-background)\\r\\n > .mantine-datatable {\\r\\n flex: 1 1 auto;\\r\\n min-height: 100%;\\r\\n }\\r\\n\\r\\n .dash-mantine-datatable-root .mantine-datatable-table tbody tr {\\r\\n height: auto;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = window[\"React\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var getCurrentScript = function() {\n var script = document.currentScript;\n if (!script) {\n /* Shim for IE11 and below */\n /* Do not take into account async scripts and inline scripts */\n\n var doc_scripts = document.getElementsByTagName('script');\n var scripts = [];\n\n for (var i = 0; i < doc_scripts.length; i++) {\n scripts.push(doc_scripts[i]);\n }\n\n scripts = scripts.filter(function(s) { return !s.async && !s.text && !s.textContent; });\n script = scripts.slice(-1)[0];\n }\n\n return script;\n};\n\nvar isLocalScript = function(script) {\n return /\\/_dash-component-suites\\//.test(script.src);\n};\n\nObject.defineProperty(__webpack_require__, 'p', {\n get: (function () {\n var script = getCurrentScript();\n\n var url = script.src.split('/').slice(0, -1).join('/') + '/';\n\n return function() {\n return url;\n };\n })()\n});\n\nif (typeof jsonpScriptSrc !== 'undefined') {\n var __jsonpScriptSrc__ = jsonpScriptSrc;\n jsonpScriptSrc = function(chunkId) {\n var script = getCurrentScript();\n var isLocal = isLocalScript(script);\n\n var src = __jsonpScriptSrc__(chunkId);\n\n if(!isLocal) {\n return src;\n }\n\n var srcFragments = src.split('/');\n var fileFragments = srcFragments.slice(-1)[0].split('.');\n\n fileFragments.splice(1, 0, \"v0_1_0m1788392440\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","__webpack_require__.nc = undefined;","\n import API from \"!../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../css-loader/dist/cjs.js!./styles.layer.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../css-loader/dist/cjs.js!./styles.layer.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./layers.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./layers.css\";\n export default content && content.locals ? content.locals : undefined;\n","const __WEBPACK_NAMESPACE_OBJECT__ = window[\"PropTypes\"];","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t{let{children:t,columnsOrder:o,setColumnsOrder:n,columnsToggle:a,setColumnsToggle:r,resetColumnsOrder:l,resetColumnsToggle:c,setColumnWidth:m,setMultipleColumnWidths:u,resetColumnsWidth:f}=e,[p,d]=kt(\"\"),[s,i]=kt(\"\");return oa(Mt,{value:{sourceColumn:p,setSourceColumn:d,targetColumn:s,setTargetColumn:i,columnsToggle:a,setColumnsToggle:r,swapColumns:()=>{if(!o||!n||!p||!s)return;let h=o.indexOf(p),y=o.indexOf(s);if(h!==-1&&y!==-1){let v=o.splice(h,1)[0];o.splice(y,0,v),n([...o])}},resetColumnsOrder:l,resetColumnsToggle:c,setColumnWidth:m,setMultipleColumnWidths:u,resetColumnsWidth:f},children:t})};import{jsx as Et}from\"react/jsx-runtime\";function Nt(){return Et(\"tr\",{className:\"mantine-datatable-empty-row\",children:Et(\"td\",{})})}import{Center as aa,Text as ra}from\"@mantine/core\";import{jsx as Re,jsxs as na}from\"react/jsx-runtime\";function Lt(){return na(\"svg\",{width:\"24\",height:\"24\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[Re(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),Re(\"path\",{d:\"M12.983 8.978c3.955 -.182 7.017 -1.446 7.017 -2.978c0 -1.657 -3.582 -3 -8 -3c-1.661 0 -3.204 .19 -4.483 .515m-2.783 1.228c-.471 .382 -.734 .808 -.734 1.257c0 1.22 1.944 2.271 4.734 2.74\"}),Re(\"path\",{d:\"M4 6v6c0 1.657 3.582 3 8 3c.986 0 1.93 -.067 2.802 -.19m3.187 -.82c1.251 -.53 2.011 -1.228 2.011 -1.99v-6\"}),Re(\"path\",{d:\"M4 12v6c0 1.657 3.582 3 8 3c3.217 0 5.991 -.712 7.261 -1.74m.739 -3.26v-4\"}),Re(\"path\",{d:\"M3 3l18 18\"})]})}import{Fragment as la,jsx as We,jsxs as ia}from\"react/jsx-runtime\";function Wt({icon:e,text:t,active:o,children:n}){return We(aa,{className:\"mantine-datatable-empty-state\",\"data-active\":o||void 0,children:n||ia(la,{children:[e||We(\"div\",{className:\"mantine-datatable-empty-state-icon\",children:We(Lt,{})}),We(ra,{component:\"div\",size:\"sm\",c:\"dimmed\",children:t})]})})}import{TableTfoot as Ia,TableTr as Ha}from\"@mantine/core\";import Oa from\"clsx\";import{TableTh as ka}from\"@mantine/core\";import Ea from\"clsx\";import{useCallback as Ml,useRef as kl,useState as El}from\"react\";import{useLocalStorage as sa}from\"@mantine/hooks\";function It({key:e,columns:t=[],getInitialValueInEffect:o=!0}){function n(p,d){let s=[];return p.forEach(i=>{d.find(g=>g.accessor===i)&&s.push(i)}),d.forEach(i=>{s.includes(i.accessor)||s.push(i.accessor)}),s}let a=t&&t.map(p=>p.accessor)||[],[r,l]=sa({key:e?`${e}-columns-order`:\"\",defaultValue:e?a:void 0,getInitialValueInEffect:o});function c(p){e&&l(p)}let m=()=>{c(a)};if(!e)return{columnsOrder:r,setColumnsOrder:c,resetColumnsOrder:m};let u=n(r,t),f=JSON.stringify(r);return JSON.stringify(u)!==f&&c(u),{columnsOrder:u,setColumnsOrder:c,resetColumnsOrder:m}}import{useLocalStorage as ca}from\"@mantine/hooks\";import{useCallback as re,useEffect as st,useMemo as Ie,useRef as Ht,useState as Ot}from\"react\";function _t({key:e,columns:t=[],getInitialValueInEffect:o=!0,headerRef:n,onFixedLayoutChange:a}){let r=Ht(!1),l=Ht({}),[c,m]=Ot(!0),u=Ie(()=>t.some(b=>b.resizable&&!b.hidden&&b.accessor!==\"__selection__\"),[t]),f=Ie(()=>t.filter(b=>b.resizable&&!b.hidden&&b.accessor!==\"__selection__\"),[t]),p=Ie(()=>f.some(b=>b.width===void 0||b.width===\"\"||b.width===\"initial\"),[f]),d=re(()=>t.filter(b=>b.accessor!==\"__selection__\").map(b=>({[b.accessor]:b.width??\"auto\"})),[t]),[s,i]=ca({key:e?`${e}-columns-width`:\"\",defaultValue:e?d():void 0,getInitialValueInEffect:!1}),[g,h]=Ot(()=>d());st(()=>{m(!1)},[]);let y=re(()=>{if(!n?.current||c)return{};let b=n.current,x=Array.from(b.querySelectorAll(\"th[data-accessor]\")),k={};return x.forEach(E=>{let L=E.getAttribute(\"data-accessor\");if(!L||L===\"__selection__\")return;let C=f.find(w=>w.accessor===L);if(C&&(C.width===void 0||C.width===\"\"||C.width===\"initial\")){let w=E.getBoundingClientRect();k[L]=Math.round(w.width)}}),k},[n,f,c]),v=re(b=>{let x=b.filter(E=>E.accessor!==\"__selection__\"),k=g.map(E=>{let L=Object.keys(E)[0],C=x.find(w=>w.accessor===L);return C?{[L]:C.width}:E});h(k),e&&i(k)},[g,e,i]),M=re(b=>{v(b)},[v]),R=re(()=>{if(!(!n?.current||!a||c))if(p)a(!1),requestAnimationFrame(()=>{requestAnimationFrame(()=>{let b=y();l.current={...l.current,...b};let x=t.filter(k=>k.accessor!==\"__selection__\").map(k=>{let E=k.accessor,L=s?.find(w=>Object.keys(w)[0]===E);if(L&&L[E]!==\"auto\")return{[E]:L[E]};let C=b[E];return C?{[E]:`${C}px`}:{[E]:k.width??\"auto\"}});h(x),setTimeout(()=>{a(!0),r.current=!0},10)})});else{let b=t.filter(x=>x.accessor!==\"__selection__\").map(x=>({[x.accessor]:x.width??\"auto\"}));h(b),a(!0),r.current=!0}},[n,a,c,p,y,t,s]),W=R;st(()=>{if(!u||!a||c){a?.(!1);return}r.current=!1;let b=setTimeout(()=>{R()},50);return()=>clearTimeout(b)},[u,a,c,R]),st(()=>{c||!e||!o||s&&s.length>0&&h(s)},[c,e,o,s]);let D=re(()=>{e&&i(d()),l.current={},r.current=!1,a&&(a(!1),setTimeout(()=>{R()},10))},[e,i,d,a,R]),T=re((b,x)=>{v([{accessor:b,width:x}])},[v]),P=Ie(()=>u?g.filter(b=>{let x=Object.keys(b)[0];return f.some(k=>k.accessor===x)}).every(b=>{let x=Object.values(b)[0];return x===\"auto\"||x===\"initial\"}):!1,[u,g,f]);return{columnsWidth:g,setColumnsWidth:v,setColumnWidth:T,setMultipleColumnWidths:M,resetColumnsWidth:D,hasResizableColumns:u,allResizableWidthsInitial:P,measureAndSetColumnWidths:W}}import{useMemo as da}from\"react\";import{useLocalStorage as ua}from\"@mantine/hooks\";function At({key:e,columns:t=[],getInitialValueInEffect:o=!0}){function n(p,d){let s=[];return p.forEach(i=>{d.find(g=>g.accessor===i.accessor)&&s.push(i)}),d.forEach(i=>{s.find(g=>g.accessor===i.accessor)||s.push({accessor:i.accessor,defaultToggle:i.defaultToggle||!0,toggleable:i.toggleable,toggled:i.defaultToggle===void 0?!0:i.defaultToggle})}),s}let a=t&&t.map(p=>({accessor:p.accessor,defaultToggle:p.defaultToggle||!0,toggleable:p.toggleable,toggled:p.defaultToggle===void 0?!0:p.defaultToggle})),[r,l]=ua({key:e?`${e}-columns-toggle`:\"\",defaultValue:e?a:void 0,getInitialValueInEffect:o});function c(p){e&&l(p)}let m=()=>{c(a)};if(!e)return{columnsToggle:r,setColumnsToggle:c,resetColumnsToggle:m};let u=n(r,t),f=JSON.stringify(r);return JSON.stringify(u)!==f&&c(u),{columnsToggle:u,setColumnsToggle:c,resetColumnsToggle:m}}var zt=({key:e,columns:t=[],getInitialValueInEffect:o=!0,headerRef:n,scrollViewportRef:a,onFixedLayoutChange:r})=>{let{columnsOrder:l,setColumnsOrder:c,resetColumnsOrder:m}=It({key:e,columns:t,getInitialValueInEffect:o}),{columnsToggle:u,setColumnsToggle:f,resetColumnsToggle:p}=At({key:e,columns:t,getInitialValueInEffect:o}),{columnsWidth:d,setColumnsWidth:s,setColumnWidth:i,setMultipleColumnWidths:g,resetColumnsWidth:h,hasResizableColumns:y,allResizableWidthsInitial:v,measureAndSetColumnWidths:M}=_t({key:e,columns:t,getInitialValueInEffect:o,headerRef:n,scrollViewportRef:a,onFixedLayoutChange:r});return{effectiveColumns:da(()=>l?l.map(T=>t.find(P=>P.accessor===T)).map(T=>({...T,hidden:T?.hidden||!u.find(P=>P.accessor===T?.accessor)?.toggled})).map(T=>T?.accessor===\"__selection__\"?T:{...T,width:d.find(P=>P[T?.accessor])?.[T?.accessor]}):t,[t,l,u,d]),setColumnsOrder:c,columnsOrder:l,resetColumnsOrder:m,columnsToggle:u,setColumnsToggle:f,resetColumnsToggle:p,columnsWidth:d,setColumnsWidth:s,setColumnWidth:i,setMultipleColumnWidths:g,resetColumnsWidth:h,hasResizableColumns:y,allResizableWidthsInitial:v,measureAndSetColumnWidths:M}};import{rem as ba}from\"@mantine/core\";import{useCallback as Ta,useEffect as dt,useRef as K}from\"react\";import{useEffect as ma,useLayoutEffect as pa}from\"react\";var ct=typeof window<\"u\"?pa:ma;import{useRef as fa}from\"react\";function ut(e){let t=fa(e);return t.current=e,t}var Bt=\"--mantine-datatable-header-height\",Vt=\"--mantine-datatable-footer-height\",Gt=\"--mantine-datatable-selection-column-width\",Ft=\"--mantine-datatable-last-row-border-bottom\";function G(e,t,o){e?.style.setProperty(t,o)}function pt(e){let t=e.borderBoxSize?.[0]||e.contentBoxSize?.[0];return t?{width:t.inlineSize,height:t.blockSize}:{width:e.contentRect.width,height:e.contentRect.height}}function mt(e,t,o){if(e){let n=new ResizeObserver(a=>{let r=a[0];r&&t(pt(r))});return n.observe(e),()=>{n.disconnect(),o()}}}function $t({scrollCallbacks:e,withRowBorders:t}){let o={root:K(null),table:K(null),scrollViewport:K(null),header:K(null),footer:K(null),selectionColumnHeader:K(null)},{root:n,table:a,scrollViewport:r,header:l,footer:c,selectionColumnHeader:m}=o,u=ut({withRowBorders:t}),f=ut(e),p=K(()=>{}),d=K(()=>{}),s=Ta(i=>{f.current.onScroll?.(i),p.current()},[]);return dt(()=>mt(l.current,i=>{G(n.current,Bt,`${i.height}px`)},()=>G(n.current,Bt,\"0\")),[l.current]),dt(()=>mt(c.current,i=>{G(n.current,Vt,`${i.height}px`)},()=>G(n.current,Vt,\"0\")),[c.current]),dt(()=>mt(m.current,i=>{G(n.current,Gt,`${i.width}px`)},()=>G(n.current,Gt,\"0\")),[m.current]),ct(()=>{if(typeof window===void 0)return;let i={top:!0,bottom:!0,left:!0,right:!0},g={width:0,height:0},h={width:0,height:0};function y(D,T){let P=i[D];return i[D]=T,G(n.current,`--mantine-datatable-${D}-shadow-opacity`,T?\"0\":\"1\"),P}function v(){let D=g.height-h.height,T=D<0;G(n.current,\"--mantine-datatable-footer-position\",T?\"relative\":\"sticky\"),G(n.current,\"--mantine-datatable-footer-bottom\",T?`${D}px`:\"0\")}function M(){u.current.withRowBorders&&g.height{for(let T of D)switch(T.target.tagName){case\"TABLE\":{g=pt(T);break}case\"DIV\":{h=pt(T);break}}R(),v(),M()});return W.observe(a.current),W.observe(r.current),()=>{W.disconnect()}},[]),ct(()=>{d.current()},[t]),{refs:o,onScroll:s}}import{useEffect as ga,useState as ha}from\"react\";function Xt(e){let[t,o]=ha(null),n=e?.join(\":\")||\"\";return ga(()=>{o(null)},[n]),{lastSelectionChangeIndex:t,setLastSelectionChangeIndex:o}}import{useEffect as Ca,useRef as ya,useState as Da}from\"react\";function xa(e,t){let o=()=>{t(e.map(a=>a.matches))},n=e.map(a=>{try{return a.addEventListener(\"change\",o),()=>a.removeEventListener(\"change\",o)}catch{return a.addListener(o),()=>a.removeListener(o)}});return()=>{n.forEach(a=>a())}}function wa(e,t){return t||(typeof window<\"u\"&&\"matchMedia\"in window?e.map(o=>window.matchMedia(o).matches):e.map(()=>!1))}function Ut(e,t,{getInitialValueInEffect:o}={getInitialValueInEffect:!0}){let[n,a]=Da(o?t:wa(e,t)),r=ya(null);return Ca(()=>{if(\"matchMedia\"in window)return r.current=e.map(l=>window.matchMedia(l)),a(r.current.map(l=>l.matches)),xa(r.current,l=>{a(l)})},[e]),n}import{useMantineTheme as Sa}from\"@mantine/core\";import{useMemo as Qt}from\"react\";function Kt(e){let t=Sa(),o=Qt(()=>e.map(a=>(typeof a==\"function\"?a(t):a)??\"\"),[e,t]),n=Qt(()=>e.map(()=>!0),[e]);return Ut(o,n)}import{useMantineTheme as Ra}from\"@mantine/core\";import{useMediaQuery as Pa}from\"@mantine/hooks\";function J(e){let t=Ra(),o=typeof e==\"function\"?e(t):e;return Pa(o||\"\",!0)}import{useState as va}from\"react\";function de(e){let t=e.replace(/([a-z\\d])([A-Z]+)/g,\"$1 $2\").replace(/\\W|_/g,\" \").trim().toLowerCase();return`${t.charAt(0).toUpperCase()}${t.slice(1)}`}function Jt(e,t,o){return e.filter(n=>!t.map(o).includes(o(n)))}function He(e,t){return e.filter((o,n,a)=>n===a.findIndex(r=>t(o)===t(r)))}function ft(e,t){return t?t.match(/([^[.\\]])+/g).reduce((n,a)=>n&&n[a],e):void 0}function _(e,t){return typeof t==\"string\"?ft(e,t):t(e)}function ui(e,t){let o=structuredClone(t),n=o[e.source.index];return e.destination&&(o.splice(e.source.index,1),o.splice(e.destination.index,0,n)),o}function di(e,t){let o=structuredClone(t),n=e.destination;if(!n)return o;let a=o[e.source.index],r=o[n.index];return o.splice(n.index,1,a),o.splice(e.source.index,1,r),o}function bt(e){return!e||e.length===0?0:Math.max(...e.map(t=>t.groups&&t.groups.length>0?1+bt(t.groups):1))}function Pe(e){let t=[];for(let o of e)o.columns&&o.columns.length>0?t.push(...o.columns.filter(n=>n!=null)):o.groups&&o.groups.length>0&&t.push(...Pe(o.groups));return t.filter(o=>o!=null)}function Oe(e,t){return e.columns&&e.columns.length>0?e.columns.filter((o,n)=>o.hidden?!1:t?t[n]!==!1:!0).length:e.groups&&e.groups.length>0?e.groups.reduce((o,n)=>o+Oe(n,t),0):0}function Tt(e,t,o=0){if(o===t)return[...e];let n=[];for(let a of e)a.groups&&a.groups.length>0&&n.push(...Tt(a.groups,t,o+1));return n}function jt(e,t,o){return o?!e||t:!1}function Zt({rowExpansion:e,records:t,idAccessor:o}){let n=[];if(e&&t){let{trigger:c,allowMultiple:m,initiallyExpanded:u}=e;t&&c===\"always\"?n=t.map(f=>_(f,o)):u&&(n=t.filter((f,p)=>u({record:f,index:p})).map(f=>_(f,o)),m||(n=[n[0]]))}let a,r,l=va(n);if(e){let{expandable:c,trigger:m,allowMultiple:u,collapseProps:f,content:p}=e;e.expanded?{recordIds:a,onRecordIdsChange:r}=e.expanded:[a,r]=l;let d=s=>r?.(a.filter(i=>i!==_(s,o)));return{expandOnClick:m!==\"always\"&&m!==\"never\",isRowExpanded:s=>m===\"always\"?!0:a.includes(_(s,o)),isExpandable:({record:s,index:i})=>c?c({record:s,index:i}):!0,expandRow:s=>{let i=_(s,o);r?.(u?[...a,i]:[i])},collapseRow:d,collapseProps:f,content:({record:s,index:i})=>()=>p({record:s,index:i,collapse:()=>d(s)})}}}import{useTimeout as Yt}from\"@mantine/hooks\";import{useEffect as Ma,useState as qt}from\"react\";function eo(e,t){let[o,n]=qt(e),[a,r]=qt(e),l=Yt(()=>n(!0),0),c=Yt(()=>r(!1),t||200);return Ma(()=>{e?(c.clear(),r(!0),l.start()):(l.clear(),n(!1),c.start())},[l,c,e]),{expanded:o,visible:a}}var me=\"mantine-datatable-nowrap\",pe=\"mantine-datatable-ellipsis\",X=\"mantine-datatable-pointer-cursor\",_e=\"mantine-datatable-context-menu-cursor\",to=\"mantine-datatable-text-selection-disabled\",j=\"mantine-datatable-text-align-left\",Z=\"mantine-datatable-text-align-center\",Y=\"mantine-datatable-text-align-right\";import{jsx as Na}from\"react/jsx-runtime\";function oo({className:e,style:t,visibleMediaQuery:o,title:n,noWrap:a,ellipsis:r,textAlign:l,width:c}){return J(o)?Na(ka,{className:Ea({[me]:a||r,[pe]:r,[j]:l===\"left\",[Z]:l===\"center\",[Y]:l===\"right\"},e),style:[{width:c,minWidth:c,maxWidth:c},t],children:n}):null}import{TableTh as La}from\"@mantine/core\";import{jsx as Wa}from\"react/jsx-runtime\";function no({shadowVisible:e}){return Wa(La,{className:\"mantine-datatable-footer-selector-placeholder-cell\",\"data-shadow-visible\":e||void 0})}import{jsx as gt,jsxs as _a}from\"react/jsx-runtime\";function ao({className:e,style:t,columns:o,defaultColumnProps:n,selectionVisible:a,selectorCellShadowVisible:r,ref:l}){return gt(Ia,{ref:l,className:Oa(\"mantine-datatable-footer\",e),style:t,children:_a(Ha,{children:[a&>(no,{shadowVisible:r}),o.map(({hidden:c,...m})=>{if(c)return null;let{accessor:u,visibleMediaQuery:f,textAlign:p,width:d,footer:s,footerClassName:i,footerStyle:g,noWrap:h,ellipsis:y}={...n,...m};return gt(oo,{className:i,style:g,visibleMediaQuery:f,textAlign:p,width:d,title:s,noWrap:h,ellipsis:y},u)})]})})}import{Checkbox as pr,Group as fr,Popover as br,PopoverDropdown as Tr,PopoverTarget as gr,Stack as hr,TableThead as Cr,TableTr as wo}from\"@mantine/core\";import yr from\"clsx\";import{useState as Dr}from\"react\";import{TableTh as Aa}from\"@mantine/core\";import za from\"clsx\";import{useMemo as Ae}from\"react\";import{jsx as Ba}from\"react/jsx-runtime\";function ro({group:{id:e,columns:t,groups:o,title:n,textAlign:a,className:r,style:l},maxDepth:c,currentDepth:m,previousGroups:u,isLastGroup:f,withColumnBorders:p=!1,totalTableColumns:d}){let s=Ae(()=>t&&t.length>0?t:o&&o.length>0?Pe([{id:e,columns:t,groups:o}]):[],[t,o,e]),i=Ae(()=>s.map(({visibleMediaQuery:D})=>D),[s]),g=Kt(i),h=Ae(()=>Oe({id:e,columns:t,groups:o},g),[e,t,o,g]),y=Ae(()=>u.reduce((D,T)=>D+Oe(T,g),0),[u,g]),M=o&&o.length>0?1:c-m,R=y+h0?Ba(Aa,{colSpan:h,rowSpan:M>1?M:void 0,className:za(\"mantine-datatable-column-group-header-cell\",{[j]:a===\"left\",[Z]:a===\"center\",[Y]:a===\"right\",\"mantine-datatable-column-group-header-cell--needs-border\":W},r),style:l,children:n??de(e)}):null}import{ActionIcon as Co,Box as nr,Center as Ge,Flex as ar,Group as rr,TableTh as lr}from\"@mantine/core\";import Fe from\"clsx\";import{useRef as ir,useState as sr}from\"react\";import{ActionIcon as Fa,Popover as $a,PopoverDropdown as Xa,PopoverTarget as Ua}from\"@mantine/core\";import{useClickOutside as Qa,useDisclosure as Ka}from\"@mantine/hooks\";import{jsx as lo,jsxs as Va}from\"react/jsx-runtime\";function io(){return Va(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[lo(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),lo(\"path\",{d:\"M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z\"})]})}import{jsx as so,jsxs as Ga}from\"react/jsx-runtime\";function co(){return Ga(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[so(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),so(\"path\",{d:\"M20 3h-16a1 1 0 0 0 -1 1v2.227l.008 .223a3 3 0 0 0 .772 1.795l4.22 4.641v8.114a1 1 0 0 0 1.316 .949l6 -2l.108 -.043a1 1 0 0 0 .576 -.906v-6.586l4.121 -4.12a3 3 0 0 0 .879 -2.123v-2.171a1 1 0 0 0 -1 -1z\",strokeWidth:\"0\",fill:\"currentColor\"})]})}import{jsx as ze,jsxs as Ja}from\"react/jsx-runtime\";function uo({children:e,isActive:t,filterPopoverProps:o,filterPopoverDisableClickOutside:n}){let[a,{close:r,toggle:l}]=Ka(!1),c=t?co:io,m=Qa(r);return n&&(m=void 0),Ja($a,{withArrow:!0,shadow:\"md\",opened:a,onClose:r,trapFocus:!0,...o,children:[ze(Ua,{children:ze(Fa,{className:\"mantine-datatable-header-cell-filter-action-icon\",\"data-active\":t||void 0,size:\"sm\",variant:\"default\",onClick:u=>{u.preventDefault(),l()},onKeyDown:u=>u.stopPropagation(),children:ze(c,{})})}),ze(Xa,{ref:m,onClick:u=>u.stopPropagation(),onKeyDown:u=>u.stopPropagation(),children:typeof e==\"function\"?e({close:r}):e})]})}import{useDirection as ja}from\"@mantine/core\";import{useCallback as mo,useRef as po,useState as Za}from\"react\";import{jsx as Ya}from\"react/jsx-runtime\";var fo=e=>{let{accessor:t,columnRef:o}=e,[n,a]=Za(!1),r=po(0),l=po({current:0,next:0}),{dir:c}=ja(),m=c===\"rtl\",{setMultipleColumnWidths:u}=ue(),f=mo(d=>{if(d.preventDefault(),d.stopPropagation(),!o.current)return;let s=o.current,i=s.nextElementSibling;for(;i;){let W=i.getAttribute(\"data-accessor\");if(W&&W!==\"__selection__\")break;i=i.nextElementSibling}if(!i)return;let g=i.getAttribute(\"data-accessor\");if(!g)return;let h=g===\"__selection__\";a(!0),r.current=d.clientX;let y=s.offsetWidth,v=i.offsetWidth;l.current={current:y,next:v};let M=W=>{if(!o.current)return;let D=o.current,T=D.nextElementSibling;if(!T)return;let P=W.clientX-r.current;m&&(P=-P);let b=50,x=l.current.current-b,k=l.current.next-b,E=Math.max(-x,Math.min(P,k)),L=l.current.current+E,C=l.current.next-E;D.style.width=`${L}px`,T.style.width=`${C}px`,D.style.minWidth=`${L}px`,D.style.maxWidth=`${L}px`,T.style.minWidth=`${C}px`,T.style.maxWidth=`${C}px`},R=()=>{if(!o.current)return;let W=o.current,D=W.nextElementSibling;a(!1),document.body.style.cursor=\"initial\",document.body.style.userSelect=\"initial\";let T=parseInt(W.style.width)||W.offsetWidth,P=D?parseInt(D.style.width)||D.offsetWidth:0,b=[{accessor:t,width:`${T}px`}];if(D&&!h){let x=D.getAttribute(\"data-accessor\");x&&b.push({accessor:x,width:`${P}px`})}setTimeout(()=>{u(b)},0),document.removeEventListener(\"mousemove\",M),document.removeEventListener(\"mouseup\",R)};document.body.style.cursor=\"col-resize\",document.body.style.userSelect=\"none\",document.addEventListener(\"mousemove\",M),document.addEventListener(\"mouseup\",R)},[t,o,m,u]),p=mo(()=>{if(!o.current)return;let d=o.current,s=d.nextElementSibling;d.style.width=\"\",d.style.minWidth=\"\",d.style.maxWidth=\"\";let i=[{accessor:t,width:\"auto\"}];if(s){s.style.width=\"\",s.style.minWidth=\"\",s.style.maxWidth=\"\";let g=s.getAttribute(\"data-accessor\");g&&g!==\"__selection__\"&&i.push({accessor:g,width:\"auto\"})}setTimeout(()=>{u(i)},0)},[t,o,u]);return Ya(\"div\",{className:\"mantine-datatable-header-resizable-handle\",style:{cursor:n?\"col-resize\":void 0},onMouseDown:f,onDoubleClick:p,onClick:d=>d.stopPropagation(),title:\"Drag to resize column, double-click to reset\"})};import{jsx as Be,jsxs as qa}from\"react/jsx-runtime\";function bo(){return qa(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[Be(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),Be(\"path\",{d:\"M12 5l0 14\"}),Be(\"path\",{d:\"M16 9l-4 -4\"}),Be(\"path\",{d:\"M8 9l4 -4\"})]})}import{jsx as Ve,jsxs as er}from\"react/jsx-runtime\";function To(){return er(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[Ve(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),Ve(\"path\",{d:\"M8 7l4 -4l4 4\"}),Ve(\"path\",{d:\"M8 17l4 4l4 -4\"}),Ve(\"path\",{d:\"M12 3l0 18\"})]})}import{jsx as le,jsxs as tr}from\"react/jsx-runtime\";function go(){return tr(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[le(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),le(\"path\",{d:\"M9 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M9 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M9 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M15 5m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M15 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"}),le(\"path\",{d:\"M15 19m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"})]})}import{jsx as ht,jsxs as or}from\"react/jsx-runtime\";function ho(){return or(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[ht(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),ht(\"path\",{d:\"M18 6l-12 12\"}),ht(\"path\",{d:\"M6 6l12 12\"})]})}import{Fragment as cr,jsx as z,jsxs as Ct}from\"react/jsx-runtime\";function yo({className:e,style:t,accessor:o,visibleMediaQuery:n,title:a,sortable:r,draggable:l,toggleable:c,resizable:m,sortIcons:u,textAlign:f,width:p,sortStatus:d,onSortStatusChange:s,filter:i,filterPopoverProps:g,filterPopoverDisableClickOutside:h,filtering:y,sortKey:v}){let{setSourceColumn:M,setTargetColumn:R,swapColumns:W,setColumnsToggle:D}=ue(),[T,P]=sr(!1),b=ir(null);if(!J(n))return null;let x=a??de(o),k=typeof x==\"string\"?x:void 0,E=r&&s?H=>{H?.defaultPrevented||s({sortKey:v,columnAccessor:o,direction:d?.columnAccessor===o?d.direction===\"asc\"?\"desc\":\"asc\":d?.direction??\"asc\"})}:void 0,L=H=>{H.stopPropagation(),M(o),P(!1)},C=H=>{H.preventDefault(),R(o),P(!0)},w=()=>{R(o),P(!1),W()},S=()=>{P(!0)},I=()=>{P(!1)},A=H=>{H.stopPropagation(),D(F=>F.map(U=>U.accessor===o?{...U,toggled:!1}:U))};return Ct(lr,{\"data-accessor\":o,className:Fe({\"mantine-datatable-header-cell-sortable\":r,\"mantine-datatable-header-cell-toggleable\":c,\"mantine-datatable-header-cell-resizable\":m},e),style:[{width:p,...m?{}:{minWidth:p,maxWidth:p}},t],role:r?\"button\":void 0,tabIndex:r?0:void 0,onClick:E,onKeyDown:H=>H.key===\"Enter\"&&E?.(),ref:b,children:[Ct(rr,{className:\"mantine-datatable-header-cell-sortable-group\",justify:\"space-between\",wrap:\"nowrap\",children:[Ct(ar,{align:\"center\",w:\"100%\",className:Fe({\"mantine-datatable-header-cell-draggable\":l,\"mantine-datatable-header-cell-drag-over\":T}),draggable:l,onDragStart:l?L:void 0,onDragEnter:l?S:void 0,onDragOver:l?C:void 0,onDrop:l?w:void 0,onDragLeave:l?I:void 0,children:[l?z(Ge,{role:\"img\",\"aria-label\":\"Drag column\",children:z(Co,{className:\"mantine-datatable-header-cell-draggable-action-icon\",variant:\"subtle\",size:\"xs\",onClick:H=>{H.stopPropagation()},children:z(go,{})})}):null,z(nr,{className:Fe(\"mantine-datatable-header-cell-sortable-text\",{[j]:f===\"left\",[Z]:f===\"center\",[Y]:f===\"right\"},me,pe),title:k,children:x})]}),c?z(Ge,{className:\"mantine-datatable-header-cell-toggleable-icon\",role:\"img\",\"aria-label\":\"Toggle column\",children:z(Co,{size:\"xs\",variant:\"light\",onClick:A,children:z(ho,{})})}):null,r||d?.columnAccessor===o?z(cr,{children:d?.columnAccessor===o?z(Ge,{className:Fe(\"mantine-datatable-header-cell-sortable-icon\",{\"mantine-datatable-header-cell-sortable-icon-reversed\":d.direction===\"desc\"}),role:\"img\",\"aria-label\":`Sorted ${d.direction===\"desc\"?\"descending\":\"ascending\"}`,children:u?.sorted||z(bo,{})}):z(Ge,{className:\"mantine-datatable-header-cell-sortable-unsorted-icon\",role:\"img\",\"aria-label\":\"Not sorted\",children:u?.unsorted||z(To,{})})}):null,i?z(uo,{filterPopoverProps:g,isActive:!!y,filterPopoverDisableClickOutside:h,children:i}):null]}),m&&o!==\"__selection__\"?z(fo,{accessor:o,columnRef:b}):null]})}import{Checkbox as ur,TableTh as dr}from\"@mantine/core\";import mr from\"clsx\";import{jsx as Do}from\"react/jsx-runtime\";function xo({className:e,style:t,trigger:o,shadowVisible:n,checked:a,indeterminate:r,checkboxProps:l,onChange:c,rowSpan:m,ref:u}){let f=!l.disabled;return Do(dr,{ref:u,className:mr(\"mantine-datatable-header-selector-cell\",{[X]:o===\"cell\"&&f},e),style:t,rowSpan:m,\"data-shadow-visible\":n||void 0,\"data-accessor\":\"__selection__\",onClick:o===\"cell\"&&f?c:void 0,children:Do(ur,{classNames:f?{input:X}:void 0,checked:a,indeterminate:r,onChange:c,...l,disabled:!(c||l.onChange)||l.disabled})})}import{jsx as q,jsxs as $e}from\"react/jsx-runtime\";function So({selectionColumnHeaderRef:e,className:t,style:o,sortStatus:n,sortIcons:a,onSortStatusChange:r,columns:l,defaultColumnProps:c,groups:m,selectionTrigger:u,selectionVisible:f,selectionChecked:p,selectionIndeterminate:d,onSelectionChange:s,selectionCheckboxProps:i,selectorCellShadowVisible:g,selectionColumnClassName:h,selectionColumnStyle:y,withColumnBorders:v=!1,ref:M}){let R=m?bt(m):0,W=R>0?R+1:1,D=f?q(xo,{ref:e,className:h,style:y,trigger:u,shadowVisible:g,checked:p,indeterminate:d,checkboxProps:i,onChange:s,rowSpan:m?W:void 0}):null,{columnsToggle:T,setColumnsToggle:P}=ue(),[b,x]=Dr(!1),k=l.some(C=>C.toggleable),E=k?Object.fromEntries(l.map(({accessor:C,title:w})=>[C,w??de(String(C))])):void 0,L=$e(Cr,{className:yr(\"mantine-datatable-header\",t),style:o,ref:M,onContextMenu:k?C=>{C.preventDefault(),x(w=>!w)}:void 0,children:[m&&Array.from({length:R},(C,w)=>{let S=Tt(m,w);return $e(wo,{children:[w===0&&D,S.map((I,A)=>q(ro,{group:I,maxDepth:R,currentDepth:w,previousGroups:S.slice(0,A),isLastGroup:A===S.length-1,withColumnBorders:v,totalTableColumns:l.length},I.id))]},`group-depth-${w}`)}),$e(wo,{children:[!m&&D,l.map(({hidden:C,...w},S)=>{if(C)return null;let{accessor:I,visibleMediaQuery:A,textAlign:H,width:F,title:U,sortable:fe,draggable:be,toggleable:Te,resizable:ge,titleClassName:te,titleStyle:he,filter:Ce,filterPopoverProps:Q,filterPopoverDisableClickOutside:Je,filtering:je,sortKey:Ze}={...c,...w};return q(yo,{accessor:I,className:te,style:he,visibleMediaQuery:A,textAlign:H,width:F,title:U,sortable:fe,draggable:be,toggleable:Te,resizable:ge&&SC.toggleable).map(C=>q(fr,{children:q(pr,{classNames:{label:\"mantine-datatable-header-column-toggle-checkbox-label\"},size:\"xs\",label:E[C.accessor],checked:C.toggled,onChange:w=>{P(T.map(S=>S.accessor===C.accessor?{...S,toggled:w.currentTarget.checked}:S))}})},C.accessor))})})]}):L}import{Center as xr,Loader as wr}from\"@mantine/core\";import Sr from\"clsx\";import{jsx as Ro}from\"react/jsx-runtime\";function Po({fetching:e,customContent:t,backgroundBlur:o,size:n,type:a,color:r}){return Ro(xr,{className:Sr(\"mantine-datatable-loader\",{\"mantine-datatable-loader-fetching\":e}),style:[{backdropFilter:o?`blur(${o}px)`:void 0}],children:e&&(t||Ro(wr,{size:n,type:a,color:r}))})}import{Box as Ir,Pagination as Hr,Text as Or,rem as _r}from\"@mantine/core\";import Io from\"clsx\";import{Button as vr,Group as Mr,Menu as kr,MenuDropdown as Er,MenuItem as Nr,MenuTarget as Lr,Text as Eo,rem as ve}from\"@mantine/core\";import Wr from\"clsx\";import{parseThemeColor as Rr}from\"@mantine/core\";function O(e,t,o){return e?Rr({color:typeof e==\"object\"?e[o]:e,theme:t}).value:void 0}function vo({theme:e,c:t,backgroundColor:o,borderColor:n,rowBorderColor:a,stripedColor:r,highlightOnHoverColor:l}){return{\"--mantine-datatable-color-light\":O(t,e,\"light\"),\"--mantine-datatable-color-dark\":O(t,e,\"dark\"),\"--mantine-datatable-background-color-light\":O(o,e,\"light\"),\"--mantine-datatable-background-color-dark\":O(o,e,\"dark\"),\"--mantine-datatable-border-color-light\":O(n,e,\"light\"),\"--mantine-datatable-border-color-dark\":O(n,e,\"dark\"),\"--mantine-datatable-row-border-color-light\":O(a,e,\"light\"),\"--mantine-datatable-row-border-color-dark\":O(a,e,\"dark\"),\"--mantine-datatable-striped-color-light\":O(r,e,\"light\"),\"--mantine-datatable-striped-color-dark\":O(r,e,\"dark\"),\"--mantine-datatable-highlight-on-hover-color-light\":O(l,e,\"light\"),\"--mantine-datatable-highlight-on-hover-color-dark\":O(l,e,\"dark\")}}function Xe({theme:e,paginationActiveTextColor:t,paginationActiveBackgroundColor:o}){return{\"--mantine-datatable-pagination-active-text-color-light\":O(t,e,\"light\"),\"--mantine-datatable-pagination-active-text-color-dark\":O(t,e,\"dark\"),\"--mantine-datatable-pagination-active-background-color-light\":O(o,e,\"light\"),\"--mantine-datatable-pagination-active-background-color-dark\":O(o,e,\"dark\")}}function Mo({theme:e,color:t,backgroundColor:o}){return{\"--mantine-datatable-row-color-light\":O(t,e,\"light\"),\"--mantine-datatable-row-color-dark\":O(t,e,\"dark\"),\"--mantine-datatable-row-background-color-light\":O(o,e,\"light\"),\"--mantine-datatable-row-background-color-dark\":O(o,e,\"dark\")}}import{jsx as yt,jsxs as Pr}from\"react/jsx-runtime\";function ko(){return Pr(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",strokeWidth:\"2\",stroke:\"currentColor\",fill:\"none\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[yt(\"path\",{stroke:\"none\",d:\"M0 0h24v24H0z\",fill:\"none\"}),yt(\"path\",{d:\"M8 9l4 -4l4 4\"}),yt(\"path\",{d:\"M16 15l-4 4l-4 -4\"})]})}import{jsx as ie,jsxs as Lo}from\"react/jsx-runtime\";var No={xs:ve(22),sm:ve(26),md:ve(32),lg:ve(38),xl:ve(44)};function Wo({size:e,label:t,values:o,value:n,activeTextColor:a,activeBackgroundColor:r,onChange:l}){return Lo(Mr,{gap:\"xs\",children:[ie(Eo,{component:\"div\",size:e,children:t}),Lo(kr,{withinPortal:!0,withArrow:!0,offset:2,classNames:{arrow:\"mantine-datatable-page-size-selector-menu-arrow\"},children:[ie(Lr,{children:ie(vr,{size:e,variant:\"default\",classNames:{section:\"mantine-datatable-page-size-selector-button-icon\"},rightSection:ie(ko,{}),style:[{fontWeight:\"normal\"},c=>({height:No[e],paddingLeft:c.spacing[e],paddingRight:c.spacing[e]})],children:n})}),ie(Er,{children:o.map(c=>{let m=c===n;return ie(Nr,{className:Wr({\"mantine-datatable-page-size-selector-active\":m}),style:[{height:No[e]},m&&(a||r)?u=>Xe({theme:u,paginationActiveTextColor:a,paginationActiveBackgroundColor:r}):void 0],disabled:m,onClick:()=>l(c),children:ie(Eo,{component:\"div\",size:e,children:c})},c)})})]})]})}import{Fragment as Ho,jsx as ee,jsxs as Ar}from\"react/jsx-runtime\";function Oo({className:e,style:t,fetching:o,page:n,onPageChange:a,paginationWithEdges:r,paginationWithControls:l,paginationActiveTextColor:c,paginationActiveBackgroundColor:m,paginationSize:u,loadingText:f,noRecordsText:p,paginationText:d,totalRecords:s,recordsPerPage:i,onRecordsPerPageChange:g,recordsPerPageLabel:h,recordsPerPageOptions:y,recordsLength:v,horizontalSpacing:M,paginationWrapBreakpoint:R,getPaginationControlProps:W,getPaginationItemProps:D,renderPagination:T}){let P;if(s){let S=(n-1)*i+1,I=S+(v||0)-1;P=d({from:S,to:I,totalRecords:s})}else P=o?f:p;let b=s&&i?Math.max(1,Math.ceil(s/i)):1,x=s?(n-1)*(i??0)+1:void 0,k=s?(x??1)+(v??0)-1:void 0,L=!J(({breakpoints:S})=>`(min-width: ${typeof R==\"number\"?`${_r(R)}rem`:S[R]||R})`),C={Text:S=>ee(Or,{component:\"div\",className:\"mantine-datatable-pagination-text\",size:u,...S,children:P}),PageSizeSelector:S=>y?ee(Wo,{activeTextColor:c,activeBackgroundColor:m,size:u,label:h,values:y,value:i,onChange:g,...S}):ee(Ho,{}),Pagination:S=>ee(Hr,{classNames:{root:Io(\"mantine-datatable-pagination-pages\",{\"mantine-datatable-pagination-pages-fetching\":o||!v}),control:\"mantine-datatable-pagination-pages-control\"},style:c||m?I=>Xe({theme:I,paginationActiveTextColor:c,paginationActiveBackgroundColor:m}):void 0,withEdges:r,withControls:l,value:n,onChange:a,size:u,total:b,getControlProps:W,getItemProps:D,...S})},w={state:{paginationSize:u,page:n,totalPages:b,totalRecords:s,recordsPerPage:i,recordsLength:v,fetching:o,from:x,to:k,isWrapped:L},actions:{setPage:S=>a?.(S),setRecordsPerPage:g?S=>g(S):void 0},Controls:C};return ee(Ir,{px:M??\"xs\",py:\"xs\",className:Io(\"mantine-datatable-pagination\",e),style:[{flexDirection:L?\"column\":\"row\"},t],children:typeof T==\"function\"?T(w):Ar(Ho,{children:[ee(C.Text,{}),ee(C.PageSizeSelector,{}),ee(C.Pagination,{})]})})}import{TableTr as Jr}from\"@mantine/core\";import jr from\"clsx\";import{TableTd as zr}from\"@mantine/core\";import Br from\"clsx\";import{jsx as Vr}from\"react/jsx-runtime\";function _o({className:e,style:t,visibleMediaQuery:o,record:n,index:a,onClick:r,onDoubleClick:l,onContextMenu:c,noWrap:m,ellipsis:u,textAlign:f,width:p,accessor:d,render:s,defaultRender:i,customCellAttributes:g}){return J(o)?Vr(zr,{className:Br({[me]:m||u,[pe]:u,[X]:r||l,[_e]:c,[j]:f===\"left\",[Z]:f===\"center\",[Y]:f===\"right\"},e),style:[{width:p,minWidth:p,maxWidth:p},t],onClick:r,onDoubleClick:l,onContextMenu:c,...g?.(n,a),children:s?s(n,a):i?i(n,a,d):ft(n,d)}):null}import{Collapse as Gr,TableTd as Fr,TableTr as Ao}from\"@mantine/core\";import{Fragment as $r,jsx as Me,jsxs as Xr}from\"react/jsx-runtime\";function zo({open:e,colSpan:t,content:o,collapseProps:n}){let{expanded:a,visible:r}=eo(e,n?.transitionDuration);return r?Xr($r,{children:[Me(Ao,{}),Me(Ao,{children:Me(Fr,{className:\"mantine-datatable-row-expansion-cell\",colSpan:t,children:Me(Gr,{in:a,...n,children:Me(\"div\",{className:\"mantine-datatable-row-expansion-cell-content\",children:o()})})})})]}):null}import{Checkbox as Ur,TableTd as Qr}from\"@mantine/core\";import Kr from\"clsx\";import{jsx as Bo}from\"react/jsx-runtime\";function Vo({className:e,style:t,record:o,index:n,trigger:a,onChange:r,withRightShadow:l,checkboxProps:c,getCheckboxProps:m,...u}){let f={...c,...m(o,n)},p=!u.disabled&&!f.disabled,d=s=>{s.stopPropagation(),a===\"cell\"&&p&&r?.(s)};return Bo(Qr,{className:Kr(\"mantine-datatable-row-selector-cell\",{[X]:a===\"cell\"&&p},e),style:t,\"data-shadow-visible\":l||void 0,onClick:d,children:Bo(Ur,{classNames:p?{input:X}:void 0,onChange:r,...u,...f})})}import{Fragment as Go,jsx as Ue,jsxs as Fo}from\"react/jsx-runtime\";function $o({record:e,index:t,columns:o,defaultColumnProps:n,defaultColumnRender:a,selectionTrigger:r,selectionVisible:l,selectionChecked:c,onSelectionChange:m,isRecordSelectable:u,selectionCheckboxProps:f,getSelectionCheckboxProps:p,onClick:d,onDoubleClick:s,onContextMenu:i,onCellClick:g,onCellDoubleClick:h,onCellContextMenu:y,expansion:v,customAttributes:M,color:R,backgroundColor:W,className:D,style:T,selectorCellShadowVisible:P,selectionColumnClassName:b,selectionColumnStyle:x,rowFactory:k}){let E=Fo(Go,{children:[l&&Ue(Vo,{className:b,style:x,record:e,index:t,trigger:r,withRightShadow:P,checked:c,disabled:!m||(u?!u(e,t):!1),onChange:m,checkboxProps:f,getCheckboxProps:p}),o.map(({hidden:w,hiddenContent:S,...I},A)=>{if(w||S)return null;let{accessor:H,visibleMediaQuery:F,textAlign:U,noWrap:fe,ellipsis:be,width:Te,render:ge,cellsClassName:te,cellsStyle:he,customCellAttributes:Ce}={...n,...I};return Ue(_o,{className:typeof te==\"function\"?te(e,t):te,style:he?.(e,t),visibleMediaQuery:F,record:e,index:t,onClick:g?Q=>g({event:Q,record:e,index:t,column:I,columnIndex:A}):void 0,onDoubleClick:h?Q=>h({event:Q,record:e,index:t,column:I,columnIndex:A}):void 0,onContextMenu:y?Q=>y({event:Q,record:e,index:t,column:I,columnIndex:A}):void 0,accessor:H,textAlign:U,noWrap:fe,ellipsis:be,width:Te,render:ge,defaultRender:a,customCellAttributes:Ce},H)})]}),L=v&&Ue(zo,{colSpan:o.filter(({hidden:w})=>!w).length+(l?1:0),open:v.isRowExpanded(e),content:v.content({record:e,index:t}),collapseProps:v.collapseProps}),C=Zr({record:e,index:t,selectionChecked:c,onClick:d,onDoubleClick:s,onContextMenu:i,expansion:v,customAttributes:M,color:R,backgroundColor:W,className:D,style:T});return k?k({record:e,index:t,rowProps:C,children:E,expandedElement:L}):Fo(Go,{children:[Ue(Jr,{...C,children:E}),L]})}function Zr({record:e,index:t,selectionChecked:o,onClick:n,onDoubleClick:a,onContextMenu:r,expansion:l,customAttributes:c,color:m,backgroundColor:u,className:f,style:p}){return{className:jr(\"mantine-datatable-row\",{[X]:n||a||l?.isExpandable({record:e,index:t})&&l?.expandOnClick},{[_e]:r},typeof f==\"function\"?f(e,t):f),\"data-selected\":o||void 0,onClick:d=>{if(l){let{isExpandable:s,isRowExpanded:i,expandOnClick:g,expandRow:h,collapseRow:y}=l;s({record:e,index:t})&&g&&(i(e)?y(e):h(e))}n?.({event:d,record:e,index:t})},onDoubleClick:a?d=>a({event:d,record:e,index:t}):void 0,onContextMenu:r?d=>r({event:d,record:e,index:t}):void 0,style:[m||u?d=>{let s=m?.(e,t),i=u?.(e,t);return Mo({theme:d,color:s,backgroundColor:i})}:void 0,p?.(e,t)],...c?.(e,t)??{}}}import{Box as Xo,ScrollArea as Yr}from\"@mantine/core\";import Qe from\"clsx\";import{jsx as Ke,jsxs as qr}from\"react/jsx-runtime\";function Uo({leftShadowBehind:e,rightShadowBehind:t,onScrollPositionChange:o,children:n,viewportRef:a,scrollAreaProps:r}){return qr(Yr,{...r,viewportRef:a,classNames:{root:\"mantine-datatable-scroll-area\",scrollbar:\"mantine-datatable-scroll-area-scrollbar\",thumb:\"mantine-datatable-scroll-area-thumb\",corner:\"mantine-datatable-scroll-area-corner\"},onScrollPositionChange:o,children:[n,Ke(Xo,{className:Qe(\"mantine-datatable-scroll-area-shadow\",\"mantine-datatable-scroll-area-top-shadow\")}),Ke(\"div\",{className:Qe(\"mantine-datatable-scroll-area-shadow\",\"mantine-datatable-scroll-area-left-shadow\",{\"mantine-datatable-scroll-area-shadow-behind\":e})}),Ke(\"div\",{className:Qe(\"mantine-datatable-scroll-area-shadow\",\"mantine-datatable-scroll-area-right-shadow\",{\"mantine-datatable-scroll-area-shadow-behind\":t})}),Ke(Xo,{className:Qe(\"mantine-datatable-scroll-area-shadow\",\"mantine-datatable-scroll-area-bottom-shadow\")})]})}import{jsx as B,jsxs as Jo}from\"react/jsx-runtime\";function ll({withTableBorder:e,borderRadius:t,textSelectionDisabled:o,height:n=\"100%\",minHeight:a,maxHeight:r,shadow:l,verticalAlign:c=\"center\",fetching:m,columns:u,storeColumnsKey:f,groups:p,pinFirstColumn:d,pinLastColumn:s,defaultColumnProps:i,defaultColumnRender:g,idAccessor:h=\"id\",records:y,selectionTrigger:v=\"checkbox\",selectedRecords:M,onSelectedRecordsChange:R,selectionColumnClassName:W,selectionColumnStyle:D,isRecordSelectable:T,selectionCheckboxProps:P,allRecordsSelectionCheckboxProps:b={\"aria-label\":\"Select all records\"},getRecordSelectionCheckboxProps:x=(V,xe)=>({\"aria-label\":`Select record ${xe+1}`}),sortStatus:k,sortIcons:E,onSortStatusChange:L,horizontalSpacing:C,page:w,onPageChange:S,totalRecords:I,recordsPerPage:A,onRecordsPerPageChange:H,recordsPerPageOptions:F,recordsPerPageLabel:U=\"Records per page\",paginationWithEdges:fe,paginationWithControls:be,paginationActiveTextColor:Te,paginationActiveBackgroundColor:ge,paginationSize:te=\"sm\",paginationText:he=({from:V,to:xe,totalRecords:et})=>`${V} - ${xe} / ${et}`,paginationWrapBreakpoint:Ce=\"sm\",getPaginationControlProps:Q=V=>V===\"previous\"?{\"aria-label\":\"Previous page\"}:V===\"next\"?{\"aria-label\":\"Next page\"}:{},getPaginationItemProps:Je,renderPagination:je,loaderBackgroundBlur:Ze,customLoader:jo,loaderSize:Zo,loaderType:Yo,loaderColor:qo,loadingText:en=\"...\",emptyState:tn,noRecordsText:wt=\"No records\",noRecordsIcon:on,highlightOnHover:nn,striped:an,noHeader:rn,onRowClick:ln,onRowDoubleClick:sn,onRowContextMenu:cn,onCellClick:un,onCellDoubleClick:dn,onCellContextMenu:mn,onScroll:pn,onScrollToTop:fn,onScrollToBottom:bn,onScrollToLeft:Tn,onScrollToRight:gn,c:hn,backgroundColor:Cn,borderColor:yn,rowBorderColor:Dn,stripedColor:xn,highlightOnHoverColor:wn,rowColor:Sn,rowBackgroundColor:Rn,rowExpansion:Pn,rowClassName:vn,rowStyle:Mn,customRowAttributes:kn,scrollViewportRef:En,scrollAreaProps:Nn,tableRef:Ln,bodyRef:Wn,m:In,my:Hn,mx:On,mt:_n,mb:An,ml:zn,mr:Bn,className:Vn,classNames:ye,style:Gn,styles:De,rowFactory:Fn,tableWrapper:Ye,...qe}){let V=al(()=>p?Pe(p):u,[u,p]),[xe,et]=rl(!1),{refs:$,onScroll:$n}=$t({scrollCallbacks:{onScroll:pn,onScrollToTop:fn,onScrollToBottom:bn,onScrollToLeft:Tn,onScrollToRight:gn},withRowBorders:qe.withRowBorders}),tt=zt({key:f,columns:V,headerRef:$.header,scrollViewportRef:$.scrollViewport,onFixedLayoutChange:et}),Xn=Qo($.table,Ln),Un=Qo($.scrollViewport,En),Qn=Zt({rowExpansion:Pn,records:y,idAccessor:h}),ke=xt(!1),St=xt(w),ot=xt(y),Kn=Dt(N=>{ke.current=!0,ot.current=y,S(N)},[S,y]);ol(()=>{St.current!==w&&(ke.current=!0,ot.current=y,St.current=w)},[w,y]);let we=y?.length;nl(()=>{if(!ke.current||m||y===ot.current)return;let N=$.scrollViewport.current;if(!N)return;let oe=requestAnimationFrame(()=>{N.scrollTo({top:0,left:0}),ke.current=!1});return()=>cancelAnimationFrame(oe)},[m,y,$.scrollViewport]);let Rt=y?.map(N=>_(N,h)),se=!!M,Se=M?.map(N=>_(N,h)),Pt=Rt!==void 0&&Se!==void 0&&Se.length>0,nt=T?y?.filter(T):y,Ee=nt?.map(N=>_(N,h)),Ne=Pt&&Ee.every(N=>Se.includes(N)),Jn=Pt&&Ee.some(N=>Se.includes(N)),jn=Dt(()=>{M&&R&&R(Ne?M.filter(N=>!Ee.includes(_(N,h))):He([...M,...nt],N=>_(N,h)))},[Ne,h,R,Ee,nt,M]),{lastSelectionChangeIndex:Le,setLastSelectionChangeIndex:Zn}=Xt(Rt),at=se&&!d,Yn={m:In,my:Hn,mx:On,mt:_n,mb:An,ml:zn,mr:Bn},qn=Dt(({children:N})=>Ye?Ye({children:N}):N,[Ye]);return B(it,{...tt,children:Jo(el,{ref:$.root,...Yn,className:Ko(\"mantine-datatable\",{\"mantine-datatable-with-border\":e},Vn,ye?.root),style:[N=>({...vo({theme:N,c:hn,backgroundColor:Cn,borderColor:yn,rowBorderColor:Dn,stripedColor:xn,highlightOnHoverColor:wn}),borderRadius:N.radius[t]||t,boxShadow:N.shadows[l]||l,height:n,minHeight:a,maxHeight:r}),Gn,De?.root,{position:\"relative\"}],children:[B(Uo,{viewportRef:Un,leftShadowBehind:se||!!d,rightShadowBehind:s,onScrollPositionChange:$n,scrollAreaProps:Nn,children:B(qn,{children:Jo(tl,{ref:Xn,horizontalSpacing:C,className:Ko(\"mantine-datatable-table\",{[to]:o,\"mantine-datatable-vertical-align-top\":c===\"top\",\"mantine-datatable-vertical-align-bottom\":c===\"bottom\",\"mantine-datatable-pin-last-column\":s,\"mantine-datatable-selection-column-visible\":se,\"mantine-datatable-pin-first-column\":d,\"mantine-datatable-resizable-columns\":tt.hasResizableColumns&&xe},ye?.table),style:{...De?.table},\"data-striped\":we&&an||void 0,\"data-highlight-on-hover\":nn||void 0,...qe,children:[rn?null:B(it,{...tt,children:B(So,{ref:$.header,selectionColumnHeaderRef:$.selectionColumnHeader,className:ye?.header,style:De?.header,columns:V,defaultColumnProps:i,groups:p,sortStatus:k,sortIcons:E,onSortStatusChange:L,selectionTrigger:v,selectionVisible:se,selectionChecked:Ne,selectionIndeterminate:Jn&&!Ne,onSelectionChange:jn,selectionCheckboxProps:{...P,...b},selectorCellShadowVisible:at,selectionColumnClassName:W,selectionColumnStyle:D,withColumnBorders:qe.withColumnBorders})}),B(\"tbody\",{ref:Wn,children:we?y.map((N,oe)=>{let rt=_(N,h),lt=Se?.includes(rt)||!1,vt;return R&&M&&(vt=ea=>{if(ea.nativeEvent.shiftKey&&Le!==null){let ce=y.filter(oe>Le?(ne,ae)=>ae>=Le&&ae<=oe&&(T?T(ne,ae):!0):(ne,ae)=>ae>=oe&&ae<=Le&&(T?T(ne,ae):!0));R(lt?Jt(M,ce,ne=>_(ne,h)):He([...M,...ce],ne=>_(ne,h)))}else R(lt?M.filter(ce=>_(ce,h)!==rt):He([...M,N],ce=>_(ce,h)));Zn(oe)}),B($o,{record:N,index:oe,columns:V,defaultColumnProps:i,defaultColumnRender:g,selectionTrigger:v,selectionVisible:se,selectionChecked:lt,onSelectionChange:vt,isRecordSelectable:T,selectionCheckboxProps:P,getSelectionCheckboxProps:x,onClick:ln,onDoubleClick:sn,onCellClick:un,onCellDoubleClick:dn,onContextMenu:cn,onCellContextMenu:mn,expansion:Qn,color:Sn,backgroundColor:Rn,className:vn,style:Mn,customAttributes:kn,selectorCellShadowVisible:at,selectionColumnClassName:W,selectionColumnStyle:D,idAccessor:h,rowFactory:Fn},rt)}):B(Nt,{})}),V.some(({footer:N})=>N)&&B(ao,{ref:$.footer,className:ye?.footer,style:De?.footer,columns:V,defaultColumnProps:i,selectionVisible:se,selectorCellShadowVisible:at})]})})}),!!(w&&we)&&B(Oo,{className:ye?.pagination,style:De?.pagination,horizontalSpacing:C,fetching:m,page:w,onPageChange:Kn,totalRecords:I,recordsPerPage:A,onRecordsPerPageChange:H,recordsPerPageOptions:F,recordsPerPageLabel:U,paginationWithEdges:fe,paginationWithControls:be,paginationActiveTextColor:Te,paginationActiveBackgroundColor:ge,paginationSize:te,paginationText:he,paginationWrapBreakpoint:Ce,getPaginationControlProps:Q,getPaginationItemProps:Je,noRecordsText:wt,loadingText:en,recordsLength:we,renderPagination:je}),B(Po,{fetching:m,backgroundBlur:Ze,customContent:jo,size:Zo,type:Yo,color:qo}),B(Wt,{icon:on,text:wt,active:!m&&!we,children:tn})]})})}import{TableTr as il}from\"@mantine/core\";import{useMergedRef as sl}from\"@mantine/hooks\";import{useEffect as cl,useRef as ul}from\"react\";import{jsx as ml}from\"react/jsx-runtime\";function dl({className:e,children:t,isDragging:o,ref:n,...a}){let r=ul(null),l=sl(r,n);return cl(()=>{if(!r.current||!o)return;let f=r.current.parentElement.parentElement.children[0].children[0];for(let p=0;p {};\r\nconst GROUP_RECORD_PREFIX = '__group__';\r\nconst GROUP_INDENT_SIZE = 20;\r\nconst TEMPLATE_TOKEN_PATTERN = /\\{([^}]+)\\}/g;\r\nconst ROOT_STYLE_PROP_NAMES = [\r\n 'm',\r\n 'mx',\r\n 'my',\r\n 'mt',\r\n 'mb',\r\n 'ms',\r\n 'me',\r\n 'ml',\r\n 'mr',\r\n 'p',\r\n 'px',\r\n 'py',\r\n 'pt',\r\n 'pb',\r\n 'ps',\r\n 'pe',\r\n 'pl',\r\n 'pr',\r\n 'w',\r\n 'miw',\r\n 'maw',\r\n 'h',\r\n 'mih',\r\n 'mah',\r\n 'bg',\r\n 'opacity',\r\n 'ff',\r\n 'fz',\r\n 'fw',\r\n 'lts',\r\n 'ta',\r\n 'lh',\r\n 'fs',\r\n 'tt',\r\n 'display',\r\n 'flex',\r\n 'bd',\r\n 'bdrs',\r\n 'td',\r\n 'bgsz',\r\n 'bgp',\r\n 'bgr',\r\n 'bga',\r\n 'pos',\r\n 'top',\r\n 'left',\r\n 'bottom',\r\n 'right',\r\n 'inset',\r\n 'hiddenFrom',\r\n 'visibleFrom',\r\n];\r\n\r\nconst isNil = (value) => value === null || value === undefined;\r\n\r\nconst isPlainObject = (value) =>\r\n value && typeof value === 'object' && !Array.isArray(value);\r\n\r\nconst pickDefinedProps = (source, keys) =>\r\n keys.reduce((accumulator, key) => {\r\n if (!isNil(source[key])) {\r\n accumulator[key] = source[key];\r\n }\r\n\r\n return accumulator;\r\n }, {});\r\n\r\nconst hasAnyDefinedProp = (source, keys) => keys.some((key) => !isNil(source[key]));\r\n\r\nconst reorderByIndices = (records, sourceIndex, destinationIndex) => {\r\n if (\r\n !Array.isArray(records) ||\r\n sourceIndex === destinationIndex ||\r\n sourceIndex < 0 ||\r\n destinationIndex < 0\r\n ) {\r\n return records;\r\n }\r\n\r\n const nextRecords = [...records];\r\n const [movedRecord] = nextRecords.splice(sourceIndex, 1);\r\n nextRecords.splice(destinationIndex, 0, movedRecord);\r\n return nextRecords;\r\n};\r\n\r\nconst isInteractiveDragTarget = (target) =>\r\n Boolean(\r\n target?.closest?.(\r\n 'a, button, input, textarea, select, option, [role=\"button\"], [contenteditable=\"true\"]'\r\n )\r\n );\r\n\r\nconst isDryComponent = (value) =>\r\n Boolean(\r\n value &&\r\n typeof value === 'object' &&\r\n !Array.isArray(value) &&\r\n value.type &&\r\n value.namespace &&\r\n value.props\r\n );\r\n\r\nconst DASH_COMPONENT_TYPE_NAMES = new WeakMap();\r\n\r\nconst trackDashComponentType = (componentType, typeName) => {\r\n if (\r\n componentType &&\r\n (typeof componentType === 'function' ||\r\n (typeof componentType === 'object' && componentType !== null))\r\n ) {\r\n DASH_COMPONENT_TYPE_NAMES.set(componentType, typeName);\r\n }\r\n\r\n return componentType;\r\n};\r\n\r\nconst isMaterializedDashComponent = (node) =>\r\n React.isValidElement(node) && DASH_COMPONENT_TYPE_NAMES.has(node.type);\r\n\r\nconst getAccessorValue = (record, accessor) => {\r\n if (!record || !accessor) {\r\n return undefined;\r\n }\r\n\r\n if (typeof accessor !== 'string') {\r\n return record[accessor];\r\n }\r\n\r\n return accessor.split('.').reduce((accumulator, key) => {\r\n if (accumulator === null || accumulator === undefined) {\r\n return undefined;\r\n }\r\n\r\n return accumulator[key];\r\n }, record);\r\n};\r\n\r\nconst setAccessorValue = (record, accessor, value) => {\r\n if (!record || typeof accessor !== 'string' || !accessor.trim()) {\r\n return record;\r\n }\r\n\r\n const keys = accessor.split('.');\r\n const nextRecord = Array.isArray(record) ? [...record] : { ...record };\r\n let currentTarget = nextRecord;\r\n let currentSource = record;\r\n\r\n keys.forEach((key, index) => {\r\n if (index === keys.length - 1) {\r\n currentTarget[key] = value;\r\n return;\r\n }\r\n\r\n const sourceValue =\r\n currentSource &&\r\n typeof currentSource === 'object' &&\r\n Object.prototype.hasOwnProperty.call(currentSource, key)\r\n ? currentSource[key]\r\n : undefined;\r\n const nextValue = Array.isArray(sourceValue)\r\n ? [...sourceValue]\r\n : sourceValue && typeof sourceValue === 'object'\r\n ? { ...sourceValue }\r\n : {};\r\n\r\n currentTarget[key] = nextValue;\r\n currentTarget = nextValue;\r\n currentSource = sourceValue;\r\n });\r\n\r\n return nextRecord;\r\n};\r\n\r\nconst findRecordInCollection = (\r\n records,\r\n recordId,\r\n idAccessor,\r\n childRowsAccessor\r\n) => {\r\n if (!Array.isArray(records)) {\r\n return undefined;\r\n }\r\n\r\n for (const record of records) {\r\n if (getRecordId(record, idAccessor) === recordId) {\r\n return record;\r\n }\r\n\r\n if (childRowsAccessor) {\r\n const children = getAccessorValue(record, childRowsAccessor);\r\n if (Array.isArray(children)) {\r\n const nestedMatch = findRecordInCollection(\r\n children,\r\n recordId,\r\n idAccessor,\r\n childRowsAccessor\r\n );\r\n\r\n if (nestedMatch) {\r\n return nestedMatch;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst updateRecordValueInCollection = (\r\n records,\r\n recordId,\r\n idAccessor,\r\n accessor,\r\n value,\r\n childRowsAccessor\r\n) => {\r\n if (!Array.isArray(records)) {\r\n return { records, didUpdate: false };\r\n }\r\n\r\n let didUpdate = false;\r\n const nextRecords = records.map((record) => {\r\n let nextRecord = record;\r\n\r\n if (getRecordId(record, idAccessor) === recordId) {\r\n nextRecord = setAccessorValue(record, accessor, value);\r\n didUpdate = true;\r\n }\r\n\r\n if (childRowsAccessor) {\r\n const childRows = getAccessorValue(nextRecord, childRowsAccessor);\r\n\r\n if (Array.isArray(childRows)) {\r\n const updatedChildren = updateRecordValueInCollection(\r\n childRows,\r\n recordId,\r\n idAccessor,\r\n accessor,\r\n value,\r\n childRowsAccessor\r\n );\r\n\r\n if (updatedChildren.didUpdate) {\r\n nextRecord = setAccessorValue(\r\n nextRecord,\r\n childRowsAccessor,\r\n updatedChildren.records\r\n );\r\n didUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n return nextRecord;\r\n });\r\n\r\n return {\r\n records: didUpdate ? nextRecords : records,\r\n didUpdate,\r\n };\r\n};\r\n\r\nconst areEditableValuesEqual = (left, right) => {\r\n if (left === right) {\r\n return true;\r\n }\r\n\r\n if (left instanceof Date || right instanceof Date) {\r\n return String(left) === String(right);\r\n }\r\n\r\n if (Array.isArray(left) && Array.isArray(right)) {\r\n return (\r\n left.length === right.length &&\r\n left.every((item, index) =>\r\n areEditableValuesEqual(item, right[index])\r\n )\r\n );\r\n }\r\n\r\n if (\r\n left &&\r\n right &&\r\n typeof left === 'object' &&\r\n typeof right === 'object'\r\n ) {\r\n try {\r\n return JSON.stringify(left) === JSON.stringify(right);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getEditorTypeName = (node) => {\r\n if (isDryComponent(node)) {\r\n return typeof node.type === 'string' ? node.type : undefined;\r\n }\r\n\r\n if (!React.isValidElement(node)) {\r\n return undefined;\r\n }\r\n\r\n if (typeof node.type === 'string') {\r\n return node.type;\r\n }\r\n\r\n if (DASH_COMPONENT_TYPE_NAMES.has(node.type)) {\r\n return DASH_COMPONENT_TYPE_NAMES.get(node.type);\r\n }\r\n\r\n return node.type?.displayName || node.type?.name;\r\n};\r\n\r\nconst resolveEditorValueProp = (column, editorDefinition) => {\r\n if (typeof column?.editorValueProp === 'string') {\r\n return column.editorValueProp;\r\n }\r\n\r\n const editorTypeName = getEditorTypeName(editorDefinition);\r\n\r\n if (editorTypeName === 'Checkbox' || editorTypeName === 'Switch') {\r\n return 'checked';\r\n }\r\n\r\n return 'value';\r\n};\r\n\r\nconst extractEditorValue = (nextValue, valueProp) => {\r\n if (\r\n nextValue &&\r\n typeof nextValue === 'object' &&\r\n !Array.isArray(nextValue)\r\n ) {\r\n if (Object.prototype.hasOwnProperty.call(nextValue, valueProp)) {\r\n return nextValue[valueProp];\r\n }\r\n\r\n if (\r\n nextValue.currentTarget &&\r\n Object.prototype.hasOwnProperty.call(\r\n nextValue.currentTarget,\r\n valueProp\r\n )\r\n ) {\r\n return nextValue.currentTarget[valueProp];\r\n }\r\n\r\n if (\r\n nextValue.target &&\r\n Object.prototype.hasOwnProperty.call(nextValue.target, valueProp)\r\n ) {\r\n return nextValue.target[valueProp];\r\n }\r\n }\r\n\r\n return nextValue;\r\n};\r\n\r\nconst normalizeEditableValue = (value, column, editorDefinition) => {\r\n if (value instanceof Date) {\r\n const editorTypeName = getEditorTypeName(editorDefinition);\r\n\r\n if (\r\n column?.presentation === 'date' ||\r\n column?.type === 'date' ||\r\n editorTypeName === 'DateInput'\r\n ) {\r\n return value.toISOString().slice(0, 10);\r\n }\r\n\r\n return value.toISOString();\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) =>\r\n normalizeEditableValue(item, column, editorDefinition)\r\n );\r\n }\r\n\r\n return value;\r\n};\r\n\r\nconst isTextLikeEditor = (editorDefinition) =>\r\n ['TextInput', 'Textarea', 'NumberInput', 'PasswordInput'].includes(\r\n getEditorTypeName(editorDefinition)\r\n );\r\n\r\nconst FILTER_VALUE_PROP_BY_TYPE = {\r\n Checkbox: 'checked',\r\n Switch: 'checked',\r\n};\r\n\r\nconst FILTER_TEXT_CONTROL_TYPES = new Set([\r\n 'Autocomplete',\r\n 'JsonInput',\r\n 'PasswordInput',\r\n 'PinInput',\r\n 'TextInput',\r\n 'Textarea',\r\n]);\r\n\r\nconst FILTER_MULTI_CONTROL_TYPES = new Set([\r\n 'CheckboxGroup',\r\n 'MultiSelect',\r\n 'TagsInput',\r\n]);\r\n\r\nconst FILTER_RANGE_CONTROL_TYPES = new Set(['RangeSlider']);\r\n\r\nconst FILTER_DATE_CONTROL_TYPES = new Set([\r\n 'DateInput',\r\n 'DatePickerInput',\r\n 'DateTimePicker',\r\n 'MonthPickerInput',\r\n 'TimeInput',\r\n 'YearPickerInput',\r\n]);\r\n\r\nconst FILTER_EQUALITY_CONTROL_TYPES = new Set([\r\n 'ChipGroup',\r\n 'ColorInput',\r\n 'ColorPicker',\r\n 'NativeSelect',\r\n 'NumberInput',\r\n 'RadioGroup',\r\n 'Rating',\r\n 'SegmentedControl',\r\n 'Select',\r\n]);\r\n\r\nconst FILTER_CONTROL_TYPES = new Set([\r\n ...FILTER_TEXT_CONTROL_TYPES,\r\n ...FILTER_MULTI_CONTROL_TYPES,\r\n ...FILTER_RANGE_CONTROL_TYPES,\r\n ...FILTER_DATE_CONTROL_TYPES,\r\n ...FILTER_EQUALITY_CONTROL_TYPES,\r\n 'Checkbox',\r\n 'Switch',\r\n]);\r\n\r\nconst FILTER_INACTIVE_STRING_VALUES = new Set(['all', '__all__']);\r\n\r\nconst FILTER_OVERLAY_CONTROL_TYPES = new Set([\r\n ...FILTER_MULTI_CONTROL_TYPES,\r\n ...FILTER_DATE_CONTROL_TYPES,\r\n 'Autocomplete',\r\n 'Select',\r\n]);\r\n\r\nconst filterDefinitionNeedsClickOutsideDisabled = (definition) =>\r\n (definition?.controls || EMPTY_ARRAY).some((control) =>\r\n FILTER_OVERLAY_CONTROL_TYPES.has(control.typeName)\r\n );\r\n\r\nconst mergeEditorNestedProps = (value, overrides) =>\r\n value && typeof value === 'object' && !Array.isArray(value)\r\n ? { ...value, ...overrides }\r\n : overrides;\r\n\r\nconst mergeFilterNestedProps = (value, defaults) =>\r\n value && typeof value === 'object' && !Array.isArray(value)\r\n ? { ...defaults, ...value }\r\n : defaults;\r\n\r\nconst enhanceEditorNode = (\r\n editorNode,\r\n column,\r\n editorDefinition,\r\n value,\r\n handleValueChange,\r\n closeEditor\r\n) => {\r\n if (!React.isValidElement(editorNode)) {\r\n return editorNode;\r\n }\r\n\r\n const valueProp = resolveEditorValueProp(column, editorDefinition);\r\n const existingProps = editorNode.props || EMPTY_OBJECT;\r\n const originalOnChange = existingProps.onChange;\r\n const originalOnKeyDown = existingProps.onKeyDown;\r\n const originalSetProps = existingProps.setProps;\r\n // Keep combobox/date dropdowns inside the editable popover so outside-click\r\n // dismissal does not fire before MultiSelect/Select/DateInput can commit.\r\n const nextProps = {\r\n ...existingProps,\r\n [valueProp]: value,\r\n autoFocus: false,\r\n comboboxProps: mergeEditorNestedProps(existingProps.comboboxProps, {\r\n withinPortal: false,\r\n zIndex: 1100,\r\n }),\r\n popoverProps: mergeEditorNestedProps(existingProps.popoverProps, {\r\n withinPortal: false,\r\n zIndex: 1100,\r\n }),\r\n setProps: (nextChildProps = EMPTY_OBJECT) => {\r\n if (\r\n nextChildProps &&\r\n Object.prototype.hasOwnProperty.call(nextChildProps, valueProp)\r\n ) {\r\n handleValueChange(nextChildProps[valueProp]);\r\n }\r\n\r\n if (typeof originalSetProps === 'function') {\r\n originalSetProps(nextChildProps);\r\n }\r\n },\r\n onChange: (nextValue, ...args) => {\r\n handleValueChange(extractEditorValue(nextValue, valueProp));\r\n\r\n if (typeof originalOnChange === 'function') {\r\n originalOnChange(nextValue, ...args);\r\n }\r\n },\r\n onKeyDown: (event) => {\r\n if (event?.key === 'Escape') {\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n closeEditor();\r\n } else if (event?.key === 'Enter' && isTextLikeEditor(editorDefinition)) {\r\n closeEditor();\r\n }\r\n\r\n if (typeof originalOnKeyDown === 'function') {\r\n originalOnKeyDown(event);\r\n }\r\n },\r\n };\r\n\r\n return React.cloneElement(editorNode, nextProps);\r\n};\r\n\r\nconst safeStringify = (value) => {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n};\r\n\r\nconst serializeComponentId = (id) => {\r\n if (isNil(id)) {\r\n return undefined;\r\n }\r\n\r\n if (typeof id === 'string' || typeof id === 'number') {\r\n return String(id);\r\n }\r\n\r\n return safeStringify(id);\r\n};\r\n\r\nconst getNodeProps = (node) => {\r\n if (React.isValidElement(node) || isDryComponent(node)) {\r\n return node.props || EMPTY_OBJECT;\r\n }\r\n\r\n return EMPTY_OBJECT;\r\n};\r\n\r\nconst resolveFilterValueProp = (column, filterNode) => {\r\n if (typeof column?.filterValueProp === 'string') {\r\n return column.filterValueProp;\r\n }\r\n\r\n const typeName = getEditorTypeName(filterNode);\r\n\r\n if (FILTER_VALUE_PROP_BY_TYPE[typeName]) {\r\n return FILTER_VALUE_PROP_BY_TYPE[typeName];\r\n }\r\n\r\n const props = getNodeProps(filterNode);\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(props, 'checked') ||\r\n Object.prototype.hasOwnProperty.call(props, 'defaultChecked')\r\n ) {\r\n return 'checked';\r\n }\r\n\r\n return 'value';\r\n};\r\n\r\nconst isFilterControlNode = (node) => {\r\n const props = getNodeProps(node);\r\n\r\n if (props.filterRegistration === false || props.autoFilter === false) {\r\n return false;\r\n }\r\n\r\n const typeName = getEditorTypeName(node);\r\n const hasDashValueProp =\r\n typeof props.setProps === 'function' &&\r\n props.setProps !== NOOP_SET_PROPS &&\r\n ['value', 'defaultValue', 'checked', 'defaultChecked'].some((key) =>\r\n Object.prototype.hasOwnProperty.call(props, key)\r\n );\r\n\r\n return (\r\n FILTER_CONTROL_TYPES.has(typeName) ||\r\n props.filterRegistration === true ||\r\n props.autoFilter === true ||\r\n hasDashValueProp\r\n );\r\n};\r\n\r\nconst getFilterControlKey = (node, column, nodePath = EMPTY_ARRAY) => {\r\n const serializedId = serializeComponentId(getNodeProps(node).id);\r\n const pathKey = nodePath.length ? nodePath.join('.') : 'root';\r\n return serializedId || `${column?.accessor || '__filter__'}:${pathKey}`;\r\n};\r\n\r\nconst getFilterDefaultValue = (control) => {\r\n const props = control.props || EMPTY_OBJECT;\r\n\r\n if (Object.prototype.hasOwnProperty.call(props, control.valueProp)) {\r\n return props[control.valueProp];\r\n }\r\n\r\n const defaultValueProp =\r\n control.valueProp === 'checked' ? 'defaultChecked' : 'defaultValue';\r\n\r\n if (Object.prototype.hasOwnProperty.call(props, defaultValueProp)) {\r\n return props[defaultValueProp];\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst collectFilterControls = (node, column, nodePath = EMPTY_ARRAY) => {\r\n if (React.isValidElement(node) || isDryComponent(node)) {\r\n const props = getNodeProps(node);\r\n const controls = [];\r\n\r\n if (isFilterControlNode(node)) {\r\n const valueProp = resolveFilterValueProp(column, node);\r\n controls.push({\r\n key: getFilterControlKey(node, column, nodePath),\r\n path: nodePath,\r\n props,\r\n typeName: getEditorTypeName(node),\r\n valueProp,\r\n });\r\n }\r\n\r\n return controls.concat(\r\n collectFilterControls(props.children, column, [\r\n ...nodePath,\r\n 'children',\r\n ])\r\n );\r\n }\r\n\r\n if (Array.isArray(node)) {\r\n return node.flatMap((child, index) =>\r\n collectFilterControls(child, column, [...nodePath, index])\r\n );\r\n }\r\n\r\n return EMPTY_ARRAY;\r\n};\r\n\r\nconst buildFilterDefinitions = (\r\n columns,\r\n defaultColumnProps,\r\n locale,\r\n renderOptions\r\n) =>\r\n (columns || EMPTY_ARRAY).map((column) => {\r\n const effectiveColumn = defaultColumnProps\r\n ? { ...defaultColumnProps, ...column }\r\n : column;\r\n const filterTemplate = !isNil(column?.filter)\r\n ? column.filter\r\n : defaultColumnProps?.filter;\r\n\r\n if (!column?.accessor || isNil(filterTemplate)) {\r\n return {\r\n accessor: column?.accessor,\r\n column: effectiveColumn,\r\n controls: EMPTY_ARRAY,\r\n };\r\n }\r\n\r\n const resolvedFilter =\r\n typeof filterTemplate === 'function'\r\n ? undefined\r\n : resolveStaticTemplateNode(\r\n filterTemplate,\r\n column,\r\n locale,\r\n renderOptions\r\n );\r\n\r\n return {\r\n accessor: column.accessor,\r\n column: effectiveColumn,\r\n controls: resolvedFilter\r\n ? collectFilterControls(resolvedFilter, column)\r\n : EMPTY_ARRAY,\r\n };\r\n });\r\n\r\nconst getFilterDefinitionsKey = (definitions) =>\r\n safeStringify(\r\n (definitions || EMPTY_ARRAY).map((definition) => ({\r\n accessor: definition.accessor,\r\n controls: (definition.controls || EMPTY_ARRAY).map((control) => ({\r\n defaultValue: getFilterDefaultValue(control),\r\n key: control.key,\r\n typeName: control.typeName,\r\n valueProp: control.valueProp,\r\n })),\r\n }))\r\n );\r\n\r\nconst setFilterValueInCollection = (\r\n filterValues,\r\n accessor,\r\n filterKey,\r\n value,\r\n inputCount\r\n) => {\r\n const nextValues = isPlainObject(filterValues) ? { ...filterValues } : {};\r\n\r\n if (inputCount <= 1) {\r\n nextValues[accessor] = value;\r\n return nextValues;\r\n }\r\n\r\n const currentColumnValue = isPlainObject(nextValues[accessor])\r\n ? nextValues[accessor]\r\n : {};\r\n\r\n nextValues[accessor] = {\r\n ...currentColumnValue,\r\n [filterKey]: value,\r\n };\r\n\r\n return nextValues;\r\n};\r\n\r\nconst getFilterValueFromCollection = (\r\n filterValues,\r\n accessor,\r\n filterKey,\r\n inputCount\r\n) => {\r\n if (!isPlainObject(filterValues)) {\r\n return { hasValue: false, value: undefined };\r\n }\r\n\r\n if (!Object.prototype.hasOwnProperty.call(filterValues, accessor)) {\r\n return { hasValue: false, value: undefined };\r\n }\r\n\r\n const columnValue = filterValues[accessor];\r\n\r\n if (inputCount <= 1) {\r\n if (\r\n isPlainObject(columnValue) &&\r\n Object.prototype.hasOwnProperty.call(columnValue, filterKey)\r\n ) {\r\n return { hasValue: true, value: columnValue[filterKey] };\r\n }\r\n\r\n return { hasValue: true, value: columnValue };\r\n }\r\n\r\n if (\r\n isPlainObject(columnValue) &&\r\n Object.prototype.hasOwnProperty.call(columnValue, filterKey)\r\n ) {\r\n return { hasValue: true, value: columnValue[filterKey] };\r\n }\r\n\r\n return { hasValue: false, value: undefined };\r\n};\r\n\r\nconst buildInitialFilterValues = (definitions) =>\r\n (definitions || EMPTY_ARRAY).reduce((filterValues, definition) => {\r\n const controls = definition.controls || EMPTY_ARRAY;\r\n\r\n controls.forEach((control) => {\r\n const value = getFilterDefaultValue(control);\r\n\r\n if (isNil(value)) {\r\n return;\r\n }\r\n\r\n Object.assign(\r\n filterValues,\r\n setFilterValueInCollection(\r\n filterValues,\r\n definition.accessor,\r\n control.key,\r\n value,\r\n controls.length\r\n )\r\n );\r\n });\r\n\r\n return filterValues;\r\n }, {});\r\n\r\nconst syncFilterValuesWithDefinitions = (filterValues, definitions) => {\r\n const nextValues = {};\r\n\r\n (definitions || EMPTY_ARRAY).forEach((definition) => {\r\n if (\r\n definition.accessor &&\r\n definition.controls?.length &&\r\n Object.prototype.hasOwnProperty.call(filterValues, definition.accessor)\r\n ) {\r\n nextValues[definition.accessor] = filterValues[definition.accessor];\r\n }\r\n });\r\n\r\n return nextValues;\r\n};\r\n\r\nconst resolveFilterEmptyValue = (column, control) => {\r\n const resolvedColumn = column || EMPTY_OBJECT;\r\n const props = control.props || EMPTY_OBJECT;\r\n\r\n if (Object.prototype.hasOwnProperty.call(resolvedColumn, 'filterEmptyValue')) {\r\n return resolvedColumn.filterEmptyValue;\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(props, 'filterEmptyValue')) {\r\n return props.filterEmptyValue;\r\n }\r\n\r\n if (\r\n FILTER_RANGE_CONTROL_TYPES.has(control.typeName) &&\r\n !isNil(props.min) &&\r\n !isNil(props.max)\r\n ) {\r\n return [props.min, props.max];\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst isFilterValueActive = (value, emptyValue) => {\r\n if (!isNil(emptyValue) && areEditableValuesEqual(value, emptyValue)) {\r\n return false;\r\n }\r\n\r\n if (isNil(value)) {\r\n return false;\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalizedValue = value.trim();\r\n return (\r\n normalizedValue !== '' &&\r\n !FILTER_INACTIVE_STRING_VALUES.has(normalizedValue.toLowerCase())\r\n );\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.some((item) => isFilterValueActive(item, undefined));\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return Object.values(value).some((item) =>\r\n isFilterValueActive(item, undefined)\r\n );\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst getActiveColumnFilterEntries = (filterValues, definition) => {\r\n const controls = definition?.controls || EMPTY_ARRAY;\r\n\r\n return controls\r\n .map((control) => {\r\n const valueInfo = getFilterValueFromCollection(\r\n filterValues,\r\n definition.accessor,\r\n control.key,\r\n controls.length\r\n );\r\n const value = valueInfo.hasValue\r\n ? valueInfo.value\r\n : getFilterDefaultValue(control);\r\n const emptyValue = resolveFilterEmptyValue(definition.column, control);\r\n\r\n return {\r\n ...control,\r\n emptyValue,\r\n value,\r\n };\r\n })\r\n .filter((entry) => isFilterValueActive(entry.value, entry.emptyValue));\r\n};\r\n\r\nconst isColumnFilterActive = (filterValues, definition) =>\r\n getActiveColumnFilterEntries(filterValues, definition).length > 0;\r\n\r\nconst isDateLikeString = (value) =>\r\n typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value.trim());\r\n\r\nconst normalizeFilterComparableValue = (value) => {\r\n if (value instanceof Date) {\r\n return value.getTime();\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalizedValue = value.trim();\r\n const numericValue = Number(normalizedValue);\r\n\r\n if (normalizedValue !== '' && Number.isFinite(numericValue)) {\r\n return numericValue;\r\n }\r\n\r\n if (isDateLikeString(normalizedValue)) {\r\n const dateValue = Date.parse(normalizedValue);\r\n\r\n if (Number.isFinite(dateValue)) {\r\n return dateValue;\r\n }\r\n }\r\n\r\n return normalizedValue.toLowerCase();\r\n }\r\n\r\n return value;\r\n};\r\n\r\nconst filterValuesEqual = (left, right, caseSensitive = false) => {\r\n if (Array.isArray(left)) {\r\n return left.some((item) => filterValuesEqual(item, right, caseSensitive));\r\n }\r\n\r\n if (Array.isArray(right)) {\r\n return right.some((item) => filterValuesEqual(left, item, caseSensitive));\r\n }\r\n\r\n const normalizedLeft = normalizeFilterComparableValue(left);\r\n const normalizedRight = normalizeFilterComparableValue(right);\r\n\r\n if (typeof normalizedLeft === 'string' || typeof normalizedRight === 'string') {\r\n const leftText = isNil(normalizedLeft) ? '' : String(normalizedLeft);\r\n const rightText = isNil(normalizedRight) ? '' : String(normalizedRight);\r\n\r\n return caseSensitive\r\n ? leftText === rightText\r\n : leftText.toLowerCase() === rightText.toLowerCase();\r\n }\r\n\r\n return normalizedLeft === normalizedRight;\r\n};\r\n\r\nconst compareFilterValues = (left, right) => {\r\n const normalizedLeft = normalizeFilterComparableValue(left);\r\n const normalizedRight = normalizeFilterComparableValue(right);\r\n\r\n if (normalizedLeft < normalizedRight) {\r\n return -1;\r\n }\r\n\r\n if (normalizedLeft > normalizedRight) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst getFilterEntryText = (entry) =>\r\n [\r\n entry.key,\r\n serializeComponentId(entry.props?.id),\r\n entry.props?.label,\r\n entry.props?.placeholder,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n .toLowerCase();\r\n\r\nconst inferBoundOperator = (entry) => {\r\n const entryText = getFilterEntryText(entry);\r\n\r\n if (/(from|start|minimum|min|after|earliest|lower)/.test(entryText)) {\r\n return 'gte';\r\n }\r\n\r\n if (/(to|end|maximum|max|before|latest|upper)/.test(entryText)) {\r\n return 'lte';\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst inferFilterOperator = (column, entry) => {\r\n const configuredOperator =\r\n column.filterOperator || column.filterMatchMode || entry.props?.filterOperator;\r\n\r\n if (configuredOperator) {\r\n return configuredOperator;\r\n }\r\n\r\n const boundOperator = inferBoundOperator(entry);\r\n\r\n if (boundOperator) {\r\n return boundOperator;\r\n }\r\n\r\n if (FILTER_RANGE_CONTROL_TYPES.has(entry.typeName)) {\r\n return 'between';\r\n }\r\n\r\n if (\r\n FILTER_DATE_CONTROL_TYPES.has(entry.typeName) &&\r\n Array.isArray(entry.value)\r\n ) {\r\n return 'between';\r\n }\r\n\r\n if (FILTER_MULTI_CONTROL_TYPES.has(entry.typeName)) {\r\n return 'in';\r\n }\r\n\r\n if (FILTER_TEXT_CONTROL_TYPES.has(entry.typeName)) {\r\n return 'contains';\r\n }\r\n\r\n if (Array.isArray(entry.value)) {\r\n return 'in';\r\n }\r\n\r\n return 'equals';\r\n};\r\n\r\nconst matchesContainsFilter = (recordValue, filterValue, caseSensitive) => {\r\n const haystack = toSearchableText(recordValue);\r\n const needle = String(filterValue);\r\n\r\n return caseSensitive\r\n ? haystack.includes(needle)\r\n : haystack.toLowerCase().includes(needle.toLowerCase());\r\n};\r\n\r\nconst matchesInFilter = (recordValue, filterValue, caseSensitive) => {\r\n const filterItems = Array.isArray(filterValue) ? filterValue : [filterValue];\r\n\r\n if (Array.isArray(recordValue)) {\r\n return recordValue.some((item) =>\r\n filterItems.some((filterItem) =>\r\n filterValuesEqual(item, filterItem, caseSensitive)\r\n )\r\n );\r\n }\r\n\r\n return filterItems.some((filterItem) =>\r\n filterValuesEqual(recordValue, filterItem, caseSensitive)\r\n );\r\n};\r\n\r\nconst matchesBetweenFilter = (recordValue, lowerValue, upperValue) => {\r\n if (isNil(recordValue)) {\r\n return false;\r\n }\r\n\r\n if (isFilterValueActive(lowerValue, undefined)) {\r\n if (compareFilterValues(recordValue, lowerValue) < 0) {\r\n return false;\r\n }\r\n }\r\n\r\n if (isFilterValueActive(upperValue, undefined)) {\r\n if (compareFilterValues(recordValue, upperValue) > 0) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst matchesSingleColumnFilter = (recordValue, entry, column) => {\r\n const operator = inferFilterOperator(column, entry);\r\n const caseSensitive = Boolean(column.filterCaseSensitive);\r\n\r\n if (typeof column.filterPredicate === 'function') {\r\n return Boolean(\r\n column.filterPredicate(recordValue, entry.value, {\r\n column,\r\n filter: entry,\r\n })\r\n );\r\n }\r\n\r\n if (operator === 'contains') {\r\n return matchesContainsFilter(recordValue, entry.value, caseSensitive);\r\n }\r\n\r\n if (operator === 'startsWith') {\r\n const haystack = toSearchableText(recordValue);\r\n const needle = String(entry.value);\r\n return caseSensitive\r\n ? haystack.startsWith(needle)\r\n : haystack.toLowerCase().startsWith(needle.toLowerCase());\r\n }\r\n\r\n if (operator === 'endsWith') {\r\n const haystack = toSearchableText(recordValue);\r\n const needle = String(entry.value);\r\n return caseSensitive\r\n ? haystack.endsWith(needle)\r\n : haystack.toLowerCase().endsWith(needle.toLowerCase());\r\n }\r\n\r\n if (operator === 'in') {\r\n return matchesInFilter(recordValue, entry.value, caseSensitive);\r\n }\r\n\r\n if (operator === 'between' || operator === 'range') {\r\n const [lowerValue, upperValue] = Array.isArray(entry.value)\r\n ? entry.value\r\n : [undefined, entry.value];\r\n return matchesBetweenFilter(recordValue, lowerValue, upperValue);\r\n }\r\n\r\n if (operator === 'gte') {\r\n return compareFilterValues(recordValue, entry.value) >= 0;\r\n }\r\n\r\n if (operator === 'gt') {\r\n return compareFilterValues(recordValue, entry.value) > 0;\r\n }\r\n\r\n if (operator === 'lte') {\r\n return compareFilterValues(recordValue, entry.value) <= 0;\r\n }\r\n\r\n if (operator === 'lt') {\r\n return compareFilterValues(recordValue, entry.value) < 0;\r\n }\r\n\r\n if (operator === 'notIn') {\r\n return !matchesInFilter(recordValue, entry.value, caseSensitive);\r\n }\r\n\r\n return filterValuesEqual(recordValue, entry.value, caseSensitive);\r\n};\r\n\r\nconst getRangeBoundsFromEntries = (entries) => {\r\n let lowerValue;\r\n let upperValue;\r\n\r\n entries.forEach((entry) => {\r\n const operator = inferBoundOperator(entry);\r\n\r\n if (operator === 'lte') {\r\n upperValue = entry.value;\r\n return;\r\n }\r\n\r\n if (operator === 'gte') {\r\n lowerValue = entry.value;\r\n return;\r\n }\r\n\r\n if (isNil(lowerValue)) {\r\n lowerValue = entry.value;\r\n } else if (isNil(upperValue)) {\r\n upperValue = entry.value;\r\n }\r\n });\r\n\r\n return [lowerValue, upperValue];\r\n};\r\n\r\nconst shouldUseRangeEntries = (column, entries) => {\r\n if (entries.length < 2) {\r\n return false;\r\n }\r\n\r\n if (['between', 'range'].includes(column.filterOperator || column.filterMatchMode)) {\r\n return true;\r\n }\r\n\r\n if (entries.some((entry) => inferBoundOperator(entry))) {\r\n return true;\r\n }\r\n\r\n return entries.every(\r\n (entry) =>\r\n FILTER_DATE_CONTROL_TYPES.has(entry.typeName) ||\r\n entry.typeName === 'NumberInput'\r\n );\r\n};\r\n\r\nconst matchesColumnFilters = (record, filterValues, definition) => {\r\n const activeEntries = getActiveColumnFilterEntries(filterValues, definition);\r\n\r\n if (!activeEntries.length) {\r\n return true;\r\n }\r\n\r\n const column = definition.column || EMPTY_OBJECT;\r\n const accessor =\r\n column.filterAccessor || column.filterValueAccessor || definition.accessor;\r\n const recordValue = getAccessorValue(record, accessor);\r\n\r\n if (shouldUseRangeEntries(column, activeEntries)) {\r\n const [lowerValue, upperValue] = getRangeBoundsFromEntries(activeEntries);\r\n return matchesBetweenFilter(recordValue, lowerValue, upperValue);\r\n }\r\n\r\n return activeEntries.every((entry) =>\r\n matchesSingleColumnFilter(recordValue, entry, column)\r\n );\r\n};\r\n\r\nconst filterRecordsByColumnFilters = (records, filterValues, definitions) => {\r\n const activeDefinitions = (definitions || EMPTY_ARRAY).filter((definition) =>\r\n isColumnFilterActive(filterValues, definition)\r\n );\r\n\r\n if (!activeDefinitions.length) {\r\n return records;\r\n }\r\n\r\n return records.filter((record) =>\r\n activeDefinitions.every((definition) =>\r\n matchesColumnFilters(record, filterValues, definition)\r\n )\r\n );\r\n};\r\n\r\nconst enhanceFilterNode = (\r\n filterNode,\r\n column,\r\n filterOptions = EMPTY_OBJECT,\r\n nodePath = EMPTY_ARRAY\r\n) => {\r\n if (React.isValidElement(filterNode)) {\r\n const existingProps = filterNode.props || EMPTY_OBJECT;\r\n const enhancedChildren = Object.prototype.hasOwnProperty.call(\r\n existingProps,\r\n 'children'\r\n )\r\n ? enhanceFilterNode(\r\n existingProps.children,\r\n column,\r\n filterOptions,\r\n [...nodePath, 'children']\r\n )\r\n : undefined;\r\n const controls =\r\n filterOptions.filterDefinitionsByAccessor?.[column.accessor]?.controls ||\r\n EMPTY_ARRAY;\r\n const controlKey = getFilterControlKey(filterNode, column, nodePath);\r\n const control = controls.find((item) => item.key === controlKey);\r\n const nextProps = { ...existingProps };\r\n\r\n if (Object.prototype.hasOwnProperty.call(existingProps, 'children')) {\r\n nextProps.children = enhancedChildren;\r\n }\r\n\r\n if (!control) {\r\n return React.cloneElement(filterNode, nextProps);\r\n }\r\n\r\n const valueInfo = getFilterValueFromCollection(\r\n filterOptions.filterValues,\r\n column.accessor,\r\n control.key,\r\n controls.length\r\n );\r\n const hasExistingValue = Object.prototype.hasOwnProperty.call(\r\n existingProps,\r\n control.valueProp\r\n );\r\n\r\n if (valueInfo.hasValue || hasExistingValue) {\r\n nextProps[control.valueProp] = valueInfo.hasValue\r\n ? valueInfo.value\r\n : existingProps[control.valueProp];\r\n }\r\n\r\n nextProps.comboboxProps = mergeFilterNestedProps(\r\n existingProps.comboboxProps,\r\n { withinPortal: false }\r\n );\r\n nextProps.popoverProps = mergeFilterNestedProps(\r\n existingProps.popoverProps,\r\n { withinPortal: false }\r\n );\r\n\r\n const originalSetProps = existingProps.setProps;\r\n const originalOnChange = existingProps.onChange;\r\n const handleFilterChange = (nextValue) => {\r\n if (typeof filterOptions.handleFilterValueChange === 'function') {\r\n filterOptions.handleFilterValueChange(\r\n column,\r\n control,\r\n nextValue,\r\n controls.length\r\n );\r\n }\r\n };\r\n\r\n // DMC controls primarily sync through setProps; also keep onChange for\r\n // Mantine-native / non-Dash filter nodes and dual-wired components.\r\n nextProps.setProps = (nextChildProps = EMPTY_OBJECT) => {\r\n if (\r\n nextChildProps &&\r\n Object.prototype.hasOwnProperty.call(\r\n nextChildProps,\r\n control.valueProp\r\n )\r\n ) {\r\n handleFilterChange(nextChildProps[control.valueProp]);\r\n }\r\n\r\n if (typeof originalSetProps === 'function') {\r\n originalSetProps(nextChildProps);\r\n }\r\n };\r\n\r\n nextProps.onChange = (nextValue, ...args) => {\r\n handleFilterChange(\r\n extractEditorValue(nextValue, control.valueProp)\r\n );\r\n\r\n if (typeof originalOnChange === 'function') {\r\n originalOnChange(nextValue, ...args);\r\n }\r\n };\r\n\r\n return React.cloneElement(filterNode, nextProps);\r\n }\r\n\r\n if (Array.isArray(filterNode)) {\r\n return filterNode.map((child, index) =>\r\n enhanceFilterNode(child, column, filterOptions, [...nodePath, index])\r\n );\r\n }\r\n\r\n return filterNode;\r\n};\r\n\r\nconst EditableCellPopover = ({\r\n content,\r\n editor,\r\n editorDefinition,\r\n isEditing,\r\n closeEditor,\r\n handleValueChange,\r\n value,\r\n}) => {\r\n const dropdownRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (!isEditing || !dropdownRef.current) {\r\n return undefined;\r\n }\r\n\r\n const frameId = window.requestAnimationFrame(() => {\r\n const focusTarget = dropdownRef.current?.querySelector(\r\n 'input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [role=\"textbox\"], [type=\"radio\"]:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\r\n );\r\n\r\n if (!focusTarget || typeof focusTarget.focus !== 'function') {\r\n return;\r\n }\r\n\r\n try {\r\n focusTarget.focus({ preventScroll: true });\r\n } catch {\r\n focusTarget.focus();\r\n }\r\n });\r\n\r\n return () => window.cancelAnimationFrame(frameId);\r\n }, [isEditing]);\r\n\r\n return (\r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n event.stopPropagation()}\r\n onDoubleClick={(event) => event.stopPropagation()}\r\n onMouseDown={(event) => event.stopPropagation()}\r\n p=\"xs\"\r\n >\r\n \r\n {enhanceEditorNode(\r\n editor,\r\n editorDefinition?.column,\r\n editorDefinition?.editor,\r\n value,\r\n handleValueChange,\r\n closeEditor\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst normalizeGroupBy = (value) => {\r\n if (typeof value === 'string') {\r\n const normalizedAccessor = value.trim();\r\n return normalizedAccessor ? [normalizedAccessor] : EMPTY_ARRAY;\r\n }\r\n\r\n if (!Array.isArray(value)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return value\r\n .map((accessor) =>\r\n typeof accessor === 'string' ? accessor.trim() : ''\r\n )\r\n .filter(Boolean);\r\n};\r\n\r\nconst serializeGroupValue = (value) => {\r\n if (value instanceof Date) {\r\n return value.toISOString();\r\n }\r\n\r\n if (isNil(value)) {\r\n return '';\r\n }\r\n\r\n if (typeof value === 'object') {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n\r\n return String(value);\r\n};\r\n\r\nconst buildGroupRecordId = (path) =>\r\n [GROUP_RECORD_PREFIX]\r\n .concat(\r\n path.map(\r\n ({ accessor, value }) =>\r\n `${accessor}=${serializeGroupValue(value)}`\r\n )\r\n )\r\n .join('|');\r\n\r\nconst hasAccessorPath = (record, accessor) => {\r\n if (!record || typeof accessor !== 'string' || !accessor.trim()) {\r\n return false;\r\n }\r\n\r\n return accessor.split('.').every((key) => {\r\n if (\r\n record === null ||\r\n record === undefined ||\r\n typeof record !== 'object' ||\r\n !Object.prototype.hasOwnProperty.call(record, key)\r\n ) {\r\n return false;\r\n }\r\n\r\n record = record[key];\r\n return true;\r\n });\r\n};\r\n\r\nconst normalizeChildRowsAccessor = (value) => {\r\n if (typeof value !== 'string') {\r\n return undefined;\r\n }\r\n\r\n const normalizedAccessor = value.trim();\r\n return normalizedAccessor || undefined;\r\n};\r\n\r\nconst compareAggregationValues = (left, right) => {\r\n const normalizeComparableValue = (value) => {\r\n if (value instanceof Date) {\r\n return value.getTime();\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const numericValue = Number(value);\r\n if (Number.isFinite(numericValue) && value.trim() !== '') {\r\n return numericValue;\r\n }\r\n\r\n return value;\r\n }\r\n\r\n return String(value);\r\n };\r\n\r\n const normalizedLeft = normalizeComparableValue(left);\r\n const normalizedRight = normalizeComparableValue(right);\r\n\r\n if (normalizedLeft < normalizedRight) {\r\n return -1;\r\n }\r\n\r\n if (normalizedLeft > normalizedRight) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst compileCustomAggregator = (value) => {\r\n if (typeof value === 'function') {\r\n return value;\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n const source = value.trim();\r\n\r\n if (!source) {\r\n return null;\r\n }\r\n\r\n try {\r\n if (source.startsWith('lambda ')) {\r\n const lambdaMatch =\r\n /^lambda\\s*\\(([^)]*)\\)\\s*:\\s*([\\s\\S]+)$/.exec(source) ||\r\n /^lambda\\s+([^:]+)\\s*:\\s*([\\s\\S]+)$/.exec(source);\r\n\r\n if (lambdaMatch) {\r\n return Function(\r\n `return (${lambdaMatch[1].trim()}) => (${lambdaMatch[2].trim()});`\r\n )();\r\n }\r\n }\r\n\r\n if (source.includes('=>') || source.startsWith('function')) {\r\n return Function(`return (${source});`)();\r\n }\r\n\r\n return Function(\r\n 'values',\r\n 'records',\r\n 'groupRecord',\r\n 'outputAccessor',\r\n source\r\n );\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\nconst BUILT_IN_GROUP_AGGREGATORS = {\r\n count: (_values, records) => records.length,\r\n sum: (values) => {\r\n const numericValues = values\r\n .map((value) => Number(value))\r\n .filter((value) => Number.isFinite(value));\r\n\r\n if (!numericValues.length) {\r\n return undefined;\r\n }\r\n\r\n return numericValues.reduce((sum, value) => sum + value, 0);\r\n },\r\n mean: (values) => {\r\n const numericValues = values\r\n .map((value) => Number(value))\r\n .filter((value) => Number.isFinite(value));\r\n\r\n if (!numericValues.length) {\r\n return undefined;\r\n }\r\n\r\n return (\r\n numericValues.reduce((sum, value) => sum + value, 0) /\r\n numericValues.length\r\n );\r\n },\r\n median: (values) => {\r\n const numericValues = values\r\n .map((value) => Number(value))\r\n .filter((value) => Number.isFinite(value))\r\n .sort((left, right) => left - right);\r\n\r\n if (!numericValues.length) {\r\n return undefined;\r\n }\r\n\r\n const middleIndex = Math.floor(numericValues.length / 2);\r\n\r\n return numericValues.length % 2 === 0\r\n ? (numericValues[middleIndex - 1] + numericValues[middleIndex]) / 2\r\n : numericValues[middleIndex];\r\n },\r\n min: (values) => {\r\n const comparableValues = values.filter((value) => !isNil(value));\r\n\r\n if (!comparableValues.length) {\r\n return undefined;\r\n }\r\n\r\n return comparableValues.reduce((currentMin, value) =>\r\n compareAggregationValues(value, currentMin) < 0 ? value : currentMin\r\n );\r\n },\r\n max: (values) => {\r\n const comparableValues = values.filter((value) => !isNil(value));\r\n\r\n if (!comparableValues.length) {\r\n return undefined;\r\n }\r\n\r\n return comparableValues.reduce((currentMax, value) =>\r\n compareAggregationValues(value, currentMax) > 0 ? value : currentMax\r\n );\r\n },\r\n};\r\n\r\nconst normalizeGroupAggregations = (value) => {\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return Object.entries(value).flatMap(([outputAccessor, definition]) => {\r\n if (isNil(definition)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n if (typeof definition === 'string' || typeof definition === 'function') {\r\n return [\r\n {\r\n outputAccessor,\r\n sourceAccessor: outputAccessor,\r\n aggregator: definition,\r\n },\r\n ];\r\n }\r\n\r\n if (typeof definition !== 'object' || Array.isArray(definition)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return [\r\n {\r\n outputAccessor,\r\n sourceAccessor:\r\n typeof definition.accessor === 'string' &&\r\n definition.accessor.trim()\r\n ? definition.accessor.trim()\r\n : outputAccessor,\r\n aggregator:\r\n definition.fn ??\r\n definition.aggregator ??\r\n definition.operation ??\r\n definition.lambda ??\r\n definition.function ??\r\n definition.value,\r\n },\r\n ];\r\n });\r\n};\r\n\r\nconst applyGroupAggregations = (record, leafRecords, aggregationDefinitions) => {\r\n if (!Array.isArray(aggregationDefinitions) || !aggregationDefinitions.length) {\r\n return record;\r\n }\r\n\r\n return aggregationDefinitions.reduce((nextRecord, definition) => {\r\n const { outputAccessor, sourceAccessor, aggregator } = definition;\r\n const values = sourceAccessor\r\n ? leafRecords.map((leafRecord) => getAccessorValue(leafRecord, sourceAccessor))\r\n : EMPTY_ARRAY;\r\n const normalizedAggregator =\r\n typeof aggregator === 'string' &&\r\n Object.prototype.hasOwnProperty.call(\r\n BUILT_IN_GROUP_AGGREGATORS,\r\n aggregator.trim().toLowerCase()\r\n )\r\n ? BUILT_IN_GROUP_AGGREGATORS[aggregator.trim().toLowerCase()]\r\n : compileCustomAggregator(aggregator);\r\n\r\n if (typeof normalizedAggregator !== 'function') {\r\n return nextRecord;\r\n }\r\n\r\n const aggregatedValue = normalizedAggregator(\r\n values,\r\n leafRecords,\r\n nextRecord,\r\n outputAccessor\r\n );\r\n\r\n if (isNil(aggregatedValue)) {\r\n return nextRecord;\r\n }\r\n\r\n return {\r\n ...nextRecord,\r\n [outputAccessor]: aggregatedValue,\r\n };\r\n }, record);\r\n};\r\n\r\nconst isInlineHierarchyParentRecord = (record) =>\r\n Boolean(record?.__group || record?.__hierarchyParent);\r\n\r\nconst buildGroupedRecords = (\r\n records,\r\n accessors,\r\n aggregationDefinitions,\r\n path = EMPTY_ARRAY\r\n) => {\r\n if (\r\n !Array.isArray(records) ||\r\n !records.length ||\r\n !Array.isArray(accessors) ||\r\n !accessors.length\r\n ) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n const [accessor, ...remainingAccessors] = accessors;\r\n const groupedEntries = [];\r\n const groupedRecordsByKey = new Map();\r\n\r\n records.forEach((record) => {\r\n const groupValue = getAccessorValue(record, accessor);\r\n const groupKey = `${accessor}:${serializeGroupValue(groupValue)}`;\r\n\r\n if (!groupedRecordsByKey.has(groupKey)) {\r\n const groupPath = [...path, { accessor, value: groupValue }];\r\n const groupRecord = {\r\n __group: true,\r\n __groupAccessor: accessor,\r\n __groupId: buildGroupRecordId(groupPath),\r\n __groupLevel: path.length,\r\n __groupPath: groupPath,\r\n __groupValue: groupValue,\r\n __hierarchyParent: true,\r\n __groupedRecords: EMPTY_ARRAY,\r\n __remainingGroupBy: remainingAccessors,\r\n };\r\n\r\n if (!isNil(groupValue)) {\r\n groupRecord[accessor] = groupValue;\r\n }\r\n\r\n const nextEntry = {\r\n record: groupRecord,\r\n records: [],\r\n };\r\n\r\n groupedRecordsByKey.set(groupKey, nextEntry);\r\n groupedEntries.push(nextEntry);\r\n }\r\n\r\n groupedRecordsByKey.get(groupKey).records.push(record);\r\n });\r\n\r\n return groupedEntries.map((entry) => {\r\n const childPath = entry.record.__groupPath;\r\n const childRecords = remainingAccessors.length\r\n ? buildGroupedRecords(\r\n entry.records,\r\n remainingAccessors,\r\n aggregationDefinitions,\r\n childPath\r\n )\r\n : entry.records.map((record) => ({\r\n ...record,\r\n __group: false,\r\n __groupLevel: childPath.length,\r\n __leafRecords: [record],\r\n }));\r\n const leafRecords = remainingAccessors.length\r\n ? childRecords.flatMap((record) => record.__leafRecords || EMPTY_ARRAY)\r\n : entry.records;\r\n\r\n return applyGroupAggregations(\r\n {\r\n ...entry.record,\r\n __children: childRecords,\r\n __groupedRecords: leafRecords,\r\n __leafRecords: leafRecords,\r\n },\r\n leafRecords,\r\n aggregationDefinitions\r\n );\r\n });\r\n};\r\n\r\nconst collectGroupedRecordIds = (records) => {\r\n if (!Array.isArray(records)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return records.flatMap((record) =>\r\n record?.__group\r\n ? [\r\n record.__groupId,\r\n ...collectGroupedRecordIds(record.__children),\r\n ]\r\n : EMPTY_ARRAY\r\n );\r\n};\r\n\r\nconst buildChildRowsRecords = (\r\n records,\r\n childRowsAccessor,\r\n aggregationDefinitions,\r\n level = 0\r\n) => {\r\n if (!Array.isArray(records)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return records.map((record) => {\r\n const hasChildrenAccessor = hasAccessorPath(record, childRowsAccessor);\r\n const rawChildren = hasChildrenAccessor\r\n ? getAccessorValue(record, childRowsAccessor)\r\n : undefined;\r\n const childRecords = Array.isArray(rawChildren)\r\n ? buildChildRowsRecords(\r\n rawChildren,\r\n childRowsAccessor,\r\n aggregationDefinitions,\r\n level + 1\r\n )\r\n : EMPTY_ARRAY;\r\n const leafRecords = hasChildrenAccessor\r\n ? childRecords.flatMap((childRecord) => childRecord.__leafRecords || EMPTY_ARRAY)\r\n : [record];\r\n const nextRecord = {\r\n ...record,\r\n __children: childRecords,\r\n __group: false,\r\n __groupLevel: level,\r\n __groupedRecords: leafRecords,\r\n __hierarchyParent: hasChildrenAccessor,\r\n __leafRecords: leafRecords,\r\n };\r\n\r\n return hasChildrenAccessor\r\n ? applyGroupAggregations(\r\n nextRecord,\r\n leafRecords,\r\n aggregationDefinitions\r\n )\r\n : nextRecord;\r\n });\r\n};\r\n\r\nconst flattenGroupedRecords = (records, expandedRecordIds, idAccessor) => {\r\n if (!Array.isArray(records)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return records.flatMap((record) => {\r\n if (!isInlineHierarchyParentRecord(record)) {\r\n return [record];\r\n }\r\n\r\n const recordId = getRecordId(record, idAccessor);\r\n const isExpanded = expandedRecordIds.includes(recordId);\r\n\r\n return isExpanded\r\n ? [\r\n record,\r\n ...flattenGroupedRecords(\r\n record.__children,\r\n expandedRecordIds,\r\n idAccessor\r\n ),\r\n ]\r\n : [record];\r\n });\r\n};\r\n\r\nconst collectHierarchyRecords = (records) => {\r\n if (!Array.isArray(records)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return records.flatMap((record) => [\r\n record,\r\n ...collectHierarchyRecords(record?.__children),\r\n ]);\r\n};\r\n\r\nconst mergeExpandedRecordIds = (...lists) =>\r\n Array.from(\r\n new Set(\r\n lists.flatMap((list) => (Array.isArray(list) ? list : EMPTY_ARRAY))\r\n )\r\n );\r\n\r\nconst wrapGroupedCellContent = (\r\n content,\r\n record,\r\n expandedRecordIds,\r\n groupLevel = 0,\r\n idAccessor = 'id'\r\n) => {\r\n const isHierarchyParent = isInlineHierarchyParentRecord(record);\r\n const recordId = isHierarchyParent\r\n ? getRecordId(record, idAccessor)\r\n : undefined;\r\n const isExpanded =\r\n isHierarchyParent &&\r\n !isNil(recordId) &&\r\n Array.isArray(expandedRecordIds) &&\r\n expandedRecordIds.includes(recordId);\r\n\r\n return (\r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n );\r\n};\r\n\r\nconst interpolateTemplate = (template, record) => {\r\n if (!template || typeof template !== 'string') {\r\n return template;\r\n }\r\n\r\n return template.replace(/\\{([^}]+)\\}/g, (_, accessor) => {\r\n const value = getAccessorValue(record, accessor.trim());\r\n return isNil(value) ? '' : String(value);\r\n });\r\n};\r\n\r\nconst getTemplateValue = (context, accessor) => {\r\n const normalizedAccessor = accessor.trim();\r\n\r\n if (!normalizedAccessor) {\r\n return undefined;\r\n }\r\n\r\n if (normalizedAccessor === 'record' || normalizedAccessor === 'row') {\r\n return context.record;\r\n }\r\n\r\n if (normalizedAccessor === 'value') {\r\n return context.value;\r\n }\r\n\r\n if (normalizedAccessor === 'index') {\r\n return context.index;\r\n }\r\n\r\n if (normalizedAccessor === 'accessor') {\r\n return context.accessor;\r\n }\r\n\r\n if (normalizedAccessor === 'column') {\r\n return context.column;\r\n }\r\n\r\n if (normalizedAccessor === 'locale') {\r\n return context.locale;\r\n }\r\n\r\n if (normalizedAccessor.startsWith('record.')) {\r\n return getAccessorValue(context.record, normalizedAccessor.slice(7));\r\n }\r\n\r\n if (normalizedAccessor.startsWith('row.')) {\r\n return getAccessorValue(context.record, normalizedAccessor.slice(4));\r\n }\r\n\r\n if (normalizedAccessor.startsWith('column.')) {\r\n return getAccessorValue(context.column, normalizedAccessor.slice(7));\r\n }\r\n\r\n const directContextValue = getAccessorValue(context, normalizedAccessor);\r\n\r\n if (!isNil(directContextValue)) {\r\n return directContextValue;\r\n }\r\n\r\n return getAccessorValue(context.record, normalizedAccessor);\r\n};\r\n\r\nconst interpolateTemplateValue = (value, context) => {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n\r\n const matches = Array.from(value.matchAll(TEMPLATE_TOKEN_PATTERN));\r\n\r\n if (!matches.length) {\r\n return value;\r\n }\r\n\r\n if (matches.length === 1 && matches[0][0] === value) {\r\n return getTemplateValue(context, matches[0][1]);\r\n }\r\n\r\n return value.replace(TEMPLATE_TOKEN_PATTERN, (_, accessor) => {\r\n const resolvedValue = getTemplateValue(context, accessor);\r\n return isNil(resolvedValue) ? '' : String(resolvedValue);\r\n });\r\n};\r\n\r\nconst interpolateDryComponentNode = (node, context) => {\r\n if (Array.isArray(node)) {\r\n return node.map((item) => interpolateDryComponentNode(item, context));\r\n }\r\n\r\n if (isDryComponent(node)) {\r\n return {\r\n ...node,\r\n props: interpolateDryComponentNode(node.props, context),\r\n };\r\n }\r\n\r\n if (node && typeof node === 'object') {\r\n return Object.entries(node).reduce((accumulator, [key, value]) => {\r\n accumulator[key] = interpolateDryComponentNode(value, context);\r\n return accumulator;\r\n }, {});\r\n }\r\n\r\n return interpolateTemplateValue(node, context);\r\n};\r\n\r\nconst resolveDashComponentType = (node) => {\r\n const namespace = node?.namespace;\r\n const type = node?.type;\r\n\r\n if (!namespace || !type || typeof window === 'undefined') {\r\n return null;\r\n }\r\n\r\n if (namespace === 'dash_html_components' || namespace === 'dash.html') {\r\n return String(type).toLowerCase();\r\n }\r\n\r\n return trackDashComponentType(window?.[namespace]?.[type] || null, type);\r\n};\r\n\r\nconst normalizeTemplateAction = (value) => {\r\n if (typeof value !== 'string') {\r\n return undefined;\r\n }\r\n\r\n const normalized = value\r\n .replace(/-row$/, '')\r\n .replace(/[-_]+/g, ' ')\r\n .trim();\r\n\r\n return normalized || value;\r\n};\r\n\r\nconst buildTemplateClickPayload = (context, componentProps) => {\r\n const payload = buildEventPayload(\r\n {\r\n record: context.record,\r\n index: context.index,\r\n column: context.column,\r\n },\r\n context.idAccessor\r\n );\r\n const templateId = componentProps?.id;\r\n\r\n payload.trigger = 'templateClick';\r\n payload.templateId = templateId;\r\n\r\n if (\r\n templateId &&\r\n typeof templateId === 'object' &&\r\n !Array.isArray(templateId) &&\r\n typeof templateId.type === 'string'\r\n ) {\r\n payload.actionType = templateId.type;\r\n payload.action = normalizeTemplateAction(templateId.type);\r\n }\r\n\r\n return payload;\r\n};\r\n\r\nconst withTemplateClickHandler = (componentProps, context, renderOptions) => {\r\n if (\r\n isNil(componentProps?.id) ||\r\n isNil(componentProps?.n_clicks) ||\r\n typeof renderOptions?.updateProps !== 'function'\r\n ) {\r\n return componentProps;\r\n }\r\n\r\n const originalOnClick = componentProps.onClick;\r\n\r\n return {\r\n ...componentProps,\r\n onClick: (event) => {\r\n if (event?.stopPropagation) {\r\n event.stopPropagation();\r\n }\r\n\r\n renderOptions.updateProps({\r\n cellClick: buildTemplateClickPayload(context, componentProps),\r\n });\r\n\r\n if (typeof originalOnClick === 'function') {\r\n originalOnClick(event);\r\n }\r\n },\r\n };\r\n};\r\n\r\nconst materializeDashComponent = (\r\n node,\r\n context,\r\n renderOptions = EMPTY_OBJECT,\r\n nodePath = EMPTY_ARRAY\r\n) => {\r\n const componentType = resolveDashComponentType(node);\r\n\r\n if (!componentType) {\r\n return interpolateDryComponentNode(node, context);\r\n }\r\n\r\n const interpolatedProps = interpolateDryComponentNode(node.props || EMPTY_OBJECT, context);\r\n const nextProps = Object.entries(interpolatedProps).reduce(\r\n (accumulator, [key, value]) => {\r\n if (key === 'children') {\r\n return accumulator;\r\n }\r\n\r\n accumulator[key] = renderTemplateNode(value, context, renderOptions, [\r\n ...nodePath,\r\n key,\r\n ]);\r\n return accumulator;\r\n },\r\n {}\r\n );\r\n const componentProps =\r\n typeof componentType === 'string' ||\r\n typeof nextProps.setProps === 'function'\r\n ? nextProps\r\n : { ...nextProps, setProps: NOOP_SET_PROPS };\r\n const resolvedProps = withTemplateClickHandler(\r\n componentProps,\r\n context,\r\n renderOptions\r\n );\r\n const renderedChildren = Object.prototype.hasOwnProperty.call(\r\n interpolatedProps,\r\n 'children'\r\n )\r\n ? renderTemplateNode(interpolatedProps.children, context, renderOptions, [\r\n ...nodePath,\r\n 'children',\r\n ])\r\n : undefined;\r\n\r\n if (Array.isArray(renderedChildren)) {\r\n return React.createElement(componentType, resolvedProps, ...renderedChildren);\r\n }\r\n\r\n if (!isNil(renderedChildren)) {\r\n return React.createElement(componentType, resolvedProps, renderedChildren);\r\n }\r\n\r\n return React.createElement(componentType, resolvedProps);\r\n};\r\n\r\nconst getHydratedDashLayout = (node) => {\r\n if (!React.isValidElement(node)) {\r\n return null;\r\n }\r\n\r\n const props = node.props || EMPTY_OBJECT;\r\n\r\n if (isDryComponent(props.component)) {\r\n return props.component;\r\n }\r\n\r\n if (isDryComponent(props._dashprivate_layout)) {\r\n return props._dashprivate_layout;\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTemplateNode = (\r\n node,\r\n context,\r\n renderOptions = EMPTY_OBJECT,\r\n nodePath = EMPTY_ARRAY\r\n) => {\r\n if (React.isValidElement(node)) {\r\n // Dash-hydrated wrappers cannot be safely cloneElement'd for per-row\r\n // template interpolation. Re-materialize from the dry layout instead.\r\n const hydratedLayout = getHydratedDashLayout(node);\r\n if (hydratedLayout) {\r\n return materializeDashComponent(\r\n hydratedLayout,\r\n context,\r\n renderOptions,\r\n nodePath\r\n );\r\n }\r\n\r\n const nextProps = Object.keys(node.props || {}).reduce(\r\n (accumulator, key) => {\r\n // Preserve Dash/React internals when cloning plain elements.\r\n if (\r\n key === 'component' ||\r\n key === 'componentPath' ||\r\n key.startsWith('_dashprivate_')\r\n ) {\r\n accumulator[key] = node.props[key];\r\n return accumulator;\r\n }\r\n\r\n accumulator[key] = renderTemplateNode(\r\n node.props[key],\r\n context,\r\n renderOptions,\r\n [...nodePath, key]\r\n );\r\n return accumulator;\r\n },\r\n {}\r\n );\r\n\r\n return React.cloneElement(\r\n node,\r\n withTemplateClickHandler(nextProps, context, renderOptions)\r\n );\r\n }\r\n\r\n if (isDryComponent(node)) {\r\n return materializeDashComponent(node, context, renderOptions, nodePath);\r\n }\r\n\r\n if (Array.isArray(node)) {\r\n return node.map((item, index) =>\r\n renderTemplateNode(item, context, renderOptions, [...nodePath, index])\r\n );\r\n }\r\n\r\n if (node && typeof node === 'object') {\r\n return Object.entries(node).reduce((accumulator, [key, value]) => {\r\n accumulator[key] = renderTemplateNode(value, context, renderOptions, [\r\n ...nodePath,\r\n key,\r\n ]);\r\n return accumulator;\r\n }, {});\r\n }\r\n\r\n return interpolateTemplateValue(node, context);\r\n};\r\n\r\nconst buildTemplateContext = (record, index, column, locale, options = EMPTY_OBJECT) => ({\r\n accessor: column?.accessor,\r\n column,\r\n idAccessor: options.idAccessor,\r\n index,\r\n locale,\r\n record,\r\n recordId: getRecordId(record, options.idAccessor),\r\n row: record,\r\n value: getAccessorValue(record, column?.accessor),\r\n});\r\n\r\nconst resolveTemplateNode = (\r\n template,\r\n context,\r\n options = EMPTY_OBJECT\r\n) => {\r\n if (typeof template === 'function') {\r\n return template(context.record, context.index);\r\n }\r\n\r\n return renderTemplateNode(template, context, options);\r\n};\r\n\r\nconst resolveTemplateRender = (\r\n template,\r\n record,\r\n index,\r\n column,\r\n locale,\r\n options = EMPTY_OBJECT\r\n) =>\r\n resolveTemplateNode(\r\n template,\r\n buildTemplateContext(record, index, column, locale, options)\r\n );\r\n\r\nconst resolveStaticTemplateNode = (template, column, locale, options = EMPTY_OBJECT) =>\r\n resolveTemplateNode(\r\n template,\r\n buildTemplateContext(undefined, undefined, column, locale, options)\r\n );\r\n\r\nconst toDate = (value) => {\r\n if (value instanceof Date) {\r\n return value;\r\n }\r\n\r\n const nextDate = new Date(value);\r\n return Number.isNaN(nextDate.getTime()) ? null : nextDate;\r\n};\r\n\r\nconst formatPrimitiveValue = (value, column, locale) => {\r\n if (isNil(value)) {\r\n return column.emptyValue || '';\r\n }\r\n\r\n const presentation = column.presentation || column.type || 'text';\r\n const effectiveLocale = column.locale || locale;\r\n const intlOptions = column.formatOptions || EMPTY_OBJECT;\r\n\r\n if (\r\n presentation === 'number' ||\r\n presentation === 'currency' ||\r\n presentation === 'percent'\r\n ) {\r\n const numericValue = Number(value);\r\n\r\n if (Number.isNaN(numericValue)) {\r\n return String(value);\r\n }\r\n\r\n const options = { ...intlOptions };\r\n\r\n if (presentation === 'currency') {\r\n options.style = 'currency';\r\n options.currency = column.currency || options.currency || 'USD';\r\n } else if (presentation === 'percent') {\r\n options.style = 'percent';\r\n }\r\n\r\n if (!isNil(column.minimumFractionDigits)) {\r\n options.minimumFractionDigits = column.minimumFractionDigits;\r\n }\r\n\r\n if (!isNil(column.maximumFractionDigits)) {\r\n options.maximumFractionDigits = column.maximumFractionDigits;\r\n }\r\n\r\n return new Intl.NumberFormat(effectiveLocale, options).format(\r\n numericValue\r\n );\r\n }\r\n\r\n if (\r\n presentation === 'date' ||\r\n presentation === 'datetime' ||\r\n presentation === 'time'\r\n ) {\r\n const dateValue = toDate(value);\r\n\r\n if (!dateValue) {\r\n return String(value);\r\n }\r\n\r\n const options = { ...intlOptions };\r\n\r\n if (presentation === 'date') {\r\n options.dateStyle = options.dateStyle || 'medium';\r\n } else if (presentation === 'datetime') {\r\n options.dateStyle = options.dateStyle || 'medium';\r\n options.timeStyle = options.timeStyle || 'short';\r\n } else if (presentation === 'time') {\r\n options.timeStyle = options.timeStyle || 'short';\r\n }\r\n\r\n return new Intl.DateTimeFormat(effectiveLocale, options).format(\r\n dateValue\r\n );\r\n }\r\n\r\n if (presentation === 'boolean') {\r\n const trueLabel = column.trueLabel || 'Yes';\r\n const falseLabel = column.falseLabel || 'No';\r\n return value ? trueLabel : falseLabel;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (!value.length) {\r\n return column.emptyValue || '';\r\n }\r\n\r\n return value\r\n .map((item) => {\r\n if (isNil(item)) {\r\n return '';\r\n }\r\n\r\n if (typeof item === 'object') {\r\n return (\r\n item.label ||\r\n item.value ||\r\n item.name ||\r\n safeStringify(item)\r\n );\r\n }\r\n\r\n return String(item);\r\n })\r\n .filter(Boolean)\r\n .join(', ');\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return JSON.stringify(value);\r\n }\r\n\r\n return String(value);\r\n};\r\n\r\nconst buildDisplayValue = (record, column, locale) => {\r\n if (column.template) {\r\n return interpolateTemplate(column.template, record);\r\n }\r\n\r\n const accessorValue = getAccessorValue(record, column.accessor);\r\n\r\n if (typeof column.valueAccessor === 'string') {\r\n return getAccessorValue(record, column.valueAccessor);\r\n }\r\n\r\n return formatPrimitiveValue(accessorValue, column, locale);\r\n};\r\n\r\nconst renderFieldValue = (field, record, locale) => {\r\n const derivedField = {\r\n accessor: field.accessor,\r\n template: field.template,\r\n presentation: field.presentation,\r\n type: field.type,\r\n locale: field.locale,\r\n currency: field.currency,\r\n formatOptions: field.formatOptions,\r\n trueLabel: field.trueLabel,\r\n falseLabel: field.falseLabel,\r\n emptyValue: field.emptyValue,\r\n minimumFractionDigits: field.minimumFractionDigits,\r\n maximumFractionDigits: field.maximumFractionDigits,\r\n };\r\n\r\n const value = buildDisplayValue(record, derivedField, locale);\r\n\r\n if (field.type === 'code') {\r\n return {value};\r\n }\r\n\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n};\r\n\r\nconst renderExpansionContent = (\r\n config,\r\n record,\r\n locale,\r\n options = EMPTY_OBJECT\r\n) => {\r\n if (!config) {\r\n return null;\r\n }\r\n\r\n if (\r\n React.isValidElement(config) ||\r\n Array.isArray(config) ||\r\n isDryComponent(config)\r\n ) {\r\n return resolveTemplateNode(\r\n config,\r\n buildTemplateContext(\r\n record,\r\n undefined,\r\n { accessor: '__rowExpansion__' },\r\n locale,\r\n options\r\n ),\r\n options\r\n );\r\n }\r\n\r\n if (typeof config !== 'object') {\r\n return resolveTemplateNode(\r\n config,\r\n buildTemplateContext(\r\n record,\r\n undefined,\r\n { accessor: '__rowExpansion__' },\r\n locale,\r\n options\r\n ),\r\n options\r\n );\r\n }\r\n\r\n if (config.type === 'json') {\r\n const jsonValue = config.accessor\r\n ? getAccessorValue(record, config.accessor)\r\n : record;\r\n\r\n return (\r\n \r\n {JSON.stringify(jsonValue, null, 2)}\r\n \r\n );\r\n }\r\n\r\n if (config.type === 'text') {\r\n const textValue = config.template\r\n ? interpolateTemplate(config.template, record)\r\n : buildDisplayValue(record, config, locale);\r\n\r\n return {textValue};\r\n }\r\n\r\n const fields = Array.isArray(config.fields) ? config.fields : EMPTY_ARRAY;\r\n\r\n return (\r\n \r\n \r\n {config.title ? (\r\n {interpolateTemplate(config.title, record)}\r\n ) : null}\r\n {fields.map((field) => (\r\n \r\n \r\n {field.label || field.accessor}\r\n \r\n \r\n {renderFieldValue(field, record, locale)}\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nconst toComparableValue = (value) => {\r\n if (typeof value === 'string') {\r\n return value.toLowerCase();\r\n }\r\n\r\n if (value instanceof Date) {\r\n return value.getTime();\r\n }\r\n\r\n return value;\r\n};\r\n\r\nconst sortRecords = (records, sortStatus) => {\r\n if (!sortStatus || !sortStatus.columnAccessor) {\r\n return records;\r\n }\r\n\r\n const direction = sortStatus.direction === 'desc' ? -1 : 1;\r\n const accessor = sortStatus.sortKey || sortStatus.columnAccessor;\r\n const sorted = [...records];\r\n\r\n sorted.sort((left, right) => {\r\n const leftValue = toComparableValue(getAccessorValue(left, accessor));\r\n const rightValue = toComparableValue(getAccessorValue(right, accessor));\r\n\r\n if (isNil(leftValue) && isNil(rightValue)) {\r\n return 0;\r\n }\r\n\r\n if (isNil(leftValue)) {\r\n return 1;\r\n }\r\n\r\n if (isNil(rightValue)) {\r\n return -1;\r\n }\r\n\r\n if (leftValue > rightValue) {\r\n return direction;\r\n }\r\n\r\n if (leftValue < rightValue) {\r\n return -direction;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n return sorted;\r\n};\r\n\r\nconst toSearchableText = (value) => {\r\n if (isNil(value)) {\r\n return '';\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map(toSearchableText).join(' ');\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return JSON.stringify(value);\r\n }\r\n\r\n return String(value);\r\n};\r\n\r\nconst filterRecords = (records, query, accessors) => {\r\n if (!query) {\r\n return records;\r\n }\r\n\r\n const normalizedQuery = String(query).trim().toLowerCase();\r\n\r\n if (!normalizedQuery) {\r\n return records;\r\n }\r\n\r\n return records.filter((record) =>\r\n accessors.some((accessor) =>\r\n toSearchableText(getAccessorValue(record, accessor))\r\n .toLowerCase()\r\n .includes(normalizedQuery)\r\n )\r\n );\r\n};\r\n\r\nconst isCompositeIdAccessor = (value) =>\r\n value && typeof value === 'object' && !Array.isArray(value);\r\n\r\nconst joinRecordIdParts = (values, separator = ':') =>\r\n values.map((value) => (isNil(value) ? '' : String(value))).join(separator);\r\n\r\nconst getRecordId = (record, idAccessor) => {\r\n if (!record) {\r\n return undefined;\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(record, '__groupId')) {\r\n return record.__groupId;\r\n }\r\n\r\n if (typeof idAccessor === 'function') {\r\n return idAccessor(record);\r\n }\r\n\r\n if (Array.isArray(idAccessor)) {\r\n return joinRecordIdParts(\r\n idAccessor.map((accessor) => getAccessorValue(record, accessor))\r\n );\r\n }\r\n\r\n if (isCompositeIdAccessor(idAccessor)) {\r\n if (typeof idAccessor.template === 'string') {\r\n return interpolateTemplate(idAccessor.template, record);\r\n }\r\n\r\n if (Array.isArray(idAccessor.accessors)) {\r\n return joinRecordIdParts(\r\n idAccessor.accessors.map((accessor) =>\r\n getAccessorValue(record, accessor)\r\n ),\r\n idAccessor.separator\r\n );\r\n }\r\n\r\n if (typeof idAccessor.accessor === 'string') {\r\n return getAccessorValue(record, idAccessor.accessor);\r\n }\r\n }\r\n\r\n return getAccessorValue(record, idAccessor || 'id');\r\n};\r\n\r\nconst isRowRule = (value) =>\r\n value &&\r\n typeof value === 'object' &&\r\n !Array.isArray(value) &&\r\n (Object.prototype.hasOwnProperty.call(value, 'selector') ||\r\n Object.prototype.hasOwnProperty.call(value, 'when'));\r\n\r\nconst matchesSelectorCondition = (actualValue, condition) => {\r\n if (!condition || typeof condition !== 'object' || Array.isArray(condition)) {\r\n return actualValue === condition;\r\n }\r\n\r\n if (\r\n isNil(actualValue) &&\r\n ['gt', 'gte', 'lt', 'lte', 'contains', 'startsWith', 'endsWith'].some(\r\n (key) => Object.prototype.hasOwnProperty.call(condition, key)\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'eq') &&\r\n actualValue !== condition.eq\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'ne') &&\r\n actualValue === condition.ne\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'gt') &&\r\n !(actualValue > condition.gt)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'gte') &&\r\n !(actualValue >= condition.gte)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'lt') &&\r\n !(actualValue < condition.lt)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'lte') &&\r\n !(actualValue <= condition.lte)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'in') &&\r\n (!Array.isArray(condition.in) || !condition.in.includes(actualValue))\r\n ) {\r\n return false;\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(condition, 'notIn') &&\r\n Array.isArray(condition.notIn) &&\r\n condition.notIn.includes(actualValue)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(condition, 'contains')) {\r\n const haystack = toSearchableText(actualValue);\r\n if (!haystack.includes(String(condition.contains))) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(condition, 'startsWith')) {\r\n const haystack = toSearchableText(actualValue);\r\n if (!haystack.startsWith(String(condition.startsWith))) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(condition, 'endsWith')) {\r\n const haystack = toSearchableText(actualValue);\r\n if (!haystack.endsWith(String(condition.endsWith))) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst matchesRowSelector = (record, index, selector, idAccessor) => {\r\n if (isNil(selector)) {\r\n return true;\r\n }\r\n\r\n if (typeof selector === 'function') {\r\n return Boolean(selector(record, index));\r\n }\r\n\r\n if (Array.isArray(selector)) {\r\n return selector.some((childSelector) =>\r\n matchesRowSelector(record, index, childSelector, idAccessor)\r\n );\r\n }\r\n\r\n if (typeof selector === 'string' || typeof selector === 'number') {\r\n return getRecordId(record, idAccessor) === selector;\r\n }\r\n\r\n if (typeof selector === 'object') {\r\n return Object.entries(selector).every(([accessor, expectedValue]) => {\r\n let actualValue;\r\n\r\n if (accessor === 'index') {\r\n actualValue = index;\r\n } else if (accessor === 'id' || accessor === 'recordId') {\r\n actualValue = getRecordId(record, idAccessor);\r\n } else {\r\n actualValue = getAccessorValue(record, accessor);\r\n }\r\n\r\n if (Array.isArray(expectedValue)) {\r\n return expectedValue.includes(actualValue);\r\n }\r\n\r\n return matchesSelectorCondition(actualValue, expectedValue);\r\n });\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getRowRuleValue = (rule, fallbackKey) => {\r\n if (Object.prototype.hasOwnProperty.call(rule, 'value')) {\r\n return rule.value;\r\n }\r\n\r\n if (\r\n fallbackKey &&\r\n Object.prototype.hasOwnProperty.call(rule, fallbackKey)\r\n ) {\r\n return rule[fallbackKey];\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\nconst resolveRowRuleEntryValue = (\r\n entry,\r\n fallbackKey,\r\n record,\r\n index,\r\n idAccessor\r\n) => {\r\n if (!isRowRule(entry)) {\r\n return entry;\r\n }\r\n\r\n const selector = Object.prototype.hasOwnProperty.call(entry, 'selector')\r\n ? entry.selector\r\n : entry.when;\r\n\r\n if (!matchesRowSelector(record, index, selector, idAccessor)) {\r\n return undefined;\r\n }\r\n\r\n return getRowRuleValue(entry, fallbackKey);\r\n};\r\n\r\nconst buildRowValueResolver = (\r\n value,\r\n fallbackKey,\r\n idAccessor,\r\n { merge = false } = {}\r\n) => {\r\n if (typeof value === 'function') {\r\n return value;\r\n }\r\n\r\n if (isNil(value)) {\r\n return undefined;\r\n }\r\n\r\n return (record, index) => {\r\n const entries = Array.isArray(value) ? value : [value];\r\n\r\n if (merge) {\r\n const mergedValue = entries.reduce((accumulator, entry) => {\r\n const resolvedValue = resolveRowRuleEntryValue(\r\n entry,\r\n fallbackKey,\r\n record,\r\n index,\r\n idAccessor\r\n );\r\n\r\n if (\r\n resolvedValue &&\r\n typeof resolvedValue === 'object' &&\r\n !Array.isArray(resolvedValue)\r\n ) {\r\n return { ...accumulator, ...resolvedValue };\r\n }\r\n\r\n return accumulator;\r\n }, {});\r\n\r\n return Object.keys(mergedValue).length ? mergedValue : undefined;\r\n }\r\n\r\n let resolvedValue;\r\n entries.forEach((entry) => {\r\n const nextValue = resolveRowRuleEntryValue(\r\n entry,\r\n fallbackKey,\r\n record,\r\n index,\r\n idAccessor\r\n );\r\n\r\n if (!isNil(nextValue)) {\r\n resolvedValue = nextValue;\r\n }\r\n });\r\n\r\n return resolvedValue;\r\n };\r\n};\r\n\r\nconst buildRowClassNameResolver = (value, idAccessor) => {\r\n if (typeof value === 'function' || typeof value === 'string') {\r\n return value;\r\n }\r\n\r\n if (isNil(value)) {\r\n return undefined;\r\n }\r\n\r\n return (record, index) => {\r\n const entries = Array.isArray(value) ? value : [value];\r\n const classNames = entries\r\n .map((entry) =>\r\n resolveRowRuleEntryValue(\r\n entry,\r\n 'className',\r\n record,\r\n index,\r\n idAccessor\r\n )\r\n )\r\n .filter(Boolean);\r\n\r\n return classNames.length ? clsx(classNames) : undefined;\r\n };\r\n};\r\n\r\nconst buildRowStyleResolver = (value, idAccessor) => {\r\n if (typeof value === 'function') {\r\n return value;\r\n }\r\n\r\n if (isNil(value)) {\r\n return undefined;\r\n }\r\n\r\n return (record, index) => {\r\n const entries = Array.isArray(value) ? value : [value];\r\n const mergedStyle = entries.reduce((accumulator, entry) => {\r\n const nextStyle = resolveRowRuleEntryValue(\r\n entry,\r\n 'style',\r\n record,\r\n index,\r\n idAccessor\r\n );\r\n\r\n if (\r\n nextStyle &&\r\n typeof nextStyle === 'object' &&\r\n !Array.isArray(nextStyle)\r\n ) {\r\n return { ...accumulator, ...nextStyle };\r\n }\r\n\r\n return accumulator;\r\n }, {});\r\n\r\n return Object.keys(mergedStyle).length ? mergedStyle : undefined;\r\n };\r\n};\r\n\r\nconst buildRowBooleanResolver = (\r\n value,\r\n fallbackKey,\r\n idAccessor,\r\n defaultValue\r\n) => {\r\n if (typeof value === 'function') {\r\n return (record, index) => {\r\n const resolvedValue = value(record, index);\r\n return isNil(resolvedValue) ? defaultValue : Boolean(resolvedValue);\r\n };\r\n }\r\n\r\n if (isNil(value)) {\r\n return undefined;\r\n }\r\n\r\n return (record, index) => {\r\n const entries = Array.isArray(value) ? value : [value];\r\n let resolvedValue = defaultValue;\r\n\r\n entries.forEach((entry) => {\r\n const nextValue = resolveRowRuleEntryValue(\r\n entry,\r\n fallbackKey,\r\n record,\r\n index,\r\n idAccessor\r\n );\r\n\r\n if (!isNil(nextValue)) {\r\n resolvedValue = Boolean(nextValue);\r\n }\r\n });\r\n\r\n return resolvedValue;\r\n };\r\n};\r\n\r\nconst resolveMantineIdAccessor = (idAccessor) => {\r\n if (typeof idAccessor === 'function' || typeof idAccessor === 'string') {\r\n return idAccessor;\r\n }\r\n\r\n if (isNil(idAccessor)) {\r\n return 'id';\r\n }\r\n\r\n return (record) => getRecordId(record, idAccessor);\r\n};\r\n\r\nconst buildEventPayload = (params, idAccessor) => {\r\n const recordId = getRecordId(params.record, idAccessor);\r\n const payload = {\r\n record: params.record,\r\n recordId,\r\n index: params.index,\r\n timestamp: Date.now(),\r\n };\r\n\r\n if (params.column) {\r\n payload.column = params.column;\r\n payload.columnAccessor = params.column.accessor;\r\n payload.columnIndex = params.columnIndex;\r\n payload.value = getAccessorValue(params.record, params.column.accessor);\r\n }\r\n\r\n return payload;\r\n};\r\n\r\nconst flattenGroupColumns = (groupDefinitions) => {\r\n if (!Array.isArray(groupDefinitions)) {\r\n return EMPTY_ARRAY;\r\n }\r\n\r\n return groupDefinitions.flatMap((group) => [\r\n ...(Array.isArray(group?.columns) ? group.columns : EMPTY_ARRAY),\r\n ...flattenGroupColumns(group?.groups),\r\n ]);\r\n};\r\n\r\nconst syncGroupsWithEffectiveColumns = (groupDefinitions, effectiveColumns) => {\r\n if (!Array.isArray(groupDefinitions)) {\r\n return undefined;\r\n }\r\n\r\n return groupDefinitions.map((group) => {\r\n const groupAccessors = new Set(\r\n Array.isArray(group?.columns)\r\n ? group.columns.map((column) => column?.accessor).filter(Boolean)\r\n : EMPTY_ARRAY\r\n );\r\n\r\n return {\r\n ...group,\r\n columns: (effectiveColumns || EMPTY_ARRAY).filter((column) =>\r\n groupAccessors.has(column?.accessor)\r\n ),\r\n groups: Array.isArray(group?.groups)\r\n ? syncGroupsWithEffectiveColumns(group.groups, effectiveColumns)\r\n : group?.groups,\r\n };\r\n });\r\n};\r\n\r\nconst buildColumn = (\r\n column,\r\n locale,\r\n defaultColumnRender,\r\n renderOptions,\r\n editingOptions = EMPTY_OBJECT,\r\n filterOptions = EMPTY_OBJECT\r\n) => {\r\n const resolvedFilter =\r\n typeof column.filter === 'function'\r\n ? (params) =>\r\n enhanceFilterNode(\r\n column.filter(params),\r\n column,\r\n filterOptions\r\n )\r\n : isNil(column.filter)\r\n ? column.filter\r\n : enhanceFilterNode(\r\n resolveStaticTemplateNode(\r\n column.filter,\r\n column,\r\n locale,\r\n renderOptions\r\n ),\r\n column,\r\n filterOptions\r\n );\r\n const resolvedFiltering = !isNil(column.filtering)\r\n ? column.filtering\r\n : typeof filterOptions.isColumnFilterActive === 'function'\r\n ? filterOptions.isColumnFilterActive(column)\r\n : column.filtering;\r\n\r\n return {\r\n accessor: column.accessor,\r\n title: column.title,\r\n textAlign: column.textAlign,\r\n sortable: column.sortable,\r\n sortKey: column.sortKey,\r\n draggable: column.draggable,\r\n toggleable: column.toggleable,\r\n resizable: column.resizable,\r\n defaultToggle: column.defaultToggle,\r\n filter: resolvedFilter,\r\n filtering: resolvedFiltering,\r\n filterPopoverProps: column.filterPopoverProps,\r\n filterPopoverDisableClickOutside:\r\n column.filterPopoverDisableClickOutside ??\r\n (typeof filterOptions.shouldDisableFilterPopoverClickOutside ===\r\n 'function'\r\n ? filterOptions.shouldDisableFilterPopoverClickOutside(column)\r\n : undefined),\r\n width: column.width,\r\n hidden: column.hidden,\r\n hiddenContent: column.hiddenContent,\r\n visibleMediaQuery: column.visibleMediaQuery,\r\n titleClassName: column.titleClassName,\r\n titleStyle: column.titleStyle,\r\n cellsClassName: clsx(column.cellsClassName),\r\n cellsStyle:\r\n typeof column.cellsStyle === 'function'\r\n ? column.cellsStyle\r\n : column.cellsStyle\r\n ? () => column.cellsStyle\r\n : undefined,\r\n customCellAttributes: buildRowValueResolver(\r\n !isNil(column.cellAttributes)\r\n ? column.cellAttributes\r\n : column.customCellAttributes,\r\n 'attributes',\r\n renderOptions.idAccessor,\r\n { merge: true }\r\n ),\r\n footer: isNil(column.footer)\r\n ? column.footer\r\n : resolveStaticTemplateNode(\r\n column.footer,\r\n column,\r\n locale,\r\n renderOptions\r\n ),\r\n footerClassName: column.footerClassName,\r\n footerStyle: column.footerStyle,\r\n ellipsis: column.ellipsis,\r\n noWrap: column.noWrap,\r\n render: (record, index) => {\r\n const rawValue = getAccessorValue(record, column.accessor);\r\n const formattedValue = buildDisplayValue(record, column, locale);\r\n const presentation = column.presentation || column.type || 'text';\r\n const customRender = column.render;\r\n let content;\r\n\r\n if (!isNil(customRender)) {\r\n content = resolveTemplateRender(\r\n customRender,\r\n record,\r\n index,\r\n column,\r\n locale,\r\n renderOptions\r\n );\r\n } else if (presentation === 'badge') {\r\n const badgeColor = column.badgeColorAccessor\r\n ? getAccessorValue(record, column.badgeColorAccessor)\r\n : column.badgeColor || 'gray';\r\n\r\n content = (\r\n \r\n {formattedValue}\r\n \r\n );\r\n } else if (presentation === 'link') {\r\n const href = column.hrefAccessor\r\n ? getAccessorValue(record, column.hrefAccessor)\r\n : interpolateTemplate(column.hrefTemplate, record);\r\n\r\n content = (\r\n \r\n {formattedValue}\r\n \r\n );\r\n } else if (presentation === 'code') {\r\n content = {formattedValue};\r\n } else if (presentation === 'progress') {\r\n const progressValue = Number(rawValue || 0);\r\n content = (\r\n \r\n );\r\n } else if (presentation === 'json') {\r\n content = (\r\n \r\n {JSON.stringify(rawValue, null, 2)}\r\n \r\n );\r\n } else if (!isNil(defaultColumnRender)) {\r\n content = resolveTemplateRender(\r\n defaultColumnRender,\r\n record,\r\n index,\r\n column,\r\n locale,\r\n renderOptions\r\n );\r\n } else if (!hasAnyDefinedProp(column, ['color', 'fw', 'size'])) {\r\n content = formattedValue;\r\n } else {\r\n content = (\r\n \r\n {formattedValue}\r\n \r\n );\r\n }\r\n\r\n if (\r\n !column.editable ||\r\n !column.accessor ||\r\n record?.__group ||\r\n typeof editingOptions?.isEditingCell !== 'function' ||\r\n typeof editingOptions?.handleValueChange !== 'function' ||\r\n typeof editingOptions?.closeEditor !== 'function'\r\n ) {\r\n return content;\r\n }\r\n\r\n const editorDefinition = column.editor || ;\r\n const editorNode = resolveTemplateRender(\r\n editorDefinition,\r\n record,\r\n index,\r\n column,\r\n locale,\r\n renderOptions\r\n );\r\n\r\n return (\r\n \r\n editingOptions.handleValueChange(\r\n record,\r\n column,\r\n normalizeEditableValue(nextValue, column, editorDefinition)\r\n )\r\n }\r\n isEditing={editingOptions.isEditingCell(record, column)}\r\n value={rawValue}\r\n />\r\n );\r\n },\r\n };\r\n};\r\n\r\nconst buildGroup = (\r\n group,\r\n locale,\r\n defaultColumnRender,\r\n renderOptions,\r\n editingOptions = EMPTY_OBJECT,\r\n filterOptions = EMPTY_OBJECT\r\n) => ({\r\n id: group.id,\r\n title: group.title,\r\n textAlign: group.textAlign,\r\n className: group.className,\r\n style: group.style,\r\n columns: Array.isArray(group.columns)\r\n ? group.columns.map((column) =>\r\n buildColumn(\r\n column,\r\n locale,\r\n defaultColumnRender,\r\n renderOptions,\r\n editingOptions,\r\n filterOptions\r\n )\r\n )\r\n : undefined,\r\n groups: Array.isArray(group.groups)\r\n ? group.groups.map((childGroup) =>\r\n buildGroup(\r\n childGroup,\r\n locale,\r\n defaultColumnRender,\r\n renderOptions,\r\n editingOptions,\r\n filterOptions\r\n )\r\n )\r\n : undefined,\r\n});\r\n\r\nconst DataTable = ({\r\n data = EMPTY_ARRAY,\r\n columns = EMPTY_ARRAY,\r\n groups = undefined,\r\n groupBy = undefined,\r\n childRowsAccessor = undefined,\r\n groupAggregations = undefined,\r\n idAccessor = 'id',\r\n locale = 'en-US',\r\n paginationMode = 'client',\r\n sortMode = 'client',\r\n searchMode = 'client',\r\n filterMode = 'client',\r\n recordsPerPage = 10,\r\n pageSize = 10,\r\n noRecordsText = 'No records found',\r\n pageSizeOptions = [10, 25, 50],\r\n recordsPerPageOptions = undefined,\r\n recordsPerPageLabel = 'Rows per page',\r\n paginationSize = 'sm',\r\n direction = 'ltr',\r\n selectionTrigger = undefined,\r\n tableProps = EMPTY_OBJECT,\r\n scrollAreaProps = EMPTY_OBJECT,\r\n withRowBorders = true,\r\n withTableBorder = true,\r\n withColumnBorders = false,\r\n striped = false,\r\n highlightOnHover = true,\r\n textSelectionDisabled = false,\r\n ...props\r\n}) => {\r\n const {\r\n __groupLevel = 0,\r\n id,\r\n records,\r\n searchQuery,\r\n searchableAccessors,\r\n filterValues,\r\n page,\r\n totalRecords,\r\n sortStatus,\r\n sortIcons,\r\n selectedRecordIds,\r\n expandedRecordIds,\r\n selectionColumnClassName,\r\n selectionColumnStyle,\r\n selectionCheckboxProps,\r\n allRecordsSelectionCheckboxProps,\r\n selectableRowRules,\r\n disabledSelectionRowRules,\r\n selectionCheckboxRules,\r\n rowDragging,\r\n rowColor,\r\n rowBackgroundColor,\r\n rowClassName,\r\n rowStyle,\r\n rowAttributes,\r\n rowExpansion,\r\n setProps,\r\n emptyState,\r\n noRecordsIcon,\r\n paginationActiveTextColor,\r\n paginationActiveBackgroundColor,\r\n loadingText,\r\n customLoader,\r\n className,\r\n tableClassName,\r\n } = props;\r\n\r\n const allRecords = Array.isArray(records)\r\n ? records\r\n : Array.isArray(data)\r\n ? data\r\n : EMPTY_ARRAY;\r\n const normalizedGroupBy = normalizeGroupBy(groupBy);\r\n const normalizedChildRowsAccessor = normalizeChildRowsAccessor(childRowsAccessor);\r\n const normalizedGroupAggregations = normalizeGroupAggregations(groupAggregations);\r\n const hasRowGrouping = normalizedGroupBy.length > 0;\r\n const hasChildRowsHierarchy =\r\n !hasRowGrouping && Boolean(normalizedChildRowsAccessor);\r\n const hasInlineHierarchy = hasRowGrouping || hasChildRowsHierarchy;\r\n const isGroupedChildTable = __groupLevel > 0;\r\n const groupedRecordsForAllRows = hasRowGrouping\r\n ? buildGroupedRecords(\r\n allRecords,\r\n normalizedGroupBy,\r\n normalizedGroupAggregations\r\n )\r\n : undefined;\r\n const initialGroupedExpandedIds = hasRowGrouping\r\n ? collectGroupedRecordIds(groupedRecordsForAllRows)\r\n : EMPTY_ARRAY;\r\n const initialRowExpansionIds = Array.isArray(\r\n rowExpansion?.initiallyExpandedRecordIds\r\n )\r\n ? rowExpansion.initiallyExpandedRecordIds\r\n : EMPTY_ARRAY;\r\n const initialPageSize = recordsPerPage || pageSize || 10;\r\n\r\n const [internalPage, setInternalPage] = useState(page || 1);\r\n const [internalRecordsPerPage, setInternalRecordsPerPage] =\r\n useState(initialPageSize);\r\n const [internalSortStatus, setInternalSortStatus] = useState(\r\n sortStatus || null\r\n );\r\n const [internalSelectedIds, setInternalSelectedIds] = useState(\r\n Array.isArray(selectedRecordIds) ? selectedRecordIds : EMPTY_ARRAY\r\n );\r\n const [internalExpandedIds, setInternalExpandedIds] = useState(\r\n Array.isArray(expandedRecordIds)\r\n ? expandedRecordIds\r\n : mergeExpandedRecordIds(\r\n initialGroupedExpandedIds,\r\n initialRowExpansionIds\r\n )\r\n );\r\n const [activeEditableCell, setActiveEditableCell] = useState(null);\r\n\r\n const deferredSearchQuery = useDeferredValue(searchQuery);\r\n\r\n useEffect(() => {\r\n if (!isNil(page)) {\r\n setInternalPage(page);\r\n }\r\n }, [page]);\r\n\r\n useEffect(() => {\r\n if (!isNil(recordsPerPage) || !isNil(pageSize)) {\r\n setInternalRecordsPerPage(recordsPerPage || pageSize);\r\n }\r\n }, [recordsPerPage, pageSize]);\r\n\r\n useEffect(() => {\r\n if (sortStatus) {\r\n setInternalSortStatus(sortStatus);\r\n }\r\n }, [sortStatus]);\r\n\r\n useEffect(() => {\r\n if (Array.isArray(selectedRecordIds)) {\r\n setInternalSelectedIds(selectedRecordIds);\r\n }\r\n }, [selectedRecordIds]);\r\n\r\n useEffect(() => {\r\n if (Array.isArray(expandedRecordIds)) {\r\n setInternalExpandedIds(expandedRecordIds);\r\n }\r\n }, [expandedRecordIds]);\r\n\r\n const currentPage = isNil(page) ? internalPage : page;\r\n const currentRecordsPerPage = !isNil(recordsPerPage)\r\n ? recordsPerPage\r\n : !isNil(pageSize)\r\n ? pageSize\r\n : internalRecordsPerPage;\r\n const currentSortStatus = sortStatus || internalSortStatus;\r\n const currentSelectedIds = Array.isArray(selectedRecordIds)\r\n ? selectedRecordIds\r\n : internalSelectedIds;\r\n const currentExpandedIds = Array.isArray(expandedRecordIds)\r\n ? expandedRecordIds\r\n : internalExpandedIds;\r\n const rowDragSourceIdRef = useRef(null);\r\n const [draggedRowId, setDraggedRowId] = useState(null);\r\n const [dragOverRowId, setDragOverRowId] = useState(null);\r\n\r\n const groupedColumns = flattenGroupColumns(groups);\r\n const hasTopLevelColumns = Array.isArray(columns) && columns.length > 0;\r\n const hasGroups = Array.isArray(groups) && groups.length > 0;\r\n const sourceColumns = hasTopLevelColumns ? columns : groupedColumns;\r\n const { effectiveColumns } = useDataTableColumns({\r\n key: props.storeColumnsKey,\r\n columns: sourceColumns,\r\n });\r\n const resolvedColumns = Array.isArray(effectiveColumns)\r\n ? effectiveColumns\r\n : sourceColumns;\r\n const resolvedFilterColumns =\r\n props.defaultColumnProps && !isNil(props.defaultColumnProps.filter)\r\n ? resolvedColumns.map((column) =>\r\n isNil(column.filter)\r\n ? {\r\n ...column,\r\n filter: props.defaultColumnProps.filter,\r\n filterPopoverProps:\r\n column.filterPopoverProps ??\r\n props.defaultColumnProps.filterPopoverProps,\r\n filterPopoverDisableClickOutside:\r\n column.filterPopoverDisableClickOutside ??\r\n props.defaultColumnProps\r\n .filterPopoverDisableClickOutside,\r\n }\r\n : column\r\n )\r\n : resolvedColumns;\r\n const resolvedSearchableAccessors = Array.isArray(searchableAccessors)\r\n ? searchableAccessors\r\n : resolvedColumns\r\n .filter((column) => column.searchable !== false)\r\n .map((column) => column.accessor)\r\n .filter(Boolean);\r\n const templateRenderOptions = {\r\n idAccessor,\r\n };\r\n const columnFilterDefinitions = buildFilterDefinitions(\r\n resolvedFilterColumns,\r\n props.defaultColumnProps,\r\n locale,\r\n templateRenderOptions\r\n );\r\n const filterDefinitionsKey = getFilterDefinitionsKey(\r\n columnFilterDefinitions\r\n );\r\n const initialFilterValues = buildInitialFilterValues(\r\n columnFilterDefinitions\r\n );\r\n const [internalFilterValues, setInternalFilterValues] =\r\n useState(initialFilterValues);\r\n const filterValuesControlledRef = useRef(isPlainObject(filterValues));\r\n const filterValuesControlled = filterValuesControlledRef.current;\r\n\r\n useEffect(() => {\r\n if (filterValuesControlled) {\r\n return;\r\n }\r\n\r\n setInternalFilterValues((currentValues) =>\r\n syncFilterValuesWithDefinitions(\r\n { ...initialFilterValues, ...currentValues },\r\n columnFilterDefinitions\r\n )\r\n );\r\n }, [filterDefinitionsKey, filterValuesControlled]);\r\n\r\n const currentFilterValues = filterValuesControlled\r\n ? filterValues\r\n : internalFilterValues;\r\n const filterDefinitionsByAccessor = columnFilterDefinitions.reduce(\r\n (accumulator, definition) => {\r\n if (definition.accessor) {\r\n accumulator[definition.accessor] = definition;\r\n }\r\n\r\n return accumulator;\r\n },\r\n {}\r\n );\r\n\r\n const updateProps = (nextProps) => {\r\n if (setProps) {\r\n setProps(nextProps);\r\n }\r\n };\r\n\r\n const handleFilterValueChange = (\r\n column,\r\n control,\r\n nextValue,\r\n inputCount\r\n ) => {\r\n if (!column?.accessor || !control?.key) {\r\n return;\r\n }\r\n\r\n const nextFilterValues = setFilterValueInCollection(\r\n currentFilterValues,\r\n column.accessor,\r\n control.key,\r\n nextValue,\r\n inputCount || 1\r\n );\r\n const shouldResetPage = currentPage !== 1;\r\n\r\n if (!filterValuesControlled) {\r\n setInternalFilterValues(nextFilterValues);\r\n }\r\n\r\n if (shouldResetPage && isNil(page)) {\r\n setInternalPage(1);\r\n }\r\n\r\n updateProps({\r\n filterValues: nextFilterValues,\r\n lastFilterChange: {\r\n columnAccessor: column.accessor,\r\n filterKey: control.key,\r\n value: nextValue,\r\n columnFilterValue: nextFilterValues[column.accessor],\r\n active: isColumnFilterActive(\r\n nextFilterValues,\r\n filterDefinitionsByAccessor[column.accessor]\r\n ),\r\n timestamp: Date.now(),\r\n },\r\n ...(shouldResetPage ? { page: 1 } : EMPTY_OBJECT),\r\n });\r\n };\r\n\r\n const clientSearchFilteredRecords =\r\n searchMode === 'client'\r\n ? filterRecords(allRecords, deferredSearchQuery, resolvedSearchableAccessors)\r\n : allRecords;\r\n const clientFilteredRecords =\r\n filterMode === 'client'\r\n ? filterRecordsByColumnFilters(\r\n clientSearchFilteredRecords,\r\n currentFilterValues,\r\n columnFilterDefinitions\r\n )\r\n : clientSearchFilteredRecords;\r\n const clientSortedRecords =\r\n sortMode === 'client'\r\n ? sortRecords(clientFilteredRecords, currentSortStatus)\r\n : clientFilteredRecords;\r\n\r\n const computedTotalRecords =\r\n paginationMode === 'client'\r\n ? clientSortedRecords.length\r\n : totalRecords;\r\n\r\n const paginatedRecords =\r\n paginationMode === 'client'\r\n ? clientSortedRecords.slice(\r\n Math.max(currentPage - 1, 0) * currentRecordsPerPage,\r\n Math.max(currentPage - 1, 0) * currentRecordsPerPage +\r\n currentRecordsPerPage\r\n )\r\n : clientSortedRecords;\r\n const groupedRecords = hasRowGrouping\r\n ? buildGroupedRecords(\r\n paginatedRecords,\r\n normalizedGroupBy,\r\n normalizedGroupAggregations\r\n )\r\n : undefined;\r\n const childRowsRecords = hasChildRowsHierarchy\r\n ? buildChildRowsRecords(\r\n paginatedRecords,\r\n normalizedChildRowsAccessor,\r\n normalizedGroupAggregations\r\n )\r\n : undefined;\r\n const displayedRecords = hasRowGrouping\r\n ? flattenGroupedRecords(groupedRecords, currentExpandedIds, idAccessor)\r\n : hasChildRowsHierarchy\r\n ? flattenGroupedRecords(\r\n childRowsRecords,\r\n currentExpandedIds,\r\n idAccessor\r\n )\r\n : paginatedRecords;\r\n\r\n const selectableRecords = hasChildRowsHierarchy\r\n ? collectHierarchyRecords(childRowsRecords)\r\n : allRecords;\r\n const selectedRecordsPayload = selectableRecords.filter((record) =>\r\n currentSelectedIds.includes(getRecordId(record, idAccessor))\r\n );\r\n const selectableRowResolver = buildRowBooleanResolver(\r\n selectableRowRules,\r\n 'selectable',\r\n idAccessor,\r\n true\r\n );\r\n const disabledSelectionRowResolver = buildRowBooleanResolver(\r\n disabledSelectionRowRules,\r\n 'disabled',\r\n idAccessor,\r\n false\r\n );\r\n const selectionCheckboxPropsResolver = buildRowValueResolver(\r\n selectionCheckboxRules,\r\n 'checkboxProps',\r\n idAccessor,\r\n { merge: true }\r\n );\r\n const rowDraggingEnabled = Boolean(rowDragging) && !hasInlineHierarchy;\r\n\r\n const clearRowDraggingState = () => {\r\n rowDragSourceIdRef.current = null;\r\n setDraggedRowId(null);\r\n setDragOverRowId(null);\r\n };\r\n\r\n const closeEditableCell = () => {\r\n setActiveEditableCell(null);\r\n };\r\n\r\n const isEditingCell = (record, column) =>\r\n Boolean(\r\n activeEditableCell &&\r\n activeEditableCell.recordId === getRecordId(record, idAccessor) &&\r\n activeEditableCell.columnAccessor === column?.accessor\r\n );\r\n\r\n const handleEditableCellValueChange = (record, column, nextValue) => {\r\n const recordId = getRecordId(record, idAccessor);\r\n\r\n if (isNil(recordId) || !column?.accessor) {\r\n return;\r\n }\r\n\r\n const currentRecord = findRecordInCollection(\r\n allRecords,\r\n recordId,\r\n idAccessor,\r\n normalizedChildRowsAccessor\r\n );\r\n\r\n if (!currentRecord) {\r\n return;\r\n }\r\n\r\n const currentValue = getAccessorValue(currentRecord, column.accessor);\r\n\r\n if (areEditableValuesEqual(currentValue, nextValue)) {\r\n return;\r\n }\r\n\r\n const updatedRecords = updateRecordValueInCollection(\r\n allRecords,\r\n recordId,\r\n idAccessor,\r\n column.accessor,\r\n nextValue,\r\n normalizedChildRowsAccessor\r\n );\r\n\r\n if (!updatedRecords.didUpdate) {\r\n return;\r\n }\r\n\r\n updateProps({\r\n data: updatedRecords.records,\r\n records: updatedRecords.records,\r\n });\r\n };\r\n\r\n const handleCellDoubleClick = (params) => {\r\n const payload = buildEventPayload(params, idAccessor);\r\n const matchingColumn = resolvedColumns.find(\r\n (column) => column?.accessor === payload.columnAccessor\r\n );\r\n\r\n if (\r\n matchingColumn?.editable &&\r\n !params.record?.__group &&\r\n !isNil(payload.recordId)\r\n ) {\r\n setActiveEditableCell({\r\n columnAccessor: payload.columnAccessor,\r\n recordId: payload.recordId,\r\n });\r\n } else {\r\n closeEditableCell();\r\n }\r\n\r\n updateProps({\r\n cellDoubleClick: payload,\r\n });\r\n };\r\n\r\n const handlePageChange = (nextPage) => {\r\n if (isNil(page)) {\r\n setInternalPage(nextPage);\r\n }\r\n\r\n updateProps({\r\n page: nextPage,\r\n pagination: {\r\n page: nextPage,\r\n recordsPerPage: currentRecordsPerPage,\r\n totalRecords: computedTotalRecords,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n };\r\n\r\n const handleRecordsPerPageChange = (nextRecordsPerPage) => {\r\n if (isNil(recordsPerPage) && isNil(pageSize)) {\r\n setInternalRecordsPerPage(nextRecordsPerPage);\r\n }\r\n\r\n if (isNil(page)) {\r\n setInternalPage(1);\r\n }\r\n\r\n updateProps({\r\n recordsPerPage: nextRecordsPerPage,\r\n pageSize: nextRecordsPerPage,\r\n page: 1,\r\n pagination: {\r\n page: 1,\r\n recordsPerPage: nextRecordsPerPage,\r\n totalRecords: computedTotalRecords,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n };\r\n\r\n const handleSortStatusChange = (nextSortStatus) => {\r\n if (!sortStatus) {\r\n setInternalSortStatus(nextSortStatus);\r\n }\r\n\r\n updateProps({\r\n sortStatus: nextSortStatus,\r\n lastSortChange: {\r\n ...nextSortStatus,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n };\r\n\r\n const handleSelectedRecordsChange = (nextSelectedRecords) => {\r\n const nextSelectedIds = nextSelectedRecords.map((record) =>\r\n getRecordId(record, idAccessor)\r\n );\r\n\r\n if (!Array.isArray(selectedRecordIds)) {\r\n setInternalSelectedIds(nextSelectedIds);\r\n }\r\n\r\n updateProps({\r\n selectedRecordIds: nextSelectedIds,\r\n selectedRecords: nextSelectedRecords,\r\n lastSelectionChange: {\r\n recordIds: nextSelectedIds,\r\n records: nextSelectedRecords,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n };\r\n\r\n const buildExpandedRecordProps = (nextExpandedRecordIds) => ({\r\n expandedRecordIds: nextExpandedRecordIds,\r\n lastExpansionChange: {\r\n recordIds: nextExpandedRecordIds,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n\r\n const syncExpandedRecordIds = (nextExpandedRecordIds) => {\r\n if (!Array.isArray(expandedRecordIds)) {\r\n setInternalExpandedIds(nextExpandedRecordIds);\r\n }\r\n\r\n return buildExpandedRecordProps(nextExpandedRecordIds);\r\n };\r\n\r\n const handleExpandedRecordIdsChange = (nextExpandedRecordIds) => {\r\n updateProps(syncExpandedRecordIds(nextExpandedRecordIds));\r\n };\r\n\r\n const toggleInlineHierarchyRecord = (record) => {\r\n const recordId = getRecordId(record, idAccessor);\r\n\r\n if (isNil(recordId)) {\r\n return EMPTY_OBJECT;\r\n }\r\n\r\n const nextExpandedRecordIds = currentExpandedIds.includes(recordId)\r\n ? currentExpandedIds.filter((expandedId) => expandedId !== recordId)\r\n : mergeExpandedRecordIds(currentExpandedIds, [recordId]);\r\n\r\n return syncExpandedRecordIds(nextExpandedRecordIds);\r\n };\r\n\r\n const handleRowDragStart = (event, record) => {\r\n if (!rowDraggingEnabled || isInteractiveDragTarget(event.target)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const recordId = getRecordId(record, idAccessor);\r\n rowDragSourceIdRef.current = recordId;\r\n setDraggedRowId(recordId);\r\n setDragOverRowId(recordId);\r\n\r\n if (event.dataTransfer) {\r\n event.dataTransfer.effectAllowed = 'move';\r\n event.dataTransfer.dropEffect = 'move';\r\n\r\n try {\r\n event.dataTransfer.setData('text/plain', String(recordId));\r\n } catch {\r\n // Some browsers restrict custom drag payloads for table rows.\r\n }\r\n }\r\n };\r\n\r\n const handleRowDragOver = (event, record) => {\r\n if (!rowDraggingEnabled || !rowDragSourceIdRef.current) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n\r\n const recordId = getRecordId(record, idAccessor);\r\n if (recordId !== dragOverRowId) {\r\n setDragOverRowId(recordId);\r\n }\r\n };\r\n\r\n const handleRowDrop = (event, record) => {\r\n if (!rowDraggingEnabled || !rowDragSourceIdRef.current) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n const sourceRecordId = rowDragSourceIdRef.current;\r\n const destinationRecordId = getRecordId(record, idAccessor);\r\n const sourceIndex = allRecords.findIndex(\r\n (row) => getRecordId(row, idAccessor) === sourceRecordId\r\n );\r\n const destinationIndex = allRecords.findIndex(\r\n (row) => getRecordId(row, idAccessor) === destinationRecordId\r\n );\r\n\r\n if (\r\n sourceIndex === -1 ||\r\n destinationIndex === -1 ||\r\n sourceIndex === destinationIndex\r\n ) {\r\n clearRowDraggingState();\r\n return;\r\n }\r\n\r\n const reorderedRecords = reorderByIndices(\r\n allRecords,\r\n sourceIndex,\r\n destinationIndex\r\n );\r\n\r\n updateProps({\r\n data: reorderedRecords,\r\n records: reorderedRecords,\r\n lastRowDragChange: {\r\n sourceIndex,\r\n destinationIndex,\r\n record: allRecords[sourceIndex],\r\n recordId: sourceRecordId,\r\n records: reorderedRecords,\r\n recordIds: reorderedRecords.map((row) =>\r\n getRecordId(row, idAccessor)\r\n ),\r\n timestamp: Date.now(),\r\n },\r\n });\r\n\r\n clearRowDraggingState();\r\n };\r\n\r\n const builtRowFactory = rowDraggingEnabled\r\n ? ({ record, index, rowProps, children, expandedElement }) => {\r\n const recordId = getRecordId(record, idAccessor);\r\n\r\n return (\r\n \r\n \r\n handleRowDragOver(event, record, index)\r\n }\r\n onDragStart={(event) =>\r\n handleRowDragStart(event, record, index)\r\n }\r\n onDrop={(event) => handleRowDrop(event, record, index)}\r\n >\r\n {children}\r\n \r\n {expandedElement}\r\n \r\n );\r\n }\r\n : undefined;\r\n\r\n useEffect(() => {\r\n if (!rowDraggingEnabled) {\r\n clearRowDraggingState();\r\n }\r\n }, [rowDraggingEnabled]);\r\n\r\n useEffect(() => {\r\n if (!activeEditableCell) {\r\n return;\r\n }\r\n\r\n const hasActiveColumn = resolvedColumns.some(\r\n (column) => column?.accessor === activeEditableCell.columnAccessor\r\n );\r\n const hasActiveRecord = displayedRecords.some(\r\n (record) =>\r\n !record?.__group &&\r\n getRecordId(record, idAccessor) === activeEditableCell.recordId\r\n );\r\n\r\n if (!hasActiveColumn || !hasActiveRecord) {\r\n closeEditableCell();\r\n }\r\n }, [activeEditableCell, displayedRecords, idAccessor, resolvedColumns]);\r\n\r\n const resolvedDefaultColumnProps = props.defaultColumnProps\r\n ? { ...props.defaultColumnProps }\r\n : undefined;\r\n const resolvedDefaultColumnRender = !isNil(props.defaultColumnRender)\r\n ? props.defaultColumnRender\r\n : resolvedDefaultColumnProps && !isNil(resolvedDefaultColumnProps.render)\r\n ? resolvedDefaultColumnProps.render\r\n : undefined;\r\n\r\n if (\r\n resolvedDefaultColumnProps &&\r\n Object.prototype.hasOwnProperty.call(resolvedDefaultColumnProps, 'render')\r\n ) {\r\n delete resolvedDefaultColumnProps.render;\r\n }\r\n\r\n if (\r\n resolvedDefaultColumnProps &&\r\n !isNil(resolvedDefaultColumnProps.filter) &&\r\n typeof resolvedDefaultColumnProps.filter !== 'function'\r\n ) {\r\n resolvedDefaultColumnProps.filter = resolveStaticTemplateNode(\r\n resolvedDefaultColumnProps.filter,\r\n { accessor: '__default_filter__' },\r\n locale,\r\n templateRenderOptions\r\n );\r\n }\r\n\r\n if (\r\n resolvedDefaultColumnProps &&\r\n !isNil(resolvedDefaultColumnProps.footer)\r\n ) {\r\n resolvedDefaultColumnProps.footer = resolveStaticTemplateNode(\r\n resolvedDefaultColumnProps.footer,\r\n { accessor: '__default_footer__' },\r\n locale,\r\n templateRenderOptions\r\n );\r\n }\r\n\r\n if (resolvedDefaultColumnProps) {\r\n const defaultCellAttributes = !isNil(resolvedDefaultColumnProps.cellAttributes)\r\n ? resolvedDefaultColumnProps.cellAttributes\r\n : resolvedDefaultColumnProps.customCellAttributes;\r\n\r\n if (!isNil(defaultCellAttributes)) {\r\n resolvedDefaultColumnProps.customCellAttributes =\r\n buildRowValueResolver(\r\n defaultCellAttributes,\r\n 'attributes',\r\n idAccessor,\r\n { merge: true }\r\n );\r\n }\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(\r\n resolvedDefaultColumnProps,\r\n 'cellAttributes'\r\n )\r\n ) {\r\n delete resolvedDefaultColumnProps.cellAttributes;\r\n }\r\n }\r\n\r\n const filterOptions = {\r\n filterDefinitionsByAccessor,\r\n filterValues: currentFilterValues,\r\n handleFilterValueChange,\r\n isColumnFilterActive: (column) =>\r\n isColumnFilterActive(\r\n currentFilterValues,\r\n filterDefinitionsByAccessor[column.accessor]\r\n ),\r\n shouldDisableFilterPopoverClickOutside: (column) =>\r\n filterDefinitionNeedsClickOutsideDisabled(\r\n filterDefinitionsByAccessor[column.accessor]\r\n ),\r\n };\r\n\r\n const builtColumns = resolvedFilterColumns.map((column) =>\r\n buildColumn(\r\n column,\r\n locale,\r\n resolvedDefaultColumnRender,\r\n templateRenderOptions,\r\n {\r\n closeEditor: closeEditableCell,\r\n handleValueChange: handleEditableCellValueChange,\r\n isEditingCell,\r\n },\r\n filterOptions\r\n )\r\n );\r\n const builtGroupedColumns =\r\n hasInlineHierarchy || isGroupedChildTable\r\n ? builtColumns.map((column, columnIndex) => {\r\n if (columnIndex !== 0) {\r\n return column;\r\n }\r\n\r\n const originalRender = column.render;\r\n\r\n return {\r\n ...column,\r\n render: (record, index) => {\r\n const renderedContent = originalRender(record, index);\r\n const resolvedContent =\r\n record?.__group &&\r\n (isNil(renderedContent) || renderedContent === '')\r\n ? String(record.__groupValue ?? '')\r\n : renderedContent;\r\n\r\n return wrapGroupedCellContent(\r\n resolvedContent,\r\n record,\r\n currentExpandedIds,\r\n record?.__groupLevel ?? __groupLevel,\r\n idAccessor\r\n );\r\n },\r\n };\r\n })\r\n : builtColumns;\r\n const resolvedGroups = hasGroups\r\n ? syncGroupsWithEffectiveColumns(groups, resolvedFilterColumns)\r\n : undefined;\r\n const builtGroups = hasGroups\r\n ? resolvedGroups.map((group) =>\r\n buildGroup(\r\n group,\r\n locale,\r\n resolvedDefaultColumnRender,\r\n templateRenderOptions,\r\n {\r\n closeEditor: closeEditableCell,\r\n handleValueChange: handleEditableCellValueChange,\r\n isEditingCell,\r\n },\r\n filterOptions\r\n )\r\n )\r\n : undefined;\r\n\r\n const builtRowExpansion = rowExpansion\r\n ? {\r\n trigger: rowExpansion.trigger || 'click',\r\n allowMultiple: rowExpansion.allowMultiple,\r\n expandable: ({ record, index }) =>\r\n !isInlineHierarchyParentRecord(record) &&\r\n (typeof rowExpansion.expandable === 'function'\r\n ? rowExpansion.expandable({ record, index })\r\n : true),\r\n initiallyExpanded: ({ record }) =>\r\n !isInlineHierarchyParentRecord(record) &&\r\n Array.isArray(rowExpansion.initiallyExpandedRecordIds) &&\r\n rowExpansion.initiallyExpandedRecordIds.includes(\r\n getRecordId(record, idAccessor)\r\n ),\r\n expanded: {\r\n recordIds: currentExpandedIds,\r\n onRecordIdsChange: handleExpandedRecordIdsChange,\r\n },\r\n content: ({ record }) =>\r\n isInlineHierarchyParentRecord(record)\r\n ? null\r\n : renderExpansionContent(\r\n rowExpansion.content || rowExpansion,\r\n record,\r\n locale,\r\n templateRenderOptions\r\n ),\r\n }\r\n : undefined;\r\n\r\n const resolvedSortIcons = sortIcons\r\n ? {\r\n sorted: isNil(sortIcons.sorted)\r\n ? sortIcons.sorted\r\n : resolveStaticTemplateNode(\r\n sortIcons.sorted,\r\n { accessor: '__sort_icon_sorted__' },\r\n locale,\r\n templateRenderOptions\r\n ),\r\n unsorted: isNil(sortIcons.unsorted)\r\n ? sortIcons.unsorted\r\n : resolveStaticTemplateNode(\r\n sortIcons.unsorted,\r\n { accessor: '__sort_icon_unsorted__' },\r\n locale,\r\n templateRenderOptions\r\n ),\r\n }\r\n : undefined;\r\n\r\n const emptyStateNode =\r\n typeof emptyState === 'string' ? (\r\n \r\n {emptyState}\r\n \r\n ) : emptyState && emptyState.type === 'text' && !emptyState.namespace ? (\r\n \r\n {emptyState.value}\r\n \r\n ) : undefined;\r\n const resolvedEmptyStateNode =\r\n emptyStateNode ||\r\n ((React.isValidElement(emptyState) ||\r\n Array.isArray(emptyState) ||\r\n isDryComponent(emptyState)) &&\r\n !isNil(emptyState)\r\n ? resolveStaticTemplateNode(\r\n emptyState,\r\n { accessor: '__empty_state__' },\r\n locale,\r\n templateRenderOptions\r\n )\r\n : undefined);\r\n const resolvedNoRecordsIcon =\r\n isNil(emptyState) && !isNil(noRecordsIcon)\r\n ? resolveStaticTemplateNode(\r\n noRecordsIcon,\r\n { accessor: '__no_records_icon__' },\r\n locale,\r\n templateRenderOptions\r\n )\r\n : undefined;\r\n const resolvedCustomLoader = !isNil(customLoader)\r\n ? resolveStaticTemplateNode(\r\n customLoader,\r\n { accessor: '__custom_loader__' },\r\n locale,\r\n templateRenderOptions\r\n )\r\n : undefined;\r\n\r\n const rootStyleProps = pickDefinedProps(props, ROOT_STYLE_PROP_NAMES);\r\n const resolvedRootProps = {\r\n ...rootStyleProps,\r\n bg: isNil(props.bg) ? props.backgroundColor : props.bg,\r\n h: isNil(props.h) ? props.height : props.h,\r\n mih: isNil(props.mih) ? props.minHeight : props.mih,\r\n mah: isNil(props.mah) ? props.maxHeight : props.mah,\r\n radius: isNil(props.borderRadius) ? props.radius : props.borderRadius,\r\n };\r\n // Apply minHeight on the outer wrapper so Mantine DataTable does not\r\n // stretch body rows to fill leftover vertical space (see issue #8).\r\n // When the table is empty/loading, also pass mih into the table so the\r\n // absolutely-positioned empty/loader overlay has a real viewport to center in.\r\n const wrapperMinHeight = resolvedRootProps.mih;\r\n const tableRootProps = { ...resolvedRootProps };\r\n delete tableRootProps.mih;\r\n delete tableRootProps.minHeight;\r\n const showEmptyOrLoadingOverlay =\r\n Boolean(props.fetching) ||\r\n !Array.isArray(displayedRecords) ||\r\n displayedRecords.length === 0;\r\n const tableMinHeight = showEmptyOrLoadingOverlay\r\n ? wrapperMinHeight\r\n : undefined;\r\n const resolvedTableProps =\r\n hasInlineHierarchy || isGroupedChildTable\r\n ? {\r\n ...tableProps,\r\n layout: tableProps?.layout || 'fixed',\r\n }\r\n : tableProps;\r\n const resolvedRowColor = buildRowValueResolver(\r\n rowColor,\r\n 'color',\r\n idAccessor\r\n );\r\n const resolvedRowBackgroundColor = buildRowValueResolver(\r\n rowBackgroundColor,\r\n 'backgroundColor',\r\n idAccessor\r\n );\r\n const resolvedRowClassName = buildRowClassNameResolver(\r\n rowClassName,\r\n idAccessor\r\n );\r\n const resolvedRowStyle = buildRowStyleResolver(rowStyle, idAccessor);\r\n const resolvedRowAttributes = buildRowValueResolver(\r\n rowAttributes,\r\n 'attributes',\r\n idAccessor,\r\n { merge: true }\r\n );\r\n const resolvedMantineIdAccessor = hasInlineHierarchy\r\n ? (record) => getRecordId(record, idAccessor)\r\n : resolveMantineIdAccessor(idAccessor);\r\n const resolvedSelectionTrigger = hasRowGrouping\r\n ? undefined\r\n : selectionTrigger;\r\n const isRecordSelectable = resolvedSelectionTrigger\r\n ? (record, index) => {\r\n if (record?.__group) {\r\n return false;\r\n }\r\n\r\n if (\r\n disabledSelectionRowResolver &&\r\n disabledSelectionRowResolver(record, index)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (selectableRowResolver) {\r\n return selectableRowResolver(record, index);\r\n }\r\n\r\n return true;\r\n }\r\n : undefined;\r\n const getRecordSelectionCheckboxProps =\r\n selectionCheckboxPropsResolver && resolvedSelectionTrigger\r\n ? (record, index) =>\r\n selectionCheckboxPropsResolver(record, index) || EMPTY_OBJECT\r\n : undefined;\r\n const layoutDirection = props.direction === 'rtl' ? 'rtl' : 'ltr';\r\n\r\n return (\r\n \r\n \r\n \r\n updateProps({\r\n cellClick: buildEventPayload(params, idAccessor),\r\n })\r\n }\r\n onCellContextMenu={(params) =>\r\n updateProps({\r\n cellContextMenu: buildEventPayload(\r\n params,\r\n idAccessor\r\n ),\r\n })\r\n }\r\n onCellDoubleClick={handleCellDoubleClick}\r\n onPageChange={handlePageChange}\r\n onRecordsPerPageChange={handleRecordsPerPageChange}\r\n onRowClick={(params) =>\r\n updateProps({\r\n ...(isInlineHierarchyParentRecord(params.record)\r\n ? toggleInlineHierarchyRecord(params.record)\r\n : EMPTY_OBJECT),\r\n rowClick: buildEventPayload(params, idAccessor),\r\n })\r\n }\r\n onRowContextMenu={(params) =>\r\n updateProps({\r\n rowContextMenu: buildEventPayload(\r\n params,\r\n idAccessor\r\n ),\r\n })\r\n }\r\n onRowDoubleClick={(params) =>\r\n updateProps({\r\n rowDoubleClick: buildEventPayload(\r\n params,\r\n idAccessor\r\n ),\r\n })\r\n }\r\n onScroll={(position) =>\r\n updateProps({\r\n scrollPosition: {\r\n ...position,\r\n timestamp: Date.now(),\r\n },\r\n })\r\n }\r\n onScrollToBottom={() =>\r\n updateProps({\r\n scrollEdge: { edge: 'bottom', timestamp: Date.now() },\r\n })\r\n }\r\n onScrollToLeft={() =>\r\n updateProps({\r\n scrollEdge: { edge: 'left', timestamp: Date.now() },\r\n })\r\n }\r\n onScrollToRight={() =>\r\n updateProps({\r\n scrollEdge: { edge: 'right', timestamp: Date.now() },\r\n })\r\n }\r\n onScrollToTop={() =>\r\n updateProps({\r\n scrollEdge: { edge: 'top', timestamp: Date.now() },\r\n })\r\n }\r\n onSelectedRecordsChange={handleSelectedRecordsChange}\r\n onSortStatusChange={handleSortStatusChange}\r\n page={paginationMode === 'none' ? undefined : currentPage}\r\n paginationActiveBackgroundColor={\r\n paginationActiveBackgroundColor\r\n }\r\n paginationActiveTextColor={paginationActiveTextColor}\r\n paginationSize={paginationSize}\r\n paginationWithControls={props.paginationWithControls}\r\n paginationWithEdges={props.paginationWithEdges}\r\n pinFirstColumn={props.pinFirstColumn}\r\n pinLastColumn={props.pinLastColumn}\r\n horizontalSpacing={props.horizontalSpacing}\r\n records={displayedRecords}\r\n recordsPerPage={\r\n paginationMode === 'none'\r\n ? undefined\r\n : currentRecordsPerPage\r\n }\r\n recordsPerPageLabel={recordsPerPageLabel}\r\n recordsPerPageOptions={\r\n recordsPerPageOptions || pageSizeOptions || EMPTY_ARRAY\r\n }\r\n rowBorderColor={props.rowBorderColor}\r\n rowColor={resolvedRowColor}\r\n rowBackgroundColor={resolvedRowBackgroundColor}\r\n rowClassName={resolvedRowClassName}\r\n rowFactory={builtRowFactory}\r\n rowExpansion={builtRowExpansion}\r\n rowStyle={resolvedRowStyle}\r\n scrollAreaProps={scrollAreaProps}\r\n selectedRecords={\r\n resolvedSelectionTrigger || currentSelectedIds.length\r\n ? selectedRecordsPayload\r\n : undefined\r\n }\r\n allRecordsSelectionCheckboxProps={\r\n allRecordsSelectionCheckboxProps\r\n }\r\n selectionCheckboxProps={selectionCheckboxProps}\r\n selectionColumnClassName={selectionColumnClassName}\r\n selectionColumnStyle={selectionColumnStyle}\r\n selectionTrigger={resolvedSelectionTrigger}\r\n shadow={props.shadow}\r\n sortIcons={resolvedSortIcons}\r\n sortStatus={currentSortStatus}\r\n storeColumnsKey={props.storeColumnsKey}\r\n stickyHeader={props.stickyHeader}\r\n stickyHeaderOffset={props.stickyHeaderOffset}\r\n striped={striped}\r\n stripedColor={props.stripedColor}\r\n style={props.style}\r\n styles={props.styles}\r\n tableRef={props.tableRef}\r\n textSelectionDisabled={textSelectionDisabled}\r\n totalRecords={\r\n paginationMode === 'none'\r\n ? undefined\r\n : computedTotalRecords\r\n }\r\n verticalSpacing={props.verticalSpacing}\r\n verticalAlign={props.verticalAlign}\r\n withRowBorders={withRowBorders}\r\n withColumnBorders={withColumnBorders}\r\n withTableBorder={withTableBorder}\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\n\r\nDataTable.propTypes = {\r\n /**\r\n * The ID used to identify this component in Dash callbacks.\r\n */\r\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n\r\n /**\r\n * Table records. `data` is the preferred Dash-facing alias.\r\n */\r\n data: PropTypes.arrayOf(PropTypes.object),\r\n\r\n /**\r\n * Optional alias for `data`, matching the original Mantine DataTable API.\r\n */\r\n records: PropTypes.arrayOf(PropTypes.object),\r\n\r\n /**\r\n * Column definitions. Each column may also define a Dash-friendly\r\n * `presentation` such as `text`, `number`, `currency`, `date`,\r\n * `datetime`, `badge`, `link`, `code`, `json` or `progress`.\r\n * Set `editable=True` to enable double-click editing, and pass a Dash\r\n * input component to `editor` when you want a custom in-place editor.\r\n */\r\n columns: PropTypes.arrayOf(PropTypes.object),\r\n\r\n /**\r\n * Optional column groups matching Mantine DataTable grouped headers.\r\n */\r\n groups: PropTypes.arrayOf(PropTypes.object),\r\n\r\n /**\r\n * Row grouping accessor or accessors. Grouped rows render inline nested\r\n * parents inside a single table, while leaf rows can still use\r\n * `rowExpansion` for detail panels.\r\n */\r\n groupBy: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.arrayOf(PropTypes.string),\r\n ]),\r\n\r\n /**\r\n * Nested child-record accessor for already hierarchical data. When set,\r\n * rows with this accessor render inline child rows using the same\r\n * indentation and expand/collapse affordance as `groupBy`.\r\n */\r\n childRowsAccessor: PropTypes.string,\r\n\r\n /**\r\n * Per-column aggregation mapping for parent rows. Values may be one of the\r\n * built-in aggregations (`sum`, `mean`, `median`, `min`, `max`, `count`) or\r\n * a custom client-side function / function source string.\r\n */\r\n groupAggregations: PropTypes.object,\r\n\r\n /**\r\n * Record identifier accessor. Defaults to `id`.\r\n */\r\n idAccessor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n PropTypes.arrayOf(PropTypes.string),\r\n ]),\r\n\r\n /**\r\n * Locale used for number and date formatting.\r\n */\r\n locale: PropTypes.string,\r\n /**\r\n * Layout direction. Set to `rtl` to render the table in a right-to-left\r\n * Mantine direction context.\r\n */\r\n direction: PropTypes.oneOf(['ltr', 'rtl']),\r\n\r\n paginationMode: PropTypes.oneOf(['client', 'server', 'none']),\r\n sortMode: PropTypes.oneOf(['client', 'server']),\r\n searchMode: PropTypes.oneOf(['client', 'server']),\r\n filterMode: PropTypes.oneOf(['client', 'server', 'none']),\r\n searchQuery: PropTypes.string,\r\n searchableAccessors: PropTypes.arrayOf(PropTypes.string),\r\n filterValues: PropTypes.object,\r\n page: PropTypes.number,\r\n recordsPerPage: PropTypes.number,\r\n pageSize: PropTypes.number,\r\n totalRecords: PropTypes.number,\r\n sortStatus: PropTypes.object,\r\n selectedRecordIds: PropTypes.array,\r\n selectedRecords: PropTypes.array,\r\n expandedRecordIds: PropTypes.array,\r\n selectionTrigger: PropTypes.oneOf(['cell', 'checkbox']),\r\n selectionColumnClassName: PropTypes.string,\r\n selectionColumnStyle: PropTypes.object,\r\n selectionCheckboxProps: PropTypes.object,\r\n allRecordsSelectionCheckboxProps: PropTypes.object,\r\n selectableRowRules: PropTypes.oneOfType([\r\n PropTypes.bool,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n disabledSelectionRowRules: PropTypes.oneOfType([\r\n PropTypes.bool,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n selectionCheckboxRules: PropTypes.oneOfType([\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n\r\n /**\r\n * Enables Dash-native row reordering. Pass `true` or a configuration object.\r\n * The reordered list is written back to both `data` and `records`, and the\r\n * latest drag payload is exposed through `lastRowDragChange`.\r\n */\r\n rowDragging: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),\r\n\r\n /**\r\n * Row text color. Accepts a static Mantine color or Dash-safe rule objects.\r\n */\r\n rowColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n\r\n /**\r\n * Row background color. Accepts a static color or Dash-safe rule objects.\r\n */\r\n rowBackgroundColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n\r\n /**\r\n * Row class names. Accepts a static className or Dash-safe rule objects.\r\n */\r\n rowClassName: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n PropTypes.array,\r\n ]),\r\n rowAttributes: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\r\n\r\n /**\r\n * Row inline styles. Accepts a static style object or Dash-safe rule objects.\r\n */\r\n rowStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\r\n rowExpansion: PropTypes.object,\r\n rowClick: PropTypes.object,\r\n rowDoubleClick: PropTypes.object,\r\n rowContextMenu: PropTypes.object,\r\n cellClick: PropTypes.object,\r\n cellDoubleClick: PropTypes.object,\r\n cellContextMenu: PropTypes.object,\r\n pagination: PropTypes.object,\r\n scrollPosition: PropTypes.object,\r\n scrollEdge: PropTypes.object,\r\n lastRowDragChange: PropTypes.object,\r\n lastSortChange: PropTypes.object,\r\n lastSelectionChange: PropTypes.object,\r\n lastExpansionChange: PropTypes.object,\r\n lastFilterChange: PropTypes.object,\r\n emptyState: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n noRecordsIcon: PropTypes.any,\r\n noRecordsText: PropTypes.string,\r\n recordsPerPageOptions: PropTypes.arrayOf(PropTypes.number),\r\n pageSizeOptions: PropTypes.arrayOf(PropTypes.number),\r\n recordsPerPageLabel: PropTypes.string,\r\n paginationSize: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n paginationActiveTextColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n ]),\r\n paginationActiveBackgroundColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n ]),\r\n loadingText: PropTypes.string,\r\n tableProps: PropTypes.object,\r\n scrollAreaProps: PropTypes.object,\r\n className: PropTypes.string,\r\n tableClassName: PropTypes.string,\r\n classNames: PropTypes.object,\r\n style: PropTypes.object,\r\n styles: PropTypes.object,\r\n radius: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n minHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n maxHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n shadow: PropTypes.string,\r\n bg: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n c: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n backgroundColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n borderColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n rowBorderColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n stripedColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n highlightOnHoverColor: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.object,\r\n ]),\r\n withRowBorders: PropTypes.bool,\r\n withTableBorder: PropTypes.bool,\r\n withColumnBorders: PropTypes.bool,\r\n horizontalSpacing: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.number,\r\n ]),\r\n verticalSpacing: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n borderRadius: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n striped: PropTypes.bool,\r\n highlightOnHover: PropTypes.bool,\r\n textSelectionDisabled: PropTypes.bool,\r\n fetching: PropTypes.bool,\r\n loaderBackgroundBlur: PropTypes.number,\r\n loaderSize: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n loaderType: PropTypes.string,\r\n loaderColor: PropTypes.string,\r\n customLoader: PropTypes.any,\r\n noHeader: PropTypes.bool,\r\n pinFirstColumn: PropTypes.bool,\r\n pinLastColumn: PropTypes.bool,\r\n stickyHeader: PropTypes.bool,\r\n stickyHeaderOffset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n verticalAlign: PropTypes.oneOf(['top', 'center', 'bottom']),\r\n paginationWithEdges: PropTypes.bool,\r\n paginationWithControls: PropTypes.bool,\r\n /**\r\n * Local-storage key used by Mantine DataTable to persist\r\n * draggable / toggleable / resizable column state.\r\n */\r\n storeColumnsKey: PropTypes.string,\r\n defaultColumnProps: PropTypes.object,\r\n defaultColumnRender: PropTypes.any,\r\n sortIcons: PropTypes.object,\r\n bodyRef: PropTypes.any,\r\n tableRef: PropTypes.any,\r\n m: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mx: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n my: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mt: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mb: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ms: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n me: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ml: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mr: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n p: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n px: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n py: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pt: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pb: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ps: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pe: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pl: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n pr: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n w: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n miw: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n maw: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n h: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mih: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n mah: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n opacity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ff: PropTypes.string,\r\n fz: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n fw: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n lts: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n ta: PropTypes.string,\r\n lh: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n fs: PropTypes.string,\r\n tt: PropTypes.string,\r\n display: PropTypes.string,\r\n flex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n bd: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n bdrs: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n td: PropTypes.string,\r\n bgsz: PropTypes.string,\r\n bgp: PropTypes.string,\r\n bgr: PropTypes.string,\r\n bga: PropTypes.string,\r\n pos: PropTypes.string,\r\n top: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n left: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n bottom: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n right: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n inset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n hiddenFrom: PropTypes.string,\r\n visibleFrom: PropTypes.string,\r\n\r\n /**\r\n * Dash-assigned callback that reports property changes back to Dash.\r\n */\r\n setProps: PropTypes.func,\r\n};\r\n\r\nDataTable.dashChildrenUpdate = true;\r\n\r\nexport default DataTable;\r\n\r\nexport const defaultProps = DataTable.defaultProps;\r\nexport const propTypes = DataTable.propTypes;\r\n","import 'mantine-datatable/styles.layer.css';\nimport './styles/layers.css';\n\nimport DataTable from './components/DataTable.react';\n\nexport { DataTable };\nexport const DashMantineDatatable = DataTable;\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","exports","cssWithMappingToString","list","toString","this","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","f","Symbol","for","l","m","Object","prototype","hasOwnProperty","n","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","p","key","ref","__self","__source","q","c","a","g","b","d","e","h","call","defaultProps","$$typeof","type","props","_owner","current","Fragment","jsx","jsxs","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","getTarget","Error","appendChild","element","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","o","defineProperty","enumerable","get","prop","r","toStringTag","value","url","getCurrentScript","script","currentScript","doc_scripts","getElementsByTagName","scripts","filter","s","async","text","textContent","slice","src","split","jsonpScriptSrc","__jsonpScriptSrc__","chunkId","isLocal","test","srcFragments","fileFragments","nc","locals","t","Array","isArray","arguments","Mt","ue","it","children","columnsOrder","setColumnsOrder","columnsToggle","setColumnsToggle","resetColumnsOrder","resetColumnsToggle","setColumnWidth","setMultipleColumnWidths","u","resetColumnsWidth","sourceColumn","setSourceColumn","targetColumn","setTargetColumn","swapColumns","indexOf","y","v","Nt","className","Lt","width","height","viewBox","strokeWidth","stroke","fill","strokeLinecap","strokeLinejoin","Wt","icon","active","component","size","zt","columns","getInitialValueInEffect","headerRef","scrollViewportRef","onFixedLayoutChange","accessor","defaultValue","forEach","find","includes","It","defaultToggle","toggleable","toggled","At","columnsWidth","setColumnsWidth","hasResizableColumns","allResizableWidthsInitial","measureAndSetColumnWidths","M","some","resizable","hidden","x","from","querySelectorAll","E","L","getAttribute","C","w","getBoundingClientRect","Math","round","keys","R","requestAnimationFrame","setTimeout","W","clearTimeout","D","T","P","every","values","_t","effectiveColumns","ct","ut","Bt","Vt","Gt","Ft","G","setProperty","pt","borderBoxSize","contentBoxSize","inlineSize","blockSize","contentRect","mt","ResizeObserver","observe","disconnect","Ut","matchMedia","matches","wa","addEventListener","removeEventListener","addListener","removeListener","xa","J","de","replace","trim","toLowerCase","charAt","toUpperCase","He","findIndex","ft","match","reduce","_","bt","max","groups","Pe","Oe","Tt","me","pe","X","_e","to","j","Z","Y","oo","visibleMediaQuery","title","noWrap","ellipsis","textAlign","minWidth","maxWidth","no","shadowVisible","ao","defaultColumnProps","selectionVisible","selectorCellShadowVisible","footer","footerClassName","footerStyle","ro","group","maxDepth","currentDepth","previousGroups","isLastGroup","withColumnBorders","totalTableColumns","Kt","jt","colSpan","rowSpan","io","co","uo","isActive","filterPopoverProps","filterPopoverDisableClickOutside","close","toggle","withArrow","shadow","opened","onClose","trapFocus","variant","onClick","preventDefault","onKeyDown","stopPropagation","fo","columnRef","next","dir","nextElementSibling","clientX","offsetWidth","min","body","cursor","userSelect","parseInt","onMouseDown","onDoubleClick","bo","To","go","ho","yo","sortable","draggable","sortIcons","sortStatus","onSortStatusChange","filtering","sortKey","H","defaultPrevented","columnAccessor","direction","role","tabIndex","justify","wrap","align","onDragStart","onDragEnter","onDragOver","onDrop","onDragLeave","F","U","sorted","unsorted","xo","trigger","checked","indeterminate","checkboxProps","onChange","disabled","classNames","input","So","selectionColumnHeaderRef","selectionTrigger","selectionChecked","selectionIndeterminate","onSelectionChange","selectionCheckboxProps","selectionColumnClassName","selectionColumnStyle","fromEntries","String","onContextMenu","S","I","A","fe","be","Te","ge","titleClassName","te","titleStyle","he","Ce","Q","Je","je","Ze","position","label","currentTarget","Po","fetching","customContent","backgroundBlur","color","backdropFilter","O","theme","vo","backgroundColor","borderColor","rowBorderColor","stripedColor","highlightOnHoverColor","Xe","paginationActiveTextColor","paginationActiveBackgroundColor","ko","No","xs","sm","md","lg","xl","Wo","activeTextColor","activeBackgroundColor","gap","withinPortal","offset","arrow","section","rightSection","fontWeight","paddingLeft","spacing","paddingRight","Oo","page","onPageChange","paginationWithEdges","paginationWithControls","paginationSize","loadingText","noRecordsText","paginationText","totalRecords","recordsPerPage","onRecordsPerPageChange","recordsPerPageLabel","recordsPerPageOptions","recordsLength","horizontalSpacing","paginationWrapBreakpoint","getPaginationControlProps","getPaginationItemProps","renderPagination","ceil","breakpoints","Text","PageSizeSelector","Pagination","root","control","withEdges","withControls","total","getControlProps","getItemProps","state","totalPages","isWrapped","actions","setPage","setRecordsPerPage","Controls","px","py","flexDirection","_o","record","render","defaultRender","customCellAttributes","zo","open","collapseProps","expanded","visible","clear","start","eo","transitionDuration","in","Vo","withRightShadow","getCheckboxProps","$o","defaultColumnRender","isRecordSelectable","getSelectionCheckboxProps","onCellClick","onCellDoubleClick","onCellContextMenu","expansion","customAttributes","rowFactory","hiddenContent","cellsClassName","cellsStyle","event","column","columnIndex","isRowExpanded","isExpandable","expandOnClick","expandRow","collapseRow","Mo","Zr","rowProps","expandedElement","Uo","leftShadowBehind","rightShadowBehind","onScrollPositionChange","viewportRef","scrollAreaProps","scrollbar","thumb","corner","ll","withTableBorder","borderRadius","textSelectionDisabled","minHeight","maxHeight","verticalAlign","storeColumnsKey","pinFirstColumn","pinLastColumn","idAccessor","records","selectedRecords","onSelectedRecordsChange","allRecordsSelectionCheckboxProps","getRecordSelectionCheckboxProps","V","xe","et","loaderBackgroundBlur","customLoader","jo","loaderSize","Zo","loaderType","Yo","loaderColor","qo","en","emptyState","tn","wt","noRecordsIcon","on","highlightOnHover","nn","striped","an","noHeader","rn","onRowClick","ln","onRowDoubleClick","sn","onRowContextMenu","cn","un","dn","mn","onScroll","pn","onScrollToTop","fn","onScrollToBottom","bn","onScrollToLeft","Tn","onScrollToRight","gn","hn","Cn","yn","Dn","xn","wn","rowColor","Sn","rowBackgroundColor","Rn","rowExpansion","Pn","rowClassName","vn","rowStyle","Mn","customRowAttributes","kn","En","Nn","tableRef","Ln","bodyRef","Wn","In","my","Hn","mx","On","mb","An","ml","zn","mr","Bn","Vn","ye","Gn","styles","De","Fn","tableWrapper","Ye","qe","refs","$","$n","scrollCallbacks","withRowBorders","table","scrollViewport","header","selectionColumnHeader","top","bottom","left","right","scrollTop","scrollLeft","getComputedStyle","scrollWidth","abs","tagName","$t","tt","Xn","Un","Qn","allowMultiple","initiallyExpanded","expandable","recordIds","onRecordIdsChange","collapse","Zt","ke","St","ot","Kn","N","we","oe","scrollTo","cancelAnimationFrame","Rt","se","Se","Pt","nt","Ee","Ne","Jn","jn","lastSelectionChangeIndex","Le","setLastSelectionChangeIndex","Zn","Xt","at","Yn","qn","radius","boxShadow","shadows","vt","rt","lt","ea","nativeEvent","shiftKey","ce","ne","ae","Jt","pagination","dl","isDragging","parentElement","EMPTY_ARRAY","EMPTY_OBJECT","NOOP_SET_PROPS","GROUP_RECORD_PREFIX","TEMPLATE_TOKEN_PATTERN","ROOT_STYLE_PROP_NAMES","isNil","isPlainObject","_typeof","isDryComponent","Boolean","namespace","DASH_COMPONENT_TYPE_NAMES","WeakMap","getAccessorValue","accumulator","setAccessorValue","nextRecord","_toConsumableArray","_objectSpread","currentSource","sourceValue","nextValue","findRecordInCollection","recordId","childRowsAccessor","_step","_iterator","_createForOfIteratorHelper","done","getRecordId","nestedMatch","err","updateRecordValueInCollection","didUpdate","nextRecords","childRows","updatedChildren","areEditableValuesEqual","Date","_unused","getEditorTypeName","node","_node$type","_node$type2","React","has","displayName","name","extractEditorValue","valueProp","normalizeEditableValue","editorDefinition","editorTypeName","presentation","toISOString","FILTER_VALUE_PROP_BY_TYPE","Checkbox","Switch","FILTER_TEXT_CONTROL_TYPES","Set","FILTER_MULTI_CONTROL_TYPES","FILTER_RANGE_CONTROL_TYPES","FILTER_DATE_CONTROL_TYPES","FILTER_EQUALITY_CONTROL_TYPES","FILTER_CONTROL_TYPES","FILTER_INACTIVE_STRING_VALUES","FILTER_OVERLAY_CONTROL_TYPES","mergeEditorNestedProps","overrides","mergeFilterNestedProps","defaults","safeStringify","_unused2","serializeComponentId","getNodeProps","getFilterControlKey","nodePath","serializedId","pathKey","getFilterDefaultValue","defaultValueProp","collectFilterControls","controls","filterRegistration","autoFilter","typeName","hasDashValueProp","setProps","isFilterControlNode","filterNode","filterValueProp","resolveFilterValueProp","path","flatMap","child","setFilterValueInCollection","filterValues","filterKey","inputCount","nextValues","currentColumnValue","_defineProperty","getFilterValueFromCollection","hasValue","columnValue","isFilterValueActive","emptyValue","normalizedValue","getActiveColumnFilterEntries","valueInfo","resolvedColumn","filterEmptyValue","resolveFilterEmptyValue","entry","isColumnFilterActive","normalizeFilterComparableValue","getTime","numericValue","Number","isFinite","isDateLikeString","dateValue","parse","filterValuesEqual","caseSensitive","normalizedLeft","normalizedRight","leftText","rightText","compareFilterValues","inferBoundOperator","entryText","_entry$props","_entry$props2","_entry$props3","placeholder","getFilterEntryText","matchesInFilter","recordValue","filterValue","filterItems","filterItem","matchesBetweenFilter","lowerValue","upperValue","matchesColumnFilters","activeEntries","filterAccessor","filterValueAccessor","entries","filterOperator","filterMatchMode","shouldUseRangeEntries","_getRangeBoundsFromEn","operator","getRangeBoundsFromEntries","_getRangeBoundsFromEn2","_slicedToArray","_entry$props4","inferFilterOperator","filterCaseSensitive","filterPredicate","haystack","toSearchableText","needle","matchesContainsFilter","startsWith","endsWith","_ref2","matchesSingleColumnFilter","enhanceFilterNode","filterOptions","_filterOptions$filter","existingProps","enhancedChildren","filterDefinitionsByAccessor","controlKey","nextProps","hasExistingValue","comboboxProps","popoverProps","originalSetProps","originalOnChange","handleFilterChange","handleFilterValueChange","nextChildProps","_len2","args","_key2","EditableCellPopover","_ref3","editor","isEditing","closeEditor","handleValueChange","dropdownRef","useRef","useEffect","frameId","_dropdownRef$current","focusTarget","focus","preventScroll","_unused3","Popover","closeOnClickOutside","onDismiss","portalProps","reuseTargetNode","zIndex","Target","Box","clsx","Dropdown","editorNode","editorValueProp","resolveEditorValueProp","originalOnKeyDown","_len","_key","isTextLikeEditor","enhanceEditorNode","serializeGroupValue","_unused4","buildGroupRecordId","_ref4","compareAggregationValues","normalizeComparableValue","BUILT_IN_GROUP_AGGREGATORS","_values","sum","numericValues","mean","median","sort","middleIndex","floor","comparableValues","currentMin","currentMax","applyGroupAggregations","leafRecords","aggregationDefinitions","outputAccessor","sourceAccessor","aggregator","leafRecord","normalizedAggregator","source","lambdaMatch","exec","Function","_unused5","compileCustomAggregator","aggregatedValue","isInlineHierarchyParentRecord","__group","__hierarchyParent","buildGroupedRecords","accessors","_accessors","_toArray","remainingAccessors","_arrayLikeToArray","groupedEntries","groupedRecordsByKey","Map","groupValue","groupKey","groupPath","groupRecord","__groupAccessor","__groupId","__groupLevel","__groupPath","__groupValue","__groupedRecords","__remainingGroupBy","nextEntry","set","childPath","childRecords","__leafRecords","__children","collectGroupedRecordIds","buildChildRowsRecords","level","hasChildrenAccessor","hasAccessorPath","rawChildren","childRecord","flattenGroupedRecords","expandedRecordIds","collectHierarchyRecords","mergeExpandedRecordIds","_len3","lists","_key3","interpolateTemplate","template","getTemplateValue","context","normalizedAccessor","locale","directContextValue","interpolateTemplateValue","matchAll","resolvedValue","interpolateDryComponentNode","_ref1","_ref10","buildTemplateClickPayload","componentProps","payload","buildEventPayload","templateId","actionType","action","normalizeTemplateAction","withTemplateClickHandler","renderOptions","n_clicks","updateProps","originalOnClick","cellClick","materializeDashComponent","componentType","_window","resolveDashComponentType","interpolatedProps","_ref11","_ref12","renderTemplateNode","resolvedProps","renderedChildren","hydratedLayout","_dashprivate_layout","getHydratedDashLayout","_ref13","_ref14","buildTemplateContext","row","resolveTemplateNode","resolveTemplateRender","resolveStaticTemplateNode","buildDisplayValue","accessorValue","valueAccessor","effectiveLocale","intlOptions","formatOptions","isNaN","currency","minimumFractionDigits","maximumFractionDigits","Intl","NumberFormat","format","nextDate","toDate","dateStyle","timeStyle","DateTimeFormat","trueLabel","falseLabel","formatPrimitiveValue","toComparableValue","joinRecordIdParts","separator","matchesRowSelector","selector","childSelector","_ref15","actualValue","_ref16","expectedValue","condition","eq","gt","gte","lte","notIn","contains","matchesSelectorCondition","resolveRowRuleEntryValue","fallbackKey","when","rule","getRowRuleValue","buildRowValueResolver","_ref17$merge","merge","mergedValue","buildRowBooleanResolver","params","timestamp","now","flattenGroupColumns","groupDefinitions","syncGroupsWithEffectiveColumns","groupAccessors","buildColumn","_column$filterPopover","editingOptions","resolvedFilter","resolvedFiltering","shouldDisableFilterPopoverClickOutside","cellAttributes","rawValue","formattedValue","customRender","badgeColor","badgeColorAccessor","Badge","badgeRadius","badgeVariant","href","hrefAccessor","hrefTemplate","Anchor","Code","progressValue","Progress","progressColor","progressRadius","whiteSpace","fw","editable","isEditingCell","TextInput","buildGroup","childGroup","DataTable","_ref18","_ref18$data","_ref18$columns","_ref18$groups","_ref18$groupBy","groupBy","_ref18$childRowsAcces","_ref18$groupAggregati","groupAggregations","_ref18$idAccessor","_ref18$locale","_ref18$paginationMode","paginationMode","_ref18$sortMode","sortMode","_ref18$searchMode","searchMode","_ref18$filterMode","filterMode","_ref18$recordsPerPage","_ref18$pageSize","pageSize","_ref18$noRecordsText","_ref18$pageSizeOption","pageSizeOptions","_ref18$recordsPerPage2","_ref18$recordsPerPage3","_ref18$paginationSize","_ref18$selectionTrigg","_ref18$tableProps","tableProps","_ref18$scrollAreaProp","_ref18$withRowBorders","_ref18$withTableBorde","_ref18$withColumnBord","_ref18$striped","_ref18$highlightOnHov","_ref18$textSelectionD","_objectWithoutProperties","_excluded","_props$__groupLevel","searchQuery","searchableAccessors","selectedRecordIds","selectableRowRules","disabledSelectionRowRules","selectionCheckboxRules","rowDragging","rowAttributes","tableClassName","allRecords","normalizedGroupBy","normalizeGroupBy","normalizedChildRowsAccessor","normalizeChildRowsAccessor","normalizedGroupAggregations","_ref5","_ref7","_ref8","_ref9","_ref0","_definition$fn","_ref6","operation","lambda","hasRowGrouping","hasChildRowsHierarchy","hasInlineHierarchy","isGroupedChildTable","groupedRecordsForAllRows","initialGroupedExpandedIds","initialRowExpansionIds","initiallyExpandedRecordIds","initialPageSize","_useState2","useState","internalPage","setInternalPage","_useState4","internalRecordsPerPage","setInternalRecordsPerPage","_useState6","internalSortStatus","setInternalSortStatus","_useState8","internalSelectedIds","setInternalSelectedIds","_useState0","internalExpandedIds","setInternalExpandedIds","_useState10","activeEditableCell","setActiveEditableCell","deferredSearchQuery","useDeferredValue","currentPage","currentRecordsPerPage","currentSortStatus","currentSelectedIds","currentExpandedIds","rowDragSourceIdRef","_useState12","draggedRowId","setDraggedRowId","_useState14","dragOverRowId","setDragOverRowId","groupedColumns","hasTopLevelColumns","hasGroups","sourceColumns","useDataTableColumns","resolvedColumns","resolvedFilterColumns","_column$filterPopover2","_column$filterPopover3","resolvedSearchableAccessors","searchable","templateRenderOptions","columnFilterDefinitions","effectiveColumn","filterTemplate","buildFilterDefinitions","filterDefinitionsKey","initialFilterValues","assign","_useState16","internalFilterValues","setInternalFilterValues","filterValuesControlled","currentValues","definitions","_definition$controls","syncFilterValuesWithDefinitions","currentFilterValues","clientSearchFilteredRecords","query","normalizedQuery","filterRecords","clientFilteredRecords","activeDefinitions","filterRecordsByColumnFilters","clientSortedRecords","leftValue","rightValue","sortRecords","computedTotalRecords","paginatedRecords","groupedRecords","childRowsRecords","displayedRecords","selectedRecordsPayload","selectableRowResolver","disabledSelectionRowResolver","selectionCheckboxPropsResolver","rowDraggingEnabled","clearRowDraggingState","closeEditableCell","handleEditableCellValueChange","currentRecord","currentValue","updatedRecords","syncExpandedRecordIds","nextExpandedRecordIds","lastExpansionChange","buildExpandedRecordProps","builtRowFactory","_ref19","DataTableDraggableRow","_extends","onDragEnd","dataTransfer","dropEffect","handleRowDragOver","_target$closest","closest","effectAllowed","setData","_unused6","handleRowDragStart","sourceRecordId","destinationRecordId","sourceIndex","destinationIndex","reorderedRecords","movedRecord","reorderByIndices","lastRowDragChange","handleRowDrop","hasActiveColumn","hasActiveRecord","resolvedDefaultColumnProps","resolvedDefaultColumnRender","defaultCellAttributes","nextFilterValues","shouldResetPage","lastFilterChange","columnFilterValue","builtColumns","builtGroupedColumns","originalRender","_record$__groupValue","_record$__groupLevel","renderedContent","groupLevel","isHierarchyParent","isExpanded","paddingInlineStart","wrapGroupedCellContent","resolvedGroups","builtGroups","builtRowExpansion","_ref20","_ref21","_ref22","config","jsonValue","block","textValue","fields","Paper","withBorder","Stack","field","Group","grow","flex","derivedField","renderFieldValue","renderExpansionContent","resolvedSortIcons","resolvedEmptyStateNode","ta","resolvedNoRecordsIcon","resolvedCustomLoader","resolvedRootProps","bg","mih","mah","wrapperMinHeight","tableRootProps","tableMinHeight","resolvedTableProps","layout","resolvedRowColor","resolvedRowBackgroundColor","resolvedRowClassName","buildRowClassNameResolver","resolvedRowStyle","mergedStyle","nextStyle","buildRowStyleResolver","resolvedRowAttributes","resolvedMantineIdAccessor","resolveMantineIdAccessor","resolvedSelectionTrigger","layoutDirection","DirectionProvider","detectDirection","initialDirection","display","MantineDataTable","cellContextMenu","_params$record","matchingColumn","cellDoubleClick","nextPage","nextRecordsPerPage","expandedId","toggleInlineHierarchyRecord","rowClick","rowContextMenu","rowDoubleClick","scrollPosition","scrollEdge","edge","nextSelectedRecords","nextSelectedIds","lastSelectionChange","nextSortStatus","lastSortChange","stickyHeader","stickyHeaderOffset","verticalSpacing","propTypes","PropTypes","ms","pb","ps","pl","pr","miw","maw","opacity","ff","fz","lts","lh","fs","bd","bdrs","td","bgsz","bgp","bgr","bga","pos","inset","hiddenFrom","visibleFrom","dashChildrenUpdate","DashMantineDatatable"],"sourceRoot":""} \ No newline at end of file diff --git a/great-docs/.gitignore b/great-docs/.gitignore new file mode 100644 index 0000000..91e4dc5 --- /dev/null +++ b/great-docs/.gitignore @@ -0,0 +1,3 @@ +/.quarto/ +/_site/ +**/*.quarto_ipynb diff --git a/great-docs/.well-known/agent-skills/dash-mantine-datatable/SKILL.md b/great-docs/.well-known/agent-skills/dash-mantine-datatable/SKILL.md new file mode 100644 index 0000000..dfb296f --- /dev/null +++ b/great-docs/.well-known/agent-skills/dash-mantine-datatable/SKILL.md @@ -0,0 +1,36 @@ +--- +name: dash-mantine-datatable +description: > + Use when writing Python code that uses the dash_mantine_datatable package. +--- + +# Dash Mantine DataTable + +## Installation + +```bash +pip install dash-mantine-datatable +``` + +## API overview + +### Component + +Main generated Dash component. + +- `DataTable`: Description + +### Helper Builders + +Dictionary factories for readable table configuration. + +- `Column`: Description +- `ColumnGroup`: Description +- `SelectionConfig`: Description +- `PaginationConfig`: Description +- `RowExpansionConfig`: Description + +## Resources + +- [llms.txt](llms.txt) — Indexed API reference for LLMs +- [llms-full.txt](llms-full.txt) — Comprehensive documentation for LLMs diff --git a/great-docs/.well-known/agent-skills/index.json b/great-docs/.well-known/agent-skills/index.json new file mode 100644 index 0000000..1f77ad5 --- /dev/null +++ b/great-docs/.well-known/agent-skills/index.json @@ -0,0 +1,11 @@ +{ + "skills": [ + { + "name": "dash-mantine-datatable", + "description": "Use when writing Python code that uses the dash_mantine_datatable package.", + "files": [ + "SKILL.md" + ] + } + ] +} diff --git a/great-docs/.well-known/skills/default/SKILL.md b/great-docs/.well-known/skills/default/SKILL.md new file mode 100644 index 0000000..dfb296f --- /dev/null +++ b/great-docs/.well-known/skills/default/SKILL.md @@ -0,0 +1,36 @@ +--- +name: dash-mantine-datatable +description: > + Use when writing Python code that uses the dash_mantine_datatable package. +--- + +# Dash Mantine DataTable + +## Installation + +```bash +pip install dash-mantine-datatable +``` + +## API overview + +### Component + +Main generated Dash component. + +- `DataTable`: Description + +### Helper Builders + +Dictionary factories for readable table configuration. + +- `Column`: Description +- `ColumnGroup`: Description +- `SelectionConfig`: Description +- `PaginationConfig`: Description +- `RowExpansionConfig`: Description + +## Resources + +- [llms.txt](llms.txt) — Indexed API reference for LLMs +- [llms-full.txt](llms-full.txt) — Comprehensive documentation for LLMs diff --git a/great-docs/_constant_values.json b/great-docs/_constant_values.json new file mode 100644 index 0000000..2631f9c --- /dev/null +++ b/great-docs/_constant_values.json @@ -0,0 +1,11 @@ +{ + "DataTable.ComponentSingleType": { + "value": "typing.Union[str, int, float, Component, None]" + }, + "DataTable.ComponentType": { + "value": "typing.Union[ComponentSingleType, typing.Sequence[ComponentSingleType]]" + }, + "DataTable.NumberType": { + "value": "typing.Union[typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex]" + } +} \ No newline at end of file diff --git a/great-docs/_extensions/color-swatch/_color_swatch_shortcode.py b/great-docs/_extensions/color-swatch/_color_swatch_shortcode.py new file mode 100644 index 0000000..2a3b0bb --- /dev/null +++ b/great-docs/_extensions/color-swatch/_color_swatch_shortcode.py @@ -0,0 +1,680 @@ +"""Color swatch shortcode helper. + +Called by `color-swatch.lua` via `io.popen`. Reads an optional YAML body +from *stdin* (when the shortcode has inner content) or loads a built-in GD +palette preset, computes APCA contrast values, and emits self-contained HTML +for the requested display mode. +""" + +from __future__ import annotations + +import argparse +import colorsys +import html as html_mod +import importlib.util +import sys +from pathlib import Path +from typing import Any + +# --------------------------------------------------------------------------- +# Module bootstrap — load contrast helpers from great_docs.contrast +# --------------------------------------------------------------------------- + +_parse_color = None +_ideal_text_color = None +_apca_contrast = None +_relative_luminance_apca = None + + +def _load_contrast_module() -> None: + global _parse_color, _ideal_text_color, _apca_contrast, _relative_luminance_apca + + # Fast path: great_docs is installed + try: + from great_docs.contrast import ( + _apca_contrast as _ac, + ) + from great_docs.contrast import ( + _relative_luminance_apca as _rl, + ) + from great_docs.contrast import ( + ideal_text_color as _itc, + ) + from great_docs.contrast import ( + parse_color as _pc, + ) + + _parse_color = _pc + _ideal_text_color = _itc + _apca_contrast = _ac + _relative_luminance_apca = _rl + return + except Exception: + pass + + # Walk ancestors to find contrast.py + cur = Path(__file__).resolve().parent + for ancestor in cur.parents: + contrast_path = ancestor / "great_docs" / "contrast.py" + if contrast_path.exists(): + spec = importlib.util.spec_from_file_location("contrast", contrast_path) + mod = importlib.util.module_from_spec(spec) # type: ignore[arg-type] + spec.loader.exec_module(mod) # type: ignore[union-attr] + _parse_color = mod.parse_color + _ideal_text_color = mod.ideal_text_color + _apca_contrast = mod._apca_contrast + _relative_luminance_apca = mod._relative_luminance_apca + return + + raise ImportError("Cannot locate great_docs/contrast.py") + + +_load_contrast_module() + +# --------------------------------------------------------------------------- +# Built-in GD palette presets +# --------------------------------------------------------------------------- + +GD_PALETTES: dict[str, dict[str, Any]] = { + "sky": { + "description": "Soft sky blues", + "light": [ + {"name": "Sky 100", "hex": "#e0f4ff"}, + {"name": "Sky 200", "hex": "#d0ecf9"}, + {"name": "Sky 300", "hex": "#c5e8f7"}, + {"name": "Sky 400", "hex": "#b8e0f5"}, + ], + "dark": [ + {"name": "Sky 100", "hex": "#0096c7"}, + {"name": "Sky 200", "hex": "#0077b6"}, + {"name": "Sky 300", "hex": "#005f73"}, + {"name": "Sky 400", "hex": "#023e8a"}, + ], + "gradient": { + "angle": -45, + "duration": "15s", + "timing": "ease", + "iteration": "infinite", + "background_size": "400% 400%", + }, + }, + "peach": { + "description": "Peach and blush", + "light": [ + {"name": "Peach 100", "hex": "#ffe4cc"}, + {"name": "Peach 200", "hex": "#ffddc1"}, + {"name": "Peach 300", "hex": "#fdd0d8"}, + {"name": "Peach 400", "hex": "#fbc4d4"}, + ], + "dark": [ + {"name": "Peach 100", "hex": "#c7760f"}, + {"name": "Peach 200", "hex": "#cc4a1a"}, + {"name": "Peach 300", "hex": "#b84a5f"}, + {"name": "Peach 400", "hex": "#a33560"}, + ], + "gradient": { + "angle": -45, + "duration": "15s", + "timing": "ease", + "iteration": "infinite", + "background_size": "400% 400%", + }, + }, + "prism": { + "description": "Mint, sky, and lavender", + "light": [ + {"name": "Prism 100", "hex": "#d0e8f5"}, + {"name": "Prism 200", "hex": "#c4f0e0"}, + {"name": "Prism 300", "hex": "#e4d4f4"}, + {"name": "Prism 400", "hex": "#d8cef0"}, + ], + "dark": [ + {"name": "Prism 100", "hex": "#0c6a8a"}, + {"name": "Prism 200", "hex": "#048a65"}, + {"name": "Prism 300", "hex": "#52077d"}, + {"name": "Prism 400", "hex": "#2a0978"}, + ], + "gradient": { + "angle": -45, + "duration": "15s", + "timing": "ease", + "iteration": "infinite", + "background_size": "400% 400%", + }, + }, + "lilac": { + "description": "Lilac and pink", + "light": [ + {"name": "Lilac 100", "hex": "#f5d0e0"}, + {"name": "Lilac 200", "hex": "#e8d0f0"}, + {"name": "Lilac 300", "hex": "#f0d4f8"}, + {"name": "Lilac 400", "hex": "#eac8ee"}, + ], + "dark": [ + {"name": "Lilac 100", "hex": "#8b1140"}, + {"name": "Lilac 200", "hex": "#561e64"}, + {"name": "Lilac 300", "hex": "#a02db3"}, + {"name": "Lilac 400", "hex": "#6e1a7d"}, + ], + "gradient": { + "angle": -45, + "duration": "15s", + "timing": "ease", + "iteration": "infinite", + "background_size": "400% 400%", + }, + }, + "slate": { + "description": "Cool grays", + "light": [ + {"name": "Slate 100", "hex": "#eceff1"}, + {"name": "Slate 200", "hex": "#e0e4e8"}, + {"name": "Slate 300", "hex": "#dde2e6"}, + {"name": "Slate 400", "hex": "#d5dadf"}, + ], + "dark": [ + {"name": "Slate 100", "hex": "#455a64"}, + {"name": "Slate 200", "hex": "#37474f"}, + {"name": "Slate 300", "hex": "#3e525e"}, + {"name": "Slate 400", "hex": "#263238"}, + ], + "gradient": { + "angle": -45, + "duration": "15s", + "timing": "ease", + "iteration": "infinite", + "background_size": "400% 400%", + }, + }, + "honey": { + "description": "Warm cream and apricot", + "light": [ + {"name": "Honey 100", "hex": "#ffedcc"}, + {"name": "Honey 200", "hex": "#ffe0c2"}, + {"name": "Honey 300", "hex": "#ffe5b4"}, + {"name": "Honey 400", "hex": "#ffd6a8"}, + ], + "dark": [ + {"name": "Honey 100", "hex": "#e65100"}, + {"name": "Honey 200", "hex": "#bf360c"}, + {"name": "Honey 300", "hex": "#ef6c00"}, + {"name": "Honey 400", "hex": "#b71c1c"}, + ], + "gradient": { + "angle": -45, + "duration": "15s", + "timing": "ease", + "iteration": "infinite", + "background_size": "400% 400%", + }, + }, + "dusk": { + "description": "Soft lavender-blue", + "light": [ + {"name": "Dusk 100", "hex": "#dddff5"}, + {"name": "Dusk 200", "hex": "#d8daf0"}, + {"name": "Dusk 300", "hex": "#d4d0ee"}, + {"name": "Dusk 400", "hex": "#dad4f2"}, + ], + "dark": [ + {"name": "Dusk 100", "hex": "#141b55"}, + {"name": "Dusk 200", "hex": "#0d1244"}, + {"name": "Dusk 300", "hex": "#1a0f52"}, + {"name": "Dusk 400", "hex": "#261560"}, + ], + "gradient": { + "angle": -45, + "duration": "15s", + "timing": "ease", + "iteration": "infinite", + "background_size": "400% 400%", + }, + }, + "mint": { + "description": "Pale aqua", + "light": [ + {"name": "Mint 100", "hex": "#d5f0ec"}, + {"name": "Mint 200", "hex": "#ccece8"}, + {"name": "Mint 300", "hex": "#c4e8e4"}, + {"name": "Mint 400", "hex": "#d0f2ee"}, + ], + "dark": [ + {"name": "Mint 100", "hex": "#00796b"}, + {"name": "Mint 200", "hex": "#00695c"}, + {"name": "Mint 300", "hex": "#004d40"}, + {"name": "Mint 400", "hex": "#00897b"}, + ], + "gradient": { + "angle": -45, + "duration": "15s", + "timing": "ease", + "iteration": "infinite", + "background_size": "400% 400%", + }, + }, +} + +# --------------------------------------------------------------------------- +# Color utility helpers +# --------------------------------------------------------------------------- + + +def hex_to_rgb(hex_str: str) -> tuple[int, int, int]: + """Convert a hex color string to (R, G, B) using `contrast.parse_color`.""" + return _parse_color(hex_str) # type: ignore[return-value] + + +def rgb_to_hsl(r: int, g: int, b: int) -> tuple[int, int, int]: + """Convert RGB (0-255) to HSL (degrees, percent, percent), rounded to ints.""" + h, l, s = colorsys.rgb_to_hls(r / 255.0, g / 255.0, b / 255.0) + return (round(h * 360) % 360, round(s * 100), round(l * 100)) + + +def needs_border_ring(hex_str: str) -> tuple[bool, str]: + """Determine if a swatch needs a border ring and return the ring color. + + Very light colors (luminance > 0.93) get a slightly darker ring. + Very dark colors (luminance < 0.07) get a slightly lighter ring. + Returns `(needs_ring, ring_color_hex)`. + """ + r, g, b = hex_to_rgb(hex_str) + lum = _relative_luminance_apca(r, g, b) # type: ignore[misc] + + if lum > 0.93: + # Darken by 10% + dr = max(0, int(r * 0.9)) + dg = max(0, int(g * 0.9)) + db = max(0, int(b * 0.9)) + return True, f"#{dr:02x}{dg:02x}{db:02x}" + if lum < 0.07: + # Lighten by mixing with white + lr = min(255, r + 40) + lg = min(255, g + 40) + lb = min(255, b + 40) + return True, f"#{lr:02x}{lg:02x}{lb:02x}" + + return False, "" + + +def compute_contrast_info(hex_str: str) -> dict[str, Any]: + """Compute APCA contrast values for a color against white and black.""" + r, g, b = hex_to_rgb(hex_str) + lum = _relative_luminance_apca(r, g, b) # type: ignore[misc] + white_lum = _relative_luminance_apca(255, 255, 255) # type: ignore[misc] + black_lum = _relative_luminance_apca(0, 0, 0) # type: ignore[misc] + + lc_vs_white = abs(_apca_contrast(white_lum, lum)) # type: ignore[misc] + lc_vs_black = abs(_apca_contrast(black_lum, lum)) # type: ignore[misc] + + ideal = _ideal_text_color(hex_str) # type: ignore[misc] + + # WCAG AA via APCA: normal text >= 60 Lc, large >= 45, non-text >= 30 + best_lc = max(lc_vs_white, lc_vs_black) + aa_normal = best_lc >= 60 + aa_large = best_lc >= 45 + + return { + "lc_vs_white": round(lc_vs_white, 1), + "lc_vs_black": round(lc_vs_black, 1), + "ideal_text": ideal, + "aa_normal": aa_normal, + "aa_large": aa_large, + } + + +# --------------------------------------------------------------------------- +# YAML parsing +# --------------------------------------------------------------------------- + +try: + import yaml as _yaml + + def _parse_yaml(text: str) -> list[dict[str, Any]]: + data = _yaml.safe_load(text) + if isinstance(data, list): + return data + return [] + +except ImportError: + # Minimal YAML-subset parser for simple list-of-dicts (no external dep) + + def _parse_yaml(text: str) -> list[dict[str, Any]]: # type: ignore[misc] + """Parse a trivial YAML list of dicts (single-level, string values).""" + items: list[dict[str, Any]] = [] + current: dict[str, Any] | None = None + for line in text.splitlines(): + stripped = line.strip() + if not stripped or stripped.startswith("#"): + continue + if stripped.startswith("- "): + # New item — may have key on same line + if current is not None: + items.append(current) + current = {} + rest = stripped[2:].strip() + if ":" in rest: + k, v = rest.split(":", 1) + current[k.strip()] = v.strip().strip("\"'") + elif ":" in stripped and current is not None: + k, v = stripped.split(":", 1) + current[k.strip()] = v.strip().strip("\"'") + if current is not None: + items.append(current) + return items + + +def parse_colors(body: str, palette: str) -> list[dict[str, Any]]: + """Resolve the color list from body YAML and/or a palette preset.""" + colors: list[dict[str, Any]] = [] + + if palette: + if palette == "all": + for name, preset in GD_PALETTES.items(): + for c in preset["light"]: + colors.append({**c, "group": name.capitalize()}) + elif palette in GD_PALETTES: + colors.extend(GD_PALETTES[palette]["light"]) + else: + raise ValueError(f"Unknown palette: {palette!r}") + + if body.strip(): + parsed = _parse_yaml(body) + for entry in parsed: + if "hex" not in entry or "name" not in entry: + continue + colors.append(entry) + + return colors + + +# --------------------------------------------------------------------------- +# Tooltip HTML +# --------------------------------------------------------------------------- + + +def _esc(text: str) -> str: + return html_mod.escape(text, quote=True) + + +def build_tooltip_html(color: dict[str, Any], show_contrast: str) -> str: + """Build the rich tooltip HTML for a single swatch.""" + hex_val = color["hex"] + name = color.get("name", hex_val) + r, g, b = hex_to_rgb(hex_val) + h, s, l = rgb_to_hsl(r, g, b) + + parts = [ + '
', + f'
', + '
', + f'
{_esc(name)}
', + '', + f"', + f"", + f"", + ] + + if show_contrast != "false": + info = compute_contrast_info(hex_val) + parts.append('') + parts.append(f"") + parts.append(f"") + verdict = "✓ AA" if info["aa_normal"] else "✗ AA" + css_cls = "gd-cs-pass" if info["aa_normal"] else "gd-cs-fail" + parts.append(f'') + + parts.append("
HEX{_esc(hex_val)}" + f'
RGB{r}, {g}, {b}
HSL{h}°, {s}%, {l}%
vs White{info['lc_vs_white']} Lc
vs Black{info['lc_vs_black']} Lc
WCAG{verdict} (normal)
") + return "".join(parts) + + +# --------------------------------------------------------------------------- +# HTML renderers +# --------------------------------------------------------------------------- + +_ID_COUNTER = 0 + + +def _next_id() -> str: + global _ID_COUNTER + _ID_COUNTER += 1 + return f"gd-cs-{_ID_COUNTER}" + + +def render_circles( + colors: list[dict[str, Any]], + *, + size: str = "56px", + show_contrast: str = "true", + show_names: str = "true", + show_hex: str = "true", + copy_format: str = "hex", + title: str = "", + description: str = "", + elem_id: str = "", + extra_class: str = "", + border: str = "true", +) -> str: + """Render colors as circle swatches.""" + cid = elem_id or _next_id() + cls = "gd-color-swatch gd-color-swatch--circles" + if border == "true": + cls += " gd-color-swatch--bordered" + if extra_class: + cls += " " + extra_class + + parts = [ + f'
' + ] + + if title: + parts.append(f'
{_esc(title)}
') + if description: + parts.append(f'
{_esc(description)}
') + + parts.append('
') + + for color in colors: + hex_val = color["hex"] + name = color.get("name", hex_val) + ring, ring_color = needs_border_ring(hex_val) + tooltip = build_tooltip_html(color, show_contrast) + + # Inline contrast info + contrast_inline = "" + if show_contrast == "inline": + info = compute_contrast_info(hex_val) + contrast_inline = f'{info["lc_vs_white"]}/{info["lc_vs_black"]} Lc' + + ring_attr = "" + ring_style = "" + if ring: + ring_attr = ' data-needs-ring="true"' + ring_style = f";--gd-ring-color:{ring_color}" + + # Escape tooltip HTML for data attribute (double-encode quotes) + tooltip_escaped = _esc(tooltip) + + parts.append( + f'
' + f'
' + ) + if show_names == "true": + parts.append(f'{_esc(name)}') + if show_hex == "true": + parts.append(f'{_esc(hex_val)}') + if contrast_inline: + parts.append(contrast_inline) + parts.append("
") + + parts.append("
") + return "\n".join(parts) + + +def render_rectangles( + colors: list[dict[str, Any]], + *, + show_contrast: str = "true", + show_names: str = "true", + show_hex: str = "true", + copy_format: str = "hex", + title: str = "", + description: str = "", + elem_id: str = "", + extra_class: str = "", + border: str = "true", +) -> str: + """Render colors as horizontal rectangle strips.""" + cid = elem_id or _next_id() + cls = "gd-color-swatch gd-color-swatch--rectangles" + if border == "true": + cls += " gd-color-swatch--bordered" + if extra_class: + cls += " " + extra_class + + parts = [ + f'
' + ] + + if title: + parts.append(f'
{_esc(title)}
') + if description: + parts.append(f'
{_esc(description)}
') + + for color in colors: + hex_val = color["hex"] + name = color.get("name", hex_val) + info = compute_contrast_info(hex_val) + text_color = info["ideal_text"] + tooltip = build_tooltip_html(color, show_contrast) + tooltip_escaped = _esc(tooltip) + + parts.append( + f'
' + ) + + if show_names == "true": + parts.append(f'{_esc(name)}') + if show_hex == "true": + parts.append(f'{_esc(hex_val)}') + + if show_contrast != "false": + white_cls = "gd-cs-pass" if info["lc_vs_white"] >= 60 else "gd-cs-fail" + black_cls = "gd-cs-pass" if info["lc_vs_black"] >= 60 else "gd-cs-fail" + parts.append( + '' + f'Aa' + f'Aa' + "" + ) + + parts.append("
") + + parts.append("
") + return "\n".join(parts) + + +# --------------------------------------------------------------------------- +# CLI entry point +# --------------------------------------------------------------------------- + + +def main() -> None: + parser = argparse.ArgumentParser(description="Render color swatches as HTML.") + parser.add_argument("--palette", default="", help="GD palette preset name") + parser.add_argument("--mode", default="circles", help="Display mode") + parser.add_argument("--cols", default="4", help="Grid columns") + parser.add_argument("--size", default="56px", help="Swatch size") + parser.add_argument("--show-contrast", default="true", dest="show_contrast") + parser.add_argument("--show-names", default="true", dest="show_names") + parser.add_argument("--show-hex", default="true", dest="show_hex") + parser.add_argument("--copy-format", default="hex", dest="copy_format") + parser.add_argument("--title", default="") + parser.add_argument("--description", default="") + parser.add_argument("--file", default="", dest="file_path") + parser.add_argument("--height", default="200px") + parser.add_argument("--show-css", default="true", dest="show_css") + parser.add_argument("--show-details", default="true", dest="show_details") + parser.add_argument("--show-controls", default="true", dest="show_controls") + parser.add_argument("--id", default="", dest="elem_id") + parser.add_argument("--class", default="", dest="extra_class") + parser.add_argument("--border", default="true") + + args = parser.parse_args() + + try: + # Read body from stdin (may be empty) + body = "" + if not sys.stdin.isatty(): + body = sys.stdin.read() + + # Or from an external file + if args.file_path: + file_p = Path(args.file_path) + if not file_p.is_absolute(): + file_p = Path(".").resolve() / file_p + body = file_p.read_text(encoding="utf-8") + + colors = parse_colors(body, args.palette) + + if not colors: + print( + "", + file=sys.stderr, + ) + sys.exit(1) + + if args.mode == "circles": + html_out = render_circles( + colors, + size=args.size, + show_contrast=args.show_contrast, + show_names=args.show_names, + show_hex=args.show_hex, + copy_format=args.copy_format, + title=args.title, + description=args.description, + elem_id=args.elem_id, + extra_class=args.extra_class, + border=args.border, + ) + elif args.mode == "rectangles": + html_out = render_rectangles( + colors, + show_contrast=args.show_contrast, + show_names=args.show_names, + show_hex=args.show_hex, + copy_format=args.copy_format, + title=args.title, + description=args.description, + elem_id=args.elem_id, + extra_class=args.extra_class, + border=args.border, + ) + else: + print( + f"", + file=sys.stderr, + ) + sys.exit(1) + + print(html_out, end="") + + except Exception as exc: + print( + f"", + file=sys.stderr, + ) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/great-docs/_extensions/color-swatch/_extension.yml b/great-docs/_extensions/color-swatch/_extension.yml new file mode 100644 index 0000000..75ca5a4 --- /dev/null +++ b/great-docs/_extensions/color-swatch/_extension.yml @@ -0,0 +1,7 @@ +title: Color Swatch +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + shortcodes: + - color-swatch.lua diff --git a/great-docs/_extensions/color-swatch/color-swatch.lua b/great-docs/_extensions/color-swatch/color-swatch.lua new file mode 100644 index 0000000..ac7a170 --- /dev/null +++ b/great-docs/_extensions/color-swatch/color-swatch.lua @@ -0,0 +1,119 @@ +-- color-swatch.lua — Quarto shortcode for color palette display +-- +-- Usage in .qmd files: +-- +-- {{< color-swatch >}} +-- - name: Sky Blue +-- hex: "#38bdf8" +-- {{< /color-swatch >}} +-- +-- {{< color-swatch palette="sky" >}} +-- {{< color-swatch palette="sky" mode="rectangles" >}} +-- +-- Calls the companion _color_swatch_shortcode.py script, which computes +-- contrast ratios, builds tooltip data, and returns complete HTML. + +local function kwarg_str(kwargs, key) + local raw = kwargs[key] + if raw == nil then return "" end + local s = pandoc.utils.stringify(raw) + return s or "" +end + +return { + ["color-swatch"] = function(args, kwargs, blocks) + -- Locate the helper script (lives alongside this .lua file) + local script_dir = debug.getinfo(1, "S").source:match("@?(.*/)") or "./" + local helper = script_dir .. "_color_swatch_shortcode.py" + + -- Build CLI arguments + local cmd_args = { "python3", helper } + + -- Forward all keyword arguments as CLI flags + local forwarded = { + { key = "palette", flag = "--palette" }, + { key = "mode", flag = "--mode" }, + { key = "cols", flag = "--cols" }, + { key = "size", flag = "--size" }, + { key = "show-contrast", flag = "--show-contrast" }, + { key = "show-names", flag = "--show-names" }, + { key = "show-hex", flag = "--show-hex" }, + { key = "copy-format", flag = "--copy-format" }, + { key = "title", flag = "--title" }, + { key = "description", flag = "--description" }, + { key = "file", flag = "--file" }, + { key = "height", flag = "--height" }, + { key = "show-css", flag = "--show-css" }, + { key = "show-details", flag = "--show-details" }, + { key = "show-controls", flag = "--show-controls" }, + { key = "id", flag = "--id" }, + { key = "class", flag = "--class" }, + { key = "border", flag = "--border" }, + } + + for _, spec in ipairs(forwarded) do + local val = kwarg_str(kwargs, spec.key) + if val ~= "" then + table.insert(cmd_args, spec.flag) + table.insert(cmd_args, val) + end + end + + -- Resolve --file relative to the Quarto project root + local file_val = kwarg_str(kwargs, "file") + if file_val ~= "" and file_val:sub(1, 1) ~= "/" then + local project_root = script_dir .. "../../" + -- Replace the already-inserted value + for i, arg in ipairs(cmd_args) do + if arg == "--file" and cmd_args[i + 1] == file_val then + cmd_args[i + 1] = project_root .. file_val + break + end + end + end + + -- Note: Quarto shortcodes do not support paired (body) content. + -- The third parameter is `meta` (document metadata), not `blocks`. + -- Custom colors are supplied via the `file` parameter instead. + local body = "" + + -- Build shell command: pipe body via echo into the helper + local parts = {} + for _, arg in ipairs(cmd_args) do + local escaped = arg:gsub("'", "'\\''") + table.insert(parts, "'" .. escaped .. "'") + end + local cmd_str = table.concat(parts, " ") + + local cmd + if body ~= "" then + -- Pipe the YAML body via a here-document to avoid shell escaping issues + local body_escaped = body:gsub("'", "'\\''") + cmd = "printf '%s' '" .. body_escaped .. "' | " .. cmd_str .. " 2>&1" + else + cmd = cmd_str .. " 2>&1" + end + + local handle = io.popen(cmd) + if not handle then + return pandoc.RawBlock( + "html", + "" + ) + end + + local result = handle:read("*a") + local success = handle:close() + + if not success or result == "" then + local msg = result ~= "" and result or "unknown error" + msg = msg:gsub("-->", "-- >") + return pandoc.RawBlock( + "html", + "" + ) + end + + return pandoc.RawBlock("html", result) + end +} diff --git a/great-docs/_extensions/details/_extension.yml b/great-docs/_extensions/details/_extension.yml new file mode 100644 index 0000000..f526640 --- /dev/null +++ b/great-docs/_extensions/details/_extension.yml @@ -0,0 +1,7 @@ +title: Collapsible Details +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + filters: + - details.lua diff --git a/great-docs/_extensions/details/details.lua b/great-docs/_extensions/details/details.lua new file mode 100644 index 0000000..a6a4e1f --- /dev/null +++ b/great-docs/_extensions/details/details.lua @@ -0,0 +1,175 @@ +-- details.lua — Quarto filter for enhanced collapsible sections +-- +-- Usage in .qmd files (fenced div syntax): +-- +-- ::: {.details summary="Click to expand"} +-- Content here with **markdown** support. +-- ::: +-- +-- ::: {.details summary="Advanced Options" .open icon="settings"} +-- This section starts expanded. +-- ::: +-- +-- ::: {.details summary="Section A" group="faq" type="note"} +-- Only one section in a group can be open at a time (accordion). +-- ::: +-- +-- Renders as
with smooth animations, +-- optional Lucide icons, callout-type styling, and accordion groups. +-- +-- All styling is handled via CSS classes in great-docs.scss. +-- Accordion behavior and smooth animation are handled by details.js. + +--- Escape HTML special characters in a string. +local function escape_html(s) + return s:gsub("&", "&"):gsub("<", "<"):gsub(">", ">"):gsub('"', """) +end + +--- Render inline backtick code in summary text as elements. +--- First escapes HTML, then converts `...` to .... +local function render_summary(s) + local escaped = escape_html(s) + return escaped:gsub("`([^`]+)`", "%1") +end + +--- Read a named attribute from a Pandoc Div, returning "" if absent. +local function attr_str(div, key) + local val = div.attributes[key] + if val == nil then return "" end + return val +end + +-- Valid callout-like types for styled details +local TYPES = { + note = true, + warning = true, + tip = true, + danger = true, + gradient = true, +} + +-- Valid named gradient presets +local GRADIENT_PRESETS = { + sky = true, + peach = true, + prism = true, + lilac = true, + slate = true, + honey = true, + dusk = true, + mint = true, +} + +-- Map types to default Lucide icon names +local TYPE_ICONS = { + note = "message-circle", + warning = "zap", + tip = "lightbulb", + danger = "ban", +} + +--- Render a Lucide icon SVG by calling the icon helper script. +--- Returns the SVG HTML string, or empty string on failure. +local function render_icon(icon_name) + if icon_name == "" then return "" end + + -- Locate the icon helper script in the sibling extension directory + local script_dir = debug.getinfo(1, "S").source:match("@?(.*/)") or "./" + local helper = script_dir .. "../icon/_icon_shortcode.py" + + local cmd = "python3 '" .. + helper .. "' '" .. icon_name:gsub("'", "'\\''") .. + "' --size 16 --class gd-details-icon 2>/dev/null" + local handle = io.popen(cmd) + if not handle then return "" end + + local result = handle:read("*a") + local success = handle:close() + + if not success or result == "" then return "" end + return result +end + +function Div(div) + -- Only process divs with the "details" class + if not div.classes:includes("details") then + return nil + end + + -- Read attributes + local summary = attr_str(div, "summary") + if summary == "" then summary = "Details" end + local icon = attr_str(div, "icon") + local dtype = attr_str(div, "type") + local group = attr_str(div, "group") + local gradient = attr_str(div, "gradient") + local open_val = div.classes:includes("open") + local gleam = div.classes:includes("gleam") + + -- Build CSS classes for the
element + local classes = { "gd-details" } + if dtype ~= "" and TYPES[dtype] then + table.insert(classes, "gd-details--" .. dtype) + end + + -- Named gradient preset (gradient="sky" etc.) overrides type="gradient" + if gradient ~= "" and GRADIENT_PRESETS[gradient] then + table.insert(classes, "gd-details--gradient-" .. gradient) + end + + -- Gleam border effect + if gleam then + table.insert(classes, "gd-details--gleam") + end + + -- If a type is set but no icon was specified, use the default icon + if icon == "" and dtype ~= "" and TYPE_ICONS[dtype] then + icon = TYPE_ICONS[dtype] + end + + -- Build data attributes + local data_attrs = {} + if group ~= "" then + table.insert(data_attrs, 'data-gd-group="' .. escape_html(group) .. '"') + end + + -- Build the open attribute + local open_attr = open_val and " open" or "" + + -- Render icon SVG + local icon_html = "" + if icon ~= "" then + icon_html = render_icon(icon) + if icon_html ~= "" then + icon_html = '' .. + icon_html .. '' + end + end + + -- Build the HTML wrapper + local class_attr = table.concat(classes, " ") + local extra_attrs = "" + if #data_attrs > 0 then + extra_attrs = " " .. table.concat(data_attrs, " ") + end + + local html_open = '
\n' + .. '' + .. '' + .. icon_html + .. '' + .. render_summary(summary) .. '' + .. '\n' + .. '
' + local html_close = '
\n
' + + -- Return opening HTML + inner blocks + closing HTML + local output = pandoc.List:new() + output:insert(pandoc.RawBlock("html", html_open)) + for _, block in ipairs(div.content) do + output:insert(block) + end + output:insert(pandoc.RawBlock("html", html_close)) + return output +end diff --git a/great-docs/_extensions/evolution/_evolution_shortcode.py b/great-docs/_extensions/evolution/_evolution_shortcode.py new file mode 100644 index 0000000..40d9522 --- /dev/null +++ b/great-docs/_extensions/evolution/_evolution_shortcode.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path + + +def _bool_arg(value: str) -> bool: + return value.lower() not in ("false", "no", "0") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Render an evolution table.") + parser.add_argument("symbol", help="Symbol name to track") + parser.add_argument("--package", default=None) + parser.add_argument("--old_version", default=None) + parser.add_argument("--new_version", default=None) + parser.add_argument("--changes_only", default="true") + parser.add_argument("--disclosure", default="false") + parser.add_argument("--summary", default=None) + parser.add_argument("--css", default="true") + parser.add_argument("--json_file", default=None, help="Path to a JSON file to render from") + + args = parser.parse_args() + + try: + if args.json_file: + # Render from a JSON file instead of live git history + from great_docs._api_diff import render_evolution_table_from_dict + + json_path = Path(args.json_file) + if not json_path.is_absolute(): + # Resolve relative to cwd (Quarto runs from great-docs/) + json_path = Path(".").resolve() / json_path + data = json.loads(json_path.read_text(encoding="utf-8")) + html = render_evolution_table_from_dict( + data, + disclosure=_bool_arg(args.disclosure), + summary_text=args.summary, + include_css=_bool_arg(args.css), + ) + else: + # Live git history mode + from great_docs._api_diff import render_evolution_table + + # Quarto runs from the project directory (great-docs/), the git root + # is one level up. + project_root = Path(".").resolve().parent + + html = render_evolution_table( + project_root, + args.symbol, + package=args.package, + old_version=args.old_version, + new_version=args.new_version, + changes_only=_bool_arg(args.changes_only), + disclosure=_bool_arg(args.disclosure), + summary_text=args.summary, + include_css=_bool_arg(args.css), + ) + print(html) + except Exception as exc: + print( + f"", + file=sys.stderr, + ) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/great-docs/_extensions/evolution/_extension.yml b/great-docs/_extensions/evolution/_extension.yml new file mode 100644 index 0000000..2b21b0e --- /dev/null +++ b/great-docs/_extensions/evolution/_extension.yml @@ -0,0 +1,7 @@ +title: Evolution Table +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + shortcodes: + - evolution.lua diff --git a/great-docs/_extensions/evolution/evolution.lua b/great-docs/_extensions/evolution/evolution.lua new file mode 100644 index 0000000..2553740 --- /dev/null +++ b/great-docs/_extensions/evolution/evolution.lua @@ -0,0 +1,103 @@ +-- evolution.lua — Quarto shortcode for API evolution tables +-- +-- Usage in .qmd files: +-- +-- {{< evolution build >}} +-- {{< evolution symbol="build" changes_only="false" >}} +-- {{< evolution build old_version="v1.0" new_version="v2.0" >}} +-- {{< evolution build json="path/to/data.json" >}} +-- +-- Calls the companion _evolution_shortcode.py script, which imports +-- render_evolution_table() and prints the resulting HTML to stdout. + +-- Helper: stringify a kwarg value; returns "" if the key is absent or empty. +-- In Quarto >=1.8 kwargs[key] can return a truthy-but-empty object for +-- keys not supplied by the user, so a simple truthiness check is unreliable. +local function kwarg_str(kwargs, key) + local raw = kwargs[key] + if raw == nil then return "" end + local s = pandoc.utils.stringify(raw) + return s or "" +end + +return { + ["evolution"] = function(args, kwargs) + -- Symbol can be a positional arg or a named kwarg + local symbol = kwarg_str(kwargs, "symbol") + if symbol == "" and #args > 0 then + symbol = pandoc.utils.stringify(args[1]) + end + + if symbol == "" then + return pandoc.RawBlock( + "html", + "" + ) + end + + -- Locate the helper script (lives alongside this .lua file) + local script_dir = debug.getinfo(1, "S").source:match("@?(.*/)") or "./" + local helper = script_dir .. "_evolution_shortcode.py" + + -- Build CLI arguments for the helper script + local cmd_args = { "python", helper, symbol } + + -- Forward optional keyword arguments + local forwarded = { + "package", "old_version", "new_version", + "changes_only", "disclosure", "summary", "css" + } + for _, key in ipairs(forwarded) do + local val = kwarg_str(kwargs, key) + if val ~= "" then + table.insert(cmd_args, "--" .. key) + table.insert(cmd_args, val) + end + end + + -- Forward json as --json_file, resolving relative paths against + -- the Quarto project root (the directory containing _extensions/). + local json_val = kwarg_str(kwargs, "json") + if json_val ~= "" then + -- Resolve relative paths: script_dir is /_extensions/evolution/ + -- so project root is two levels up. + if json_val:sub(1, 1) ~= "/" then + local project_root = script_dir .. "../../" + json_val = project_root .. json_val + end + table.insert(cmd_args, "--json_file") + table.insert(cmd_args, json_val) + end + + -- Build shell command (quote each argument) + local parts = {} + for _, arg in ipairs(cmd_args) do + local escaped = arg:gsub("'", "'\\''") + table.insert(parts, "'" .. escaped .. "'") + end + local cmd = table.concat(parts, " ") .. " 2>&1" + + local handle = io.popen(cmd) + if not handle then + return pandoc.RawBlock( + "html", + "" + ) + end + + local result = handle:read("*a") + local success = handle:close() + + if not success or result == "" then + local msg = result ~= "" and result or "unknown error" + -- Sanitise to prevent breaking the HTML comment + msg = msg:gsub("-->", "-- >") + return pandoc.RawBlock( + "html", + "" + ) + end + + return pandoc.RawBlock("html", result) + end +} diff --git a/great-docs/_extensions/hr/_extension.yml b/great-docs/_extensions/hr/_extension.yml new file mode 100644 index 0000000..ae38d19 --- /dev/null +++ b/great-docs/_extensions/hr/_extension.yml @@ -0,0 +1,7 @@ +title: Horizontal Rule +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + shortcodes: + - hr.lua diff --git a/great-docs/_extensions/hr/hr.lua b/great-docs/_extensions/hr/hr.lua new file mode 100644 index 0000000..72c9a6c --- /dev/null +++ b/great-docs/_extensions/hr/hr.lua @@ -0,0 +1,167 @@ +-- hr.lua — Quarto shortcode for decorative horizontal rules +-- +-- Usage in .qmd files: +-- +-- {{< hr >}} +-- {{< hr style="dashed" color="sky" >}} +-- {{< hr style="dotted" thickness="3px" width="50%" align="center" >}} +-- {{< hr text="§" >}} +-- {{< hr text="Continue Reading" style="solid" color="#6366f1" >}} +-- {{< hr preset="gradient-shimmer" >}} +-- {{< hr preset="fade" width="60%" >}} +-- +-- Pure Lua implementation — no Python helper needed. +-- All styling is handled via CSS classes in great-docs.scss. + +local function kwarg_str(kwargs, key) + local raw = kwargs[key] + if raw == nil then return "" end + local s = pandoc.utils.stringify(raw) + return s or "" +end + +-- Named palette colors that map to CSS custom properties +local PALETTE_COLORS = { + sky = true, + peach = true, + prism = true, + lilac = true, + slate = true, + honey = true, + dusk = true, + mint = true, + accent = true, +} + +-- Valid presets +local PRESETS = { + ["gradient-shimmer"] = true, + ["gradient-static"] = true, + ["fade"] = true, + ["fade-edges"] = true, + ["dots"] = true, + ["diamond"] = true, + ["ornament"] = true, + ["wave"] = true, + ["double-line"] = true, +} + +-- Valid line styles +local STYLES = { + solid = true, dotted = true, dashed = true, double = true, +} + +-- Named thickness values +local THICKNESS_MAP = { + thin = "1px", + medium = "2px", + thick = "4px", +} + +-- Named spacing values +local SPACING_MAP = { + compact = "1rem", + normal = "2rem", + spacious = "4rem", +} + +return { + ["hr"] = function(args, kwargs) + local preset = kwarg_str(kwargs, "preset") + local style = kwarg_str(kwargs, "style") + local color = kwarg_str(kwargs, "color") + local thickness = kwarg_str(kwargs, "thickness") + local width = kwarg_str(kwargs, "width") + local align = kwarg_str(kwargs, "align") + local text = kwarg_str(kwargs, "text") + local text_color = kwarg_str(kwargs, "text-color") + local text_size = kwarg_str(kwargs, "text-size") + local spacing = kwarg_str(kwargs, "spacing") + + -- Build CSS classes + local classes = { "gd-hr" } + + if preset ~= "" and PRESETS[preset] then + table.insert(classes, "gd-hr--" .. preset) + end + + if style ~= "" and STYLES[style] then + table.insert(classes, "gd-hr--" .. style) + end + + if align == "left" then + table.insert(classes, "gd-hr--left") + elseif align == "right" then + table.insert(classes, "gd-hr--right") + end + + -- Build inline styles for dynamic values + local inline_styles = {} + + -- Color: palette name → CSS var, otherwise raw CSS color + if color ~= "" then + if PALETTE_COLORS[color] then + table.insert(inline_styles, + "--gd-hr-color: var(--gd-palette-" .. color .. ", var(--gd-accent, #6366f1))") + else + table.insert(inline_styles, "--gd-hr-color: " .. color) + end + end + + -- Thickness + if thickness ~= "" then + local resolved = THICKNESS_MAP[thickness] or thickness + table.insert(inline_styles, "--gd-hr-thickness: " .. resolved) + end + + -- Width + if width ~= "" then + if width == "full" then + width = "100%" + end + table.insert(inline_styles, "--gd-hr-width: " .. width) + end + + -- Spacing + if spacing ~= "" then + local resolved = SPACING_MAP[spacing] or spacing + table.insert(inline_styles, "--gd-hr-spacing: " .. resolved) + end + + local style_attr = "" + if #inline_styles > 0 then + style_attr = ' style="' .. table.concat(inline_styles, "; ") .. '"' + end + + local class_attr = table.concat(classes, " ") + + -- If there's embedded text, use the flex wrapper structure + if text ~= "" then + local text_classes = { "gd-hr-text" } + if text_size == "sm" then + table.insert(text_classes, "gd-hr-text--sm") + elseif text_size == "lg" then + table.insert(text_classes, "gd-hr-text--lg") + end + + local text_style = "" + if text_color ~= "" then + text_style = ' style="color: ' .. text_color .. '"' + end + + local html = '
' + .. '' + .. '' + .. text + .. '' + .. '' + .. '
' + + return pandoc.RawBlock("html", html) + end + + -- Simple
element + local html = '
' + return pandoc.RawBlock("html", html) + end, +} diff --git a/great-docs/_extensions/icon/_extension.yml b/great-docs/_extensions/icon/_extension.yml new file mode 100644 index 0000000..90b5b97 --- /dev/null +++ b/great-docs/_extensions/icon/_extension.yml @@ -0,0 +1,7 @@ +title: Lucide Icon +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + shortcodes: + - icon.lua diff --git a/great-docs/_extensions/icon/_icon_shortcode.py b/great-docs/_extensions/icon/_icon_shortcode.py new file mode 100644 index 0000000..2f35d15 --- /dev/null +++ b/great-docs/_extensions/icon/_icon_shortcode.py @@ -0,0 +1,125 @@ +from __future__ import annotations + +import argparse +import importlib.util +import re +import sys +from pathlib import Path + + +def _load_icons_module(): + """Load `great_docs._icons` without requiring great_docs to be installed. + + Walks up the directory tree from this script's location until it + finds `great_docs/_icons.py` and imports it directly. This avoids + requiring the full great_docs package (and its dependencies) to be + installed in whatever Python interpreter Quarto happens to use. + """ + # Fast path: great_docs is installed + try: + from great_docs._icons import get_icon_svg + + return get_icon_svg + except Exception: + pass + + # Walk ancestors to find the _icons.py source file + cur = Path(__file__).resolve().parent + for ancestor in cur.parents: + icons_path = ancestor / "great_docs" / "_icons.py" + if icons_path.exists(): + spec = importlib.util.spec_from_file_location("_icons", icons_path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod.get_icon_svg + + raise ImportError("Cannot locate great_docs/_icons.py") + + +def _apply_inline_text_style(svg: str, size_px: int | None) -> str: + """Replace pixel width/height with em-based inline styles. + + Follows this approach: + + - height/width in `em` so the icon scales with surrounding text + - `vertical-align: -0.125em` to sit on the text baseline + - `font-size: inherit` to pick up the parent element's size + - `overflow: visible` to prevent clipping + - `position: relative` for correct stacking context + + When the caller specifies a custom pixel size, it is converted to + `em` relative to a 16 px base (e.g. 24 px -> 1.5em). + """ + if size_px is None or size_px == 16: + em = "1em" + else: + em = f"{round(size_px / 16, 3)}em" + + style = ( + f"height:{em};" + f"width:{em};" + "vertical-align:-0.125em;" + "font-size:inherit;" + "overflow:visible;" + "position:relative;" + ) + + # Strip the old pixel width="N" height="N" attributes + svg = re.sub(r'\s*width="\d+"', "", svg) + svg = re.sub(r'\s*height="\d+"', "", svg) + + # Inject the style attribute into the opening tag + svg = svg.replace(" None: + parser = argparse.ArgumentParser(description="Render a Lucide icon as inline SVG.") + parser.add_argument("name", help="Lucide icon name (e.g. 'heart', 'rocket')") + parser.add_argument("--size", type=int, default=None, help="Icon size in pixels") + parser.add_argument( + "--class", dest="css_class", default="gd-icon", help="CSS class for the SVG" + ) + parser.add_argument( + "--label", + default=None, + help="Accessible label (sets aria-label instead of aria-hidden)", + ) + + args = parser.parse_args() + + try: + get_icon_svg = _load_icons_module() + + # get_icon_svg needs a pixel size; default to 16 (will be replaced by em) + px_size = args.size if args.size is not None else 16 + svg = get_icon_svg(args.name, size=px_size, css_class=args.css_class) + + if not svg: + print( + f"", + file=sys.stderr, + ) + sys.exit(1) + + # Replace pixel sizing with em-based inline styles + svg = _apply_inline_text_style(svg, args.size) + + # If a label is provided, make the icon accessible + if args.label: + svg = svg.replace( + 'aria-hidden="true"', + f'aria-label="{args.label}" role="img"', + ) + + print(svg, end="") + except Exception as exc: + print( + f"", + file=sys.stderr, + ) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/great-docs/_extensions/icon/icon.lua b/great-docs/_extensions/icon/icon.lua new file mode 100644 index 0000000..de5fa75 --- /dev/null +++ b/great-docs/_extensions/icon/icon.lua @@ -0,0 +1,86 @@ +-- icon.lua — Quarto shortcode for inline Lucide icons +-- +-- Usage in .qmd files: +-- +-- {{< icon heart >}} +-- {{< icon name="heart" >}} +-- {{< icon heart size="24" >}} +-- {{< icon heart class="my-icon" >}} +-- {{< icon heart label="Favorite" >}} +-- +-- Calls the companion _icon_shortcode.py script, which imports +-- get_icon_svg() from great_docs._icons and prints the resulting +-- SVG markup to stdout. + +local function kwarg_str(kwargs, key) + local raw = kwargs[key] + if raw == nil then return "" end + local s = pandoc.utils.stringify(raw) + return s or "" +end + +return { + ["icon"] = function(args, kwargs) + -- Icon name can be a positional arg or a named kwarg + local name = kwarg_str(kwargs, "name") + if name == "" and #args > 0 then + name = pandoc.utils.stringify(args[1]) + end + + if name == "" then + return pandoc.RawInline( + "html", + "" + ) + end + + -- Locate the helper script (lives alongside this .lua file) + local script_dir = debug.getinfo(1, "S").source:match("@?(.*/)") or "./" + local helper = script_dir .. "_icon_shortcode.py" + + -- Build CLI arguments for the helper script + -- Use python3 for macOS compatibility (python may not exist) + local cmd_args = { "python3", helper, name } + + -- Forward optional keyword arguments + local forwarded = { "size", "class", "label" } + for _, key in ipairs(forwarded) do + local val = kwarg_str(kwargs, key) + if val ~= "" then + table.insert(cmd_args, "--" .. key) + table.insert(cmd_args, val) + end + end + + -- Build shell command (quote each argument) + local parts = {} + for _, arg in ipairs(cmd_args) do + local escaped = arg:gsub("'", "'\\''") + table.insert(parts, "'" .. escaped .. "'") + end + local cmd = table.concat(parts, " ") .. " 2>&1" + + local handle = io.popen(cmd) + if not handle then + return pandoc.RawInline( + "html", + "" + ) + end + + local result = handle:read("*a") + local success = handle:close() + + if not success or result == "" then + local msg = result ~= "" and result or "unknown error" + msg = msg:gsub("-->", "-- >") + return pandoc.RawInline( + "html", + "" + ) + end + + -- Icons are inline elements, not blocks + return pandoc.RawInline("html", result) + end +} diff --git a/great-docs/_extensions/keys/_extension.yml b/great-docs/_extensions/keys/_extension.yml new file mode 100644 index 0000000..f504053 --- /dev/null +++ b/great-docs/_extensions/keys/_extension.yml @@ -0,0 +1,7 @@ +title: Keyboard Keys +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + shortcodes: + - keys.lua diff --git a/great-docs/_extensions/keys/keys.lua b/great-docs/_extensions/keys/keys.lua new file mode 100644 index 0000000..d99c3f6 --- /dev/null +++ b/great-docs/_extensions/keys/keys.lua @@ -0,0 +1,204 @@ +-- keys.lua — Quarto shortcode for styled keyboard key caps +-- +-- Usage in .qmd files: +-- +-- {{< keys "Esc" >}} +-- {{< keys "Ctrl" >}}+{{< keys "Shift" >}}+{{< keys "P" >}} +-- {{< keys shortcut="Ctrl+Shift+P" >}} +-- {{< keys shortcut="Ctrl+Shift+P" platform="mac" >}} +-- {{< keys shortcut="Cmd+K" platform="win" >}} +-- +-- Pure Lua implementation — no Python helper needed. +-- All styling is handled via CSS classes in great-docs.scss. +-- +-- NOTE: Quarto ships a built-in {{< kbd >}} shortcode that renders plain-text +-- shortcuts with per-OS keyword args (mac=, win=, linux=). This extension is +-- intentionally named "keys" to avoid conflict. It provides *styled* key caps +-- with a 3D border effect and macOS symbol translation. + +local function kwarg_str(kwargs, key) + local raw = kwargs[key] + if raw == nil then return "" end + local s = pandoc.utils.stringify(raw) + return s or "" +end + +-- Map generic key names to macOS symbols +local MAC_KEYS = { + ctrl = "⌃", + control = "⌃", + alt = "⌥", + option = "⌥", + opt = "⌥", + shift = "⇧", + cmd = "⌘", + command = "⌘", + meta = "⌘", + super = "⌘", + enter = "⏎", + ["return"] = "⏎", + tab = "⇥", + delete = "⌫", + backspace = "⌫", + esc = "⎋", + escape = "⎋", + space = "␣", + up = "▲", + down = "▼", + left = "◀", + right = "▶", +} + +-- Map macOS-specific key names to Windows/generic equivalents +local WIN_KEYS = { + cmd = "Ctrl", + command = "Ctrl", + meta = "Win", + super = "Win", + option = "Alt", + opt = "Alt", +} + +-- Tooltip text for symbolic key labels (shown on hover) +local TOOLTIPS = { + ["⌃"] = "Control", + ["⌥"] = "Option", + ["⇧"] = "Shift", + ["⌘"] = "Command", + ["⏎"] = "Enter", + ["⇥"] = "Tab", + ["⌫"] = "Delete", + ["⎋"] = "Escape", + ["␣"] = "Space", + ["▲"] = "Up", + ["▼"] = "Down", + ["◀"] = "Left", + ["▶"] = "Right", +} + +--- Escape HTML special characters. +local function escape_html(s) + return s:gsub("&", "&"):gsub("<", "<"):gsub(">", ">"):gsub('"', """) +end + +--- Check whether a label is a function key (F1–F20). +local function is_fn_key(label) + return label:match("^[Ff]%d%d?$") ~= nil +end + +--- Render a single key label into an HTML element. +--- @param label string The display text for the key +--- @return string HTML string +local function render_key(label) + local cls = "gd-keys" + if is_fn_key(label) then + cls = "gd-keys gd-keys-fn" + end + local tooltip = TOOLTIPS[label] + if tooltip then + return '' .. escape_html(label) .. '' + end + return '' .. escape_html(label) .. '' +end + +--- Translate a single key name for a given platform. +--- @param key string Raw key name (e.g. "Ctrl", "Cmd") +--- @param platform string "mac" | "win" | "" +--- @return string Display label for the key +local function translate_key(key, platform) + local lower = key:lower() + + if platform == "mac" then + local sym = MAC_KEYS[lower] + if sym then return sym end + elseif platform == "win" then + local mapped = WIN_KEYS[lower] + if mapped then return mapped end + end + + -- For keys that aren't platform-special, title-case single-char keys + -- and preserve the original casing for multi-char keys + if #key == 1 then + return key:upper() + end + return key +end + +--- Split a shortcut string on "+" while respecting a literal "+" key. +--- E.g. "Ctrl+Shift++" => {"Ctrl", "Shift", "+"} +--- @param shortcut string +--- @return table List of key names +local function split_shortcut(shortcut) + local keys = {} + local i = 1 + local len = #shortcut + + while i <= len do + -- Find next "+" + local j = shortcut:find("+", i, true) + if j == nil then + -- Last segment + local seg = shortcut:sub(i) + if seg ~= "" then + table.insert(keys, seg) + end + break + end + + local seg = shortcut:sub(i, j - 1) + if seg == "" then + -- The "+" itself is the key (e.g. at start, or after another "+") + table.insert(keys, "+") + i = j + 1 + else + table.insert(keys, seg) + i = j + 1 + end + end + + return keys +end + +return { + ["keys"] = function(args, kwargs) + local shortcut = kwarg_str(kwargs, "shortcut") + local platform = kwarg_str(kwargs, "platform") + + -- Normalise platform + if platform ~= "" then + platform = platform:lower() + if platform ~= "mac" and platform ~= "win" then + platform = "" + end + end + + -- Single-key mode: positional arg or key="" kwarg + if shortcut == "" then + local key = kwarg_str(kwargs, "key") + if key == "" and #args > 0 then + key = pandoc.utils.stringify(args[1]) + end + + if key == "" then + return pandoc.RawInline( + "html", + "" + ) + end + + local label = translate_key(key, platform) + return pandoc.RawInline("html", render_key(label)) + end + + -- Shortcut combo mode: split on "+" and render each key + local keys = split_shortcut(shortcut) + local parts = {} + for _, k in ipairs(keys) do + local label = translate_key(k, platform) + table.insert(parts, render_key(label)) + end + + local separator = '+' + return pandoc.RawInline("html", table.concat(parts, separator)) + end +} diff --git a/great-docs/_extensions/output-title/_extension.yml b/great-docs/_extensions/output-title/_extension.yml new file mode 100644 index 0000000..20a263a --- /dev/null +++ b/great-docs/_extensions/output-title/_extension.yml @@ -0,0 +1,7 @@ +title: Output Title +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + filters: + - output-title.lua diff --git a/great-docs/_extensions/output-title/output-title.lua b/great-docs/_extensions/output-title/output-title.lua new file mode 100644 index 0000000..a250921 --- /dev/null +++ b/great-docs/_extensions/output-title/output-title.lua @@ -0,0 +1,101 @@ +-- output-title.lua — Quarto filter for labelling and framing code cell outputs +-- +-- Usage in .qmd files: +-- +-- ```{python} +-- #| output-title: "Response" +-- chat.chat("Hello!") +-- ``` +-- +-- ```{python} +-- #| output-frame: true +-- print("framed output, no title") +-- ``` +-- +-- Wraps the cell's output in a styled container with an optional title. +-- Works with any executable code cell, and composes with source-code: mock. + +--- Extract the output-title value from a cell Div's attributes. +--- Quarto passes unrecognised hash-pipe options as attributes on the +--- enclosing div.cell element. +---@param div pandoc.Div +---@return string|nil The title text (unquoted), or nil if absent. +local function get_output_title(div) + -- Quarto passes custom cell options as attributes on the div + local title = div.attributes["output-title"] + if title == nil then return nil end + + -- Strip surrounding quotes if present + title = title:match('^"(.*)"$') or title:match("^'(.*)'$") or title + if title == "" then return nil end + return title +end + +--- Check whether output-frame is set to a truthy value. +---@param div pandoc.Div +---@return boolean +local function get_output_frame(div) + local val = div.attributes["output-frame"] + if val == nil then return false end + val = val:lower() + return val == "true" or val == "yes" or val == "1" +end + +--- Check whether a block element is a cell-output container. +---@param el pandoc.Block +---@return boolean +local function is_cell_output(el) + if el.t ~= "Div" then return false end + for _, cls in ipairs(el.classes) do + if cls:match("^cell%-output") then return true end + end + return false +end + +function Div(div) + -- Only operate on executable code cells + if not div.classes:includes("cell") then return nil end + + local title = get_output_title(div) + local frame = get_output_frame(div) + + -- Need either a title or an explicit frame request + if title == nil and not frame then return nil end + + -- Remove attributes so they don't leak into the HTML + div.attributes["output-title"] = nil + div.attributes["output-frame"] = nil + + -- Collect output blocks and wrap them + local new_content = pandoc.List() + local output_blocks = pandoc.List() + + for _, el in ipairs(div.content) do + if is_cell_output(el) then + output_blocks:insert(el) + else + new_content:insert(el) + end + end + + if #output_blocks == 0 then return nil end + + -- Build the container HTML + local title_html = '
\n' + if title then + title_html = title_html + .. '
' .. title .. '
\n' + end + title_html = title_html .. '
\n' + local close_html = '
\n
' + + -- Wrap: open tag, output blocks, close tag + new_content:insert(pandoc.RawBlock("html", title_html)) + for _, ob in ipairs(output_blocks) do + new_content:insert(ob) + end + new_content:insert(pandoc.RawBlock("html", close_html)) + + div.content = new_content + return div +end diff --git a/great-docs/_extensions/tbl-explorer/_extension.yml b/great-docs/_extensions/tbl-explorer/_extension.yml new file mode 100644 index 0000000..a9fb86d --- /dev/null +++ b/great-docs/_extensions/tbl-explorer/_extension.yml @@ -0,0 +1,7 @@ +title: Table Explorer +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + shortcodes: + - tbl-explorer.lua diff --git a/great-docs/_extensions/tbl-explorer/_tbl_explorer_shortcode.py b/great-docs/_extensions/tbl-explorer/_tbl_explorer_shortcode.py new file mode 100644 index 0000000..9203d61 --- /dev/null +++ b/great-docs/_extensions/tbl-explorer/_tbl_explorer_shortcode.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +"""CLI helper for the tbl-explorer Quarto shortcode.""" + +from __future__ import annotations + +import argparse +import importlib.util +import sys +from pathlib import Path + + +def _load_tbl_explorer(): + """Import tbl_explorer without triggering great_docs.__init__.""" + try: + from great_docs._tbl_explorer import tbl_explorer + + return tbl_explorer + except (ImportError, ModuleNotFoundError): + here = Path(__file__).resolve().parent + p = here + while p != p.parent: + candidate = p / "great_docs" / "_tbl_explorer.py" + if candidate.exists(): + spec = importlib.util.spec_from_file_location("_tbl_explorer", candidate) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod.tbl_explorer + p = p.parent + raise ImportError("Cannot find _tbl_explorer.py") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Render an interactive table explorer.") + parser.add_argument( + "file", help="Path to data file (CSV, TSV, JSONL, Parquet, Feather, Arrow IPC)" + ) + parser.add_argument("--columns", default=None, help="Comma-separated column names") + parser.add_argument("--page_size", type=int, default=20) + parser.add_argument("--sortable", default="true") + parser.add_argument("--filterable", default="true") + parser.add_argument("--column_toggle", default="true") + parser.add_argument("--copyable", default="true") + parser.add_argument("--downloadable", default="true") + parser.add_argument("--resizable", default="false") + parser.add_argument("--sticky_header", default="true") + parser.add_argument("--search_highlight", default="true") + parser.add_argument("--show_row_numbers", default="true") + parser.add_argument("--show_dtypes", default="true") + parser.add_argument("--show_dimensions", default="true") + parser.add_argument("--max_col_width", type=int, default=250) + parser.add_argument("--min_tbl_width", type=int, default=500) + parser.add_argument("--caption", default=None) + parser.add_argument("--highlight_missing", default="true") + args = parser.parse_args() + + tbl_explorer = _load_tbl_explorer() + + columns = [c.strip() for c in args.columns.split(",")] if args.columns else None + + def _to_bool(s: str) -> bool: + return s.lower() in ("true", "1", "yes") + + result = tbl_explorer( + data=args.file, + columns=columns, + page_size=args.page_size, + sortable=_to_bool(args.sortable), + filterable=_to_bool(args.filterable), + column_toggle=_to_bool(args.column_toggle), + copyable=_to_bool(args.copyable), + downloadable=_to_bool(args.downloadable), + resizable=_to_bool(args.resizable), + sticky_header=_to_bool(args.sticky_header), + search_highlight=_to_bool(args.search_highlight), + show_row_numbers=_to_bool(args.show_row_numbers), + show_dtypes=_to_bool(args.show_dtypes), + show_dimensions=_to_bool(args.show_dimensions), + max_col_width=args.max_col_width, + min_tbl_width=args.min_tbl_width, + caption=args.caption, + highlight_missing=_to_bool(args.highlight_missing), + ) + + sys.stdout.write(result.as_html()) + + +if __name__ == "__main__": + main() diff --git a/great-docs/_extensions/tbl-explorer/tbl-explorer.lua b/great-docs/_extensions/tbl-explorer/tbl-explorer.lua new file mode 100644 index 0000000..89b9dff --- /dev/null +++ b/great-docs/_extensions/tbl-explorer/tbl-explorer.lua @@ -0,0 +1,94 @@ +-- tbl-explorer.lua — Quarto shortcode for interactive table explorer +-- +-- Usage in .qmd files: +-- +-- {{< tbl-explorer file="data/example.csv" >}} +-- {{< tbl-explorer file="data.csv" page_size="25" sortable="true" >}} +-- {{< tbl-explorer file="data.csv" column_toggle="false" downloadable="false" >}} +-- +-- Calls the companion _tbl_explorer_shortcode.py script, which imports +-- tbl_explorer() from great_docs._tbl_explorer and prints the resulting +-- HTML to stdout. + +local function kwarg_str(kwargs, key) + local raw = kwargs[key] + if raw == nil then return "" end + local s = pandoc.utils.stringify(raw) + return s or "" +end + +return { + ["tbl-explorer"] = function(args, kwargs) + -- File path can be a positional arg or named kwarg + local file = kwarg_str(kwargs, "file") + if file == "" and #args > 0 then + file = pandoc.utils.stringify(args[1]) + end + + if file == "" then + return pandoc.RawBlock( + "html", + "" + ) + end + + -- Locate the helper script (lives alongside this .lua file) + local script_dir = debug.getinfo(1, "S").source:match("@?(.*/)") or "./" + local helper = script_dir .. "_tbl_explorer_shortcode.py" + + -- Resolve relative file paths against the Quarto project root + if file:sub(1, 1) ~= "/" then + local project_root = script_dir .. "../../" + file = project_root .. file + end + + -- Build CLI arguments + local cmd_args = { "python3", helper, file } + + -- Forward optional keyword arguments + local forwarded = { + "columns", "page_size", "sortable", "filterable", + "column_toggle", "copyable", "downloadable", "resizable", + "sticky_header", "search_highlight", + "show_row_numbers", "show_dtypes", "show_dimensions", + "max_col_width", "min_tbl_width", "caption", + "highlight_missing", + } + for _, key in ipairs(forwarded) do + local val = kwarg_str(kwargs, key) + if val ~= "" then + table.insert(cmd_args, "--" .. key) + table.insert(cmd_args, val) + end + end + + -- Build shell command (quote each argument) + local parts = {} + for _, arg in ipairs(cmd_args) do + local escaped = arg:gsub("'", "'\\''") + table.insert(parts, "'" .. escaped .. "'") + end + local cmd = table.concat(parts, " ") .. " 2>&1" + + local handle = io.popen(cmd) + if not handle then + return pandoc.RawBlock( + "html", + "" + ) + end + + local result = handle:read("*a") + local success = handle:close() + + if not success or result == "" then + return pandoc.RawBlock( + "html", + "" + ) + end + + return pandoc.RawBlock("html", result) + end +} diff --git a/great-docs/_extensions/tbl-preview/_extension.yml b/great-docs/_extensions/tbl-preview/_extension.yml new file mode 100644 index 0000000..217f1e5 --- /dev/null +++ b/great-docs/_extensions/tbl-preview/_extension.yml @@ -0,0 +1,7 @@ +title: Table Preview +author: Great Docs +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + shortcodes: + - tbl-preview.lua diff --git a/great-docs/_extensions/tbl-preview/_tbl_preview_shortcode.py b/great-docs/_extensions/tbl-preview/_tbl_preview_shortcode.py new file mode 100644 index 0000000..1d105cd --- /dev/null +++ b/great-docs/_extensions/tbl-preview/_tbl_preview_shortcode.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""CLI helper for the tbl-preview Quarto shortcode.""" + +from __future__ import annotations + +import argparse +import importlib.util +import sys +from pathlib import Path + + +def _load_tbl_preview(): + """Import tbl_preview without triggering great_docs.__init__.""" + try: + from great_docs._tbl_preview import tbl_preview + + return tbl_preview + except (ImportError, ModuleNotFoundError): + # Fall back to loading the module directly by file path. + # Walk up the directory tree until we find great_docs/_tbl_preview.py. + here = Path(__file__).resolve().parent + p = here + while p != p.parent: + candidate = p / "great_docs" / "_tbl_preview.py" + if candidate.exists(): + spec = importlib.util.spec_from_file_location("_tbl_preview", candidate) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod.tbl_preview + p = p.parent + raise ImportError("Cannot find _tbl_preview.py") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Render a table preview from a data file.") + parser.add_argument( + "file", help="Path to data file (CSV, TSV, JSONL, Parquet, Feather, Arrow IPC)" + ) + parser.add_argument("--columns", default=None, help="Comma-separated column names") + parser.add_argument("--n_head", type=int, default=5) + parser.add_argument("--n_tail", type=int, default=5) + parser.add_argument("--show_all", default="false") + parser.add_argument("--show_row_numbers", default="true") + parser.add_argument("--show_dtypes", default="true") + parser.add_argument("--show_dimensions", default="true") + parser.add_argument("--max_col_width", type=int, default=250) + parser.add_argument("--min_tbl_width", type=int, default=500) + parser.add_argument("--caption", default=None) + parser.add_argument("--row_index_offset", type=int, default=0) + args = parser.parse_args() + + tbl_preview = _load_tbl_preview() + + columns = [c.strip() for c in args.columns.split(",")] if args.columns else None + + def _to_bool(s: str) -> bool: + return s.lower() in ("true", "1", "yes") + + result = tbl_preview( + data=args.file, + columns=columns, + n_head=args.n_head, + n_tail=args.n_tail, + show_all=_to_bool(args.show_all), + show_row_numbers=_to_bool(args.show_row_numbers), + show_dtypes=_to_bool(args.show_dtypes), + show_dimensions=_to_bool(args.show_dimensions), + max_col_width=args.max_col_width, + min_tbl_width=args.min_tbl_width, + caption=args.caption, + row_index_offset=args.row_index_offset, + ) + + sys.stdout.write(result.as_html()) + + +if __name__ == "__main__": + main() diff --git a/great-docs/_extensions/tbl-preview/tbl-preview.lua b/great-docs/_extensions/tbl-preview/tbl-preview.lua new file mode 100644 index 0000000..4c01541 --- /dev/null +++ b/great-docs/_extensions/tbl-preview/tbl-preview.lua @@ -0,0 +1,97 @@ +-- tbl-preview.lua — Quarto shortcode for data table previews +-- +-- Usage in .qmd files: +-- +-- {{< tbl-preview file="data/example.csv" >}} +-- {{< tbl-preview file="data.tsv" >}} +-- {{< tbl-preview file="data.jsonl" show_all="true" >}} +-- {{< tbl-preview file="data.parquet" n_head="10" n_tail="5" >}} +-- {{< tbl-preview file="data.csv" show_all="true" caption="My Dataset" >}} +-- +-- Calls the companion _tbl_preview_shortcode.py script, which imports +-- tbl_preview() from great_docs._tbl_preview and prints the resulting +-- HTML to stdout. + +local function kwarg_str(kwargs, key) + local raw = kwargs[key] + if raw == nil then return "" end + local s = pandoc.utils.stringify(raw) + return s or "" +end + +return { + ["tbl-preview"] = function(args, kwargs) + -- File path can be a positional arg or named kwarg + local file = kwarg_str(kwargs, "file") + if file == "" and #args > 0 then + file = pandoc.utils.stringify(args[1]) + end + + if file == "" then + return pandoc.RawBlock( + "html", + "" + ) + end + + -- Locate the helper script (lives alongside this .lua file) + local script_dir = debug.getinfo(1, "S").source:match("@?(.*/)") or "./" + local helper = script_dir .. "_tbl_preview_shortcode.py" + + -- Resolve relative file paths against the Quarto project root + -- (script_dir is /_extensions/tbl-preview/) + if file:sub(1, 1) ~= "/" then + local project_root = script_dir .. "../../" + file = project_root .. file + end + + -- Build CLI arguments + -- Use python3 for macOS compatibility (python may not exist) + local cmd_args = { "python3", helper, file } + + -- Forward optional keyword arguments + local forwarded = { + "columns", "n_head", "n_tail", "show_all", + "show_row_numbers", "show_dtypes", "show_dimensions", + "max_col_width", "min_tbl_width", "caption", + "row_index_offset", + } + for _, key in ipairs(forwarded) do + local val = kwarg_str(kwargs, key) + if val ~= "" then + table.insert(cmd_args, "--" .. key) + table.insert(cmd_args, val) + end + end + + -- Build shell command (quote each argument) + local parts = {} + for _, arg in ipairs(cmd_args) do + local escaped = arg:gsub("'", "'\\''") + table.insert(parts, "'" .. escaped .. "'") + end + local cmd = table.concat(parts, " ") .. " 2>&1" + + local handle = io.popen(cmd) + if not handle then + return pandoc.RawBlock( + "html", + "" + ) + end + + local result = handle:read("*a") + local success = handle:close() + + if not success or result == "" then + local msg = result ~= "" and result or "unknown error" + msg = msg:gsub("-->", "-- >") + return pandoc.RawBlock( + "html", + "" + ) + end + + return pandoc.RawBlock("html", result) + end +} diff --git a/great-docs/_gd_options.json b/great-docs/_gd_options.json new file mode 100644 index 0000000..5c12eaf --- /dev/null +++ b/great-docs/_gd_options.json @@ -0,0 +1 @@ +{"markdown_pages": true, "show_dates": false, "date_format": "%B %d, %Y", "show_author": true, "team_author": null, "authors": [{"name": "Jeff Gallini", "role": "Maintainer", "email": "gallinij@gmail.com", "github": "jeffgallini"}], "build_timestamp": "2026-05-26T10:41:43.493187", "language": "en", "i18n": {"kb_overlay_title": "Keyboard shortcuts", "kb_group_navigation": "Navigation", "kb_group_display": "Display", "kb_group_general": "General", "kb_focus_search": "Focus search", "kb_prev_page": "Previous page", "kb_next_page": "Next page", "kb_prev_next_page": "Previous / next page", "kb_user_guide": "User Guide", "kb_api_reference": "API Reference", "kb_show_menu": "Show menu", "kb_menu_title_site": "Site Navigation", "kb_menu_title_section": "Section Navigation", "kb_toggle_dark": "Toggle dark mode", "kb_copy_page": "Copy page as Markdown", "kb_home": "Go to homepage", "kb_show_help": "Show keyboard shortcuts", "kb_close_dismiss": "Close / dismiss", "kb_or": "or", "back_to_top": "Back to top", "copy_to_clipboard": "Copy to clipboard", "copied": "Copied!", "copy_page": "Copy page", "copy_page_as_markdown": "Copy page as Markdown", "view_as_markdown": "View as Markdown", "view_page_as_markdown": "View page as Markdown", "page_actions": "Page actions", "error": "Error", "switch_to_dark_mode": "Switch to dark mode", "switch_to_light_mode": "Switch to light mode", "toggle_dark_mode": "Toggle dark mode", "stars": "Stars", "forks": "Forks", "repository": "Repository", "issues": "Issues", "pull_requests": "Pull Requests", "add_a_star": "Add a Star", "create_a_fork": "Create a Fork", "refreshed_time_ago": "Refreshed {time}", "years_ago": "{n} year ago|{n} years ago", "months_ago": "{n} month ago|{n} months ago", "days_ago": "{n} day ago|{n} days ago", "hours_ago": "{n} hour ago|{n} hours ago", "minutes_ago": "{n} minute ago|{n} minutes ago", "just_now": "just now", "date_at_time_utc": "{date} at {time} UTC", "author_avatar_alt": "{name}'s avatar", "author_avatar_fallback": "Author avatar", "author": "Author", "filter_api": "Filter API...", "filter_api_reference_items": "Filter API reference items", "clear_filter": "Clear filter", "n_of_total_items": "{n} of {total} items", "api_reference": "API Reference", "cli_reference": "CLI Reference", "api": "API", "api_index": "API Index", "cli": "CLI", "dismiss_announcement": "Dismiss announcement", "scrollable_table": "Scrollable table", "play_video": "Play video: {title}", "video": "Video", "user_guide": "User Guide", "recipes": "Recipes", "reference": "Reference", "changelog": "Changelog", "developed_by": "Developed by", "supported_by": "Supported by", "and": "and", "site_created_with": "Site created with", "links": "Links", "view_on_pypi": "View on PyPI", "browse_source_code": "Browse source code", "report_a_bug": "Report a bug", "ai_agents": "AI / Agents", "developers": "Developers", "meta": "Meta", "community": "Community", "contributing_guide": "Contributing guide", "code_of_conduct": "Code of conduct", "project_roadmap": "Project roadmap", "security_policy": "Security policy", "full_license": "Full license", "license_label": "License:", "license_features": "License features", "license_permissions": "Permissions", "license_conditions": "Conditions", "license_limitations": "Limitations", "citing": "Citing", "on_this_page": "On this page", "parameters": "Parameters", "returns": "Returns", "raises": "Raises", "examples": "Examples", "notes": "Notes", "warnings_section": "Warnings", "references_section": "References", "see_also": "See Also", "attributes": "Attributes", "methods": "Methods", "classes": "Classes", "functions": "Functions", "dataclasses": "Dataclasses", "abstract_classes": "Abstract Classes", "protocols": "Protocols", "enumerations": "Enumerations", "exceptions": "Exceptions", "named_tuples": "Named Tuples", "typed_dicts": "Typed Dicts", "async_functions": "Async Functions", "constants": "Constants", "type_aliases": "Type Aliases", "other": "Other", "core_classes_desc": "Core classes", "public_functions_desc": "Public functions", "data_classes_desc": "Data-holding classes", "abstract_classes_desc": "Abstract base classes", "protocols_desc": "Structural typing protocols", "enum_types_desc": "Enum types", "exception_classes_desc": "Exception classes", "namedtuple_types_desc": "NamedTuple types", "typeddict_types_desc": "TypedDict types", "async_functions_desc": "Asynchronous functions", "constants_desc": "Module-level constants and data", "type_alias_desc": "Type alias definitions", "additional_exports_desc": "Additional exports", "usage": "Usage", "source": "Source", "skills_title": "Skills", "install_this_skill": "Install this skill", "install_these_skills": "Install these skills", "any_agent": "Any agent", "tell_the_agent": "Tell the agent", "fetch_skill_file_at": "Fetch the skill file at", "fetch_skill_file_from": "Fetch the skill file from", "and_follow_instructions": "and follow the instructions.", "manual_download": "Manual", "download_skill_file": "download the skill file", "browse_skill_file": "Or browse the", "browse_skill_files": "Or browse the skill files below", "file_word": "file", "skill_layout": "SKILL LAYOUT", "skills_intro": "A skill is a package of structured files that teaches an AI coding agent how to work with a specific tool or framework.", "skills_intro_auto": "The skill below was generated by Great Docs from this project's documentation. Install it in your agent and it will be able to run commands, edit configuration, write content, and troubleshoot problems without step-by-step guidance from you.", "skills_intro_curated": "Install it in your agent and it will be able to run commands, edit configuration, write content, and troubleshoot problems without step-by-step guidance from you.", "install_with_npx": "install with", "install_all_with_npx": "install all with", "cli_install": "CLI", "install_all_in_project": "install all skills in a project", "tell_the_agent_to_fetch": "Tell the agent to fetch these skill files", "added_in_version": "Added in version", "changed_in_version": "Changed in version", "deprecated_since_version": "Deprecated since version", "note_callout": "Note", "warning_callout": "Warning", "caution_callout": "Caution", "danger_callout": "Danger", "important_callout": "Important", "tip_callout": "Tip", "hint_callout": "Hint", "requires_python": "Requires", "provides_extra": "Provides-Extra", "logo_tooltip_released": "Released {date}", "tags_title": "Tags", "tags_nav": "Tags", "tags_page_count_one": "1 page in {sections}", "tags_page_count_other": "{count} pages in {sections}", "tags_page_count_one_no_section": "1 page", "tags_page_count_other_no_section": "{count} pages", "status_label_new": "New", "status_label_updated": "Updated", "status_label_beta": "Beta", "status_label_deprecated": "Deprecated", "status_label_experimental": "Experimental", "status_label_upcoming": "Upcoming", "status_desc_new": "Recently added", "status_desc_updated": "Recently updated", "status_desc_beta": "Beta feature", "status_desc_deprecated": "May be removed in a future release", "status_desc_experimental": "API may change without notice", "status_desc_upcoming": "Coming in a future release", "evo_disclosure_summary": "Signature evolution for {symbol}", "tbl_filter_hint": "Add Data Filter", "tbl_no_matching_rows": "No matching rows", "tbl_columns_btn": "Columns", "tbl_copy_tooltip": "Copy", "tbl_download_tooltip": "Download", "tbl_reset_tooltip": "Reset", "tbl_filter_contains": "contains", "tbl_filter_not_contains": "doesn\u2019t contain", "tbl_filter_starts_with": "starts with", "tbl_filter_ends_with": "ends with", "tbl_filter_equals": "equals", "tbl_filter_is_empty": "is empty", "tbl_filter_not_empty": "is not empty", "tbl_filter_between": "between", "tbl_filter_is_true": "is true", "tbl_filter_is_false": "is false", "tbl_filter_is_null": "is null", "tbl_filter_is_not_null": "is not null", "tbl_filter_enter_value": "Enter value\u2026", "tbl_filter_case_insensitive": "Case insensitive", "tbl_filter_case_sensitive": "Case sensitive", "tbl_filter_apply": "Apply", "tbl_filter_min": "min", "tbl_filter_and": "and", "tbl_filter_max": "max"}, "rtl": false, "seo_enabled": true, "canonical_enabled": true, "canonical_base_url": "https://jeffgallini.github.io/dash-mantine-datatable/", "title_template": "{page_title} | {site_name}", "structured_data_enabled": true, "structured_data_type": "SoftwareSourceCode", "default_description": "", "package_name": "dash-mantine-datatable", "package_description": "", "package_license": "", "package_version": "", "repo_url": "", "site_name": "Dash Mantine DataTable", "social_cards_enabled": true, "social_cards_image": null, "social_cards_twitter_card": null, "social_cards_twitter_site": null} \ No newline at end of file diff --git a/great-docs/_object_types.json b/great-docs/_object_types.json new file mode 100644 index 0000000..e224cfe --- /dev/null +++ b/great-docs/_object_types.json @@ -0,0 +1,10 @@ +{ + "Column": "function", + "ColumnGroup": "function", + "DataTable.ComponentSingleType": "constant", + "DataTable.ComponentType": "constant", + "DataTable.NumberType": "constant", + "PaginationConfig": "function", + "RowExpansionConfig": "function", + "SelectionConfig": "function" +} \ No newline at end of file diff --git a/great-docs/_package_meta.json b/great-docs/_package_meta.json new file mode 100644 index 0000000..5c89ace --- /dev/null +++ b/great-docs/_package_meta.json @@ -0,0 +1 @@ +{"version": "0.1.0", "published_at": "2026-04-17T11:47:04Z"} \ No newline at end of file diff --git a/great-docs/_quarto.yml b/great-docs/_quarto.yml new file mode 100644 index 0000000..4e5e579 --- /dev/null +++ b/great-docs/_quarto.yml @@ -0,0 +1,181 @@ +project: + type: website + post-render: scripts/post-render.py + resources: + - github-widget.js + - sidebar-filter.js + - sidebar-wrap.js + - sidebar-float.js + - dark-mode-toggle.js + - theme-init.js + - copy-code.js + - tooltips.js + - color-swatch.js + - mermaid-renderer.js + - responsive-tables.js + - video-embed.js + - navbar-widgets.js + - details.js + - copy-page.js + - back-to-top.js + - on-this-page.js + - keyboard-nav.js + - skill.md + - ".well-known/**" + - navbar-style.js + - content-style.js + - assets/** + render: + - "**" + - "!skill.md" + - "!.well-known/**" +format: + html: + theme: + - flatly + - great-docs.scss + toc: true + toc-depth: 2 + toc-title: On this page + code-copy: false + mermaid: + theme: default + shift-heading-level-by: -1 + include-in-header: + - text: "" + - text: "" + - text: "" + - text: "" + include-after-body: + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" + - text: "" +website: + page-navigation: true + title: Dash Mantine DataTable + navbar: + left: + - text: User Guide + href: user-guide/getting-started.qmd + - text: Recipes + href: recipes/index.qmd + - text: Reference + href: reference/index.qmd + right: + - text: "
" + sidebar: + - id: reference + contents: + - text: API Index + href: reference/index.qmd + - section: Component + contents: + - reference/DataTable.qmd + - section: Helper Builders + contents: + - reference/Column.qmd + - reference/ColumnGroup.qmd + - reference/SelectionConfig.qmd + - reference/PaginationConfig.qmd + - reference/RowExpansionConfig.qmd + - id: user-guide + title: User Guide + contents: + - user-guide/getting-started.qmd + - id: recipes + title: Recipes + contents: + - text: Recipes + href: recipes/index.qmd + - text: Basic Formatting + href: recipes/basic-formatting.qmd + - text: Client-side Selection + href: recipes/client-side-selection.qmd + - text: Row Expansion + href: recipes/row-expansion.qmd + - text: Nested Tables + href: recipes/nested-tables.qmd + - text: Async Nested Tables + href: recipes/async-nested-tables.qmd + - text: Server Pagination and Sorting + href: recipes/server-pagination-sorting.qmd + - text: Empty and Loading States + href: recipes/empty-loading-states.qmd + - text: Fixed-height Scrolling + href: recipes/fixed-height-scrolling.qmd + - text: Infinite Scrolling + href: recipes/infinite-scrolling.qmd + - text: Table Properties + href: recipes/table-properties.qmd + - text: Column Properties + href: recipes/column-properties.qmd + - text: Column Filtering + href: recipes/column-filtering.qmd + - text: Column Dragging + href: recipes/column-dragging.qmd + - text: Column Resizing + href: recipes/column-resizing.qmd + - text: Column Grouping + href: recipes/column-grouping.qmd + - text: Row Properties + href: recipes/row-properties.qmd + - text: Row Dragging + href: recipes/row-dragging.qmd + - text: Row IDs + href: recipes/row-ids.qmd + - text: Row and Cell Clicks + href: recipes/row-and-cell-clicks.qmd + - text: Inline Editing + href: recipes/inline-editing.qmd + - text: RTL Support + href: recipes/rtl-support.qmd + - text: Advanced Controls + href: recipes/advanced-controls.qmd + - text: Stock Portfolio + href: recipes/stock-portfolio.qmd + - text: Custom Components + href: recipes/custom-components.qmd + page-footer: + center: Developed by Jeff Gallini.
Site created with Great Docs. +filters: + - output-title + - details +jupyter: python3 +api-reference: + package: dash_mantine_datatable + dir: reference + title: Reference + desc: "The Python API centers on the Dash DataTable component, small dictionary builders for common nested props, and fluent methods for updating table behavior in place." + dynamic: false + parser: numpy + sections: + - title: Component + desc: Main generated Dash component. + contents: + - name: DataTable + members: [] + - title: Helper Builders + desc: Dictionary factories for readable table configuration. + contents: + - Column + - ColumnGroup + - SelectionConfig + - PaginationConfig + - RowExpansionConfig diff --git a/great-docs/_source_links.json b/great-docs/_source_links.json new file mode 100644 index 0000000..e38d4aa --- /dev/null +++ b/great-docs/_source_links.json @@ -0,0 +1,32 @@ +{ + "Column": { + "url": "https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\\__init__.py#L263-L357", + "file": "C:\\Users\\galli\\Documents\\GitHub\\Repositories\\dash-mantine-datatable\\dash_mantine_datatable\\__init__.py", + "start_line": 263, + "end_line": 357 + }, + "ColumnGroup": { + "url": "https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\\__init__.py#L360-L427", + "file": "C:\\Users\\galli\\Documents\\GitHub\\Repositories\\dash-mantine-datatable\\dash_mantine_datatable\\__init__.py", + "start_line": 360, + "end_line": 427 + }, + "SelectionConfig": { + "url": "https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\\__init__.py#L430-L487", + "file": "C:\\Users\\galli\\Documents\\GitHub\\Repositories\\dash-mantine-datatable\\dash_mantine_datatable\\__init__.py", + "start_line": 430, + "end_line": 487 + }, + "PaginationConfig": { + "url": "https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\\__init__.py#L490-L555", + "file": "C:\\Users\\galli\\Documents\\GitHub\\Repositories\\dash-mantine-datatable\\dash_mantine_datatable\\__init__.py", + "start_line": 490, + "end_line": 555 + }, + "RowExpansionConfig": { + "url": "https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\\__init__.py#L558-L597", + "file": "C:\\Users\\galli\\Documents\\GitHub\\Repositories\\dash-mantine-datatable\\dash_mantine_datatable\\__init__.py", + "start_line": 558, + "end_line": 597 + } +} \ No newline at end of file diff --git a/great-docs/api-evolution-demo.json b/great-docs/api-evolution-demo.json new file mode 100644 index 0000000..b517b9e --- /dev/null +++ b/great-docs/api-evolution-demo.json @@ -0,0 +1,54 @@ +{ + "symbol": "build", + "package": "great_docs", + "versions": ["v0.1.0", "v0.3.0", "v0.6.0", "v1.0.0"], + "dates": ["2023-03-10", "2023-06-22", "2023-11-05", "2024-02-14"], + "slots": [ + { + "position": 0, + "cells": [ + {"name": "project_path", "type": "str", "default": null}, + {"name": "project_path", "type": "str | Path", "default": null}, + {"name": "project_path", "type": "str | Path", "default": null}, + {"name": "project_path", "type": "str | Path", "default": "None"} + ] + }, + { + "position": 1, + "cells": [ + {"name": "output_dir", "type": "str", "default": "\"site\""}, + {"name": "output_dir", "type": "Path", "default": "Path(\"site\")"}, + {"name": "watch", "type": "bool", "default": "False"}, + {"name": "watch", "type": "bool", "default": "False"} + ] + }, + { + "position": 2, + "cells": [ + null, + {"name": "watch", "type": "bool", "default": "False"}, + {"name": "output_dir", "type": "Path", "default": "Path(\"site\")"}, + {"name": "output_dir", "type": "Path", "default": "Path(\"_site\")"} + ] + }, + { + "position": 3, + "cells": [ + null, + null, + {"name": "clean", "type": "bool", "default": "True"}, + {"name": "clean", "type": "bool", "default": "True"} + ] + }, + { + "position": 4, + "cells": [ + null, + null, + null, + {"name": "verbose", "type": "bool", "default": "False"} + ] + } + ], + "returns": ["None", "None", "int", "int"] +} diff --git a/great-docs/assets/demo.css b/great-docs/assets/demo.css new file mode 100644 index 0000000..0e4dcae --- /dev/null +++ b/great-docs/assets/demo.css @@ -0,0 +1,8 @@ +.dmdt-row-review td { + letter-spacing: 0.01em; + text-transform: none; +} + +.dmdt-row-review td:first-child { + box-shadow: inset 3px 0 0 var(--mantine-color-orange-5); +} diff --git a/great-docs/assets/examples/client-side-selection.png b/great-docs/assets/examples/client-side-selection.png new file mode 100644 index 0000000..0fb22ff Binary files /dev/null and b/great-docs/assets/examples/client-side-selection.png differ diff --git a/great-docs/assets/examples/column-filtering.png b/great-docs/assets/examples/column-filtering.png new file mode 100644 index 0000000..8992ad9 Binary files /dev/null and b/great-docs/assets/examples/column-filtering.png differ diff --git a/great-docs/assets/examples/hero-basic-formatting.png b/great-docs/assets/examples/hero-basic-formatting.png new file mode 100644 index 0000000..611f422 Binary files /dev/null and b/great-docs/assets/examples/hero-basic-formatting.png differ diff --git a/great-docs/assets/examples/row-dragging.png b/great-docs/assets/examples/row-dragging.png new file mode 100644 index 0000000..205481d Binary files /dev/null and b/great-docs/assets/examples/row-dragging.png differ diff --git a/great-docs/assets/examples/row-expansion.png b/great-docs/assets/examples/row-expansion.png new file mode 100644 index 0000000..924c8ef Binary files /dev/null and b/great-docs/assets/examples/row-expansion.png differ diff --git a/great-docs/assets/examples/server-pagination.png b/great-docs/assets/examples/server-pagination.png new file mode 100644 index 0000000..bd5ce6f Binary files /dev/null and b/great-docs/assets/examples/server-pagination.png differ diff --git a/great-docs/back-to-top.js b/great-docs/back-to-top.js new file mode 100644 index 0000000..0d938c7 --- /dev/null +++ b/great-docs/back-to-top.js @@ -0,0 +1,122 @@ +/** + * Back-to-Top Button for Great Docs + * + * Features: + * - Floating button that appears after scrolling down + * - Smooth scroll animation to page top + * - Respects reduced-motion preferences + * - Positioned to avoid collision with prev/next page navigation + * - Dark mode aware + * - Keyboard accessible + */ + +(function() { + 'use strict'; + + // How far (in pixels) the user must scroll before the button appears + var SCROLL_THRESHOLD = 300; + + /** + * Check if the user prefers reduced motion + */ + function prefersReducedMotion() { + return window.matchMedia('(prefers-reduced-motion: reduce)').matches; + } + + /** + * Create the back-to-top button element + */ + function createButton() { + var btn = document.createElement('button'); + btn.className = 'gd-back-to-top'; + btn.setAttribute('aria-label', 'Back to top'); + btn.setAttribute('title', 'Back to top'); + btn.setAttribute('type', 'button'); + + // Chevron-up SVG icon (Lucide-style, 24×24) + btn.innerHTML = + ''; + + return btn; + } + + /** + * Scroll to the top of the page + */ + function scrollToTop() { + if (prefersReducedMotion()) { + // Instant scroll for reduced-motion preference + window.scrollTo(0, 0); + } else { + window.scrollTo({ top: 0, behavior: 'smooth' }); + } + } + + /** + * Update button visibility based on scroll position + */ + function updateVisibility(btn) { + if (window.scrollY > SCROLL_THRESHOLD) { + btn.classList.add('gd-back-to-top-visible'); + } else { + btn.classList.remove('gd-back-to-top-visible'); + } + } + + /** + * Check if prev/next page navigation is near the viewport bottom + * and adjust button position to avoid overlap + */ + function adjustForPageNav(btn) { + var pageNav = document.querySelector('.page-navigation'); + if (!pageNav) return; + + var navRect = pageNav.getBoundingClientRect(); + var viewportHeight = window.innerHeight; + + // If the page nav is visible in the viewport, shift the button up + if (navRect.top < viewportHeight && navRect.bottom > 0) { + var overlap = viewportHeight - navRect.top + 16; // 16px extra gap + btn.style.bottom = Math.max(overlap, 32) + 'px'; + } else { + btn.style.bottom = ''; + } + } + + /** + * Initialize the back-to-top button + */ + function init() { + var btn = createButton(); + document.body.appendChild(btn); + + btn.addEventListener('click', scrollToTop); + + // Throttle scroll handler for performance + var ticking = false; + window.addEventListener('scroll', function() { + if (!ticking) { + window.requestAnimationFrame(function() { + updateVisibility(btn); + adjustForPageNav(btn); + ticking = false; + }); + ticking = true; + } + }, { passive: true }); + + // Initial state + updateVisibility(btn); + } + + // DOM ready check + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})(); diff --git a/great-docs/color-swatch.js b/great-docs/color-swatch.js new file mode 100644 index 0000000..a035643 --- /dev/null +++ b/great-docs/color-swatch.js @@ -0,0 +1,186 @@ +/** + * Color Swatch Extension for Great Docs + * + * Handles Tippy.js tooltips, click-to-copy with feedback overlay, + * and tooltip copy buttons for the color-swatch shortcode. + */ +(function () { + "use strict"; + + var containers = document.querySelectorAll(".gd-color-swatch"); + if (!containers.length) return; + + // Check icon SVG for copy feedback overlay + var checkSvg = + ''; + + /** + * Copy text to clipboard with fallback for non-HTTPS contexts. + */ + function copyToClipboard(text) { + if (navigator.clipboard && navigator.clipboard.writeText) { + return navigator.clipboard.writeText(text); + } + // Fallback: hidden textarea + execCommand + return new Promise(function (resolve, reject) { + var ta = document.createElement("textarea"); + ta.value = text; + ta.style.position = "fixed"; + ta.style.left = "-9999px"; + ta.style.opacity = "0"; + document.body.appendChild(ta); + ta.select(); + try { + document.execCommand("copy"); + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(ta); + } + }); + } + + /** + * Show a brief checkmark overlay on a swatch element after copying. + */ + function showCopyFeedback(el) { + var overlay = document.createElement("div"); + overlay.className = "gd-swatch-copy-overlay"; + overlay.innerHTML = checkSvg; + el.appendChild(overlay); + + // Announce for screen readers + var liveRegion = document.getElementById("gd-cs-live"); + if (liveRegion) { + liveRegion.textContent = "Copied"; + } + + requestAnimationFrame(function () { + overlay.style.opacity = "1"; + setTimeout(function () { + overlay.style.opacity = "0"; + setTimeout(function () { + overlay.remove(); + }, 300); + }, 700); + }); + } + + /** + * Get the hex value to copy from a swatch element. + */ + function getHexFromEl(el) { + return ( + el.getAttribute("data-hex") || + el.querySelector("[data-hex]")?.getAttribute("data-hex") || + "" + ); + } + + /** + * Handle click-to-copy on a swatch. + */ + function handleSwatchClick(e) { + var el = e.currentTarget; + var hex = getHexFromEl(el); + if (!hex) return; + + // Find the color fill element for the overlay + var colorEl = el.classList.contains("gd-swatch-color") + ? el + : el.querySelector(".gd-swatch-color") || el; + + copyToClipboard(hex).then(function () { + showCopyFeedback(colorEl); + }); + } + + /** + * Handle keyboard activation (Enter/Space). + */ + function handleSwatchKeydown(e) { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + handleSwatchClick(e); + } + } + + /** + * Initialize tooltips on elements with data-tooltip-html. + */ + function initTooltips(container) { + if (typeof tippy === "undefined") return; + + var els = container.querySelectorAll("[data-tooltip-html]"); + els.forEach(function (el) { + var content = el.getAttribute("data-tooltip-html"); + if (!content) return; + + tippy(el, { + content: content, + allowHTML: true, + placement: "top", + delay: [150, 100], + interactive: true, + appendTo: document.body, + maxWidth: 320, + onShown: function (instance) { + // Attach copy handlers to tooltip copy buttons + var btns = instance.popper.querySelectorAll(".gd-cs-tooltip-copy"); + btns.forEach(function (btn) { + btn.addEventListener("click", function (e) { + e.stopPropagation(); + var hex = btn.getAttribute("data-hex"); + if (hex) { + copyToClipboard(hex).then(function () { + btn.textContent = "\u2713"; + setTimeout(function () { + btn.innerHTML = "📋"; + }, 1000); + }); + } + }); + }); + }, + }); + }); + } + + /** + * Initialize a single color-swatch container. + */ + function initContainer(container) { + // Circle swatches — click on the wrapper (.gd-swatch) + var swatches = container.querySelectorAll(".gd-swatch"); + swatches.forEach(function (el) { + el.addEventListener("click", handleSwatchClick); + el.addEventListener("keydown", handleSwatchKeydown); + }); + + // Rectangle swatches — click on the strip (.gd-swatch-rect) + var rects = container.querySelectorAll(".gd-swatch-rect"); + rects.forEach(function (el) { + el.addEventListener("click", handleSwatchClick); + el.addEventListener("keydown", handleSwatchKeydown); + }); + + // Tooltips (attach to color fills and rects) + initTooltips(container); + } + + // Create a live region for screen reader announcements + if (!document.getElementById("gd-cs-live")) { + var live = document.createElement("div"); + live.id = "gd-cs-live"; + live.setAttribute("aria-live", "polite"); + live.setAttribute("aria-atomic", "true"); + live.className = "visually-hidden"; + document.body.appendChild(live); + } + + // Initialize all containers + containers.forEach(initContainer); +})(); diff --git a/great-docs/content-style.js b/great-docs/content-style.js new file mode 100644 index 0000000..947ceda --- /dev/null +++ b/great-docs/content-style.js @@ -0,0 +1,45 @@ +/** + * Content Area Gradient Style for Great Docs + * + * Reads the gd-content-style meta tag and applies a subtle radial + * gradient glow at the top of the main content area using the + * corresponding gradient preset colours. + */ +(function () { + "use strict"; + + var meta = document.querySelector('meta[name="gd-content-style"]'); + if (!meta) return; + + var preset = meta.getAttribute("data-preset") || ""; + if (!preset) return; + + var pages = meta.getAttribute("data-pages") || "all"; + + if (pages === "homepage") { + // Normalize: strip trailing /index.html or trailing / + var path = window.location.pathname + .replace(/\/index\.html$/i, "/") + .replace(/\/+$/, ""); + // The homepage is the site root. For GitHub Pages deployed at /repo-name/, + // the root has exactly one segment (e.g., "/great-docs"). For custom + // domains it's "" (empty after stripping "/"). Any deeper path means + // we're on a subpage. + var segments = path.split("/").filter(Boolean); + if (segments.length > 1) { + return; + } + } + + var content = document.getElementById("quarto-content"); + if (content) { + var glow = document.createElement("div"); + glow.className = "gd-content-glow gd-content-glow-" + preset; + for (var i = 1; i <= 3; i++) { + var pulse = document.createElement("div"); + pulse.className = "gd-glow-pulse gd-glow-pulse-" + i; + glow.appendChild(pulse); + } + document.body.appendChild(glow); + } +})(); diff --git a/great-docs/contributing.qmd b/great-docs/contributing.qmd new file mode 100644 index 0000000..874e88b --- /dev/null +++ b/great-docs/contributing.qmd @@ -0,0 +1,71 @@ +--- +title: "Contributing" +--- + +## Local setup + +```powershell +npm install --legacy-peer-deps +python -m pip install -r requirements.txt -r tests/requirements.txt +``` + +## Common tasks + +```powershell +npm run build:js +npm run build:backends +python -m pytest +python usage.py +``` + +## Branch workflow + +- Create feature branches from `staging`. +- Open contributor pull requests into `staging`. +- When `staging` is ready to ship, open a release pull request from `staging` + into `main`. + +## Release preparation + +Before opening the `staging -> main` release PR: + +- Add release notes under `## Unreleased` in `CHANGELOG.md`. +- Decide the next version and put it in the PR title as + `vX.Y.Z Release - Summary`. +- Run the release check locally if you want a preflight build/test/package + pass. + +```powershell +.\scripts\check-release.ps1 +``` + +```bash +python scripts/check_release.py +``` + +## Automated publishing + +Release pull requests into `main` must come from `staging` and must be titled +`vX.Y.Z Release`, optionally followed by ` - Summary`. + +The `Release PR Guard` workflow checks that: + +- the PR is `staging -> main` +- the title format is valid +- the requested version is newer than the current package version + +After a valid release PR is merged, `.github/workflows/publish-release.yml` +will: + +- write the requested release version into the package metadata files +- convert `CHANGELOG.md` into the final versioned release notes +- commit those release metadata updates back to `main` +- rebuild, test, publish to PyPI, and create or update the GitHub release + +## One-time maintainer setup + +- Create the `staging` branch on GitHub. +- Protect `main` and require the `Release PR Guard` check. +- Add a `PYPI_API_TOKEN` secret to the `pypi` environment. + + diff --git a/great-docs/copy-code.js b/great-docs/copy-code.js new file mode 100644 index 0000000..d8c68fb --- /dev/null +++ b/great-docs/copy-code.js @@ -0,0 +1,176 @@ +/** + * Custom copy-code button for Great Docs + * + * Replaces Quarto's default code-copy with a consistent top-right button + * that floats properly and works in both light and dark modes. + * + * Handles: + * - Buttons injected by post-render.py (.gd-code-copy inside .gd-code-nav) + * - Quarto-native code blocks (pre.code-with-copy) that lack a custom button + */ +(function () { + "use strict"; + + // i18n helper — read translations from + var _i18nCache = null; + function _gdT(key, fallback) { + if (!_i18nCache) { + try { + var meta = document.querySelector('meta[name="gd-i18n"]'); + _i18nCache = meta ? JSON.parse(meta.getAttribute('content')) : {}; + } catch (e) { _i18nCache = {}; } + } + return _i18nCache[key] || fallback; + } + + // Inline SVG icons — no external dependency + var COPY_ICON = + '' + + '' + + '' + + ""; + + var CHECK_ICON = + '' + + '' + + ""; + + /** + * Walk up from the button to find the element whose text to copy. + */ + function getCodeText(button) { + var scaffold = button.closest(".code-copy-outer-scaffold"); + if (scaffold) { + var code = scaffold.querySelector("pre > code"); + if (code) return code.textContent; + } + // Fallback: walk up to the nav, then find sibling pre > code + var nav = button.closest(".gd-code-nav"); + if (nav) { + var container = nav.parentElement; + if (container) { + var code = container.querySelector("pre > code"); + if (code) return code.textContent; + } + } + return ""; + } + + /** + * Copy handler with visual feedback. + */ + function handleCopy(event) { + var button = event.currentTarget; + var text = getCodeText(button); + if (!text) return; + + navigator.clipboard.writeText(text).then(function () { + button.innerHTML = CHECK_ICON; + button.classList.add("gd-code-copied"); + button.setAttribute("title", _gdT("copied", "Copied!")); + + setTimeout(function () { + button.innerHTML = COPY_ICON; + button.classList.remove("gd-code-copied"); + button.setAttribute("title", _gdT("copy_to_clipboard", "Copy to clipboard")); + }, 2000); + }); + } + + /** + * Create a gd-code-nav + gd-code-copy button element. + */ + function createCopyButton() { + var nav = document.createElement("nav"); + nav.className = "gd-code-nav"; + var btn = document.createElement("button"); + btn.className = "gd-code-copy"; + btn.title = _gdT("copy_to_clipboard", "Copy to clipboard"); + btn.innerHTML = COPY_ICON; + btn.addEventListener("click", handleCopy); + nav.appendChild(btn); + return nav; + } + + /** + * Replace any leftover Quarto-native .code-copy-button with our component. + */ + function replaceQuartoButtons() { + document + .querySelectorAll("button.code-copy-button") + .forEach(function (oldBtn) { + var nav = createCopyButton(); + + // The Quarto button lives inside a wrapper div; insert the nav there + var parent = oldBtn.parentElement; + if (parent) { + parent.insertBefore(nav, oldBtn); + parent.removeChild(oldBtn); + // Ensure the wrapper acts as a positioning anchor + parent.style.position = "relative"; + } + }); + } + + /** + * Inject a copy button into any code block that doesn't already have one. + * Targets
wrappers and Quarto
 blocks.
+   */
+  function injectMissingButtons() {
+    // Find all 
that aren't inside a scaffold + document.querySelectorAll("div.sourceCode").forEach(function (div) { + // Skip if already inside a scaffold with a button + if (div.closest(".code-copy-outer-scaffold")) return; + // Skip if already has a gd-code-nav + if (div.querySelector(".gd-code-nav")) return; + + var code = div.querySelector("pre > code"); + if (!code) return; + + div.style.position = "relative"; + div.prepend(createCopyButton()); + }); + + // Also catch standalone
 not inside a div.sourceCode
+    document.querySelectorAll("pre.sourceCode").forEach(function (pre) {
+      var parent = pre.parentElement;
+      // Skip if already handled
+      if (parent && parent.classList.contains("sourceCode")) return;
+      if (parent && parent.querySelector(".gd-code-nav")) return;
+      if (pre.closest(".code-copy-outer-scaffold")) return;
+
+      var code = pre.querySelector("code");
+      if (!code) return;
+
+      // Wrap in a relative container
+      if (parent) {
+        parent.style.position = "relative";
+        parent.insertBefore(createCopyButton(), pre);
+      }
+    });
+  }
+
+  function init() {
+    // 1. Wire up buttons that post-render.py already injected
+    document.querySelectorAll(".gd-code-copy").forEach(function (btn) {
+      btn.innerHTML = COPY_ICON;
+      btn.addEventListener("click", handleCopy);
+    });
+
+    // 2. Convert any remaining Quarto-native copy buttons
+    replaceQuartoButtons();
+
+    // 3. Inject buttons into code blocks that have none
+    injectMissingButtons();
+  }
+
+  if (document.readyState === "loading") {
+    document.addEventListener("DOMContentLoaded", init);
+  } else {
+    init();
+  }
+})();
diff --git a/great-docs/copy-page.js b/great-docs/copy-page.js
new file mode 100644
index 0000000..8120cda
--- /dev/null
+++ b/great-docs/copy-page.js
@@ -0,0 +1,149 @@
+/**
+ * Copy Page Widget for Great Docs
+ *
+ * Provides two actions:
+ * - "Copy as Markdown" — copies the page's .md content to clipboard
+ * - "View as Markdown" — navigates to the .md version of the page
+ *
+ * The .md files are generated alongside .html files by the post-render script.
+ */
+
+(function() {
+    'use strict';
+
+    /**
+     * Look up a translated string from the gd-i18n meta tag.
+     */
+    var _i18nCache = null;
+    function _gdT(key, fallback) {
+        if (!_i18nCache) {
+            try {
+                var meta = document.querySelector('meta[name="gd-i18n"]');
+                _i18nCache = meta ? JSON.parse(meta.getAttribute('content')) : {};
+            } catch (e) { _i18nCache = {}; }
+        }
+        return _i18nCache[key] || fallback;
+    }
+
+    /**
+     * Derive the .md URL from the current page URL.
+     * e.g., /reference/GreatDocs.html -> /reference/GreatDocs.md
+     *       /user-guide/quickstart.html -> /user-guide/quickstart.md
+     */
+    function getMdUrl() {
+        var path = window.location.pathname;
+        // Replace .html with .md
+        if (path.endsWith('.html')) {
+            return path.slice(0, -5) + '.md';
+        }
+        // For paths ending in / (index pages), try index.md
+        if (path.endsWith('/')) {
+            return path + 'index.md';
+        }
+        return path + '.md';
+    }
+
+    /**
+     * Create and inject the copy-page widget.
+     */
+    function initCopyPage() {
+        // Find the title block header to position the button
+        var titleBlock = document.getElementById('title-block-header');
+        if (!titleBlock) return;
+
+        // Skip the Skills page (has its own layout)
+        if (document.querySelector('.gd-skills-install')) return;
+
+        // Skip the License page (has its own layout)
+        if (document.body.classList.contains('gd-license-page')) return;
+
+        // Skip the Tags index page
+        if (document.body.classList.contains('gd-tags-index')) return;
+
+        // Skip the Blog index page
+        if (document.body.classList.contains('gd-blog-index')) return;
+
+        // Create the widget container
+        var widget = document.createElement('div');
+        widget.className = 'gd-copy-page';
+        widget.setAttribute('role', 'group');
+        widget.setAttribute('aria-label', _gdT('page_actions', 'Page actions'));
+
+        // Copy as Markdown button
+        var copyBtn = document.createElement('button');
+        copyBtn.className = 'gd-copy-page-btn gd-copy-md-btn';
+        copyBtn.setAttribute('title', _gdT('copy_page_as_markdown', 'Copy page as Markdown'));
+        copyBtn.setAttribute('aria-label', _gdT('copy_page_as_markdown', 'Copy page as Markdown'));
+        copyBtn.innerHTML =
+            '' +
+            '' + _gdT('copy_page', 'Copy page') + '';
+
+        // View as Markdown link
+        var viewLink = document.createElement('a');
+        viewLink.className = 'gd-copy-page-btn gd-view-md-btn';
+        viewLink.href = getMdUrl();
+        viewLink.setAttribute('title', _gdT('view_as_markdown', 'View as Markdown'));
+        viewLink.setAttribute('aria-label', _gdT('view_page_as_markdown', 'View page as Markdown'));
+        viewLink.innerHTML =
+            '';
+
+        widget.appendChild(copyBtn);
+        widget.appendChild(viewLink);
+
+        // Insert before the title block
+        titleBlock.parentNode.insertBefore(widget, titleBlock);
+
+        // Pre-fetch the .md content so the clipboard write can happen
+        // synchronously inside the click handler (preserving user activation).
+        var mdUrl = getMdUrl();
+        var cachedMd = null;
+
+        fetch(mdUrl)
+            .then(function(response) {
+                if (!response.ok) throw new Error('not found');
+                return response.text();
+            })
+            .then(function(text) { cachedMd = text; })
+            .catch(function() { /* will show error on click */ });
+
+        // Copy handler — writes from cache so clipboard API gets user activation
+        copyBtn.addEventListener('click', function() {
+            var label = copyBtn.querySelector('.gd-copy-page-label');
+            var origText = label.textContent;
+
+            if (!cachedMd) {
+                    label.textContent = _gdT('error', 'Error');
+                setTimeout(function() { label.textContent = origText; }, 2000);
+                return;
+            }
+
+            navigator.clipboard.writeText(cachedMd)
+                .then(function() {
+                    label.textContent = _gdT('copied', 'Copied!');
+                    copyBtn.classList.add('gd-copy-success');
+                    setTimeout(function() {
+                        label.textContent = origText;
+                        copyBtn.classList.remove('gd-copy-success');
+                    }, 2000);
+                })
+                .catch(function(err) {
+                    console.warn('Copy page failed:', err);
+                    label.textContent = _gdT('error', 'Error');
+                    setTimeout(function() { label.textContent = origText; }, 2000);
+                });
+        });
+    }
+
+    // Initialize when DOM is ready
+    if (document.readyState === 'loading') {
+        document.addEventListener('DOMContentLoaded', initCopyPage);
+    } else {
+        initCopyPage();
+    }
+})();
diff --git a/great-docs/dark-mode-toggle.js b/great-docs/dark-mode-toggle.js
new file mode 100644
index 0000000..62ede84
--- /dev/null
+++ b/great-docs/dark-mode-toggle.js
@@ -0,0 +1,321 @@
+/**
+ * Dark Mode Toggle for Great Docs
+ *
+ * Features:
+ * - Toggle switch in the navbar
+ * - System preference detection
+ * - Persistent preference storage
+ * - Smooth transitions
+ */
+
+(function() {
+    'use strict';
+
+    // i18n helper — read translations from 
+    var _i18nCache = null;
+    function _gdT(key, fallback) {
+        if (!_i18nCache) {
+            try {
+                var meta = document.querySelector('meta[name="gd-i18n"]');
+                _i18nCache = meta ? JSON.parse(meta.getAttribute('content')) : {};
+            } catch (e) { _i18nCache = {}; }
+        }
+        return _i18nCache[key] || fallback;
+    }
+
+    const STORAGE_KEY = 'great-docs-theme';
+    const DARK_CLASS = 'quarto-dark';
+    const LIGHT_CLASS = 'quarto-light';
+
+    /**
+     * Get the user's system color scheme preference
+     */
+    function getSystemPreference() {
+        if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
+            return 'dark';
+        }
+        return 'light';
+    }
+
+    /**
+     * Get the stored theme preference
+     */
+    function getStoredPreference() {
+        try {
+            return localStorage.getItem(STORAGE_KEY);
+        } catch (e) {
+            return null;
+        }
+    }
+
+    /**
+     * Store the theme preference
+     */
+    function setStoredPreference(theme) {
+        try {
+            localStorage.setItem(STORAGE_KEY, theme);
+        } catch (e) {
+            // localStorage not available
+        }
+    }
+
+    /**
+     * Get the current effective theme
+     */
+    function getCurrentTheme() {
+        const stored = getStoredPreference();
+        if (stored === 'dark' || stored === 'light') {
+            return stored;
+        }
+        return getSystemPreference();
+    }
+
+    /**
+     * Apply the theme to the document
+     */
+    function applyTheme(theme) {
+        const html = document.documentElement;
+        const body = document.body;
+
+        if (theme === 'dark') {
+            html.classList.add(DARK_CLASS);
+            html.classList.remove(LIGHT_CLASS);
+            body.classList.add(DARK_CLASS);
+            body.classList.remove(LIGHT_CLASS);
+            html.setAttribute('data-bs-theme', 'dark');
+        } else {
+            html.classList.add(LIGHT_CLASS);
+            html.classList.remove(DARK_CLASS);
+            body.classList.add(LIGHT_CLASS);
+            body.classList.remove(DARK_CLASS);
+            html.setAttribute('data-bs-theme', 'light');
+        }
+
+        // Update toggle button state
+        updateToggleButton(theme);
+    }
+
+    /**
+     * Update the toggle button appearance
+     */
+    function updateToggleButton(theme) {
+        const toggle = document.getElementById('dark-mode-toggle');
+        if (!toggle) return;
+
+        const sunIcon = toggle.querySelector('.theme-icon-light');
+        const moonIcon = toggle.querySelector('.theme-icon-dark');
+        const newTooltip = theme === 'dark'
+            ? _gdT('switch_to_light_mode', 'Switch to light mode')
+            : _gdT('switch_to_dark_mode', 'Switch to dark mode');
+
+        if (theme === 'dark') {
+            toggle.setAttribute('aria-pressed', 'true');
+            if (sunIcon) sunIcon.style.display = 'none';
+            if (moonIcon) moonIcon.style.display = 'inline-block';
+        } else {
+            toggle.setAttribute('aria-pressed', 'false');
+            if (sunIcon) sunIcon.style.display = 'inline-block';
+            if (moonIcon) moonIcon.style.display = 'none';
+        }
+
+        // Update tooltip: use data-tippy-content to keep Tippy in sync
+        // and avoid native browser tooltips (which appear after delay)
+        toggle.setAttribute('data-tippy-content', newTooltip);
+        toggle.removeAttribute('title');
+
+        // Update existing Tippy instance content directly if present
+        if (toggle._tippy) {
+            toggle._tippy.setContent(newTooltip);
+        }
+    }
+
+    /**
+     * Toggle between light and dark themes
+     */
+    function toggleTheme() {
+        const current = getCurrentTheme();
+        const newTheme = current === 'dark' ? 'light' : 'dark';
+        setStoredPreference(newTheme);
+        applyTheme(newTheme);
+    }
+
+    /**
+     * Create the toggle button HTML
+     */
+    function createToggleButton() {
+        const container = document.createElement('div');
+        container.id = 'dark-mode-toggle-container';
+        container.innerHTML = `
+            
+        `;
+        return container;
+    }
+
+    /**
+     * Insert the toggle button into the navbar
+     */
+    function insertToggleButton() {
+        // Insert into navbarCollapse; navbar-widgets.js will collect it
+        // into the unified #gd-navbar-widgets container.
+        const collapse = document.getElementById('navbarCollapse');
+        if (!collapse) return;
+
+        const toggleContainer = createToggleButton();
+        const navItem = document.createElement('li');
+        navItem.className = 'nav-item';
+        navItem.appendChild(toggleContainer);
+
+        // Append to navbarCollapse (the collector will move it)
+        var msAuto = collapse.querySelector('.navbar-nav.ms-auto');
+        if (msAuto) {
+            msAuto.insertBefore(navItem, msAuto.firstChild);
+        } else {
+            collapse.appendChild(navItem);
+        }
+
+        // Add click handler
+        const toggle = document.getElementById('dark-mode-toggle');
+        if (toggle) {
+            toggle.addEventListener('click', toggleTheme);
+        }
+    }
+
+    /**
+     * Listen for system preference changes
+     */
+    function setupSystemPreferenceListener() {
+        if (!window.matchMedia) return;
+
+        const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
+
+        mediaQuery.addEventListener('change', (e) => {
+            // Only respond to system changes if user hasn't set a preference
+            const stored = getStoredPreference();
+            if (!stored) {
+                applyTheme(e.matches ? 'dark' : 'light');
+            }
+        });
+    }
+
+    /**
+     * Apply theme immediately to prevent flash
+     */
+    function applyInitialTheme() {
+        const theme = getCurrentTheme();
+
+        // Apply to html element immediately (before body is available)
+        const html = document.documentElement;
+        if (theme === 'dark') {
+            html.classList.add(DARK_CLASS);
+            html.classList.remove(LIGHT_CLASS);
+            html.setAttribute('data-bs-theme', 'dark');
+        } else {
+            html.classList.add(LIGHT_CLASS);
+            html.classList.remove(DARK_CLASS);
+            html.setAttribute('data-bs-theme', 'light');
+        }
+    }
+
+    /**
+     * Fix the navbar dark-logo src from a  tag.
+     * Quarto's logo-dark config is ignored without a paired dark theme,
+     * so both .light-content and .dark-content imgs point to the same file.
+     * We read the correct dark logo path from 
+     * and patch the src at runtime.
+     */
+    function fixNavbarDarkLogo() {
+        var meta = document.querySelector('meta[name="gd-logo-dark"]');
+        if (!meta) return;
+        var darkFilename = meta.getAttribute('content');
+        if (!darkFilename) return;
+
+        // Resolve the dark logo path relative to the light logo's directory,
+        // so sub-pages (e.g. user-guide/page.html) get the correct "../" prefix.
+        var lightImg = document.querySelector('.navbar-logo.light-content');
+        var darkSrc = darkFilename;
+        if (lightImg && lightImg.getAttribute('src')) {
+            var lightSrc = lightImg.getAttribute('src');
+            var lastSlash = lightSrc.lastIndexOf('/');
+            if (lastSlash >= 0) {
+                darkSrc = lightSrc.substring(0, lastSlash + 1) + darkFilename;
+            }
+        }
+
+        document.querySelectorAll('.navbar-logo.dark-content').forEach(function(img) {
+            img.src = darkSrc;
+        });
+    }
+
+    /**
+     * Initialize dark mode functionality
+     */
+    function init() {
+        // Fix navbar dark logo src before applying theme
+        fixNavbarDarkLogo();
+
+        // Apply theme to body now that DOM is ready
+        const theme = getCurrentTheme();
+        applyTheme(theme);
+
+        // Insert toggle button
+        insertToggleButton();
+
+        // Update toggle button to reflect current theme (must be after insertion)
+        updateToggleButton(theme);
+
+        // Setup system preference listener
+        setupSystemPreferenceListener();
+    }
+
+    // Apply initial theme immediately to prevent flash of wrong theme
+    applyInitialTheme();
+
+    // Initialize when DOM is ready
+    if (document.readyState === 'loading') {
+        document.addEventListener('DOMContentLoaded', init);
+    } else {
+        init();
+    }
+
+    // Expose API for external use
+    window.greatDocsDarkMode = {
+        toggle: toggleTheme,
+        setTheme: function(theme) {
+            if (theme === 'dark' || theme === 'light') {
+                setStoredPreference(theme);
+                applyTheme(theme);
+            }
+        },
+        getTheme: getCurrentTheme,
+        clearPreference: function() {
+            try {
+                localStorage.removeItem(STORAGE_KEY);
+            } catch (e) {}
+            applyTheme(getSystemPreference());
+        }
+    };
+})();
diff --git a/great-docs/details.js b/great-docs/details.js
new file mode 100644
index 0000000..6e109e3
--- /dev/null
+++ b/great-docs/details.js
@@ -0,0 +1,198 @@
+/**
+ * Great Docs — Collapsible Details
+ *
+ * Provides smooth expand/collapse animation and accordion-group behavior
+ * for 
elements produced by the {{< details >}} + * shortcode. + * + * Features: + * - Smooth height animation on toggle (respects prefers-reduced-motion) + * - Accordion groups: elements sharing the same data-gd-group attribute + * close siblings when one opens + * - Works with nested details elements + */ +(function () { + "use strict"; + + // ── Feature detection ────────────────────────────────────────────── + var reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)"); + + // ── Animation helpers ────────────────────────────────────────────── + + /** + * Animate the opening of a
element. + * @param {HTMLDetailsElement} el + */ + function animateOpen(el) { + var body = el.querySelector(".gd-details-body"); + if (!body) return; + + // Force the element open so we can measure the target height + el.open = true; + + // Measure current (collapsed) and target (expanded) heights + var summary = el.querySelector("summary"); + var startHeight = summary ? summary.offsetHeight : 0; + var endHeight = el.scrollHeight; + + // If reduced motion is preferred, skip animation + if (reducedMotion.matches) { + el.style.height = ""; + el.style.overflow = ""; + el.classList.add("gd-details--open"); + return; + } + + el.style.height = startHeight + "px"; + el.style.overflow = "hidden"; + + // Force reflow + void el.offsetHeight; + + el.classList.add("gd-details--animating"); + el.style.height = endHeight + "px"; + + function onEnd() { + el.removeEventListener("transitionend", onEnd); + el.classList.remove("gd-details--animating"); + el.classList.add("gd-details--open"); + el.style.height = ""; + el.style.overflow = ""; + } + el.addEventListener("transitionend", onEnd); + } + + /** + * Animate the closing of a
element. + * @param {HTMLDetailsElement} el + */ + function animateClose(el) { + var body = el.querySelector(".gd-details-body"); + if (!body) return; + + // If reduced motion is preferred, just close immediately + if (reducedMotion.matches) { + el.classList.remove("gd-details--open"); + el.open = false; + return; + } + + var startHeight = el.scrollHeight; + var summary = el.querySelector("summary"); + var endHeight = summary ? summary.offsetHeight : 0; + + el.style.height = startHeight + "px"; + el.style.overflow = "hidden"; + + // Force reflow + void el.offsetHeight; + + el.classList.add("gd-details--animating"); + el.classList.remove("gd-details--open"); + el.style.height = endHeight + "px"; + + function onEnd() { + el.removeEventListener("transitionend", onEnd); + el.classList.remove("gd-details--animating"); + el.open = false; + el.style.height = ""; + el.style.overflow = ""; + } + el.addEventListener("transitionend", onEnd); + } + + // ── Accordion logic ──────────────────────────────────────────────── + + /** + * Close all other details in the same accordion group. + * @param {HTMLDetailsElement} current - The details element being opened + * @param {string} group - The accordion group name + */ + function closeGroupSiblings(current, group) { + var siblings = document.querySelectorAll( + 'details.gd-details[data-gd-group="' + group + '"]' + ); + for (var i = 0; i < siblings.length; i++) { + if (siblings[i] !== current && siblings[i].open) { + animateClose(siblings[i]); + } + } + } + + // ── Event binding ────────────────────────────────────────────────── + + /** + * Attach click handlers to all .gd-details elements. + */ + function initDetails() { + var elements = document.querySelectorAll("details.gd-details"); + + for (var i = 0; i < elements.length; i++) { + (function (el) { + // Mark initially-open elements + if (el.open) { + el.classList.add("gd-details--open"); + } + + var summary = el.querySelector("summary"); + if (!summary) return; + + summary.addEventListener("click", function (e) { + e.preventDefault(); + + if (el.open) { + // Currently open → close it + animateClose(el); + } else { + // Currently closed → open it + var group = el.getAttribute("data-gd-group"); + if (group) { + closeGroupSiblings(el, group); + } + animateOpen(el); + } + }); + })(elements[i]); + } + } + + // ── Gleam animation (JS-driven) ───────────────────────────────────── + + /** + * Animate the --gd-gleam-angle custom property via requestAnimationFrame. + * This avoids reliance on @property (inconsistent cross-browser). + */ + function initGleam() { + var gleamEls = document.querySelectorAll(".gd-details--gleam"); + if (!gleamEls.length) return; + if (reducedMotion.matches) return; + + var duration = 6000; // ms for a full 360° sweep + var start = null; + + function tick(timestamp) { + if (!start) start = timestamp; + var elapsed = (timestamp - start) % duration; + var angle = (elapsed / duration) * 360; + var value = angle + "deg"; + + for (var i = 0; i < gleamEls.length; i++) { + gleamEls[i].style.setProperty("--gd-gleam-angle", value); + } + requestAnimationFrame(tick); + } + + requestAnimationFrame(tick); + } + + // ── Initialize ───────────────────────────────────────────────────── + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", function () { + initDetails(); + initGleam(); + }); + } else { + initDetails(); + initGleam(); + } +})(); diff --git a/great-docs/github-widget.js b/great-docs/github-widget.js new file mode 100644 index 0000000..0cf1c0f --- /dev/null +++ b/great-docs/github-widget.js @@ -0,0 +1,313 @@ +/** + * GitHub Widget for Great-Docs + * + * A souped-up GitHub icon link with: + * - Live star and fork counts + * - Dropdown menu linking to repo, issues, PRs + * - Caching to avoid API rate limits + */ + +(function() { + 'use strict'; + + // Configuration - will be set by data attributes + let config = { + owner: null, + repo: null, + cacheKey: 'great-docs-github-stats', + cacheDuration: 5 * 60 * 1000 // 5 minutes + }; + + /** + * Initialize the GitHub widget + */ + function initGitHubWidget() { + const widget = document.getElementById('github-widget'); + if (!widget) return; + + config.owner = widget.dataset.owner; + config.repo = widget.dataset.repo; + + if (!config.owner || !config.repo) { + console.warn('GitHub widget: Missing owner or repo data attributes'); + return; + } + + // Create the widget structure + createWidgetStructure(widget); + + // Fetch and display stats + fetchGitHubStats(); + + // Setup dropdown behavior + setupDropdown(widget); + } + + /** + * Create the HTML structure for the widget + */ + function createWidgetStructure(container) { + const repoUrl = `https://github.com/${config.owner}/${config.repo}`; + + container.innerHTML = ` + + + `; + } + + /** + * Fetch GitHub stats from API with caching + */ + async function fetchGitHubStats() { + const cacheKey = `${config.cacheKey}-${config.owner}-${config.repo}`; + + // Check cache first + const cached = getFromCache(cacheKey); + if (cached) { + updateStatsDisplay(cached); + return; + } + + try { + // Fetch repo stats + const repoResponse = await fetch( + `https://api.github.com/repos/${config.owner}/${config.repo}`, + { headers: { 'Accept': 'application/vnd.github.v3+json' } } + ); + + if (!repoResponse.ok) { + throw new Error(`GitHub API error: ${repoResponse.status}`); + } + + const repoData = await repoResponse.json(); + + const stats = { + stars: repoData.stargazers_count, + forks: repoData.forks_count, + openIssues: repoData.open_issues_count, // This includes PRs + timestamp: Date.now() + }; + + // Try to get separate issue and PR counts (optional, may hit rate limits) + try { + const [issuesResponse, prsResponse] = await Promise.all([ + fetch(`https://api.github.com/search/issues?q=repo:${config.owner}/${config.repo}+type:issue+state:open`, { + headers: { 'Accept': 'application/vnd.github.v3+json' } + }), + fetch(`https://api.github.com/search/issues?q=repo:${config.owner}/${config.repo}+type:pr+state:open`, { + headers: { 'Accept': 'application/vnd.github.v3+json' } + }) + ]); + + if (issuesResponse.ok && prsResponse.ok) { + const issuesData = await issuesResponse.json(); + const prsData = await prsResponse.json(); + stats.issues = issuesData.total_count; + stats.prs = prsData.total_count; + } + } catch (e) { + // Silently fail - we'll just not show separate counts + } + + // Cache the results + saveToCache(cacheKey, stats); + + // Update display + updateStatsDisplay(stats); + + } catch (error) { + console.warn('GitHub widget: Failed to fetch stats', error); + // Show fallback + updateStatsDisplay({ stars: '?', forks: '?' }); + } + } + + /** + * Update the display with fetched stats + */ + function updateStatsDisplay(stats) { + const starsEl = document.querySelector('.gh-count[data-stat="stars"]'); + const forksEl = document.querySelector('.gh-count[data-stat="forks"]'); + const issuesBadge = document.querySelector('.gh-issues-count'); + const prsBadge = document.querySelector('.gh-prs-count'); + const starsTotalBadge = document.querySelector('.gh-stars-total'); + const forksTotalBadge = document.querySelector('.gh-forks-total'); + + if (starsEl) starsEl.textContent = formatCount(stats.stars); + if (forksEl) forksEl.textContent = formatCount(stats.forks); + + if (issuesBadge && stats.issues !== undefined) { + issuesBadge.textContent = formatCount(stats.issues); + issuesBadge.style.display = 'inline-flex'; + } + + if (prsBadge && stats.prs !== undefined) { + prsBadge.textContent = formatCount(stats.prs); + prsBadge.style.display = 'inline-flex'; + } + + if (starsTotalBadge && stats.stars !== undefined && stats.stars !== '?') { + starsTotalBadge.textContent = formatCount(stats.stars); + starsTotalBadge.style.display = 'inline-flex'; + } + + if (forksTotalBadge && stats.forks !== undefined && stats.forks !== '?') { + forksTotalBadge.textContent = formatCount(stats.forks); + forksTotalBadge.style.display = 'inline-flex'; + } + } + + /** + * Format large numbers (e.g., 1500 -> 1.5k) + */ + function formatCount(num) { + if (num === undefined || num === null || num === '?') return '?'; + if (num >= 1000000) { + return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M'; + } + if (num >= 1000) { + return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; + } + return num.toString(); + } + + /** + * Get cached data if not expired + */ + function getFromCache(key) { + try { + const data = localStorage.getItem(key); + if (!data) return null; + + const parsed = JSON.parse(data); + if (Date.now() - parsed.timestamp > config.cacheDuration) { + localStorage.removeItem(key); + return null; + } + return parsed; + } catch (e) { + return null; + } + } + + /** + * Save data to cache + */ + function saveToCache(key, data) { + try { + localStorage.setItem(key, JSON.stringify(data)); + } catch (e) { + // Silently fail if localStorage is not available + } + } + + /** + * Setup dropdown toggle behavior + */ + function setupDropdown(widget) { + const trigger = widget.querySelector('.gh-widget-trigger'); + const dropdown = widget.querySelector('.gh-dropdown'); + + if (!trigger || !dropdown) return; + + // Toggle on click + trigger.addEventListener('click', (e) => { + e.stopPropagation(); + const isExpanded = trigger.getAttribute('aria-expanded') === 'true'; + trigger.setAttribute('aria-expanded', !isExpanded); + dropdown.setAttribute('aria-hidden', isExpanded); + widget.classList.toggle('gh-widget-open', !isExpanded); + }); + + // Toggle on Enter/Space key + trigger.addEventListener('keydown', (e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + trigger.click(); + } + }); + + // Close on click outside + document.addEventListener('click', (e) => { + if (!widget.contains(e.target)) { + trigger.setAttribute('aria-expanded', 'false'); + dropdown.setAttribute('aria-hidden', 'true'); + widget.classList.remove('gh-widget-open'); + } + }); + + // Close on Escape key + document.addEventListener('keydown', (e) => { + if (e.key === 'Escape') { + trigger.setAttribute('aria-expanded', 'false'); + dropdown.setAttribute('aria-hidden', 'true'); + widget.classList.remove('gh-widget-open'); + } + }); + } + + // Initialize when DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initGitHubWidget); + } else { + initGitHubWidget(); + } +})(); diff --git a/great-docs/great-docs.scss b/great-docs/great-docs.scss new file mode 100644 index 0000000..441b83b --- /dev/null +++ b/great-docs/great-docs.scss @@ -0,0 +1,8859 @@ +// Ref: +// - https://getbootstrap.com/docs/5.3/utilities/spacing/ +// - https://github.com/twbs/bootstrap/blob/main/scss/_variables.scss +// - https://quarto.org/docs/output-formats/html-themes-more.html +// - https://getbootstrap.com/docs/5.3/utilities/text + +/*-- scss:defaults --*/ +$h2-font-size: 1.5rem; +$h3-font-size: 1.3rem; + +/*-- scss:mixins --*/ +$headings-font-weight: 300 !default; + +/*-- scss:rules --*/ +$label-class-color: mix($primary, $indigo-500, 20%); +$label-method-color: mix($primary, $cyan-600, 20%); +$label-function-color: mix($primary, $pink-700, 20%); +$label-exception-color: mix($primary, $red-600, 20%); +$label-property-color: mix($primary, $teal-600, 20%); +$label-constant-color: mix($primary, $orange-500, 20%); +$label-typealias-color: mix($primary, $yellow-500, 20%); +$label-cli-color: mix($primary, $green-600, 20%); +$label-cli-group-color: mix($primary, $green-600, 20%); + +$signature-background-color: shade-color(tint-color($primary, 96%), 2%); + +$font-family-monospace: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + +// Selectors for similar groups of elements that are created by the renderer +$docstring-sections: ":is(.doc-parameters, .doc-other-parameters, .doc-returns, .doc-yields, .doc-receives, .doc-raises, .doc-warns, .doc-attributes, .doc-parameter-attributes, .doc-init-parameters, .doc-see-also, .doc-examples)"; +$doc-object-names: "span.doc-object-name:is(.doc-class-name, .doc-method-name, .doc-module-name, .doc-function-name, .doc-alias-name, .doc-attribute-name, .doc-type-name, .doc-typevar)"; + +a { + text-decoration: none; +} + +a.gdls-link { + text-decoration: underline; + text-underline-offset: 0.25em; + text-decoration-thickness: 0.125em; +} + +a.gdls-code { + font-family: $font-family-monospace; + font-size: 0.875em; +} + +// Set headings boldness back to the bootstrap default. +// quarto changes it for h1, h2, h3! +h1, .h2, h2, .h2, h3, .h3 { + @extend .fw-medium; +} + +// Title headings get extra weight +h1.title { + font-weight: 600 !important; +} + +// Title headings get a larger font size on desktop +@media (min-width: 992px) { + h1.title, .title.h1 { + font-size: 2.3rem; + } +} + +// Remove h2 underline (Quarto/Bootstrap adds border-bottom to h2 elements) +h2, .h2 { + border-bottom: none; + padding-bottom: 0; +} + +// Changelog version headings: add a Lucide-style tag glyph and code-like type. +h1.changelog-version, +h2.changelog-version { + display: flex; + align-items: center; + font-family: $font-family-monospace; + font-size: 1.6rem; +} + +h1.changelog-version::before, +h2.changelog-version::before { + content: ""; + width: 1.15em; + height: 1.15em; + flex: 0 0 1.15em; + transform: translateY(0.08em); + background-color: currentColor; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.59 13.41 11 3H4v7l9.59 9.59a2 2 0 0 0 2.82 0l4.18-4.18a2 2 0 0 0 0-2.82Z'/%3E%3Cline x1='7' y1='7' x2='7.01' y2='7'/%3E%3C/svg%3E") no-repeat center / contain; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.59 13.41 11 3H4v7l9.59 9.59a2 2 0 0 0 2.82 0l4.18-4.18a2 2 0 0 0 0-2.82Z'/%3E%3Cline x1='7' y1='7' x2='7.01' y2='7'/%3E%3C/svg%3E") no-repeat center / contain; +} + +h5, .h5 { + @extend .mt-3; +} + +header p { + @extend .mb-2; +} + +.description { + font-style: italic; + + @media (max-width: 767.98px) { + padding-bottom: 1em; + } +} + +table:not(.gt_table) { + @extend .table-bordered; +} + +// Summary tables used in reference pages (Methods, Attributes sections) +// Override Bootstrap's .table-bordered styles for cleaner appearance +table.gd-summary-table { + border: none; + margin: 1em 0; + + thead { + display: none; + } + + td, th { + border: none; + padding: 0.5em 0.75em; + vertical-align: top; + } + + // Subtle separator between rows + td { + border-top: 1px solid var(--bs-border-color, #dee2e6); + } + + tr:first-child td { + border-top: none; + } + + // Name column styling - use code font for method/function names + td:first-child { + width: 40%; + font-weight: 500; + font-family: $font-family-monospace; + + a { + color: var(--bs-body-color); + text-decoration: underline; + text-underline-offset: 0.2em; + + &:hover { + color: var(--bs-link-color); + } + } + } + + // Description column - de-emphasize, match prose font + td:last-child { + color: var(--bs-secondary-color, #6c757d); + font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + } +} + +body.quarto-dark table.gd-summary-table td:last-child { + color: var(--bs-body-color); +} + +.table > tbody { + // quarto adds a bottom color that is different from the border color, + // that looks good the default + border-bottom-color: $table-border-color; +} + +// The default background color for the dropdown is +// off-white and it washes out the text color. +.navbar .dropdown-item { + color: $gray-800; +} + + +/*---------------------------------- Reference Page -----------------------------------*/ +.doc-reference section.doc-group > dl { + @extend .table; + border-top-style: dashed; + border-bottom-style: dashed; + padding-top: 0.5em; +} + +.doc-reference section.doc-group > dl > dt { + margin-left: 0px !important; +} + +.doc-reference dd > p:last-child { + margin-bottom: 0; +} + +.doc-reference dt a { + color: inherit; + text-decoration: underline; + font-weight: bold; + font-family: $font-family-monospace; + font-size: 0.875em; + text-underline-offset: 0.25em; + text-decoration-thickness: 0.125em; + word-break: initial; +} + +/*------------------------------------- API Page --------------------------------------*/ + +// Remove h2 underlines on API reference pages (Quarto/Bootstrap adds border-bottom +// to all h2 elements; we suppress it for doc section headings and group headings) +h2.doc-parameters, +h2.doc-returns, +h2.doc-attributes, +h2.doc-functions, +h2.doc-methods, +h2.doc-classes, +h2.doc-group { + font-size: 22px; + border-bottom: none; + padding-bottom: 0; +} + +// docstring object-name +header span.doc-object-name, +h1 span.doc-object-name, +h2 span.doc-object-name, +h3 span.doc-object-name, +h4 span.doc-object-name { + font-family: $font-family-monospace; + font-size: 1.25rem; +} + +.doc-object span.doc-object-name:not(h1.title > span) { + opacity: 0.85; +} + +.doc-subject > p { + font-style: italic; +} + +// docstring object symbols +.content code.doc-symbol { + font-size: 0.9rem; +} + +// docstring signatures +.doc-usage-source { + display: flex; + justify-content: space-between; + align-items: baseline; +} + +.doc-usage-source p { + margin-bottom: 0rem; + font-size: 0.7rem; + text-transform: uppercase; +} + +.doc-usage-source > p:first-child { + color: #AAA; +} + +.doc-usage-source a { + color: steelblue !important; + text-decoration: underline; + font-weight: 600; +} + +.doc-signature div.sourceCode { + margin-top: 0.15rem; + border-radius: 0 !important; +} + +.doc-signature > div:first-child { + background-color: $signature-background-color; +} + +.doc-signature code { + max-height: 20rem; + overflow: auto; +} + +.doc-signature > p:first-child { + @extend .my-3; + border-radius: 0.25rem; +} + +.doc-signature > p:first-child code { + @extend .p-2; + display: block; +} + +.doc-signature > p:first-child code a { + color: $primary; +} + +.doc-text:has(+section) { + margin-bottom: 2rem; +} + +// Warnings section — styled as a warning alert (matches RST .. warning:: styling) +section:has(> h2.doc-warnings, > h3.doc-warnings) { + border-left: 4px solid #D97706; + background-color: #FFFBEB; + padding: 0.75rem 1rem; + border-radius: 4px; + margin-top: 1rem; + margin-bottom: 1rem; + color: #1f2937; + + > :is(h2, h3) { + font-size: 0.875rem; + font-weight: 600; + color: #1f2937; + margin-top: 0; + margin-bottom: 0.25rem; + + &::before { + content: "\26A0\FE0F "; + } + } + + > p { + margin-bottom: 0; + color: #1f2937; + } +} + +// Notes section — styled as an info callout (matches RST .. note:: styling) +section:has(> h2.doc-notes, > h3.doc-notes) { + border-left: 4px solid #3B82F6; + background-color: #EFF6FF; + padding: 0.75rem 1rem; + border-radius: 4px; + margin-top: 1rem; + margin-bottom: 1rem; + color: #1f2937; + + > :is(h2, h3) { + font-size: 0.875rem; + font-weight: 600; + color: #1f2937; + margin-top: 0; + margin-bottom: 0.25rem; + + &::before { + content: "\2139\FE0F "; + } + } + + > p { + margin-bottom: 0; + color: #1f2937; + } +} + +// docstring sections with definition-items + +#{$docstring-sections} dl > dt { + font-weight: normal; +} + +#{$docstring-sections} dl > dd { + @extend .mb-0; +} + +#{$docstring-sections} dl > dt:not(:first-child) { + @extend .mt-3; +} + +#{$docstring-sections} dl > dd > table { + min-width: 33%; + width: 0; +} + +#{$docstring-sections} dl > dd > table > thead { + border-top: 0rem solid $border-color; + border-bottom: 0.15em solid $border-color; +} + +#{$docstring-sections} dl > dd > table td { + @extend .px-2; + @extend .py-1; +} + +// Definitions that are code +#{$docstring-sections} dt code, +.doc-signature > p > code { + display: block; + font-weight: normal; +} + +.doc-text dt code { + @extend .p-1; + font-weight: normal; +} + +#{$docstring-sections} dt code a, +.doc-signature > p > code a { + color: inherit; + text-decoration: none; +} + +// docstring spacing and indentation +section.doc-attributes > section.doc-attribute, +section.doc-methods > section.doc-method { + @extend .ps-4; + border-left: 0.025rem solid $gray-500; + backgroud-color: cyan; +} + +// docstring section parameters +#{$docstring-sections} .doc-parameter-name { + font-weight: bold; +} + +h2#{$docstring-sections} { + font-size: 1.295rem; +} + +// right sidebar ("On this page") +#toc-title { + font-weight: 600 !important; + font-size: 15px; + color: dimgray; + text-transform: uppercase; +} + +// sidebar +.sidebar nav li > a > code { + color: $code-color; + background-color: $gray-100; + padding: 0.075rem 0.075rem; +} + +.gd-ref-sidebar #quarto-sidebar .sidebar-item-text { + font-family: $font-family-monospace; +} + +#{$doc-object-names}::before { + @extend .px-1; + font-size: 0.9rem; + font-family: monospace; + margin-right: 0.5rem; + border-radius: 0.25rem; +} + +.sidebar #{$doc-object-names}::before { + font-size: 0.55rem; +} + +// docstring object labels +$all_labels: ( + class, + dataclass, + namedtuple, + typeddict, + protocol, + abc, + enum, + method, + classmethod, + staticmethod, + function, + async, + exception, + property, + constant, + typealias, + cli, + cli-group +); +$class-like-labels: (class, dataclass, namedtuple, typeddict, protocol, abc, enum); +$method-like-labels: (method, classmethod, staticmethod); + +.content span.doc-label::after { + @extend .fw-normal; + @extend .small; + font-family: $font-family-monospace; + font-size: 0.785rem; + padding: 0.125rem 0.25rem; + margin-left: 1rem; + vertical-align: middle; + border-radius: 0.25rem; + border-width: 1px; + border-style: solid; +} + +@each $label in $all_labels { + .content span.doc-label-#{$label}::after { + content: "#{$label}"; + } +} + +.content { + @each $label in $class-like-labels { + span.doc-label-#{$label}::after { + color: $label-class-color; + border-color: $label-class-color; + background-color: tint-color($label-class-color, 95%); + } + } +} + +.content { + @each $label in $method-like-labels { + span.doc-label-#{$label}::after { + color: $label-method-color; + border-color: $label-method-color; + background-color: tint-color($label-method-color, 95%); + } + } +} + +.content span.doc-label-function::after, +.content span.doc-label-async::after { + color: $label-function-color; + border-color: $label-function-color; + background-color: tint-color($label-function-color, 95%); +} + +.content span.doc-label-property::after { + color: $label-property-color; + border-color: $label-property-color; + background-color: tint-color($label-property-color, 95%); +} + +.content span.doc-label-constant::after { + color: $label-constant-color; + border-color: $label-constant-color; + background-color: tint-color($label-constant-color, 95%); +} + +.content span.doc-label-typealias::after { + color: $label-typealias-color; + border-color: $label-typealias-color; + background-color: tint-color($label-typealias-color, 95%); +} + +.content span.doc-label-cli::after { + color: $label-cli-color; + border-color: $label-cli-color; + background-color: tint-color($label-cli-color, 95%); +} + +.content span.doc-label-cli-group::after { + content: "cli-group"; + color: $label-cli-group-color; + border-color: $label-cli-group-color; + background-color: tint-color($label-cli-group-color, 95%); +} + +// Adorn callables with () +span.doc-method-name::after, +dt a.doc-method-name::after { + content: "()"; +} + +// Dark mode overrides +// Uses both selectors to match Bootstrap 5 (data-bs-theme) and Quarto (body class) +[data-bs-theme="dark"] { + // Right sidebar (TOC) code: inherit text color, no background + .sidebar nav li > a > code { + color: inherit; + background-color: transparent; + } + + // Parameter/return/raises dt code blocks: use light text on dark background + // The generic 'dt code span' rule is critical: Quarto's syntax highlighting CSS + // sets 'code span { color: #003B4F }' which overrides inherited colors on all spans + #{$docstring-sections} dt code { + color: #e2e8f0 !important; + background-color: #2d3748 !important; + } + + #{$docstring-sections} dt code span { + color: #e2e8f0 !important; + } + + #{$docstring-sections} dt code .doc-parameter-name { + color: #f7fafc !important; + } + + #{$docstring-sections} dt code .doc-parameter-annotation, + #{$docstring-sections} dt code .doc-parameter-annotation-sep, + #{$docstring-sections} dt code .doc-parameter-default, + #{$docstring-sections} dt code .doc-parameter-default-sep { + color: #cbd5e0 !important; + } + + // Signature block + .doc-signature div.sourceCode { + background-color: #2d3748 !important; + } + + .doc-signature code { + color: #e2e8f0 !important; + } + + .doc-signature code span:not(.sig-class, .sig-name, .cn-none, .cn-bool, .op) { + color: #e2e8f0 !important; + } + + // Attribute signature (uses

rather than div.sourceCode) + .doc-signature.doc-attribute { + code { + background-color: #2d3748 !important; + color: #e2e8f0 !important; + } + + .doc-parameter-name, + .doc-parameter-annotation-sep, + .doc-parameter-annotation { + color: white !important; + } + } + + // Warning callout + section:has(> h2.doc-warnings, > h3.doc-warnings) { + background-color: #422006 !important; + border-color: #d97706 !important; + color: #fef3c7 !important; + + > :is(h2, h3) { + color: #fbbf24 !important; + } + + > p { + color: #fef3c7 !important; + } + } + + // Notes callout + section:has(> h2.doc-notes, > h3.doc-notes) { + background-color: #1e3a5f !important; + border-color: #3b82f6 !important; + color: #dbeafe !important; + + > :is(h2, h3) { + color: #93c5fd !important; + } + + > p { + color: #dbeafe !important; + } + } + + // Quarto callouts (versionadded, versionchanged, etc.) + .callout { + color: var(--bs-body-color) !important; + + .callout-title-container { + color: var(--bs-body-color) !important; + } + + .callout-body p { + color: var(--bs-body-color) !important; + } + } + + // Blog listing metadata and titles + .quarto-post { + .listing-date, + .listing-author { + color: var(--bs-body-color); + } + + .listing-title a { + color: var(--bs-body-color); + } + } +} + + +/* ============================================================================ + General site styles (merged from great-docs.css) + ============================================================================ */ + +/* Theme loading - hide page until theme is applied to prevent flash */ +html.theme-loading { + visibility: hidden; +} + +html.theme-loading body { + visibility: hidden; +} + +/* General heading weight -- handled by SCSS @extend .fw-medium */ + +/* Reduce top margin on reference page object titles */ +h2.title { + margin-top: 0.5rem; + border-bottom: none; + padding-bottom: 0; +} + +.table a { + text-underline-offset: 4px; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + color: inherit; + font-weight: bold; + font-size: 0.875em; + word-break: initial; + text-decoration-thickness: 2px; +} + +/* Signature highlighting - class name (e.g., "Graph" in Graph.add_node) */ +code span.sig-class { + color: #0e84b5; + font-weight: 600; +} + +/* Signature highlighting - method/function name (e.g., "add_node" in Graph.add_node) */ +code span.sig-name { + color: #4758AB; + font-weight: 600; +} + +/* Signature highlighting - None constant */ +code span.cn-none { + color: #7D4E9E; + font-weight: 500; +} + +/* Signature highlighting - True/False boolean constants */ +code span.cn-bool { + color: #0077AA; + font-weight: 600; +} + +/* Signature highlighting - operators (=, **, etc.) - override Quarto default */ +#cb1 code span.op { + color: #D14D00; + font-weight: 500; +} + +/* Spacer between overloaded function signatures */ +#cb1 code span.overload-spacer { + display: block; + height: 0.35em; + user-select: none; +} + +.navbar-brand img { + max-height: 45px; + padding-right: 0px; + margin-left: 5px; + margin-right: 12px; + transition: transform 0.3s ease; +} + +.navbar-brand img:hover { + transform: scale(1.15); +} + +body { + background-color: var(--gd-bg-primary, #FCFEFF); +} + +p a { + color: black; + text-decoration: underline; + text-underline-offset: 4px; +} + +li a { + color: black; + text-decoration: underline; + text-underline-offset: 4px; +} + +/* Author/funder icon links in the landing page margin sidebar */ +.column-margin a:has(.bi), +.column-margin a:has(.fa-brands), +.column-margin a:has(.ror-sidebar-icon) { + color: #495057; + text-decoration: none; +} + +.column-margin a:has(.bi):hover, +.column-margin a:has(.fa-brands):hover, +.column-margin a:has(.ror-sidebar-icon):hover { + color: #212529; +} + +/* ── Blended-homepage metadata sidebar ── + In blended mode the first UG page becomes the site index page. Project + metadata (links, license, community, …) is placed in a panel that mirrors + the right-margin column of a normal homepage. + We use a custom class (.gd-meta-sidebar) instead of Quarto’s .column-margin + because .column-margin triggers slimcontent/page-full body & main classes + that change the outer CSS-grid template, shifting the left sidebar and + content area out of alignment with other user-guide pages. With a custom + class, body/main keep the same classes as regular UG pages and the metadata + panel is positioned via CSS absolute positioning. + + Because toc: false + no margin content causes Quarto to add "fullcontent" + to , the outer grid template collapses the right-margin tracks and + uses different left-side tracks than a plain floating page. We override + the grid template back to the default floating layout so the sidebar and + content align with subsequent UG pages. */ +@media (min-width: 992px) { + /* Fix outer grid: match the default floating (no-modifier) template so the + left sidebar and content area align with regular UG pages. */ + body.nav-sidebar.floating.fullcontent .page-columns { + grid-template-columns: + [screen-start] 1.5em + [screen-start-inset] 5fr + [page-start] minmax(25px, 50px) + [page-start-inset] minmax(50px, 150px) + [body-start-outset] minmax(25px, 50px) + [body-start] 1.5em + [body-content-start] minmax(500px, calc(800px - 3em)) + [body-content-end] 1.5em + [body-end] minmax(25px, 50px) + [body-end-outset] minmax(50px, 150px) + [page-end-inset] minmax(25px, 50px) + [page-end] 5fr + [screen-end-inset] 1.5em + [screen-end] !important; + } + main.content:has(.gd-meta-sidebar) { + position: relative; + overflow: visible; + } + .gd-meta-sidebar { + position: absolute; + top: 0; + left: 100%; + margin-left: 1.5em; + width: 200px; + } + .gd-meta-sidebar h3, + .gd-meta-sidebar h4 { + font-size: 0.9em; + font-weight: 600; + margin-top: 0.8em; + margin-bottom: 0.25em; + border-bottom: none; + padding-bottom: 0; + } + .gd-meta-sidebar h3:first-child, + .gd-meta-sidebar h4:first-child { + margin-top: 0; + } +} +@media (max-width: 991.98px) { + .gd-meta-sidebar { + border-top: 1px solid var(--bs-border-color, #dee2e6); + padding-top: 1em; + margin-top: 2em; + } +} + +dt { + min-height: 32px; + overflow-x: visible; + margin-left: -4px; +} + +dd { + padding-left: 1.5rem; +} + +/* Lists inside definition descriptions (e.g., Returns with bullet points) */ +dd > p + ul, +dd > p + ol { + margin-top: -0.5em; /* pull list closer to the preceding paragraph */ +} + +dd > ul > li::marker, +dd > ol > li::marker { + color: #9ca3af; /* lighter bullet / number color */ +} + +/* API reference section headings (Parameters, Returns, Examples, etc.) */ +h2.doc-section { + font-size: 22px; + border-bottom: none; + padding-bottom: 0; +} + +/* Ensure parameter descriptions are indented within doc sections */ +.doc-section-parameters dd { + padding-left: 1.5rem; + margin-left: 0; +} + +.doc-section-parameters dd p { + margin-left: 0; +} + +/* Warnings section: h2 header above, body in callout box */ +.doc-section-warnings > h2 { + color: Crimson; + font-weight: 600; + margin-bottom: 0.5rem; + border-left: none; + border-bottom: none; + padding-left: 0; +} + +.doc-section-warnings > h2::before { + content: "⚠️ "; +} + +.doc-section-warnings > p { + margin: 0.5rem 0; + padding: 0.75rem 1rem; + background-color: #FEF2F2; + border-left: 4px solid #DC2626; + border-radius: 4px; + font-size: 0.9rem; +} + +.table td { + padding-left: 0.5rem; + text-indent: 0; +} + +code { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 0.875em; + color: rgb(18, 18, 18); +} + +.blockquote { + font-size: 13px; + background-color: #E8E8E8; + border-left-color: #4682B4; +} + +p,h1,h2,h3,#toc-title,#toc-function-reference,.nav-link,.table { + font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; +} + +.cell-output.cell-output-stdout { + border-style: solid; + border-width: 1px; + border-color: #A1A1A165; + border-radius: 4px; + padding: 0.4em; + background-color: #F7F1EB65; + margin-bottom: 12px; +} + +summary::marker { + font-size: 1.5em; +} + +.parameter-name { + margin-right: -10px; +} + +/* #toc-title -- handled by SCSS rules above */ + +#toc-title > ul { + font-size: 14px; +} + +/* Prevent Quarto from collapsing the TOC entry list */ +#TOC > ul.collapse { + display: block !important; + visibility: visible !important; +} + +#quarto-margin-sidebar { + margin-left: 20px; + padding-top: 30px; +} + +#quarto-margin-sidebar nav ul li { + padding-top: 3px; + color: #595959; +} + +#quarto-margin-sidebar nav ul li a { + color: #595959; +} + +#quarto-margin-sidebar nav ul li a:hover { + color: #333; +} + +#quarto-margin-sidebar nav ul li a.active { + color: #0d6efd; + font-weight: 500; +} + +#navbarCollapse > ul.navbar-nav.navbar-nav-scroll.me-auto > li > a:hover { + background-color: rgb(240, 112, 0); + color: white; + border-radius: 5px; +} + +#navbarCollapse > ul.navbar-nav.navbar-nav-scroll.me-auto > li > a { + color: var(--gd-navbar-text); + font-weight: bold; +} + +/* --- Disable sidebar section collapsing --- */ + +/* Prevent the section heading text from triggering collapse */ +a.sidebar-item-text.sidebar-link.text-start[data-bs-toggle="collapse"] { + pointer-events: none; + cursor: default; +} + +/* Hide the chevron toggle element entirely */ +a.sidebar-item-toggle.text-start { + display: none !important; +} + +/* Keep all sidebar sections permanently expanded */ +#quarto-sidebar ul.collapse.sidebar-section { + display: block !important; + visibility: visible !important; + height: auto !important; +} + +/* Remove pointer cursor from sidebar containers */ +div.sidebar-item-container { + cursor: default !important; +} + +/* Hover effect for clickable sidebar links (not section headers). + Uses a ::before pseudo-element so hover never shifts layout. */ +#quarto-sidebar .sidebar-link[href] { + position: relative; +} + +#quarto-sidebar .sidebar-link[href]::before { + content: ""; + position: absolute; + inset: -3px -8px -3px -10px; + border-radius: 6px; + opacity: 0; + transition: opacity 0.15s ease; + pointer-events: none; + background-color: rgba(0, 0, 0, 0.04); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.10); +} + +#quarto-sidebar .sidebar-link[href]:hover::before { + opacity: 1; +} + +#quarto-sidebar a.sidebar-item-text.sidebar-link.active { + color: rgb(244, 121, 0); + text-decoration: underline; + text-decoration-thickness: 3px; + text-decoration-color: rgba(101, 180, 237, 0.75); + text-underline-offset: 3px; +} + +#api-reference > h1 { + margin: 0; +} + +.navbar-title { + font-family: Inter, Roboto, "Helvetica Neue", "Arial Nova", "Nimbus Sans", Arial, sans-serif; + font-weight: bold; + color: var(--gd-navbar-text); + border-style: solid; + border-width: 2px; + border-radius: 8px; + padding-left: 10px; + padding-right: 10px; + padding-top: 3px; + padding-bottom: 4px; +} + +/* Version badge in navbar title */ +.version-badge { + font-size: 0.65em; + font-weight: 500; + color: rgba(0, 0, 0, 0.55); + background-color: rgba(0, 0, 0, 0.08); + border-radius: 4px; + padding: 1px 6px; + margin-left: 6px; + vertical-align: middle; + letter-spacing: 0.02em; + cursor: default; +} + +#quarto-sidebar { + background-color: #FAFAFD50; +} + +/* On mobile the sidebar overlays page content, so remove transparency */ +@media (max-width: 991.98px) { + #quarto-sidebar { + background-color: #FAFAFD; + } + + /* Make the fixed-position sidebar scrollable within the viewport */ + #quarto-sidebar.show { + bottom: 0; + min-height: 0; + overflow-y: auto; + } + + /* Smoother open/close transition for the sidebar. + Bootstrap collapse-horizontal animates width; we just improve the + easing and prevent content reflow by pinning inner min-width. */ + #quarto-sidebar.sidebar-navigation.collapsing { + transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; + overflow: hidden; + + > .sidebar-menu-container { + min-width: 280px; + } + } +} + +/* ── Single-page section: expand content into sidebar space ── + When a custom section has only one page the left sidebar is omitted. + Shift the content column leftward so it occupies the sidebar area too, + keeping the TOC on the right intact. */ +@media (min-width: 992px) { + body.gd-section-no-sidebar #quarto-content { + grid-template-columns: + [screen-start] 1.5em + [screen-start-inset] 4.65fr + [page-start page-start-inset body-start-outset body-start] 1.5em + [body-content-start] minmax(500px, calc(1050px - 3em)) + [body-content-end] 1.5em + [body-end] 35px + [body-end-outset] minmax(75px, 145px) + [page-end-inset] 35px + [page-end] 5fr + [screen-end-inset] 1.5em + [screen-end] !important; + } +} + +/* Sidebar items: base styling with smart line-breaking for long names. + Line breaks are controlled by tags inserted by sidebar-wrap.js; + overflow-wrap is intentionally NOT set so the browser only breaks at + those designated points (not in the middle of words). */ +#quarto-sidebar .sidebar-item-text { + font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 0.85em; + display: block; + max-width: 100%; + white-space: normal; + hyphens: none; +} + +/* API/CLI reference sidebar monospace -- handled by SCSS .gd-ref-sidebar rule above */ + +/* Keep section headers (categories) in their original sans-serif uppercase style */ +a.sidebar-item-text.sidebar-link.text-start > span { + text-transform: uppercase; + font-weight: 600; + color: dimgray; + font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 1em; + hyphens: none; +} + +.sidebar-menu-container { + border-bottom-style: solid; + border-bottom-width: 3px; + border-bottom-color: #E7EAF6; +} + +#quarto-sidebar .sidebar-item .menu-text { + font-size: 15px; +} + +/* Keep reference sidebar items at the smaller size */ +.gd-ref-sidebar #quarto-sidebar .sidebar-item .menu-text { + font-size: 12px; +} + +.sidebar-item-section { + padding-bottom: 8px; +} + +/* ========================================================================== + Floating Sidebar Navigation (desktop only) + Transforms #quarto-sidebar into a pinned, independently-scrollable panel + with blur background, rounded border, and scroll affordances. + ========================================================================== */ + +@media (min-width: 992px) { + #quarto-sidebar.gd-sidebar-float { + /* Sticky keeps the sidebar in the CSS grid flow. + JS sets top (stick offset) and max-height (shrinks for footer). */ + display: flex; + flex-direction: column; + overflow: hidden !important; /* clip children to rounded corners; override .overflow-auto */ + position: sticky; + transition: top 0.15s ease, max-height 0.15s ease; + /* Widen sidebar to reclaim space lost to border+padding. + Negative margin-right lets it extend slightly into the gap. */ + margin-right: -12px; + /* align-self keeps the sidebar at the grid-row start so it + sticks near the top, not stretched to the full row height. */ + align-self: start; + } + + /* Suppress the old bottom border on the menu container — + it is now inside the float body. */ + #quarto-sidebar.gd-sidebar-float .sidebar-menu-container { + border-bottom: none; + } + + /* Remove default Bootstrap margin-bottom on the sidebar list + so the float body hugs the last item tightly. */ + #quarto-sidebar.gd-sidebar-float .sidebar-menu-container > ul { + margin-bottom: 0; + } + + #quarto-sidebar.gd-sidebar-float .sidebar-menu-container > ul > li:last-child { + padding-bottom: 7px; + } + + /* Tighten vertical spacing between nav items inside the float */ + #quarto-sidebar.gd-sidebar-float .sidebar-item { + margin-top: 0.1rem; + margin-bottom: 0.1em; + } + + /* Override the ::before hover pill with a direct background on the link. + The ::before pseudo extends beyond the scroll container and gets clipped; + using the link's own background avoids that entirely. */ + #quarto-sidebar.gd-sidebar-float .sidebar-link[href]::before { + display: none !important; + content: none !important; + } + + #quarto-sidebar.gd-sidebar-float .sidebar-link[href] { + border-radius: 6px; + padding-left: 8px; + padding-right: 8px; + padding-top: 3px; + padding-bottom: 3px; + margin-left: -8px; + margin-right: 0; + transition: background-color 0.15s ease, box-shadow 0.15s ease; + } + + #quarto-sidebar.gd-sidebar-float .sidebar-link[href]:hover { + background-color: rgba(0, 0, 0, 0.04); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.10); + } + + #quarto-sidebar.gd-sidebar-float.sidebar-navigation > * { + padding-top: 0.4em; + } + + #quarto-sidebar.gd-sidebar-float > * { + padding-right: 0; + } +} + + + +/* Scrollable body */ +.gd-sidebar-float-body { + display: none; /* hidden below 992px */ +} + +@media (min-width: 992px) { + .gd-sidebar-float-body { + display: block; + flex: 1 1 auto; + overflow-y: auto; + overscroll-behavior: contain; + position: relative; + /* Thin scrollbar for Webkit/Blink */ + scrollbar-width: thin; + scrollbar-color: rgba(0, 0, 0, 0.15) transparent; + + &::-webkit-scrollbar { + width: 5px; + } + &::-webkit-scrollbar-track { + background: transparent; + } + &::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.12); + border-radius: 4px; + } + } +} + +/* Scroll affordance indicators (top / bottom) */ +.gd-sidebar-scroll-indicator { + display: none; /* hidden below 992px */ +} + +@media (min-width: 992px) { + /* Indicators are inside .gd-sidebar-float-body (the scroll container) + and use position:sticky so they pin to the top/bottom of the + visible scroll area without covering the "Pages" header above. */ + .gd-sidebar-scroll-indicator { + display: flex; + align-items: center; + justify-content: center; + position: sticky; + left: 0; + right: 0; + min-height: 32px; + margin-top: -32px; /* collapse out of flow so content isn't pushed */ + pointer-events: none; + opacity: 0; + transition: opacity 0.2s ease; + z-index: 3; + } + + .gd-sidebar-scroll-indicator.visible { + opacity: 1; + pointer-events: auto; + cursor: pointer; + } + + .gd-sidebar-scroll-top { + top: 0; + background: linear-gradient(to bottom, rgba(250, 250, 253, 0.92) 0%, transparent 100%); + } + + .gd-sidebar-scroll-bottom { + bottom: 0; + position: sticky; + margin-top: 0; + margin-bottom: -32px; + background: linear-gradient(to top, rgba(250, 250, 253, 0.92) 0%, transparent 100%); + } + + .gd-sidebar-scroll-arrow { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 50%; + background: rgba(0, 0, 0, 0.06); + color: $gray-600; + font-size: 0.65rem; + line-height: 1; + transition: background 0.15s ease, color 0.15s ease; + } + + .gd-sidebar-scroll-indicator:hover .gd-sidebar-scroll-arrow { + background: rgba(0, 0, 0, 0.12); + color: $gray-800; + } +} + +/* ── Dark mode: Floating Sidebar ── */ +body.quarto-dark { + @media (min-width: 992px) { + #quarto-sidebar.gd-sidebar-float { + background: rgba(30, 30, 30, 0.55); + border-color: rgba(255, 255, 255, 0.10); + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.25); + } + + + .gd-sidebar-float-body { + scrollbar-color: rgba(255, 255, 255, 0.15) transparent; + + &::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.12); + } + } + + #quarto-sidebar.gd-sidebar-float .sidebar-link[href]:hover { + background-color: rgba(255, 255, 255, 0.08); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.12); + } + + .gd-sidebar-scroll-top { + background: linear-gradient(to bottom, rgba(30, 30, 30, 0.92) 0%, transparent 100%); + } + + .gd-sidebar-scroll-bottom { + background: linear-gradient(to top, rgba(30, 30, 30, 0.92) 0%, transparent 100%); + } + + .gd-sidebar-scroll-arrow { + background: rgba(255, 255, 255, 0.08); + color: $gray-400; + } + + .gd-sidebar-scroll-indicator:hover .gd-sidebar-scroll-arrow { + background: rgba(255, 255, 255, 0.15); + color: $gray-200; + } + } +} + +/* Print: hide floating sidebar affordances */ +@media print { + .gd-sidebar-scroll-indicator { + display: none !important; + } +} + +#quarto-header > nav > div { + margin-left: 2%; + margin-right: 2%; +} + +.navbar { + background: var(--gd-navbar-bg); + border-bottom: 1px solid rgba(0, 0, 0, 0.08); +} + +.nav-link.active { + text-decoration: underline; + text-decoration-thickness: 2px; + text-decoration-color: rgba(101, 180, 237, 0.75); + text-underline-offset: 4px; +} + +/* Light-mode navbar overrides (counteract Bootstrap data-bs-theme="dark") */ +body.quarto-light .navbar .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0,0,0,0.65)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +/* Search button - styled to match dark-mode toggle and GitHub widget */ + +/* Navbar widget container — groups search, toggle, and GitHub into a flex row */ +#gd-navbar-widgets { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 6px; + min-width: fit-content; + flex-wrap: nowrap; +} + +/* Compact widget tray on narrow phones (iPhone portrait) */ +@media (max-width: 430px) { + .navbar .container-fluid { + flex-wrap: wrap; + } + .navbar-brand.navbar-brand-logo { + padding-right: 100%; + } + .quarto-navbar-tools { + flex: 0 0 100%; + justify-content: center; + order: 99; + padding-top: 4px; + padding-bottom: 4px; + } + #gd-navbar-widgets { + justify-content: center; + } +} + +/* Uniform sizing for all direct widget children in the tray */ +#gd-navbar-widgets > #dark-mode-toggle-container, +#gd-navbar-widgets > #gd-keyboard-btn-container { + display: flex; + align-items: center; + justify-content: center; + margin: 0; +} + +/* Reset Quarto's auto-margins and ordering on search when inside widget tray */ +#gd-navbar-widgets #quarto-search { + margin-left: 0; + order: unset; +} + +#gd-navbar-widgets #quarto-search.type-overlay .aa-Autocomplete { + width: 34px; +} + +#quarto-search .aa-DetachedSearchButton { + display: flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + padding: 0; + background: rgba(0, 0, 0, 0.06); + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 6px; + color: var(--gd-navbar-text); + cursor: pointer; + transition: all 0.2s ease; +} + +#quarto-search .aa-DetachedSearchButton:hover { + background: rgba(0, 0, 0, 0.10); + border-color: rgba(0, 0, 0, 0.25); +} + +#quarto-search .aa-DetachedSearchButton:focus { + outline: none; + box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.15); +} + +#quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon { + display: flex; + align-items: center; + justify-content: center; +} + +.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon { + width: 20px; + height: 20px; + margin: 0; + color: currentColor; +} + +#quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder { + display: none; +} + +body.quarto-light .navbar .aa-DetachedSearchButton svg, +body.quarto-light .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon, +body.quarto-light .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg, +body.quarto-light .navbar .aa-DetachedSearchButton .aa-SearchIcon, +html.quarto-light .navbar .aa-DetachedSearchButton svg, +html.quarto-light .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon, +html.quarto-light .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg, +html.quarto-light .navbar .aa-DetachedSearchButton .aa-SearchIcon, +:root[data-bs-theme="light"] .navbar .aa-DetachedSearchButton svg, +:root[data-bs-theme="light"] .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon, +:root[data-bs-theme="light"] .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg, +:root[data-bs-theme="light"] .navbar .aa-DetachedSearchButton .aa-SearchIcon, +body.quarto-light .navbar .aa-SubmitButton, +body.quarto-light .navbar .aa-SubmitButton svg { + color: var(--gd-navbar-text) !important; + fill: var(--gd-navbar-text); +} + +body.quarto-light .navbar .quarto-navbar-tools button, +body.quarto-light .navbar .quarto-navbar-tools .quarto-navigation-tool { + display: flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + padding: 0; + background: rgba(0, 0, 0, 0.06); + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 6px; + color: var(--gd-navbar-text); + cursor: pointer; + transition: all 0.2s ease; +} + +body.quarto-light .navbar .quarto-navbar-tools button:hover, +body.quarto-light .navbar .quarto-navbar-tools .quarto-navigation-tool:hover { + background: rgba(0, 0, 0, 0.10); + border-color: rgba(0, 0, 0, 0.25); +} + +/* GitHub icon (icon mode) — rendered as .nav-item.compact .nav-link, or + .gd-navbar-icon when extracted into #gd-navbar-widgets */ +body.quarto-light .navbar .nav-item.compact .nav-link, +body.quarto-light .navbar .gd-navbar-icon { + display: flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + padding: 0; + background: rgba(0, 0, 0, 0.06); + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 6px; + color: var(--gd-navbar-text); + cursor: pointer; + transition: all 0.2s ease; +} + +body.quarto-light .navbar .nav-item.compact .nav-link:hover, +body.quarto-light .navbar .gd-navbar-icon:hover { + background: rgba(0, 0, 0, 0.10); + border-color: rgba(0, 0, 0, 0.25); +} + +#navbarCollapse > ul.navbar-nav.navbar-nav-scroll.ms-auto > li { + padding-right: 5px +} + +.shrink-example .cell-output table { + zoom: 60%; +} + +// Scale-to-fit: shrinks wide content (tables, GT output) to fill the +// container width. Apply in .qmd via :::{.scale-to-fit} ... ::: +.scale-to-fit { + width: 100%; + position: relative; + + .gd-scale-wrapper { + transform-origin: top left; + } + + // Fallback when content is too wide for the min-scale threshold: + // show at full size with horizontal scrolling. + &.gd-scale-scrollable { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} + +footer.footer .nav-footer { + margin-top: 10px; +} + +.nav-footer { + position: relative; + z-index: 1; + border-top-style: solid; + border-top-width: 1px; + border-top-color: #AAAAAA40; +} + +.nav-footer-left { + color: rgb(48, 48, 48); +} + +.nav-footer-center { + color: rgb(48, 48, 48); + text-wrap: balance; + padding-bottom: 20px; +} + +.nav-footer-right { + color: rgb(48, 48, 48); +} + +/* Footer alignment - add left margin to match content area on large viewports */ +@media (min-width: 992px) { + .nav-footer { + padding-left: calc((100vw - 900px) / 2); + padding-right: calc((100vw - 900px) / 2); + } + + .nav-footer-center { + margin-top: 0.5rem; + } +} + +@media (min-width: 1200px) { + .nav-footer { + padding-left: calc((100vw - 1100px) / 2); + padding-right: calc((100vw - 1100px) / 2); + } +} + +@media (min-width: 1400px) { + .nav-footer { + padding-left: calc((100vw - 1300px) / 2); + padding-right: calc((100vw - 1300px) / 2); + } +} + +/* Footer author links styling */ +.nav-footer-center a { + color: inherit; + text-decoration: underline; + text-underline-offset: 2px; + text-decoration-thickness: 1px; +} + +.nav-footer-center a:hover { + text-decoration-thickness: 2px; +} + +/* Page navigation (prev/next) at bottom of pages */ +.nav-page.nav-page-previous a, +.nav-page.nav-page-next a { + border-style: solid; + padding-left: 0.5rem; + border-radius: 8px; + padding-right: 0.5rem; + border-width: 1px; + margin-left: 0.5rem; + margin-right: 0.5rem; +} + +.nav-page-text { + font-size: 0.875em; + position: relative; + top: -1px; +} + +/* Stack prev/next nav vertically and center on mobile */ +@media (max-width: 576px) { + .page-navigation { + flex-direction: column; + align-items: center; + gap: 0.5rem; + } + + .nav-page.nav-page-previous, + .nav-page.nav-page-next { + width: auto; + text-align: center; + } +} + +/* Source link styling */ +.source-link { + font-size: 12px; + font-weight: 600; + color: steelblue !important; + text-decoration: underline !important; + text-underline-offset: 3px; + text-decoration-thickness: 1.5px; + letter-spacing: 0.5px; + transition: color 0.2s ease; +} + +.source-link:hover { + color: #2a5f8a !important; + text-decoration-thickness: 2px; +} + +/* Usage/Source row container */ +.usage-source-row { + display: flex; + justify-content: space-between; + align-items: baseline; + margin-bottom: -14px; +} + +/* Fix copy button positioning when usage-source-row is inside code-copy-outer-scaffold */ +.code-copy-outer-scaffold > .usage-source-row { + position: relative; + z-index: 1; +} + +.code-copy-outer-scaffold { + position: relative; +} + +// Override Quarto's `div.sourceCode { overflow: auto }` so the outer div +// does NOT scroll — only the

 inside scrolls.  This keeps .gd-code-nav
+// (position: absolute) anchored to the visible top-right corner.
+div.sourceCode {
+    overflow: visible;
+    position: relative;
+
+    > pre {
+        overflow-x: auto;
+    }
+}
+
+/* ---- Custom copy-code button (gd-code-nav) ---- */
+.gd-code-nav {
+    position: absolute;
+    top: 0;
+    right: 0;
+    z-index: 3;
+    padding: 0.35rem;
+}
+
+.gd-code-copy {
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    width: 28px;
+    height: 28px;
+    padding: 0;
+    border: 1px solid transparent;
+    border-radius: 4px;
+    background: transparent;
+    color: #6c757d;
+    cursor: pointer;
+    opacity: 0.25;
+    transition: opacity 0.15s ease, background-color 0.15s ease,
+        color 0.15s ease, border-color 0.15s ease;
+}
+
+.code-copy-outer-scaffold:hover .gd-code-copy,
+div.sourceCode:hover > .gd-code-nav .gd-code-copy,
+.gd-code-copy:focus-visible {
+    opacity: 1;
+}
+
+.gd-code-copy:hover {
+    background-color: rgba(0, 0, 0, 0.06);
+    border-color: rgba(0, 0, 0, 0.1);
+    color: #495057;
+}
+
+.gd-code-copy.gd-code-copied {
+    opacity: 1;
+    color: #198754;
+}
+
+/* Hide Quarto's native copy button (we provide our own) */
+.code-copy-button {
+    display: none !important;
+}
+
+/* Adjust mobile secondary nav positioning */
+@media (max-width: 991.98px) {
+    #quarto-header > .navbar .container-fluid.d-flex {
+        margin-left: 0;
+        padding-left: 5px;
+    }
+
+    /* Vertically center the toggle button and title in the secondary nav */
+    .quarto-secondary-nav .container-fluid.d-flex {
+        align-items: center;
+        padding-left: 1rem;
+    }
+
+    .quarto-secondary-nav-title {
+        padding-top: 0;
+        margin-bottom: 0.5rem;
+        padding-left: 0.5rem;
+    }
+
+    /* Reference title bar: "API / ObjectName" or "CLI / cmd" */
+    .gd-ref-title {
+        display: flex;
+        align-items: center;
+        gap: 0;
+        padding-top: 0;
+        padding-left: 0.5rem;
+        color: #6c757d;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+    }
+
+    .gd-ref-title-prefix {
+        font-weight: 600;
+        color: #495057;
+        flex-shrink: 0;
+    }
+
+    .gd-ref-title-sep {
+        margin: 0 0.4em;
+        color: #adb5bd;
+        flex-shrink: 0;
+    }
+
+    .gd-ref-title-name {
+        font-family: $font-family-monospace;
+        font-size: 18px;
+        color: #495057;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        position: relative;
+        top: 2px;
+    }
+
+    body.quarto-dark .gd-ref-title {
+        color: #868e96;
+    }
+
+    body.quarto-dark .gd-ref-title-prefix,
+    body.quarto-dark .gd-ref-title-name {
+        color: #ced4da;
+    }
+
+    body.quarto-dark .gd-ref-title-sep {
+        color: #6c757d;
+    }
+
+    /* Style the sidebar toggle to match the top-nav icon buttons */
+    .quarto-secondary-nav .quarto-btn-toggle {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        width: 34px;
+        height: 34px;
+        padding: 0;
+        background: rgba(0, 0, 0, 0.06);
+        border: 1px solid rgba(0, 0, 0, 0.15);
+        border-radius: 6px;
+        color: #495057;
+        cursor: pointer;
+        transition: all 0.2s ease;
+        margin-right: 6px;
+        flex-shrink: 0;
+
+        .bi {
+            font-size: 1.15rem;
+            line-height: 1;
+        }
+
+        &:hover {
+            background: rgba(0, 0, 0, 0.10);
+            border-color: rgba(0, 0, 0, 0.25);
+        }
+
+        &:focus {
+            outline: none;
+            box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.15);
+        }
+    }
+
+    body.quarto-dark .quarto-secondary-nav .quarto-btn-toggle {
+        background: rgba(255, 255, 255, 0.08);
+        border-color: rgba(255, 255, 255, 0.18);
+        color: #dee2e6;
+
+        &:hover {
+            background: rgba(255, 255, 255, 0.14);
+            border-color: rgba(255, 255, 255, 0.28);
+        }
+
+        &:focus {
+            box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
+        }
+    }
+
+    /* Move margin/sidebar content below main content on mobile (like pkgdown) */
+    #quarto-document-content {
+        display: flex;
+        flex-direction: column;
+    }
+
+    /* The column-margin content should appear after main content */
+    .column-margin {
+        order: 2;
+        margin-top: 2rem;
+        padding: 0.75rem 1.5rem 1.5rem 1.5rem;
+        background-color: #f8f9fa;
+        border-radius: 8px;
+        border: 1px solid #e9ecef;
+    }
+
+    /* Remove top margin from only the first heading */
+    .column-margin > div > section:first-child > h3 {
+        margin-top: 0.5em;
+    }
+
+    /* Ensure all child elements inside column-margin have transparent background */
+    .column-margin,
+    .column-margin > *,
+    .column-margin section,
+    .column-margin p,
+    .column-margin code {
+        background-color: #f8f9fa;
+    }
+
+    /* Main content comes first */
+    #quarto-document-content > *:not(.column-margin) {
+        order: 1;
+    }
+
+    /* Style adjustments for the collapsed sidebar content */
+    .column-margin h4 {
+        font-size: 0.9rem;
+        color: #495057;
+        border-bottom: 1px solid #dee2e6;
+        padding-bottom: 0.5rem;
+        margin-top: 1rem;
+    }
+
+    .column-margin h4:first-child {
+        margin-top: 0;
+    }
+
+    /* Add horizontal padding to main content on mobile */
+    #quarto-content {
+        padding-left: 12px;
+        padding-right: 12px;
+    }
+}
+
+/* ==========================================================================
+   GitHub Widget Styles
+   ========================================================================== */
+
+#github-widget {
+    position: relative;
+    display: inline-flex;
+    align-items: center;
+}
+
+.gh-widget-trigger {
+    display: flex;
+    align-items: center;
+    gap: 6px;
+    padding: 6px 10px;
+    background: rgba(0, 0, 0, 0.06);
+    border: 1px solid rgba(0, 0, 0, 0.15);
+    border-radius: 6px;
+    color: var(--gd-navbar-text);
+    cursor: pointer;
+    transition: all 0.2s ease;
+    font-size: 13px;
+}
+
+.gh-widget-trigger:hover {
+    background: rgba(0, 0, 0, 0.10);
+    border-color: rgba(0, 0, 0, 0.25);
+}
+
+.gh-widget-open .gh-widget-trigger {
+    background: rgba(0, 0, 0, 0.12);
+    border-color: rgba(0, 0, 0, 0.25);
+}
+
+.gh-icon {
+    flex-shrink: 0;
+}
+
+.gh-stats {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    margin-left: 4px;
+}
+
+.gh-stat {
+    display: flex;
+    align-items: center;
+    gap: 3px;
+    font-weight: 500;
+}
+
+.gh-stat svg {
+    opacity: 0.85;
+}
+
+.gh-count {
+    min-width: 16px;
+    text-align: center;
+}
+
+.gh-dropdown-arrow {
+    margin-left: 2px;
+    opacity: 0.7;
+    transition: transform 0.2s ease;
+}
+
+.gh-widget-open .gh-dropdown-arrow {
+    transform: rotate(180deg);
+}
+
+.gh-dropdown {
+    position: absolute;
+    top: calc(100% + 6px);
+    right: 0;
+    min-width: 180px;
+    background: #ffffff;
+    border: 1px solid #d0d7de;
+    border-radius: 8px;
+    box-shadow: 0 8px 24px rgba(31, 35, 40, 0.12);
+    opacity: 0;
+    visibility: hidden;
+    transform: translateY(-8px);
+    transition: all 0.2s ease;
+    z-index: 1000;
+    overflow: hidden;
+}
+
+.gh-widget-open .gh-dropdown {
+    opacity: 1;
+    visibility: visible;
+    transform: translateY(0);
+}
+
+.gh-dropdown-item {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    padding: 10px 14px;
+    color: #24292f !important;
+    text-decoration: none !important;
+    font-size: 14px;
+    font-weight: 500;
+    transition: background 0.15s ease;
+}
+
+.gh-dropdown-item:hover {
+    background: #f6f8fa;
+    text-decoration: none !important;
+}
+
+.gh-dropdown-item svg {
+    color: #57606a;
+    flex-shrink: 0;
+}
+
+.gh-dropdown-divider {
+    height: 1px;
+    margin: 4px 0;
+    background: #d8dee4;
+}
+
+.gh-badge {
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    min-width: 20px;
+    height: 20px;
+    padding: 0 6px;
+    margin-left: auto;
+    background: #ddf4ff;
+    color: #0969da;
+    border-radius: 10px;
+    font-size: 12px;
+    font-weight: 600;
+}
+
+/* ==========================================================================
+   Version Selector Widget — mirrors GitHub widget styling
+   ========================================================================== */
+
+.gd-version-selector {
+    position: relative;
+    display: flex;
+    align-items: center;
+}
+
+.gd-vs-trigger {
+    display: flex;
+    align-items: center;
+    gap: 6px;
+    padding: 6px 10px;
+    background: rgba(0, 0, 0, 0.06);
+    border: 1px solid rgba(0, 0, 0, 0.15);
+    border-radius: 6px;
+    color: var(--gd-navbar-text);
+    cursor: pointer;
+    transition: all 0.2s ease;
+    font-size: 13px;
+    font-weight: 500;
+    white-space: nowrap;
+}
+
+.gd-vs-trigger:hover {
+    background: rgba(0, 0, 0, 0.10);
+    border-color: rgba(0, 0, 0, 0.25);
+}
+
+.gd-vs-open .gd-vs-trigger {
+    background: rgba(0, 0, 0, 0.12);
+    border-color: rgba(0, 0, 0, 0.25);
+}
+
+.gd-vs-icon {
+    flex-shrink: 0;
+    width: 20px;
+    height: 20px;
+}
+
+.gd-vs-label {
+    line-height: 1;
+}
+
+.gd-vs-arrow {
+    margin-left: 2px;
+    opacity: 0.7;
+    transition: transform 0.2s ease;
+}
+
+.gd-vs-open .gd-vs-arrow {
+    transform: rotate(180deg);
+}
+
+.gd-vs-dropdown {
+    position: absolute;
+    top: calc(100% + 6px);
+    right: 0;
+    min-width: 170px;
+    background: #ffffff;
+    border: 1px solid #d0d7de;
+    border-radius: 8px;
+    box-shadow: 0 8px 24px rgba(31, 35, 40, 0.12);
+    opacity: 0;
+    visibility: hidden;
+    transform: translateY(-8px);
+    transition: all 0.2s ease;
+    z-index: 1000;
+    overflow: hidden;
+}
+
+.gd-vs-open .gd-vs-dropdown {
+    opacity: 1;
+    visibility: visible;
+    transform: translateY(0);
+}
+
+.gd-vs-item {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    padding: 8px 14px;
+    color: #24292f !important;
+    text-decoration: none !important;
+    font-size: 14px;
+    font-weight: 500;
+    transition: background 0.15s ease;
+}
+
+.gd-vs-item:hover {
+    background: #f6f8fa;
+}
+
+.gd-vs-item-active {
+    background: #f0f6ff;
+    font-weight: 600;
+}
+
+.gd-vs-badge {
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    width: 16px;
+    font-size: 12px;
+    flex-shrink: 0;
+}
+
+.gd-vs-badge-spacer {
+    display: inline-block;
+    width: 16px;
+    flex-shrink: 0;
+}
+
+.gd-vs-badge-pre {
+    color: #9a6700;
+}
+
+.gd-vs-badge-eol {
+    color: #cf222e;
+}
+
+.gd-vs-check {
+    margin-left: auto;
+    color: #1a7f37;
+    font-size: 12px;
+    flex-shrink: 0;
+}
+
+/* Compact version selector on mobile — hide version label, show icon only */
+@media (max-width: 991.98px) {
+    .gd-vs-label {
+        display: none;
+    }
+}
+
+/* Version warning banner */
+.gd-version-banner {
+    padding: 10px 20px;
+    font-size: 14px;
+    text-align: center;
+    font-weight: 500;
+    border-bottom: 1px solid;
+}
+
+.gd-version-banner a {
+    font-weight: 600;
+    text-decoration: underline;
+    margin-left: 4px;
+}
+
+.gd-version-banner-old {
+    background: #fff8c5;
+    color: #4d2d00;
+    border-color: #d4a72c;
+}
+
+.gd-version-banner-old a {
+    color: #4d2d00;
+}
+
+.gd-version-banner-pre {
+    background: #ddf4ff;
+    color: #0550ae;
+    border-color: #54aeff;
+}
+
+.gd-version-banner-pre a {
+    color: #0550ae;
+}
+
+.gd-version-banner-eol {
+    background: #ffebe9;
+    color: #82071e;
+    border-color: #ff8182;
+}
+
+.gd-version-banner-eol a {
+    color: #82071e;
+}
+
+/* Dark mode overrides for version selector */
+body.quarto-dark .gd-vs-trigger,
+html.quarto-dark .gd-vs-trigger,
+:root[data-bs-theme="dark"] .gd-vs-trigger {
+    background: rgba(255, 255, 255, 0.08);
+    border-color: rgba(255, 255, 255, 0.15);
+}
+
+body.quarto-dark .gd-vs-trigger:hover,
+html.quarto-dark .gd-vs-trigger:hover,
+:root[data-bs-theme="dark"] .gd-vs-trigger:hover {
+    background: rgba(255, 255, 255, 0.14);
+    border-color: rgba(255, 255, 255, 0.25);
+}
+
+body.quarto-dark .gd-vs-dropdown,
+html.quarto-dark .gd-vs-dropdown,
+:root[data-bs-theme="dark"] .gd-vs-dropdown {
+    background: var(--gd-bg-secondary);
+    border-color: var(--gd-border-color);
+    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
+}
+
+body.quarto-dark .gd-vs-item,
+html.quarto-dark .gd-vs-item,
+:root[data-bs-theme="dark"] .gd-vs-item {
+    color: #adbac7 !important;
+}
+
+body.quarto-dark .gd-vs-item:hover,
+html.quarto-dark .gd-vs-item:hover,
+:root[data-bs-theme="dark"] .gd-vs-item:hover {
+    background: #373e47;
+}
+
+body.quarto-dark .gd-vs-item-active,
+html.quarto-dark .gd-vs-item-active,
+:root[data-bs-theme="dark"] .gd-vs-item-active {
+    background: #1c3049;
+}
+
+body.quarto-dark .gd-vs-check,
+html.quarto-dark .gd-vs-check,
+:root[data-bs-theme="dark"] .gd-vs-check {
+    color: #57ab5a;
+}
+
+body.quarto-dark .gd-version-banner-old,
+html.quarto-dark .gd-version-banner-old,
+:root[data-bs-theme="dark"] .gd-version-banner-old {
+    background: #3d2e00;
+    color: #e3b341;
+    border-color: #5c4400;
+}
+
+body.quarto-dark .gd-version-banner-old a,
+html.quarto-dark .gd-version-banner-old a,
+:root[data-bs-theme="dark"] .gd-version-banner-old a {
+    color: #e3b341;
+}
+
+body.quarto-dark .gd-version-banner-pre,
+html.quarto-dark .gd-version-banner-pre,
+:root[data-bs-theme="dark"] .gd-version-banner-pre {
+    background: #0d2137;
+    color: #539bf5;
+    border-color: #1b3a57;
+}
+
+body.quarto-dark .gd-version-banner-pre a,
+html.quarto-dark .gd-version-banner-pre a,
+:root[data-bs-theme="dark"] .gd-version-banner-pre a {
+    color: #539bf5;
+}
+
+body.quarto-dark .gd-version-banner-eol,
+html.quarto-dark .gd-version-banner-eol,
+:root[data-bs-theme="dark"] .gd-version-banner-eol {
+    background: #3c1118;
+    color: #f47067;
+    border-color: #5c1a23;
+}
+
+body.quarto-dark .gd-version-banner-eol a,
+html.quarto-dark .gd-version-banner-eol a,
+:root[data-bs-theme="dark"] .gd-version-banner-eol a {
+    color: #f47067;
+}
+
+/* Inline version badges (gd-badge-new, gd-badge-changed, gd-badge-deprecated) */
+.gd-badge {
+    display: inline-block;
+    font-size: 0.7em;
+    font-weight: 600;
+    line-height: 1;
+    padding: 3px 8px;
+    border-radius: 10px;
+    vertical-align: middle;
+    margin-left: 6px;
+    white-space: nowrap;
+    letter-spacing: 0.01em;
+}
+
+.gd-badge-new {
+    background: #dafbe1;
+    color: #1a7f37;
+    border: 1px solid #a6e3b0;
+}
+
+.gd-badge-changed {
+    background: #ddf4ff;
+    color: #0550ae;
+    border: 1px solid #80ccff;
+}
+
+.gd-badge-deprecated {
+    background: #ffebe9;
+    color: #82071e;
+    border: 1px solid #ffb8b0;
+}
+
+body.quarto-dark .gd-badge-new,
+html.quarto-dark .gd-badge-new,
+:root[data-bs-theme="dark"] .gd-badge-new {
+    background: #0d3117;
+    color: #57ab5a;
+    border-color: #1b4b27;
+}
+
+body.quarto-dark .gd-badge-changed,
+html.quarto-dark .gd-badge-changed,
+:root[data-bs-theme="dark"] .gd-badge-changed {
+    background: #0d2137;
+    color: #539bf5;
+    border-color: #1b3a57;
+}
+
+body.quarto-dark .gd-badge-deprecated,
+html.quarto-dark .gd-badge-deprecated,
+:root[data-bs-theme="dark"] .gd-badge-deprecated {
+    background: #3c1118;
+    color: #f47067;
+    border-color: #5c1a23;
+}
+
+/* Mobile responsive adjustments */
+@media (max-width: 991.98px) {
+    /* Remove large side margins to align nav titles with page content */
+    #quarto-header > nav > div {
+        margin-left: 0%;
+        margin-right: 0%;
+    }
+
+    .container, .container-fluid, .container-xxl, .container-xl,
+    .container-lg, .container-md, .container-sm {
+        padding-right: calc(var(--bs-gutter-x) * .15);
+        padding-left: calc(var(--bs-gutter-x) * .15);
+    }
+
+    .navbar-expand-lg .navbar-nav .nav-link {
+        padding-left: 0.4rem;
+        padding-right: 0.6rem;
+        margin-left: -0.2rem;
+    }
+
+    /* Keep widget container in a row on mobile */
+    #gd-navbar-widgets {
+        gap: 4px;
+        margin-left: auto;
+    }
+
+    /* Make GitHub widget full width when inside collapsed nav */
+    .gh-widget-trigger {
+        width: 100%;
+        justify-content: flex-start;
+    }
+}
+
+/* Hide Supported by Posit badge at mobile (headroom--frozen would show it) */
+@media (max-width: 991.98px) {
+    #supported-by-posit {
+        display: none !important;
+    }
+}
+
+/* Reduce content grid side gutters at mobile */
+@media (max-width: 767.98px) {
+    body .page-columns {
+        grid-template-columns:
+            [screen-start] 0.5em
+            [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start]
+            minmax(0px, 1fr)
+            [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset]
+            0.5em [screen-end] !important;
+    }
+}
+
+@media (max-width: 768px) {
+    .gh-stats {
+        display: none;
+    }
+
+    .gh-widget-trigger {
+        padding: 6px 8px;
+    }
+
+    .gh-dropdown {
+        right: 0;
+        min-width: 160px;
+    }
+}
+
+/* Ensure navbar doesn't clip the dropdown */
+#quarto-header,
+#quarto-header nav,
+#quarto-header .navbar,
+#quarto-header .container-fluid,
+.navbar-nav.ms-auto,
+.navbar-nav.ms-auto > li,
+.navbar-nav.ms-auto > li > .nav-link {
+    overflow: visible !important;
+}
+
+/* Allow horizontal scrolling for navbars with many items */
+#navbarCollapse > ul.navbar-nav.navbar-nav-scroll.me-auto {
+    text-wrap: nowrap;
+    overflow-x: auto !important;
+}
+
+/* Print styles - hide widget */
+@media print {
+    #github-widget {
+        display: none;
+    }
+}
+
+/* ============================================
+   Reference Switcher Styles
+   ============================================ */
+
+.reference-switcher-container {
+    padding: 0.5rem 0.65rem;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.06);
+    background: transparent;
+}
+
+.reference-switcher {
+    display: flex;
+    gap: 0.25rem;
+    background: #f0f0f0;
+    border-radius: 6px;
+    padding: 0.2rem;
+}
+
+.reference-switcher-btn {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 0.35rem;
+    padding: 0.35rem 0.5rem;
+    border: none;
+    border-radius: 4px;
+    background: transparent;
+    color: #666;
+    font-size: 0.8rem;
+    font-weight: 500;
+    cursor: pointer;
+    transition: all 0.15s ease;
+}
+
+.reference-switcher-btn:hover {
+    background: rgba(255, 255, 255, 0.5);
+    color: #333;
+}
+
+.reference-switcher-btn.active {
+    background: #fff;
+    color: #333;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.reference-switcher-btn i {
+    font-size: 0.9rem;
+}
+
+/* Dark mode support for switcher */
+body.quarto-dark .reference-switcher {
+    background: #2a2a2a;
+}
+
+body.quarto-dark .reference-switcher-btn {
+    color: #999;
+}
+
+body.quarto-dark .reference-switcher-btn:hover {
+    background: rgba(255, 255, 255, 0.1);
+    color: #ccc;
+}
+
+body.quarto-dark .reference-switcher-btn.active {
+    background: #3a3a3a;
+    color: #fff;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+}
+
+/* ============================================
+   Sidebar Filter Styles
+   ============================================ */
+
+.sidebar-filter-container {
+    padding: 0.35rem 0.65rem 0.65rem 0rem;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+    background: transparent;
+    position: sticky;
+    top: 0;
+    z-index: 10;
+}
+
+.sidebar-filter-wrapper {
+    position: relative;
+    display: flex;
+    align-items: center;
+}
+
+.sidebar-filter-input {
+    width: 100%;
+    padding: 0.3rem 1.75rem 0.3rem 1.85rem;
+    font-size: 0.8rem;
+    border: 1px solid #e9e9e9;
+    border-radius: 4px;
+    background-color: #fff;
+    transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, background-color 0.15s ease-in-out;
+}
+
+.sidebar-filter-input:focus {
+    outline: none;
+    border-color: #86b7fe;
+    box-shadow: 0 0 0 0.15rem rgba(13, 110, 253, 0.12);
+    background-color: #fff;
+}
+
+.sidebar-filter-input::placeholder {
+    color: #999;
+    opacity: 1;
+}
+
+.sidebar-filter-icon {
+    position: absolute;
+    left: 0.55rem;
+    top: 50%;
+    transform: translateY(-50%);
+    color: #999;
+    pointer-events: none;
+    font-size: 0.75rem;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.sidebar-filter-clear {
+    position: absolute;
+    right: 0.35rem;
+    top: 50%;
+    transform: translateY(-50%);
+    background: none;
+    border: none;
+    color: #999;
+    cursor: pointer;
+    padding: 0.15rem;
+    line-height: 1;
+    border-radius: 3px;
+    transition: color 0.15s ease, background-color 0.15s ease;
+    font-size: 0.7rem;
+}
+
+.sidebar-filter-clear:hover {
+    color: #666;
+    background-color: rgba(0, 0, 0, 0.04);
+}
+
+.sidebar-filter-count {
+    font-size: 0.7rem;
+    color: #888;
+    text-align: center;
+    margin-top: 0.25rem;
+    padding: 0.1rem 0.4rem;
+    background: transparent;
+    border-radius: 3px;
+}
+
+.sidebar-filter-count .filter-count-num {
+    font-weight: 600;
+    color: #666;
+}
+
+/* Highlight matched items */
+.sidebar-item.sidebar-filter-match .sidebar-link {
+    background-color: rgba(255, 243, 205, 0.5);
+}
+
+/* Smooth transitions for showing/hiding items */
+.sidebar-item {
+    transition: opacity 0.15s ease;
+}
+
+/* Keyboard shortcut hint */
+.sidebar-filter-input:not(:focus)::placeholder {
+    /* Could show "/" hint here */
+}
+
+/* Mobile adjustments */
+@media (max-width: 991.98px) {
+    .sidebar-filter-container {
+        padding: 0.4rem 0.65rem;
+    }
+
+    .sidebar-filter-input {
+        font-size: 0.85rem;
+        padding: 0.35rem 1.75rem 0.35rem 1.85rem;
+    }
+}
+
+/* Dark mode support - uses Quarto's dark mode class */
+body.quarto-dark .sidebar-filter-container {
+    background: transparent;
+    border-bottom-color: rgba(255, 255, 255, 0.08);
+}
+
+body.quarto-dark .sidebar-filter-input {
+    background-color: #2a2a2a;
+    border-color: #3d3d3d;
+    color: #e0e0e0;
+}
+
+body.quarto-dark .sidebar-filter-input:focus {
+    border-color: #6ea8fe;
+    box-shadow: 0 0 0 0.15rem rgba(13, 110, 253, 0.25);
+    background-color: #333;
+}
+
+body.quarto-dark .sidebar-filter-input::placeholder {
+    color: #9e9e9e;
+}
+
+body.quarto-dark .sidebar-filter-icon,
+body.quarto-dark .sidebar-filter-clear {
+    color: #9e9e9e;
+}
+
+body.quarto-dark .sidebar-filter-clear:hover {
+    color: #e0e0e0;
+    background-color: rgba(255, 255, 255, 0.1);
+}
+
+body.quarto-dark .sidebar-filter-count {
+    color: #9e9e9e;
+}
+
+body.quarto-dark .sidebar-filter-count .filter-count-num {
+    color: #e0e0e0;
+}
+
+body.quarto-dark .sidebar-item.sidebar-filter-match .sidebar-link {
+    background-color: rgba(255, 193, 7, 0.2);
+}
+
+/* =====================================================
+   CLI Man-Page Styling
+   Terminal-like appearance for CLI documentation
+   ===================================================== */
+
+/* Style CLI page titles like API reference pages */
+/* Applied via post-render.py to CLI reference pages */
+h1.title.cli-title {
+    font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
+    font-size: 1.25rem;
+    font-weight: 600;
+}
+
+.cli-manpage {
+    width: 100%;
+}
+
+/* Main man-page code block */
+.cli-manpage pre {
+    font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+    font-size: 13px;
+    line-height: 1.6;
+    background: #012b15;
+    color: #d4d4d4;
+    border: none;
+    border-radius: 6px;
+    padding: 1.25rem 1.5rem;
+    overflow-x: auto;
+    white-space: pre;
+    margin-bottom: 1rem;
+    max-width: 100%;
+}
+
+.cli-manpage pre code {
+    font-family: inherit;
+    font-size: inherit;
+    background: transparent;
+    color: inherit;
+    padding: 0;
+    white-space: pre;
+}
+
+/* Light mode - keep the dark terminal look */
+[data-bs-theme="light"] .cli-manpage pre {
+    background: #1e1e1e;
+    color: #d4d4d4;
+}
+
+/* On large screens, expand CLI content area into the unused right margin space */
+/* The right sidebar ("On this page") is ~250px; we use half of that */
+@media (min-width: 992px) and (max-width: 1199.98px) {
+    .cli-manpage {
+        margin-top: 1.5rem;
+    }
+}
+
+@media (min-width: 1200px) {
+    .cli-manpage {
+        margin-top: 1.5rem;
+    }
+}
+
+/* Responsive adjustments for CLI docs */
+@media (min-width: 768px) and (max-width: 991.98px) {
+    .cli-manpage {
+        margin-top: 1.5rem;
+    }
+
+    .cli-manpage pre {
+        font-size: 12px;
+        padding: 1rem 1.25rem;
+        border-radius: 4px;
+    }
+
+    h1.title.cli-title {
+        font-size: 1.1rem;
+    }
+}
+
+@media (max-width: 767.98px) {
+    .cli-manpage {
+        margin-top: 1.5rem;
+    }
+
+    .cli-manpage pre {
+        font-size: 11px;
+        padding: 0.875rem 1rem;
+        line-height: 1.5;
+    }
+
+    h1.title.cli-title {
+        font-size: 1rem;
+    }
+}
+
+@media (max-width: 575.98px) {
+    .cli-manpage {
+        margin-top: 1.5rem;
+    }
+
+    .cli-manpage pre {
+        font-size: 10px;
+        padding: 0.75rem 0.875rem;
+        border-radius: 3px;
+    }
+
+    h1.title.cli-title {
+        font-size: 0.95rem;
+    }
+}
+
+/* ==========================================================================
+   Keyboard Shortcuts Navbar Button
+   ========================================================================== */
+
+/* Nav item containing the keyboard button - keep vertical alignment consistent */
+.nav-item:has(#gd-keyboard-btn-container) {
+    display: flex;
+    align-items: center;
+}
+
+#gd-keyboard-btn-container {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-right: 2px;
+}
+
+.gd-keyboard-btn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 34px;
+    height: 34px;
+    padding: 0;
+    background: rgba(0, 0, 0, 0.06);
+    border: 1px solid rgba(0, 0, 0, 0.15);
+    border-radius: 6px;
+    color: var(--gd-navbar-text);
+    cursor: pointer;
+    transition: all 0.2s ease;
+
+    &:hover {
+        background: rgba(0, 0, 0, 0.10);
+        border-color: rgba(0, 0, 0, 0.25);
+    }
+
+    &:focus {
+        outline: none;
+        box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.15);
+    }
+
+    svg {
+        display: block;
+    }
+}
+
+/* Hide on mobile — keyboard shortcuts are desktop-only */
+@media (max-width: 991.98px) {
+    #gd-navbar-widgets > #gd-keyboard-btn-container,
+    #gd-keyboard-btn-container {
+        display: none;
+    }
+}
+
+body.quarto-dark .gd-keyboard-btn {
+    background: rgba(255, 255, 255, 0.08);
+    border-color: rgba(255, 255, 255, 0.18);
+    color: #f8f9fa;
+
+    &:hover {
+        background: rgba(255, 255, 255, 0.14);
+        border-color: rgba(255, 255, 255, 0.28);
+    }
+
+    &:focus {
+        box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
+    }
+}
+
+/* ==========================================================================
+   Dark Mode Toggle Button Styles
+   ========================================================================== */
+
+/* Nav item containing the toggle - vertical alignment with GitHub widget */
+.nav-item:has(#dark-mode-toggle-container) {
+    display: flex;
+    align-items: center;
+}
+
+#dark-mode-toggle-container {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-right: 0;
+}
+
+.dark-mode-toggle {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 34px;
+    height: 34px;
+    padding: 0;
+    background: rgba(0, 0, 0, 0.06);
+    border: 1px solid rgba(0, 0, 0, 0.15);
+    border-radius: 6px;
+    color: var(--gd-navbar-text);
+    cursor: pointer;
+    transition: all 0.2s ease;
+}
+
+.dark-mode-toggle:hover {
+    background: rgba(0, 0, 0, 0.10);
+    border-color: rgba(0, 0, 0, 0.25);
+}
+
+.dark-mode-toggle:focus {
+    outline: none;
+    box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.15);
+}
+
+.dark-mode-toggle svg {
+    display: block;
+}
+
+.theme-icon-light,
+.theme-icon-dark {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+/* ==========================================================================
+   Dark Mode - Core Styles
+   ========================================================================== */
+
+/* CSS Custom Properties for theming */
+:root {
+    --gd-bg-primary: #FCFEFF;
+    --gd-bg-secondary: #FAFAFD;
+    --gd-bg-tertiary: #F7F1EB;
+    --gd-text-primary: rgb(18, 18, 18);
+    --gd-text-secondary: #333;
+    --gd-text-muted: #666;
+    --gd-border-color: #e9e9e9;
+    --gd-border-light: #E7EAF6;
+    --gd-link-color: black;
+    --gd-code-bg: #f8f9fa;
+    --gd-code-color: rgb(18, 18, 18);
+    --gd-blockquote-bg: #E8E8E8;
+    --gd-sidebar-bg: #FAFAFD;
+    --gd-navbar-bg: #f0f0f0;
+    --gd-navbar-text: #2d2d2d;
+    --gd-footer-text: rgb(48, 48, 48);
+    --gd-highlight-color: rgba(255, 243, 205, 0.5);
+    --gd-active-link: rgb(244, 121, 0);
+    --gd-accent-blue: rgba(101, 180, 237, 0.75);
+
+    /* Syntax highlighting - light mode */
+    --gd-syn-class: #0e84b5;
+    --gd-syn-name: #4758AB;
+    --gd-syn-none: #7D4E9E;
+    --gd-syn-bool: #0077AA;
+    --gd-syn-operator: #D14D00;
+    --gd-syn-keyword: #008000;
+    --gd-syn-string: #BA2121;
+    --gd-syn-number: #666666;
+    --gd-syn-comment: #408080;
+    --gd-syn-function: #0000FF;
+    --gd-syn-builtin: #008000;
+}
+
+/* Dark mode custom properties */
+html.quarto-dark,
+body.quarto-dark {
+    --gd-bg-primary: #1a1a1a;
+    --gd-bg-secondary: #222222;
+    --gd-bg-tertiary: #2a2a2a;
+    --gd-text-primary: #e0e0e0;
+    --gd-text-secondary: #c8c8c8;
+    --gd-text-muted: #999;
+    --gd-border-color: #3d3d3d;
+    --gd-border-light: #333;
+    --gd-link-color: #7cb8e8;
+    --gd-code-bg: #2a2a2a;
+    --gd-code-color: #e0e0e0;
+    --gd-blockquote-bg: #2a2a2a;
+    --gd-sidebar-bg: #1e1e1e;
+    --gd-navbar-bg: #1a1a1a;
+    --gd-navbar-text: #e0e0e0;
+    --gd-footer-text: #b0b0b0;
+    --gd-highlight-color: rgba(255, 193, 7, 0.2);
+    --gd-active-link: #ff9f43;
+    --gd-accent-blue: rgba(101, 180, 237, 0.6);
+
+    /* Syntax highlighting - dark mode (optimized for contrast) */
+    --gd-syn-class: #56c8ff;
+    --gd-syn-name: #8cb4ff;
+    --gd-syn-none: #c792ea;
+    --gd-syn-bool: #56c8ff;
+    --gd-syn-operator: #ff9f43;
+    --gd-syn-keyword: #c792ea;
+    --gd-syn-string: #c3e88d;
+    --gd-syn-number: #f78c6c;
+    --gd-syn-comment: #8891b3;
+    --gd-syn-function: #82aaff;
+    --gd-syn-builtin: #ffcb6b;
+}
+
+/* ==========================================================================
+   Dark Mode - Body & Background
+   ========================================================================== */
+
+body.quarto-dark {
+    background-color: var(--gd-bg-primary);
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .quarto-body-content {
+    background-color: var(--gd-bg-primary);
+}
+
+/* Main page structure elements */
+body.quarto-dark #quarto-content {
+    background-color: var(--gd-bg-primary);
+}
+
+body.quarto-dark #quarto-document-content {
+    background-color: var(--gd-bg-primary);
+}
+
+body.quarto-dark main.content {
+    background-color: var(--gd-bg-primary);
+}
+
+body.quarto-dark .page-columns {
+    background-color: var(--gd-bg-primary);
+}
+
+body.quarto-dark .page-rows-contents {
+    background-color: var(--gd-bg-primary);
+}
+
+body.quarto-dark .column-body {
+    background-color: var(--gd-bg-primary);
+}
+
+body.quarto-dark .column-page {
+    background-color: var(--gd-bg-primary);
+}
+
+body.quarto-dark article {
+    background-color: var(--gd-bg-primary);
+}
+
+body.quarto-dark section {
+    background-color: var(--gd-bg-primary);
+}
+
+/* Ensure the html element also has dark background */
+html.quarto-dark {
+    background-color: var(--gd-bg-primary);
+}
+
+/* ==========================================================================
+   Dark Mode - Typography & Links
+   ========================================================================== */
+
+body.quarto-dark h1,
+body.quarto-dark h2,
+body.quarto-dark h3,
+body.quarto-dark h4,
+body.quarto-dark h5,
+body.quarto-dark h6 {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark p,
+body.quarto-dark li,
+body.quarto-dark dd,
+body.quarto-dark dt {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark p a,
+body.quarto-dark li a {
+    color: var(--gd-link-color);
+}
+
+body.quarto-dark p a:hover,
+body.quarto-dark li a:hover {
+    color: #9dcaf0;
+}
+
+/* Author/funder icon links in dark mode */
+body.quarto-dark .column-margin a:has(.bi),
+body.quarto-dark .column-margin a:has(.fa-brands),
+body.quarto-dark .column-margin a:has(.ror-sidebar-icon) {
+    color: #adb5bd;
+}
+
+body.quarto-dark .column-margin a:has(.bi):hover,
+body.quarto-dark .column-margin a:has(.fa-brands):hover,
+body.quarto-dark .column-margin a:has(.ror-sidebar-icon):hover {
+    color: #dee2e6;
+}
+
+body.quarto-dark .table a {
+    color: var(--gd-link-color);
+}
+
+/* ==========================================================================
+   Dark Mode - Code & Syntax Highlighting
+   ========================================================================== */
+
+body.quarto-dark code {
+    color: var(--gd-code-color);
+    background-color: var(--gd-code-bg);
+}
+
+body.quarto-dark pre {
+    background-color: var(--gd-bg-tertiary);
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark pre code {
+    background-color: transparent;
+    color: var(--gd-text-primary);
+}
+
+/* Override Quarto's default code token colors for dark mode */
+body.quarto-dark .sourceCode span,
+body.quarto-dark pre.sourceCode code span {
+    color: var(--gd-text-primary);
+}
+
+/* Shell/bash specific - ensure all text is readable */
+body.quarto-dark pre.bash code,
+body.quarto-dark pre.sh code,
+body.quarto-dark pre.shell code,
+body.quarto-dark .sourceCode.bash code,
+body.quarto-dark .sourceCode.sh code,
+body.quarto-dark div.sourceCode[data-language="bash"] code,
+body.quarto-dark div.sourceCode[data-language="sh"] code {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .sourceCode.bash span,
+body.quarto-dark .sourceCode.sh span,
+body.quarto-dark div.sourceCode[data-language="bash"] span,
+body.quarto-dark div.sourceCode[data-language="sh"] span {
+    color: var(--gd-text-primary) !important;
+}
+
+/* Ensure inline code in dark mode has proper contrast */
+body.quarto-dark :not(pre) > code {
+    color: #f0a0a0;
+    background-color: var(--gd-code-bg);
+}
+
+/* Signature highlighting - dark mode */
+body.quarto-dark code span.sig-class {
+    color: var(--gd-syn-class) !important;
+}
+
+body.quarto-dark code span.sig-name {
+    color: var(--gd-syn-name) !important;
+}
+
+body.quarto-dark code span.cn-none {
+    color: var(--gd-syn-none) !important;
+}
+
+body.quarto-dark code span.cn-bool {
+    color: var(--gd-syn-bool) !important;
+}
+
+body.quarto-dark #cb1 code span.op {
+    color: var(--gd-syn-operator) !important;
+}
+
+/* Spacer between overloaded function signatures - dark mode inherits from light */
+body.quarto-dark #cb1 code span.overload-spacer {
+    display: block;
+    height: 0.35em;
+    user-select: none;
+}
+
+/* Pandoc/Quarto syntax highlighting tokens - dark mode */
+body.quarto-dark .sourceCode span.kw,       /* Keywords */
+body.quarto-dark .highlight span.k {
+    color: var(--gd-syn-keyword);
+}
+
+body.quarto-dark .sourceCode span.cf {      /* Control flow */
+    color: var(--gd-syn-keyword);
+}
+
+body.quarto-dark .sourceCode span.op {      /* Operators */
+    color: var(--gd-syn-operator);
+}
+
+body.quarto-dark .sourceCode span.st,       /* Strings */
+body.quarto-dark .highlight span.s,
+body.quarto-dark .highlight span.s1,
+body.quarto-dark .highlight span.s2 {
+    color: var(--gd-syn-string);
+}
+
+body.quarto-dark .sourceCode span.dv,       /* Decimal values */
+body.quarto-dark .sourceCode span.fl,       /* Floats */
+body.quarto-dark .sourceCode span.bn,       /* Base-N integers */
+body.quarto-dark .highlight span.mi,
+body.quarto-dark .highlight span.mf {
+    color: var(--gd-syn-number);
+}
+
+body.quarto-dark .sourceCode span.co,       /* Comments */
+body.quarto-dark .highlight span.c,
+body.quarto-dark .highlight span.c1,
+body.quarto-dark .highlight span.cm {
+    color: var(--gd-syn-comment);
+    font-style: italic;
+}
+
+body.quarto-dark .sourceCode span.fu,       /* Functions */
+body.quarto-dark .highlight span.nf {
+    color: var(--gd-syn-function);
+}
+
+body.quarto-dark .sourceCode span.bu,       /* Built-ins */
+body.quarto-dark .highlight span.nb {
+    color: var(--gd-syn-builtin);
+}
+
+body.quarto-dark .sourceCode span.va,       /* Variables */
+body.quarto-dark .sourceCode span.at,       /* Attributes */
+body.quarto-dark .highlight span.n {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .sourceCode span.sc {      /* Special characters */
+    color: var(--gd-syn-string);
+}
+
+body.quarto-dark .sourceCode span.ss {      /* Special strings */
+    color: var(--gd-syn-string);
+}
+
+body.quarto-dark .sourceCode span.im {      /* Import */
+    color: var(--gd-syn-keyword);
+}
+
+body.quarto-dark .sourceCode span.cn {      /* Constants (None, True, False) */
+    color: var(--gd-syn-none);
+}
+
+body.quarto-dark .sourceCode span.dt {      /* Data types */
+    color: var(--gd-syn-class);
+}
+
+body.quarto-dark .sourceCode span.an {      /* Annotation */
+    color: var(--gd-syn-comment);
+}
+
+body.quarto-dark .sourceCode span.pp {      /* Preprocessor */
+    color: var(--gd-syn-keyword);
+}
+
+body.quarto-dark .sourceCode span.ex {      /* Extension */
+    color: var(--gd-syn-function);
+}
+
+body.quarto-dark .sourceCode span.do {      /* Documentation */
+    color: var(--gd-syn-comment);
+    font-style: italic;
+}
+
+body.quarto-dark .sourceCode span.al {      /* Alert */
+    color: #ff5555;
+    font-weight: bold;
+}
+
+body.quarto-dark .sourceCode span.er {      /* Error */
+    color: #ff5555;
+}
+
+body.quarto-dark .sourceCode span.wa {      /* Warning */
+    color: #ffb86c;
+}
+
+body.quarto-dark .sourceCode span.in {      /* Information */
+    color: var(--gd-syn-comment);
+}
+
+/* ==========================================================================
+   Dark Mode - Parameter Documentation
+   ========================================================================== */
+
+/* Parameter definitions in dt elements */
+body.quarto-dark dt code {
+    color: var(--gd-text-primary);
+    background-color: var(--gd-code-bg);
+}
+
+/* Override Quarto syntax highlighting 'code span { color: #003B4F }' for dt spans */
+body.quarto-dark dt code span {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .parameter-name {
+    color: #82aaff;
+}
+
+body.quarto-dark .parameter-name strong {
+    color: #82aaff;
+}
+
+body.quarto-dark .parameter-annotation {
+    color: #c792ea;
+}
+
+body.quarto-dark .parameter-annotation-sep {
+    color: var(--gd-text-muted);
+}
+
+body.quarto-dark .parameter-default {
+    color: #c3e88d;
+}
+
+body.quarto-dark .parameter-default-sep {
+    color: var(--gd-text-muted);
+}
+
+/* Doc section styling */
+body.quarto-dark .doc-section dt {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .doc-section dd {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .doc-section-parameters dt code {
+    color: var(--gd-text-primary);
+}
+
+/* Warnings section dark mode */
+body.quarto-dark .doc-section-warnings > h2 {
+    color: #FCA5A5;
+}
+
+body.quarto-dark .doc-section-warnings > p {
+    background-color: rgba(220, 38, 38, 0.1);
+    border-left-color: #EF4444;
+    color: var(--gd-text-primary);
+}
+
+/* ==========================================================================
+   Dark Mode - Cell Output
+   ========================================================================== */
+
+body.quarto-dark .cell-output.cell-output-stdout {
+    background-color: var(--gd-bg-tertiary);
+    border-color: var(--gd-border-color);
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .cell-output.cell-output-stderr {
+    background-color: rgba(255, 85, 85, 0.1);
+    border-color: rgba(255, 85, 85, 0.3);
+}
+
+/* ==========================================================================
+   Dark Mode - Blockquotes
+   ========================================================================== */
+
+body.quarto-dark .blockquote,
+body.quarto-dark blockquote {
+    background-color: var(--gd-blockquote-bg);
+    border-left-color: var(--gd-accent-blue);
+    color: var(--gd-text-secondary);
+}
+
+/* ==========================================================================
+   Dark Mode - Sidebar
+   ========================================================================== */
+
+body.quarto-dark #quarto-sidebar {
+    background-color: var(--gd-sidebar-bg);
+    border-right-color: var(--gd-border-color);
+}
+
+body.quarto-dark .sidebar-menu-container {
+    border-bottom-color: var(--gd-border-color);
+}
+
+body.quarto-dark #quarto-sidebar .sidebar-item-text {
+    color: var(--gd-text-secondary);
+}
+
+body.quarto-dark #quarto-sidebar .sidebar-item-text:hover {
+    color: var(--gd-text-primary);
+}
+
+/* Hover effect for clickable sidebar links in dark mode */
+body.quarto-dark #quarto-sidebar .sidebar-link[href]::before {
+    background-color: rgba(255, 255, 255, 0.04);
+    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15);
+}
+
+body.quarto-dark #quarto-sidebar a.sidebar-item-text.sidebar-link.active {
+    color: var(--gd-active-link);
+}
+
+body.quarto-dark a.sidebar-item-text.sidebar-link.text-start > span {
+    color: #9e9e9e;
+}
+
+/* Toggle already hidden via display:none above; no dark-mode override needed */
+
+body.quarto-dark .sidebar-tools-collapse {
+    color: var(--gd-text-muted);
+}
+
+/* ==========================================================================
+   Dark Mode - Navbar
+   ========================================================================== */
+
+body.quarto-dark .navbar {
+    background: var(--gd-navbar-bg) !important;
+    border-bottom: 1px solid var(--gd-border-color);
+}
+
+body.quarto-dark .navbar-brand img {
+    /* no border overrides needed */
+}
+
+body.quarto-dark .navbar-title {
+    color: var(--gd-navbar-text);
+}
+
+body.quarto-dark .version-badge {
+    color: rgba(224, 224, 224, 0.75);
+    background-color: rgba(255, 255, 255, 0.1);
+}
+
+body.quarto-dark #navbarCollapse > ul.navbar-nav.navbar-nav-scroll.me-auto > li > a {
+    color: #e0e0e0;
+}
+
+body.quarto-dark #navbarCollapse > ul.navbar-nav.navbar-nav-scroll.me-auto > li > a:hover {
+    background-color: rgb(240, 112, 0);
+    color: white;
+}
+
+/* Dark mode toggle in dark mode */
+body.quarto-dark .dark-mode-toggle {
+    background: rgba(255, 255, 255, 0.08);
+    border-color: rgba(255, 255, 255, 0.15);
+    color: #e0e0e0;
+}
+
+body.quarto-dark .dark-mode-toggle:hover {
+    background: rgba(255, 255, 255, 0.12);
+    border-color: rgba(255, 255, 255, 0.25);
+}
+
+/* ==========================================================================
+   Dark Mode - Right Sidebar (TOC)
+   ========================================================================== */
+
+body.quarto-dark #quarto-margin-sidebar {
+    color: var(--gd-text-secondary);
+}
+
+body.quarto-dark #quarto-margin-sidebar nav a {
+    color: var(--gd-text-muted);
+}
+
+body.quarto-dark #quarto-margin-sidebar nav a:hover {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark #quarto-margin-sidebar nav a.active {
+    color: var(--gd-active-link);
+}
+
+body.quarto-dark #toc-title {
+    color: var(--gd-text-primary);
+}
+
+/* ==========================================================================
+   Dark Mode - Footer
+   ========================================================================== */
+
+body.quarto-dark .nav-footer {
+    background-color: var(--gd-bg-secondary);
+    border-top: 1px solid var(--gd-border-color);
+}
+
+body.quarto-dark .nav-footer-left,
+body.quarto-dark .nav-footer-right,
+body.quarto-dark .nav-footer-center {
+    color: var(--gd-footer-text);
+}
+
+body.quarto-dark .nav-footer a {
+    color: var(--gd-link-color);
+}
+
+/* ==========================================================================
+   Dark Mode - Tables
+   ========================================================================== */
+
+body.quarto-dark .table {
+    color: var(--gd-text-primary);
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark .table th {
+    background-color: var(--gd-bg-secondary);
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark .table td {
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark .table-striped > tbody > tr:nth-of-type(odd) > * {
+    background-color: var(--gd-bg-tertiary);
+}
+
+body.quarto-dark .table-hover > tbody > tr:hover > * {
+    background-color: rgba(255, 255, 255, 0.05);
+}
+
+/* ==========================================================================
+   Dark Mode - Cards & Panels
+   ========================================================================== */
+
+body.quarto-dark .card {
+    background-color: var(--gd-bg-secondary);
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark .card-header {
+    background-color: var(--gd-bg-tertiary);
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark .callout {
+    background-color: var(--gd-bg-secondary);
+    border-color: var(--gd-border-color);
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .callout .callout-header {
+    background-color: var(--gd-bg-secondary) !important;
+}
+
+body.quarto-dark .callout .callout-icon::before {
+    filter: invert(1);
+}
+
+body.quarto-dark .callout .callout-title-container {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .callout .callout-body p {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .callout-note {
+    border-left-color: #6ea8fe;
+}
+
+body.quarto-dark .callout-warning {
+    border-left-color: #ffb86c;
+}
+
+body.quarto-dark .callout-important {
+    border-left-color: #ff5555;
+}
+
+body.quarto-dark .callout-tip {
+    border-left-color: #50fa7b;
+}
+
+/* ==========================================================================
+   Dark Mode - Forms & Inputs
+   ========================================================================== */
+
+body.quarto-dark input,
+body.quarto-dark textarea,
+body.quarto-dark select {
+    background-color: var(--gd-bg-tertiary);
+    border-color: var(--gd-border-color);
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark input:focus,
+body.quarto-dark textarea:focus,
+body.quarto-dark select:focus {
+    border-color: #6ea8fe;
+    box-shadow: 0 0 0 0.15rem rgba(110, 168, 254, 0.25);
+}
+
+body.quarto-dark input::placeholder {
+    color: var(--gd-text-muted);
+}
+
+/* ==========================================================================
+   Dark Mode - Search
+   ========================================================================== */
+
+body.quarto-dark #quarto-search,
+html.quarto-dark #quarto-search,
+:root[data-bs-theme="dark"] #quarto-search {
+    background-color: transparent;
+}
+
+body.quarto-dark #quarto-search input,
+html.quarto-dark #quarto-search input,
+:root[data-bs-theme="dark"] #quarto-search input {
+    background-color: var(--gd-bg-tertiary);
+    border-color: var(--gd-border-color);
+    color: var(--gd-text-primary) !important;
+}
+
+body.quarto-dark #quarto-search .aa-SubmitButton,
+html.quarto-dark #quarto-search .aa-SubmitButton,
+:root[data-bs-theme="dark"] #quarto-search .aa-SubmitButton {
+    background-color: transparent;
+    color: var(--gd-text-muted) !important;
+}
+
+body.quarto-dark #quarto-search .aa-DetachedSearchButton {
+    background: rgba(255, 255, 255, 0.08);
+    border-color: rgba(255, 255, 255, 0.15);
+    color: #e0e0e0;
+}
+
+body.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,
+body.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,
+body.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-SearchIcon,
+html.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,
+html.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,
+html.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-SearchIcon,
+:root[data-bs-theme="dark"] #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,
+:root[data-bs-theme="dark"] #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,
+:root[data-bs-theme="dark"] #quarto-search .aa-DetachedSearchButton .aa-SearchIcon {
+    color: #e0e0e0 !important;
+    fill: #e0e0e0 !important;
+}
+
+body.quarto-dark #quarto-search .aa-DetachedSearchButton:hover {
+    background: rgba(255, 255, 255, 0.12);
+    border-color: rgba(255, 255, 255, 0.25);
+}
+
+body.quarto-dark #quarto-search .aa-DetachedSearchButton:focus {
+    outline: none;
+    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.15);
+}
+
+body.quarto-dark .navbar .quarto-navbar-tools button,
+body.quarto-dark .navbar .quarto-navbar-tools .quarto-navigation-tool {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 34px;
+    height: 34px;
+    padding: 0;
+    background: rgba(255, 255, 255, 0.08);
+    border: 1px solid rgba(255, 255, 255, 0.15);
+    border-radius: 6px;
+    color: #e0e0e0;
+    cursor: pointer;
+    transition: all 0.2s ease;
+}
+
+body.quarto-dark .navbar .quarto-navbar-tools button:hover,
+body.quarto-dark .navbar .quarto-navbar-tools .quarto-navigation-tool:hover {
+    background: rgba(255, 255, 255, 0.12);
+    border-color: rgba(255, 255, 255, 0.25);
+}
+
+/* GitHub icon (icon mode) — dark mode */
+body.quarto-dark .navbar .nav-item.compact .nav-link,
+body.quarto-dark .navbar .gd-navbar-icon {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 34px;
+    height: 34px;
+    padding: 0;
+    background: rgba(255, 255, 255, 0.08);
+    border: 1px solid rgba(255, 255, 255, 0.15);
+    border-radius: 6px;
+    color: #e0e0e0;
+    cursor: pointer;
+    transition: all 0.2s ease;
+}
+
+body.quarto-dark .navbar .nav-item.compact .nav-link:hover,
+body.quarto-dark .navbar .gd-navbar-icon:hover {
+    background: rgba(255, 255, 255, 0.12);
+    border-color: rgba(255, 255, 255, 0.25);
+}
+
+body.quarto-dark .navbar .navbar-toggler {
+    border: none;
+    --bs-navbar-toggler-focus-width: 0;
+}
+
+body.quarto-dark .navbar .navbar-toggler:focus {
+    box-shadow: none;
+    outline: none;
+}
+
+body.quarto-dark .navbar .navbar-toggler .navbar-toggler-icon {
+    --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23e0e0e0' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+body.quarto-dark .aa-Panel {
+    background-color: var(--gd-bg-secondary);
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark .aa-Item {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .aa-Item:hover,
+body.quarto-dark .aa-Item[aria-selected="true"] {
+    background-color: var(--gd-bg-tertiary);
+}
+
+/* Search results styling - ensure readable text in dark mode */
+body.quarto-dark .search-result-title,
+body.quarto-dark p.search-result-title,
+body.quarto-dark .aa-Panel .search-result-title,
+body.quarto-dark #quarto-search-results .search-result-title,
+html.quarto-dark .search-result-title,
+html.quarto-dark p.search-result-title {
+    color: var(--gd-text-primary) !important;
+}
+
+body.quarto-dark .search-result-header,
+body.quarto-dark div.search-result-header,
+body.quarto-dark .aa-Panel .search-result-header,
+body.quarto-dark #quarto-search-results .search-result-header,
+html.quarto-dark .search-result-header,
+html.quarto-dark div.search-result-header {
+    color: var(--gd-text-secondary) !important;
+}
+
+body.quarto-dark .search-result-text {
+    color: var(--gd-text-secondary);
+}
+
+body.quarto-dark .search-result-doc-title {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .search-result-section {
+    color: var(--gd-text-muted);
+}
+
+body.quarto-dark .aa-SourceHeader {
+    color: var(--gd-text-muted);
+    border-bottom-color: var(--gd-border-color);
+}
+
+body.quarto-dark .aa-SourceNoResults {
+    color: var(--gd-text-muted);
+}
+
+body.quarto-dark .quarto-search-results {
+    background-color: var(--gd-bg-secondary);
+}
+
+body.quarto-dark .search-result-link {
+    color: var(--gd-link-color);
+}
+
+body.quarto-dark .search-result-link:hover {
+    color: #9dcaf0;
+}
+
+/* Algolia/Autocomplete specific dark mode */
+body.quarto-dark .aa-Autocomplete {
+    background-color: transparent;
+}
+
+body.quarto-dark .aa-Form,
+html.quarto-dark .aa-Form,
+:root[data-bs-theme="dark"] .aa-Form {
+    background-color: var(--gd-bg-tertiary);
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark .aa-Input,
+html.quarto-dark .aa-Input,
+:root[data-bs-theme="dark"] .aa-Input {
+    color: var(--gd-text-primary) !important;
+    background-color: transparent;
+}
+
+body.quarto-dark .aa-InputWrapperPrefix,
+body.quarto-dark .aa-InputWrapperSuffix,
+html.quarto-dark .aa-InputWrapperPrefix,
+html.quarto-dark .aa-InputWrapperSuffix,
+:root[data-bs-theme="dark"] .aa-InputWrapperPrefix,
+:root[data-bs-theme="dark"] .aa-InputWrapperSuffix {
+    color: var(--gd-text-muted);
+}
+
+body.quarto-dark .aa-SubmitButton,
+html.quarto-dark .aa-SubmitButton,
+:root[data-bs-theme="dark"] .aa-SubmitButton,
+body.quarto-dark .aa-SubmitIcon,
+html.quarto-dark .aa-SubmitIcon,
+:root[data-bs-theme="dark"] .aa-SubmitIcon,
+body.quarto-dark svg.aa-SubmitIcon,
+html.quarto-dark svg.aa-SubmitIcon,
+:root[data-bs-theme="dark"] svg.aa-SubmitIcon {
+    color: var(--gd-text-muted) !important;
+    fill: var(--gd-text-muted) !important;
+}
+
+body.quarto-dark .aa-ClearButton,
+html.quarto-dark .aa-ClearButton,
+:root[data-bs-theme="dark"] .aa-ClearButton,
+body.quarto-dark .aa-ClearIcon,
+html.quarto-dark .aa-ClearIcon,
+:root[data-bs-theme="dark"] .aa-ClearIcon,
+body.quarto-dark svg.aa-ClearIcon,
+html.quarto-dark svg.aa-ClearIcon,
+:root[data-bs-theme="dark"] svg.aa-ClearIcon {
+    color: var(--gd-text-muted) !important;
+    fill: var(--gd-text-muted) !important;
+}
+
+body.quarto-dark .aa-ClearButton:hover,
+html.quarto-dark .aa-ClearButton:hover,
+:root[data-bs-theme="dark"] .aa-ClearButton:hover,
+body.quarto-dark .aa-ClearButton:hover svg.aa-ClearIcon,
+html.quarto-dark .aa-ClearButton:hover svg.aa-ClearIcon,
+:root[data-bs-theme="dark"] .aa-ClearButton:hover svg.aa-ClearIcon {
+    color: var(--gd-text-primary) !important;
+    fill: var(--gd-text-primary) !important;
+}
+
+/* ==========================================================================
+   Dark Mode - GitHub Widget
+   ========================================================================== */
+
+body.quarto-dark .gh-widget-trigger {
+    background: rgba(255, 255, 255, 0.08);
+    border-color: rgba(255, 255, 255, 0.15);
+    color: #e0e0e0;
+}
+
+body.quarto-dark .gh-widget-trigger:hover {
+    background: rgba(255, 255, 255, 0.12);
+    border-color: rgba(255, 255, 255, 0.25);
+}
+
+/* Suppress the nav-link hover background that wraps the GitHub widget */
+body.quarto-dark .nav-item:has(#github-widget) > a:hover,
+body.quarto-dark .nav-item:has(#github-widget) .nav-link:hover {
+    background: transparent !important;
+    background-color: transparent !important;
+    box-shadow: none !important;
+}
+
+body.quarto-dark .gh-dropdown {
+    background: var(--gd-bg-secondary);
+    border-color: var(--gd-border-color);
+    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
+}
+
+body.quarto-dark .gh-dropdown-item {
+    color: var(--gd-text-primary) !important;
+}
+
+body.quarto-dark .gh-dropdown-item:hover {
+    background: var(--gd-bg-tertiary);
+}
+
+body.quarto-dark .gh-dropdown-item svg {
+    color: var(--gd-text-muted);
+}
+
+body.quarto-dark .gh-dropdown-divider {
+    background: var(--gd-border-color);
+}
+
+body.quarto-dark .gh-badge {
+    background: rgba(110, 168, 254, 0.2);
+    color: #6ea8fe;
+}
+
+/* ==========================================================================
+   Dark Mode - Source Link
+   ========================================================================== */
+
+body.quarto-dark .source-link {
+    color: #7cb8e8 !important;
+}
+
+body.quarto-dark .source-link:hover {
+    color: #9dcaf0 !important;
+}
+
+/* ==========================================================================
+   Dark Mode - Mobile Responsive
+   ========================================================================== */
+
+@media (max-width: 991.98px) {
+    body.quarto-dark .column-margin {
+        background-color: var(--gd-bg-secondary);
+        border-color: var(--gd-border-color);
+    }
+
+    /* Ensure all child elements inside column-margin have matching background in dark mode */
+    body.quarto-dark .column-margin,
+    body.quarto-dark .column-margin > *,
+    body.quarto-dark .column-margin section,
+    body.quarto-dark .column-margin p,
+    body.quarto-dark .column-margin code {
+        background-color: var(--gd-bg-secondary);
+    }
+
+    body.quarto-dark .column-margin h4 {
+        color: var(--gd-text-secondary);
+        border-bottom-color: var(--gd-border-color);
+    }
+
+    body.quarto-dark .quarto-secondary-nav {
+        background-color: var(--gd-bg-secondary);
+        border-bottom-color: var(--gd-border-color);
+    }
+
+    body.quarto-dark header.headroom--unpinned .quarto-secondary-nav {
+        box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+    }
+}
+
+/* ==========================================================================
+   Dark Mode - Copy Button
+   ========================================================================== */
+
+body.quarto-dark .gd-code-copy {
+    color: var(--gd-text-muted);
+}
+
+body.quarto-dark .gd-code-copy:hover {
+    background-color: rgba(255, 255, 255, 0.08);
+    border-color: rgba(255, 255, 255, 0.15);
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .gd-code-copy.gd-code-copied {
+    color: #75b798;
+}
+
+/* ==========================================================================
+   Dark Mode - Code Filename/Caption Bar
+   ========================================================================== */
+
+body.quarto-dark .code-with-filename .code-with-filename-file {
+    background-color: var(--gd-bg-tertiary);
+    border-color: var(--gd-border-color);
+}
+
+body.quarto-dark .code-with-filename .code-with-filename-file pre {
+    background-color: var(--gd-bg-tertiary);
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .code-with-filename .code-with-filename-file pre strong {
+    color: var(--gd-text-primary);
+}
+
+body.quarto-dark .code-with-filename-file {
+    background-color: var(--gd-bg-tertiary);
+}
+
+body.quarto-dark .code-with-filename-file pre {
+    background-color: transparent;
+    color: var(--gd-text-primary);
+    margin: 0;
+}
+
+/* ==========================================================================
+   Dark Mode - Scrollbars (WebKit browsers)
+   ========================================================================== */
+
+body.quarto-dark ::-webkit-scrollbar {
+    width: 10px;
+    height: 10px;
+}
+
+body.quarto-dark ::-webkit-scrollbar-track {
+    background: var(--gd-bg-secondary);
+}
+
+body.quarto-dark ::-webkit-scrollbar-thumb {
+    background: var(--gd-border-color);
+    border-radius: 5px;
+}
+
+body.quarto-dark ::-webkit-scrollbar-thumb:hover {
+    background: #555;
+}
+
+/* ==========================================================================
+   Dark Mode - Transitions
+   ========================================================================== */
+
+/* Smooth transitions for theme switching */
+body,
+.navbar,
+#quarto-sidebar,
+.nav-footer,
+.card,
+pre,
+code,
+.table,
+input,
+textarea,
+.gh-dropdown,
+.dark-mode-toggle {
+    transition: background-color 0.2s ease,
+                border-color 0.2s ease,
+                color 0.2s ease;
+}
+
+/* ==========================================================================
+   Section Cards (Custom Sections index pages)
+   ========================================================================== */
+
+.section-cards {
+    display: grid;
+    gap: 1rem;
+    margin-top: 0.5rem;
+}
+
+/* 2-column image card grid (default) */
+.section-cards-2col {
+    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+}
+
+/* 1-column image card grid */
+.section-cards-1col {
+    grid-template-columns: 1fr;
+}
+
+/* Single-column plain link list */
+.section-cards-list {
+    grid-template-columns: 1fr;
+}
+
+.section-card {
+    display: block;
+    padding: 1.25rem 1.5rem;
+    border: 1px solid var(--bs-border-color, #dee2e6);
+    border-radius: 0.5rem;
+    color: inherit;
+    text-decoration: none;
+    transition: box-shadow 0.2s ease-out, border-color 0.2s ease-out, transform 0.2s ease-out;
+}
+
+.section-card:hover {
+    border-color: var(--bs-primary, #0d6efd);
+    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+    transform: translateY(-2px);
+    color: inherit;
+    text-decoration: none;
+}
+
+.section-card-img {
+    width: 100%;
+    border-radius: 0.375rem;
+    margin-bottom: 0.75rem;
+}
+
+.section-card-title {
+    font-size: 1.1rem;
+    font-weight: 600;
+    margin-bottom: 0.35rem;
+    color: var(--bs-primary, #0d6efd);
+}
+
+.section-card-desc {
+    font-size: 0.9rem;
+    color: var(--bs-secondary-color, #6c757d);
+    line-height: 1.45;
+}
+
+/* Dark mode adjustments */
+body.quarto-dark .section-card {
+    border-color: var(--bs-border-color, #495057);
+}
+
+body.quarto-dark .section-card:hover {
+    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
+}
+
+body.quarto-dark .section-card-title {
+    color: #599CFF !important;
+}
+
+body.quarto-dark .section-card-desc {
+    color: #9ca3af !important;
+}
+
+body.quarto-dark .section-card:hover {
+    border-color: #599CFF;
+}
+
+/* Disable transitions on initial page load to prevent flash */
+html:not(.theme-loaded) *,
+html:not(.theme-loaded) *::before,
+html:not(.theme-loaded) *::after {
+    transition: none !important;
+}
+
+/* Home page layout: widen main content since there's no left sidebar */
+/* On home page, expand content to use the space normally reserved for left sidebar */
+@media (min-width: 992px) {
+    body[data-page="index"] #quarto-document-content > section:not(.column-margin),
+    body[data-page="index"] #quarto-document-content > .gd-hero,
+    body[data-page="index"] #quarto-document-content > p,
+    body[data-page="index"] #quarto-document-content > .cell,
+    body[data-page="index"] #quarto-document-content > details {
+        grid-column: page-start-inset / body-content-end !important;
+    }
+
+    /* Keep the column-margin where it should be */
+    body[data-page="index"] .column-margin {
+        grid-column: body-end / page-end !important;
+    }
+
+    /* In dark mode every container gets an opaque --gd-bg-primary background
+       that hides the fixed starfield canvas (z-index: -1).  On the homepage
+       we punch all those layers transparent so the canvas shows through.
+       body/html keep their backgrounds — they sit BELOW the canvas in the
+       root stacking context and provide the base dark colour where the
+       canvas mask fades out. */
+    body.gd-homepage.quarto-dark #quarto-content,
+    body.gd-homepage.quarto-dark main.content,
+    body.gd-homepage.quarto-dark #quarto-document-content,
+    body.gd-homepage.quarto-dark .quarto-body-content,
+    body.gd-homepage.quarto-dark .page-columns,
+    body.gd-homepage.quarto-dark .page-rows-contents,
+    body.gd-homepage.quarto-dark .column-body,
+    body.gd-homepage.quarto-dark article,
+    body.gd-homepage.quarto-dark section {
+        background-color: transparent;
+    }
+}
+
+/* ── Hero Section ─────────────────────────────────────── */
+
+/* Prevent horizontal scrollbar from the 100vw starfield canvas */
+.gd-homepage {
+    overflow-x: clip;
+}
+
+.gd-hero {
+    text-align: center;
+    padding: 2.5rem 1rem 2rem;
+    position: relative;
+    overflow: visible;
+}
+
+/* Starfield canvas: breaks out of the hero to cover the full viewport width
+   and extends above into the navbar area and below into body content.
+   Uses fixed positioning relative to the viewport so Quarto's grid layout
+   doesn't clip or offset it. */
+#gd-starfield {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100vw;
+    height: 100vh;
+    pointer-events: none;         /* let clicks pass through to page content */
+    z-index: 0;
+    transition: opacity 0.15s ease-out;
+    mask-image: linear-gradient(to bottom, black 35%, transparent 85%);
+    -webkit-mask-image: linear-gradient(to bottom, black 35%, transparent 85%);
+}
+
+/* Re-enable pointer events only on the homepage hero area so the
+   dark-mode starfield can track the cursor there. */
+.gd-hero #gd-starfield {
+    pointer-events: auto;
+}
+
+/* Everything in the hero except the canvas must sit above it */
+.gd-hero > *:not(#gd-starfield) {
+    position: relative;
+    z-index: 1;
+}
+
+/* When a column-margin sidebar is present, Quarto adds page-full to 
+ which sets all children to grid-column: body-content-start / page-end via + .page-columns.page-full > *. This causes body text and centered content + to spill into the right margin area (overlapping the sidebar). + Constrain every child back to the body-content column; the .column-margin + element keeps its body-end / page-end placement via !important in Quarto's + own CSS. */ +main.content.page-columns.page-full > * { + grid-column: body-content-start / body-content-end; +} + +/* On the homepage, .column-margin triggers Quarto's page-columns grid which + narrows the body-content track to make room for the margin column. This + causes code disclosures, output tables, and other wide elements to appear + indented ~100px from the left. The data-page=index rule above handles + section, p, .cell, and details with the correct grid span; this fallback + covers any remaining direct children of main.page-columns. */ +.gd-homepage main.page-columns > *:not(.column-margin) { + grid-column: page-start-inset / body-content-end; +} + +.gd-hero-logo { + display: block; + width: auto; + max-width: 80%; + margin-left: auto; + margin-right: auto; + margin-bottom: 1.25rem; +} + +.gd-hero-name { + font-size: 2.5rem; + font-weight: 600; + margin-bottom: 0.3rem; + line-height: 1.15; +} + +.gd-hero-tagline { + font-size: 1.35rem; + max-width: 600px; + margin: 0 auto 1rem; + color: var(--bs-secondary-color, #6c757d); + line-height: 1.3; + text-wrap: balance; +} + +.gd-hero-badges { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 0.35rem; +} + +.gd-hero-badges img { + height: 20px; +} + +/* Dark-mode hero logo switching */ +.gd-hero .gd-only-dark { display: none !important; } + +[data-bs-theme="dark"] .gd-hero .gd-only-light { display: none !important; } +[data-bs-theme="dark"] .gd-hero .gd-only-dark { display: block !important; margin-left: auto; margin-right: auto; } + +/* Dark-mode navbar logo switching + Scope to html[...] so Quarto's nav[data-bs-theme="dark"] (dark navbar + background in the flatly theme) doesn't trigger these rules in light mode. */ +html[data-bs-theme="dark"] .navbar-logo.light-content { display: none !important; } +html[data-bs-theme="dark"] .navbar-logo.dark-content { display: inline !important; } + +/* Reduce top margin on first heading after hero */ +.gd-hero + section.level1 > h1:first-child, +.gd-hero + section.level2 > h2:first-child { + margin-top: 0.5rem !important; +} + +/* ── CTA Cards ("Go Further" section) ─────────────────── */ + +.gd-cta-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1.25rem; + margin: 1.5rem 0 2rem; +} + +.gd-cta-card { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 1.5rem; + border-radius: 12px; + border: 1px solid rgba(0, 0, 0, 0.08); + background: linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(248, 249, 250, 0.7)); + text-decoration: none !important; + color: inherit !important; + transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease; + position: relative; + overflow: hidden; + + &:hover { + transform: translateY(-3px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); + border-color: rgba(0, 0, 0, 0.15); + } + + &:hover .gd-cta-arrow { + transform: translateX(4px); + opacity: 1; + } +} + +.gd-cta-icon { + font-size: 2rem; + margin-bottom: 0.75rem; + line-height: 1; +} + +.gd-cta-title { + font-size: 1.15rem; + font-weight: 600; + margin-bottom: 0.4rem; + line-height: 1.3; +} + +.gd-cta-desc { + font-size: 0.9rem; + line-height: 1.5; + color: #6c757d; + flex-grow: 1; +} + +.gd-cta-arrow { + font-size: 1.25rem; + margin-top: 0.75rem; + opacity: 0.4; + transition: transform 0.2s ease, opacity 0.2s ease; + font-weight: 600; +} + +/* Dark mode CTA cards */ +body.quarto-dark .gd-cta-card { + border-color: rgba(255, 255, 255, 0.1); + background: linear-gradient(135deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.02)); + + &:hover { + border-color: rgba(255, 255, 255, 0.2); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3); + } +} + +body.quarto-dark .gd-cta-desc { + color: #adb5bd; +} + +@media (max-width: 768px) { + .gd-cta-grid { + grid-template-columns: 1fr; + gap: 1rem; + } +} + +/* ── Feature Wall ("And So Much More") ────────────────── */ + +.gd-feature-wall { + margin: 3rem 0 2rem; + hyphens: auto; + -webkit-hyphens: auto; + overflow-wrap: break-word; +} + +.gd-fw-heading { + text-align: center; + font-weight: 700; + margin-bottom: 1.5rem; + letter-spacing: -0.01em; +} + +.gd-fw-large, +.gd-fw-medium, +.gd-fw-small { + text-align: justify; + text-justify: inter-word; +} + +.gd-fw-large { + font-size: 1.65rem; + line-height: 1.45; + margin-bottom: 0.6rem; + letter-spacing: -0.01em; +} + +.gd-fw-medium { + font-size: 1.15rem; + line-height: 1.55; + margin-bottom: 0.5rem; +} + +.gd-fw-small { + font-size: 0.88rem; + line-height: 1.65; +} + +/* Dim the middle-dot separators slightly */ +.gd-feature-wall b { + font-weight: 650; +} + +@media (max-width: 768px) { + .gd-fw-large { + font-size: 1.35rem; + } + .gd-fw-medium { + font-size: 1.05rem; + } + .gd-fw-small { + font-size: 0.82rem; + } +} + +/* ── Horizontal Rule Shortcode ────────────────────────── */ + +/* Palette color tokens — representative hue from each gradient preset */ +:root { + --gd-palette-sky: #0077b6; + --gd-palette-peach: #e07a3a; + --gd-palette-prism: #6d28d9; + --gd-palette-lilac: #a855f7; + --gd-palette-slate: #64748b; + --gd-palette-honey: #d97706; + --gd-palette-dusk: #4338ca; + --gd-palette-mint: #0d9488; + --gd-palette-accent: var(--gd-accent, #6366f1); +} + +html[data-bs-theme="dark"] { + --gd-palette-sky: #38bdf8; + --gd-palette-peach: #fb923c; + --gd-palette-prism: #a78bfa; + --gd-palette-lilac: #c084fc; + --gd-palette-slate: #94a3b8; + --gd-palette-honey: #fbbf24; + --gd-palette-dusk: #818cf8; + --gd-palette-mint: #2dd4bf; + --gd-palette-accent: var(--gd-accent, #818cf8); +} + +.gd-hr { + --gd-hr-color: var(--gd-accent, #6366f1); + --gd-hr-thickness: 2px; + --gd-hr-width: 100%; + --gd-hr-spacing: 2rem; + + border: none; + height: var(--gd-hr-thickness); + width: var(--gd-hr-width); + max-width: 100%; + margin: var(--gd-hr-spacing) auto; + background: var(--gd-hr-color); + opacity: 0.7; + display: block; +} + +/* ─ Line Styles ─ */ +.gd-hr--dotted { + background: none; + border-top: var(--gd-hr-thickness) dotted var(--gd-hr-color); + height: 0; +} + +.gd-hr--dashed { + background: none; + border-top: var(--gd-hr-thickness) dashed var(--gd-hr-color); + height: 0; +} + +.gd-hr--double { + background: none; + border-top: calc(var(--gd-hr-thickness) * 0.5) double var(--gd-hr-color); + height: 0; + border-top-width: calc(var(--gd-hr-thickness) + 2px); +} + +/* ─ Alignment ─ */ +.gd-hr--left { + margin-left: 0; + margin-right: auto; +} + +.gd-hr--right { + margin-left: auto; + margin-right: 0; +} + +/* ─ With-Text Structure ─ */ +.gd-hr--with-text { + display: flex; + align-items: center; + gap: 1rem; + height: auto; + background: none; + border: none; + width: var(--gd-hr-width); + max-width: 100%; + margin: var(--gd-hr-spacing) auto; + opacity: 1; +} + +.gd-hr--with-text.gd-hr--left { + margin-left: 0; + margin-right: auto; +} + +.gd-hr--with-text.gd-hr--right { + margin-left: auto; + margin-right: 0; +} + +.gd-hr-line { + flex: 1; + height: var(--gd-hr-thickness, 2px); + background: var(--gd-hr-color); + opacity: 0.7; +} + +.gd-hr-text { + font-size: 0.9rem; + font-weight: 500; + color: var(--gd-hr-color); + white-space: nowrap; + user-select: none; + line-height: 1; +} + +.gd-hr-text--sm { + font-size: 0.75rem; +} + +.gd-hr-text--lg { + font-size: 1.2rem; +} + +/* ─ Presets ─ */ + +/* Gradient shimmer (animated) — generalizes .gd-fw-rule */ +.gd-hr--gradient-shimmer { + background: linear-gradient( + 90deg, + transparent, + var(--gd-hr-color, var(--gd-accent, #6366f1)) 25%, + var(--gd-accent-secondary, #a855f7) 50%, + var(--gd-hr-color, var(--gd-accent, #6366f1)) 75%, + transparent + ); + background-size: 200% 100%; + animation: gd-hr-shimmer 4s ease-in-out infinite; + border: none; + height: var(--gd-hr-thickness); +} + +@keyframes gd-hr-shimmer { + 0% { background-position: 100% 0; } + 50% { background-position: 0% 0; } + 100% { background-position: 100% 0; } +} + +/* Gradient static (non-animated) */ +.gd-hr--gradient-static { + background: linear-gradient( + 90deg, + transparent, + var(--gd-hr-color, var(--gd-accent, #6366f1)) 25%, + var(--gd-accent-secondary, #a855f7) 50%, + var(--gd-hr-color, var(--gd-accent, #6366f1)) 75%, + transparent + ); + border: none; + height: var(--gd-hr-thickness); +} + +/* Fade — full opacity at center, transparent at edges */ +.gd-hr--fade { + background: linear-gradient( + 90deg, + transparent, + var(--gd-hr-color) 20%, + var(--gd-hr-color) 80%, + transparent + ); + border: none; + height: var(--gd-hr-thickness); +} + +/* Fade-edges — transparent edges to colored center */ +.gd-hr--fade-edges { + background: radial-gradient( + ellipse at center, + var(--gd-hr-color) 0%, + transparent 70% + ); + border: none; + height: var(--gd-hr-thickness); +} + +/* Dots — three centered dots, no line */ +.gd-hr--dots { + background: none; + border: none; + height: auto; + text-align: center; + opacity: 1; +} + +.gd-hr--dots::after { + content: "· · ·"; + font-size: 1.5rem; + letter-spacing: 0.3em; + color: var(--gd-hr-color); + opacity: 0.8; +} + +/* Diamond — centered diamond flanked by thin lines */ +.gd-hr--diamond { + background: none; + border: none; + height: auto; + display: flex; + align-items: center; + gap: 0.75rem; + opacity: 1; +} + +.gd-hr--diamond::before, +.gd-hr--diamond::after { + content: ""; + flex: 1; + height: 1px; + background: var(--gd-hr-color); + opacity: 0.5; +} + +.gd-hr--diamond::before { + content: ""; +} + +/* Insert diamond via a nested approach — use a wrapper trick. + Since
can't have children, we use a background trick instead. */ +hr.gd-hr--diamond { + display: flex; +} + +hr.gd-hr--diamond::before { + content: ""; + flex: 1; + height: 1px; + background: linear-gradient(90deg, transparent, var(--gd-hr-color)); +} + +hr.gd-hr--diamond::after { + content: "◇"; + flex: none; + height: auto; + background: none; + font-size: 1rem; + color: var(--gd-hr-color); + opacity: 0.8; + padding: 0 0.5rem; +} + +/* Ornament — fleuron between fading lines */ +.gd-hr--ornament { + background: none; + border: none; + height: auto; + display: flex; + align-items: center; + opacity: 1; +} + +hr.gd-hr--ornament::before { + content: ""; + flex: 1; + height: 1px; + background: linear-gradient(90deg, transparent, var(--gd-hr-color)); +} + +hr.gd-hr--ornament::after { + content: "❧"; + flex: none; + height: auto; + background: none; + font-size: 1.2rem; + color: var(--gd-hr-color); + opacity: 0.7; + padding: 0 0.75rem; +} + +/* Wave — repeating wave pattern */ +.gd-hr--wave { + background: repeating-linear-gradient( + 135deg, + var(--gd-hr-color) 0px, + var(--gd-hr-color) 2px, + transparent 2px, + transparent 6px + ); + border: none; + height: var(--gd-hr-thickness); + opacity: 0.6; +} + +/* Double-line — two parallel lines */ +.gd-hr--double-line { + background: none; + border: none; + height: calc(var(--gd-hr-thickness) * 2 + 3px); + position: relative; + opacity: 0.7; +} + +.gd-hr--double-line::before, +.gd-hr--double-line::after { + content: ""; + position: absolute; + left: 0; + right: 0; + height: var(--gd-hr-thickness); + background: var(--gd-hr-color); +} + +.gd-hr--double-line::before { + top: 0; +} + +.gd-hr--double-line::after { + bottom: 0; +} + +/* ─ Dark Mode ─ */ +body.quarto-dark .gd-hr { + opacity: 0.6; +} + +body.quarto-dark .gd-hr--with-text { + opacity: 1; +} + +body.quarto-dark .gd-hr-line { + opacity: 0.5; +} + +body.quarto-dark .gd-hr-text { + opacity: 0.85; +} + +body.quarto-dark .gd-hr--dots::after { + opacity: 0.6; +} + +/* ─ Reduced Motion ─ */ +@media (prefers-reduced-motion: reduce) { + .gd-hr--gradient-shimmer { + animation: none; + } +} + +/* ─ Responsive ─ */ +@media (max-width: 768px) { + .gd-hr { + --gd-hr-spacing: 1.5rem; + } +} + +/* ── Feature Wall Closing ─────────────────────────────── */ + +.gd-fw-rule { + border: none; + height: 2px; + margin: 3rem auto 2rem; + max-width: 30rem; + background: linear-gradient( + 90deg, + transparent, + var(--gd-accent, #6366f1) 25%, + var(--gd-accent-secondary, #a855f7) 50%, + var(--gd-accent, #6366f1) 75%, + transparent + ); + background-size: 200% 100%; + animation: gd-rule-shimmer 4s ease-in-out infinite; + opacity: 0.7; +} + +@keyframes gd-rule-shimmer { + 0% { background-position: 100% 0; } + 50% { background-position: 0% 0; } + 100% { background-position: 100% 0; } +} + +.gd-fw-closing { + text-align: center; + padding: 0 1.5rem 2.5rem; + max-width: 38rem; + margin: 0 auto; + position: relative; + z-index: 1; +} + +.gd-fw-closing p { + font-size: 1.05rem; + line-height: 1.7; + color: #6b7280; + margin: 0; +} + +body.quarto-dark .gd-fw-closing p { + color: #9ca3af; +} + +.gd-fw-closing a { + color: var(--gd-accent, #6366f1); + text-decoration: none; + font-weight: 600; + border-bottom: 1px solid transparent; + transition: border-color 0.2s ease; +} + +.gd-fw-closing a:hover { + border-bottom-color: var(--gd-accent, #6366f1); +} + +@media (max-width: 768px) { + .gd-fw-rule { + max-width: 80%; + margin: 2rem auto 1.5rem; + } + .gd-fw-closing p { + font-size: 0.95rem; + } +} + +/* ── Hero Responsive ──────────────────────────────────── */ + +@media (max-width: 768px) { + .gd-hero { + padding: 1.5rem 0.75rem 1.25rem; + } + .gd-hero-logo { + max-height: 140px !important; + } + .gd-hero-name { + font-size: 2.25rem; + } + .gd-hero-tagline { + font-size: 1.1rem; + } +} + +/* ============================================================================ + Copy-Page Widget + ============================================================================ */ + +/* Container – floats top-right of the content area */ +.gd-copy-page { + float: right; + display: flex; + gap: 4px; + margin-top: 4px; + margin-left: 12px; + position: relative; + z-index: 5; +} + +/* Shared button / link styling */ +.gd-copy-page-btn { + display: inline-flex; + align-items: center; + gap: 5px; + padding: 3px 8px; + border: 1px solid #d0d7de; + border-radius: 6px; + background: #f6f8fa; + color: #57606a; + font-size: 12px; + font-family: inherit; + line-height: 1.4; + cursor: pointer; + text-decoration: none; + transition: background 0.15s, border-color 0.15s, color 0.15s; + white-space: nowrap; +} + +.gd-copy-page-btn:hover { + background: #eaeef2; + border-color: #b8bfc6; + color: #24292f; + text-decoration: none; +} + +.gd-copy-page-btn:active { + background: #d8dee4; +} + +/* Success flash */ +.gd-copy-page-btn.gd-copy-success { + border-color: #2da44e; + color: #1a7f37; + background: #dafbe1; +} + +/* View-as-Markdown link */ +a.gd-view-md-btn { + color: #57606a; +} +a.gd-view-md-btn:hover { + color: #24292f; +} + +/* ── Dark mode ── */ +html[data-bs-theme="dark"] .gd-copy-page-btn { + background: #21262d; + border-color: #30363d; + color: #8b949e; +} +html[data-bs-theme="dark"] .gd-copy-page-btn:hover { + background: #30363d; + border-color: #484f58; + color: #c9d1d9; +} +html[data-bs-theme="dark"] .gd-copy-page-btn:active { + background: #3a424a; +} +html[data-bs-theme="dark"] .gd-copy-page-btn.gd-copy-success { + border-color: #238636; + color: #3fb950; + background: #0d1117; +} +html[data-bs-theme="dark"] a.gd-view-md-btn { + color: #8b949e; +} +html[data-bs-theme="dark"] a.gd-view-md-btn:hover { + color: #c9d1d9; +} + +/* ── Mobile: icon only ── */ +@media (max-width: 768px) { + .gd-copy-page { + float: none; + margin-left: 0; + margin-bottom: 10px; + } + .gd-copy-page-label { + display: none; + } + .gd-copy-page-btn { + padding: 4px 6px; + } +} + +/* ── Announcement Banner ── */ +.gd-announcement-banner { + font-family: var(--bs-body-font-family, system-ui, -apple-system, sans-serif); + line-height: 1.5; + letter-spacing: 0.01em; + text-wrap: balance; +} +.gd-announcement-banner a { + font-weight: 600; + text-decoration: underline; + color: inherit; +} +.gd-announcement-banner a:hover { + opacity: 0.85; + text-decoration: underline; +} +/* Dark mode overrides */ +html[data-bs-theme="dark"] .gd-announcement-info { + background: #1a5bb5 !important; +} +html[data-bs-theme="dark"] .gd-announcement-warning { + background: #d4a800 !important; +} +html[data-bs-theme="dark"] .gd-announcement-success { + background: #126b3d !important; +} +html[data-bs-theme="dark"] .gd-announcement-danger { + background: #b02a37 !important; +} + +/* ── Animated Gradient Presets ── */ + +@keyframes gd-gradient-shift { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +/* Shared gradient base */ +.gd-gradient-sky, +.gd-gradient-peach, +.gd-gradient-prism, +.gd-gradient-lilac, +.gd-gradient-slate, +.gd-gradient-honey, +.gd-gradient-dusk, +.gd-gradient-mint { + background-size: 400% 400% !important; + animation: gd-gradient-shift 15s ease infinite; + border-bottom-color: rgba(0, 0, 0, 0.08) !important; +} + +/* Dark mode: white text on rich gradients */ +html[data-bs-theme="dark"] .gd-gradient-sky, +html[data-bs-theme="dark"] .gd-gradient-peach, +html[data-bs-theme="dark"] .gd-gradient-prism, +html[data-bs-theme="dark"] .gd-gradient-lilac, +html[data-bs-theme="dark"] .gd-gradient-slate, +html[data-bs-theme="dark"] .gd-gradient-honey, +html[data-bs-theme="dark"] .gd-gradient-dusk, +html[data-bs-theme="dark"] .gd-gradient-mint { + color: #ffffff !important; + border-bottom-color: rgba(255, 255, 255, 0.15) !important; +} + +/* — Sky (light: soft sky blues) — */ +.gd-gradient-sky { + background: linear-gradient(-45deg, #d0ecf9, #e0f4ff, #c5e8f7, #b8e0f5) !important; +} +html[data-bs-theme="dark"] .gd-gradient-sky { + background: linear-gradient(-45deg, #023e8a, #0077b6, #005f73, #0096c7) !important; +} + +/* — Peach (light: peach and blush) — */ +.gd-gradient-peach { + background: linear-gradient(-45deg, #ffddc1, #ffe4cc, #fdd0d8, #fbc4d4) !important; +} +html[data-bs-theme="dark"] .gd-gradient-peach { + background: linear-gradient(-45deg, #cc4a1a, #c7760f, #b84a5f, #a33560) !important; +} + +/* — Prism (light: mint, sky, lavender) — */ +.gd-gradient-prism { + background: linear-gradient(-45deg, #c4f0e0, #d0e8f5, #e4d4f4, #d8cef0) !important; +} +html[data-bs-theme="dark"] .gd-gradient-prism { + background: linear-gradient(-45deg, #048a65, #0c6a8a, #52077d, #2a0978) !important; +} + +/* — Lilac (light: lilac and pink) — */ +.gd-gradient-lilac { + background: linear-gradient(-45deg, #e8d0f0, #f5d0e0, #f0d4f8, #eac8ee) !important; +} +html[data-bs-theme="dark"] .gd-gradient-lilac { + background: linear-gradient(-45deg, #561e64, #8b1140, #a02db3, #6e1a7d) !important; +} + +/* — Slate (light: cool grays) — */ +.gd-gradient-slate { + background: linear-gradient(-45deg, #e0e4e8, #eceff1, #dde2e6, #d5dadf) !important; +} +html[data-bs-theme="dark"] .gd-gradient-slate { + background: linear-gradient(-45deg, #37474f, #455a64, #3e525e, #263238) !important; +} + +/* — Honey (light: warm cream and apricot) — */ +.gd-gradient-honey { + background: linear-gradient(-45deg, #ffe0c2, #ffedcc, #ffe5b4, #ffd6a8) !important; +} +html[data-bs-theme="dark"] .gd-gradient-honey { + background: linear-gradient(-45deg, #bf360c, #e65100, #ef6c00, #b71c1c) !important; +} + +/* — Dusk (light: soft lavender-blue) — */ +.gd-gradient-dusk { + background: linear-gradient(-45deg, #d8daf0, #dddff5, #d4d0ee, #dad4f2) !important; +} +html[data-bs-theme="dark"] .gd-gradient-dusk { + background: linear-gradient(-45deg, #0d1244, #141b55, #1a0f52, #261560) !important; +} + +/* — Mint (light: pale aqua) — */ +.gd-gradient-mint { + background: linear-gradient(-45deg, #ccece8, #d5f0ec, #c4e8e4, #d0f2ee) !important; +} +html[data-bs-theme="dark"] .gd-gradient-mint { + background: linear-gradient(-45deg, #00695c, #00796b, #004d40, #00897b) !important; +} + +/* Navbar text overrides when a gradient preset is active — dark mode only */ +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] { + border-bottom: 1px solid rgba(255, 255, 255, 0.15) !important; +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .nav-link, +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .navbar-brand .navbar-title { + color: #ffffff !important; +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .nav-link:hover { + background-color: rgba(255, 255, 255, 0.2) !important; + color: #ffffff !important; +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .nav-item:has(#github-widget) .nav-link:hover { + background-color: transparent !important; +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .nav-item.compact .nav-link, +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .gd-navbar-icon { + background: rgba(255, 255, 255, 0.08) !important; + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 6px; + width: 34px; + height: 34px; + display: flex; + align-items: center; + justify-content: center; + padding: 0; +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .nav-item.compact .nav-link:hover, +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .gd-navbar-icon:hover { + background: rgba(255, 255, 255, 0.12) !important; + border-color: rgba(255, 255, 255, 0.25); +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .nav-link.active { + text-decoration-color: rgba(255, 255, 255, 0.75) !important; +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .navbar-toggler { + border: none !important; + color: #e0e0e0 !important; +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .navbar-toggler-icon { + filter: none; +} +html[data-bs-theme="dark"] .navbar[class*="gd-gradient-"] .bi { + color: #ffffff !important; +} + +/* Banner link/dismiss overrides for gradient presets — dark mode only */ +html[data-bs-theme="dark"] .gd-announcement-banner[class*="gd-gradient-"] a { + color: #ffffff !important; +} +html[data-bs-theme="dark"] .gd-announcement-banner[class*="gd-gradient-"] button { + color: #ffffff !important; +} + +/* ── Content Area Gradient Glow ── */ +/* ── Multi-pulse content glow ── + Three overlapping radial-gradient pulses that drift independently, + creating an organic, subtly animated glow at the top of the page. + Each pulse has its own center, size, speed, and opacity curve. */ + +@keyframes gd-glow-drift-1 { + 0% { transform: translateX(0%) scale(1); opacity: 0.6; } + 25% { transform: translateX(5%) scale(1.08); opacity: 0.42; } + 50% { transform: translateX(-3%) scale(1.02); opacity: 0.55; } + 75% { transform: translateX(2%) scale(1.05); opacity: 0.38; } + 100% { transform: translateX(0%) scale(1); opacity: 0.6; } +} +@keyframes gd-glow-drift-2 { + 0% { transform: translateX(0%) scale(1); opacity: 0.45; } + 30% { transform: translateX(-6%) scale(1.1); opacity: 0.58; } + 60% { transform: translateX(4%) scale(0.96); opacity: 0.35; } + 100% { transform: translateX(0%) scale(1); opacity: 0.45; } +} +@keyframes gd-glow-drift-3 { + 0% { transform: translateX(0%) scale(1); opacity: 0.35; } + 35% { transform: translateX(3%) scale(1.12); opacity: 0.52; } + 70% { transform: translateX(-5%) scale(1.04); opacity: 0.28; } + 100% { transform: translateX(0%) scale(1); opacity: 0.35; } +} + +/* Container — fixed overlay with vertical fade-out mask */ +.gd-content-glow { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 600px; + pointer-events: none; + z-index: 0; + mask-image: linear-gradient(to bottom, rgba(0,0,0,1) 0%, rgba(0,0,0,0) 100%); + -webkit-mask-image: linear-gradient(to bottom, rgba(0,0,0,1) 0%, rgba(0,0,0,0) 100%); +} + +/* Shared pulse layer */ +.gd-glow-pulse { + position: absolute; + inset: 0; +} + +/* Pulse 1 — large, left-of-centre, slowest */ +.gd-glow-pulse-1 { + background: radial-gradient(ellipse 65% 55% at 28% 0%, var(--gd-glow-color), transparent); + animation: gd-glow-drift-1 23s ease-in-out infinite; + opacity: 0.6; +} + +/* Pulse 2 — medium, right-of-centre */ +.gd-glow-pulse-2 { + background: radial-gradient(ellipse 50% 45% at 62% 5%, var(--gd-glow-color), transparent); + animation: gd-glow-drift-2 19s ease-in-out infinite; + opacity: 0.45; +} + +/* Pulse 3 — smaller, far-right, subtlest */ +.gd-glow-pulse-3 { + background: radial-gradient(ellipse 45% 50% at 85% 0%, var(--gd-glow-color), transparent); + animation: gd-glow-drift-3 27s ease-in-out infinite; + opacity: 0.35; +} + +/* ── Preset colour tokens ── */ +.gd-content-glow-sky { --gd-glow-color: #c5e8f7; } +.gd-content-glow-peach { --gd-glow-color: #ffddc1; } +.gd-content-glow-prism { --gd-glow-color: #d0e8f5; } +.gd-content-glow-lilac { --gd-glow-color: #e8d0f0; } +.gd-content-glow-slate { --gd-glow-color: #dde2e6; } +.gd-content-glow-honey { --gd-glow-color: #ffe0c2; } +.gd-content-glow-dusk { --gd-glow-color: #d8daf0; } +.gd-content-glow-mint { --gd-glow-color: #ccece8; } + +html[data-bs-theme="dark"] .gd-content-glow-sky { --gd-glow-color: #023e8a; } +html[data-bs-theme="dark"] .gd-content-glow-peach { --gd-glow-color: #cc4a1a; } +html[data-bs-theme="dark"] .gd-content-glow-prism { --gd-glow-color: #0c6a8a; } +html[data-bs-theme="dark"] .gd-content-glow-lilac { --gd-glow-color: #561e64; } +html[data-bs-theme="dark"] .gd-content-glow-slate { --gd-glow-color: #37474f; } +html[data-bs-theme="dark"] .gd-content-glow-honey { --gd-glow-color: #bf360c; } +html[data-bs-theme="dark"] .gd-content-glow-dusk { --gd-glow-color: #141b55; } +html[data-bs-theme="dark"] .gd-content-glow-mint { --gd-glow-color: #00695c; } + +/* Sticky navbar on desktop — disable headroom hide-on-scroll for non-mobile */ +@media (min-width: 992px) { + header.headroom--unpinned { + transform: translateY(0%) !important; + } +} + +/* Mobile: keep secondary nav (sidebar toggle + page title) always visible. + When headroom hides the header via translateY(-100%), the secondary nav + counter-translates by its own height so it stays at viewport top. + Math: parent moves -(navH+secH), child moves +secH → viewport y = 0. */ +@media (max-width: 991.98px) { + .quarto-secondary-nav { + position: relative; + z-index: 1; + transition: transform 200ms linear, box-shadow 200ms linear; + } + + header.headroom--unpinned .quarto-secondary-nav { + transform: translateY(100%); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12); + } +} + +/*---------------------------------- Skills Page -----------------------------------*/ + +.gd-skills-install { + border: 1px solid tint-color($primary, 70%); + border-radius: 0.5rem; + margin-bottom: 2rem; + overflow: hidden; + width: 100%; +} + +.gd-skills-install-toggle { + display: flex; + align-items: center; + gap: 0.5rem; + width: 100%; + padding: 0.75rem 1.25rem; + border: none; + background: tint-color($primary, 93%); + color: $primary; + font-weight: 600; + font-size: 1rem; + cursor: pointer; + text-align: left; + transition: background 0.15s ease; + + &:hover { + background: tint-color($primary, 87%); + } + + &[aria-expanded="true"] { + border-bottom: 1px solid tint-color($primary, 70%); + } +} + +.gd-skills-install-icon { + display: inline-block; + font-size: 0.65rem; + transition: transform 0.25s ease; + line-height: 1; + + .gd-skills-install-toggle[aria-expanded="true"] & { + transform: rotate(90deg); + } +} + +.gd-skills-install-body { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows 0.35s ease; + background: tint-color($primary, 97%); + + > * { + overflow: hidden; + min-height: 0; + } + + &.gd-skills-install-open { + grid-template-rows: 1fr; + } + + // Inner wrapper — the direct grid child. MUST have no padding + // so that 0fr collapses to true zero height. + .gd-skills-install-inner { + // padding lives on .gd-skills-install-pad below + } + + // Padding wrapper inside the overflow-hidden element + .gd-skills-install-pad { + padding: 1rem 1.25rem 0.75rem; + } + + // Override Quarto's code block styling inside the install section + .sourceCode { + margin: 0.35rem 0 0.75rem; + } + + // Make copy buttons always visible inside the install dropdown + .gd-code-copy { + opacity: 1 !important; + } + + // Compact single-line code cells — reduce Quarto's generous pre padding + pre.sourceCode { + padding: 0.5rem 2.5rem 0.5rem 0.75rem; // right padding leaves room for copy btn + font-size: 0.88rem; + + code { + padding: 0 !important; + } + } + + p { + margin: 0.25rem 0; + font-size: 0.92rem; + line-height: 1.55; + + a { + text-decoration: underline; + cursor: pointer; + } + } + + strong { + color: shade-color($primary, 15%); + } +} + +html[data-bs-theme="dark"] { + .gd-skills-install { + border-color: shade-color($primary, 50%); + } + + .gd-skills-install-toggle { + background: shade-color($primary, 80%); + color: tint-color($primary, 50%); + + &:hover { + background: shade-color($primary, 72%); + } + + &[aria-expanded="true"] { + border-bottom-color: shade-color($primary, 50%); + } + } + + .gd-skills-install-body { + background: shade-color($primary, 88%); + + strong { + color: tint-color($primary, 40%); + } + + .code-copy-outer-scaffold, + .sourceCode, + pre.sourceCode { + background: transparent; + } + } +} + +// Skills page: eliminate column-page side margins +body.gd-skills-page .content.column-page { + grid-column: page-start / page-end !important; + max-width: 100%; +} + +// License page: same full-width layout as Skills page +body.gd-license-page .content.column-page { + grid-column: page-start / page-end !important; + max-width: 100%; +} + +// Blog index page: use full width (no TOC sidebar) +body.gd-blog-index .content.column-page { + grid-column: page-start / page-end !important; + max-width: 100%; +} + +// Terminal-style raw skill file rendering +.gd-skills-raw { + background: $gray-100; + color: $gray-800; + font-family: $font-family-monospace; + font-size: 0.85rem; + line-height: 1.7; + padding: 1.25rem 1.5rem; + border-radius: 0.5rem; + border: 1px solid $gray-300; + overflow-x: auto; + white-space: pre-wrap; + word-wrap: break-word; + margin: 0; + max-width: 100%; + + // Quarto wraps the fenced code block content in its own elements; + // flatten them so they inherit pre styling. + .sourceCode { + background: transparent !important; + border: none !important; + margin: 0; + padding: 0; + } + + code { + background: transparent; + color: inherit; + padding: 0; + font-size: inherit; + white-space: pre-wrap; + } + + pre { + background: transparent !important; + border: none !important; + margin: 0; + padding: 0; + color: inherit; + } +} + +html[data-bs-theme="dark"] .gd-skills-raw { + background: $gray-900; + border-color: $gray-700; + color: $gray-200; +} + +// Directory tree for skill packages with companion subdirectories +.gd-skills-tree { + background: $gray-100; + color: $gray-700; + font-family: $font-family-monospace; + font-size: 0.88rem; + line-height: 1.8; + padding: 1rem 1.25rem; + border-radius: 0.5rem; + border: 1px solid $gray-300; + margin: 0 0 1.5rem; + white-space: pre; + overflow-x: auto; + + a { + color: $primary; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } +} + +html[data-bs-theme="dark"] .gd-skills-tree { + background: $gray-900; + border-color: $gray-700; + color: $gray-400; + + a { + color: tint-color($primary, 40%); + } +} + +// Capitalized section heading above the directory tree +.gd-skills-section-heading { + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: $gray-500; + margin: 0 0 0.5rem; + padding: 0; +} + +html[data-bs-theme="dark"] .gd-skills-section-heading { + color: $gray-400; +} + +// Heading label for each companion file section +.gd-skills-file-heading { + font-family: $font-family-monospace; + font-size: 0.95rem; + font-weight: 600; + color: $gray-700; + margin: 1.5rem 0 0.35rem; + padding: 0; + + &:first-of-type { + margin-top: 0; + } +} + +html[data-bs-theme="dark"] .gd-skills-file-heading { + color: $gray-300; +} + +/*---------------------------------- Skill Switcher ----------------------------------------*/ +// Sticky pill bar for choosing between multiple skills on the Skills page. + +.gd-skill-switcher-sentinel { + height: 0; // grows dynamically when the bar is stuck +} + +.gd-skill-switcher { + display: flex; + align-items: center; + gap: 0.35rem; + padding: 0.5rem 0.75rem; + margin: 0 0 1.75rem; + background: $gray-100; + border: 1px solid $gray-300; + border-radius: 0.5rem; + overflow-x: auto; + z-index: 1019; // just below the Quarto navbar (1030) + transition: box-shadow 0.2s ease, border-radius 0.2s ease; + + &--stuck { + position: fixed; + left: 0; + right: 0; + margin: 0; + border-radius: 0; + border-left: none; + border-right: none; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + padding-left: max(0.75rem, env(safe-area-inset-left)); + padding-right: max(0.75rem, env(safe-area-inset-right)); + transition: top 200ms linear, box-shadow 0.2s ease, border-radius 0.2s ease; + } +} + +.gd-skill-pill { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.4rem 1rem; + border: 1px solid transparent; + border-radius: 999px; + background: transparent; + color: $gray-600; + font-size: 0.88rem; + font-weight: 500; + white-space: nowrap; + cursor: pointer; + transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease; + line-height: 1.4; + + &:hover { + background: tint-color($primary, 90%); + color: $primary; + } + + &--active, + &[aria-selected="true"] { + background: $white; + color: $primary; + border-color: tint-color($primary, 55%); + font-weight: 600; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06); + } +} + +.gd-skill-pill__icon { + width: 1em; + height: 1em; + flex-shrink: 0; +} + +// Hidden panels: the JS toggles the `hidden` attribute. +.gd-skill-panel[hidden] { + display: none !important; +} + +html[data-bs-theme="dark"] { + .gd-skill-switcher { + background: $gray-900; + border-color: $gray-700; + + &--stuck { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35); + } + } + + .gd-skill-pill { + color: $gray-400; + + &:hover { + background: shade-color($primary, 75%); + color: tint-color($primary, 45%); + } + + &--active, + &[aria-selected="true"] { + background: $gray-800; + color: tint-color($primary, 45%); + border-color: shade-color($primary, 45%); + } + } +} + + +/*---------------------------------- Page Metadata Footer -----------------------------------*/ +// Displays creation/modification dates and optional author avatars at the bottom of pages. +// Uses a horizontal layout: [edit icon] 4 months ago [create icon] 2 years ago ─ [avatar1] [avatar2] + +.gd-page-metadata { + border-top: 1px solid $gray-300; + padding-top: 1rem; + margin-top: 2rem; + margin-bottom: 1rem; + color: $gray-600; + font-size: 0.875rem; + line-height: 1.5; + display: flex; + align-items: center; + gap: 1.25rem; + flex-wrap: wrap; + + // Dates section with icons + .gd-metadata-dates { + display: flex; + align-items: center; + gap: 1rem; + } + + // Individual metadata item (icon + timestamp) + .gd-metadata-item { + display: flex; + align-items: center; + gap: 0.35rem; + } + + // Icon styling + .gd-icon { + display: inline-flex; + align-items: center; + opacity: 0.65; + + svg { + vertical-align: middle; + } + } + + // Timestamp text (hoverable for absolute date tooltip) + .gd-timestamp { + // Native title tooltip on hover + } + + // Separator between dates and authors + .gd-metadata-separator { + color: $gray-400; + font-weight: 300; + } + + // Authors section with avatars + .gd-metadata-authors { + display: flex; + align-items: center; + gap: 0.4rem; + } + + // Author link wrapper + .gd-author-link { + display: inline-flex; + text-decoration: none; + } + + // Circular avatar image (GitHub-style) + .gd-author-avatar { + width: 26px; + height: 26px; + border-radius: 50%; + object-fit: cover; + flex-shrink: 0; + border: 2px solid $gray-300; + transition: border-color 0.15s ease; + + &:hover { + border-color: $primary; + } + } + + // Initials fallback when no image + .gd-author-initials { + display: inline-flex; + align-items: center; + justify-content: center; + width: 26px; + height: 26px; + border-radius: 50%; + background: $primary; + color: white; + font-weight: 600; + font-size: 0.7rem; + flex-shrink: 0; + border: 2px solid transparent; + transition: border-color 0.15s ease; + + &:hover { + border-color: shade-color($primary, 20%); + } + } +} + +// Dark mode adjustments +html[data-bs-theme="dark"] .gd-page-metadata { + border-top-color: $gray-700; + color: $gray-400; + + .gd-icon { + opacity: 0.6; + } + + .gd-metadata-separator { + color: $gray-600; + } + + .gd-author-avatar { + border-color: $gray-600; + + &:hover { + border-color: tint-color($primary, 30%); + } + } + + .gd-author-initials { + background: tint-color($primary, 20%); + + &:hover { + border-color: tint-color($primary, 40%); + } + } +} + + +/*--------------------------------------------------------------------------- + * Custom Tooltips (Tippy.js) — Material Filling Effect + * Replaces native browser title tooltips with instant, styled tooltips. + *---------------------------------------------------------------------------*/ + +/* Base Tippy.js overrides for Great Docs theming */ +.tippy-box { + /* Material-inspired styling */ + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 0.8125rem; + line-height: 1.4; + border-radius: 6px; + font-weight: 500; + /* Material filling effect: clip overflow for smooth fill animation */ + overflow: hidden; +} + +/* Light mode theme — Material Filling Effect */ +.tippy-box[data-theme~="gd-material"] { + background-color: $gray-800; + color: $white; + box-shadow: + 0 4px 14px -2px rgba($black, 0.2), + 0 2px 4px -1px rgba($black, 0.1); + + /* Material filling effect background */ + &::before { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient( + 135deg, + rgba($white, 0.12) 0%, + rgba($white, 0) 50% + ); + pointer-events: none; + opacity: 0; + transition: opacity 150ms ease-in-out; + } + + &[data-state="visible"]::before { + opacity: 1; + } + + /* Arrow styling */ + > .tippy-arrow { + color: $gray-800; + } + + > .tippy-arrow::before { + /* Subtle shadow on arrow */ + filter: drop-shadow(0 1px 2px rgba($black, 0.15)); + } + + /* Content padding */ + > .tippy-content { + padding: 6px 10px; + position: relative; + z-index: 1; + } +} + +/* Dark mode theme — Material Filling Effect */ +.tippy-box[data-theme~="gd-material-dark"] { + background-color: $gray-200; + color: $gray-900; + box-shadow: + 0 4px 14px -2px rgba($black, 0.35), + 0 2px 4px -1px rgba($black, 0.2); + + /* Material filling effect background */ + &::before { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient( + 135deg, + rgba($black, 0.06) 0%, + rgba($black, 0) 50% + ); + pointer-events: none; + opacity: 0; + transition: opacity 150ms ease-in-out; + } + + &[data-state="visible"]::before { + opacity: 1; + } + + /* Arrow styling */ + > .tippy-arrow { + color: $gray-200; + } + + > .tippy-arrow::before { + filter: drop-shadow(0 1px 3px rgba($black, 0.25)); + } + + /* Content padding */ + > .tippy-content { + padding: 6px 10px; + position: relative; + z-index: 1; + } +} + +/* Animation: shift-away (included with Tippy but customized) */ +.tippy-box[data-animation="shift-away"][data-state="hidden"] { + opacity: 0; +} + +.tippy-box[data-animation="shift-away"][data-state="hidden"][data-placement^="top"] { + transform: translateY(6px); +} + +.tippy-box[data-animation="shift-away"][data-state="hidden"][data-placement^="bottom"] { + transform: translateY(-6px); +} + +.tippy-box[data-animation="shift-away"][data-state="hidden"][data-placement^="left"] { + transform: translateX(6px); +} + +.tippy-box[data-animation="shift-away"][data-state="hidden"][data-placement^="right"] { + transform: translateX(-6px); +} + +/* Mounted state for material fill transition */ +.gd-tooltip-mounted .tippy-box::before { + animation: gd-tooltip-fill 200ms ease-out forwards; +} + +@keyframes gd-tooltip-fill { + from { + opacity: 0; + transform: scale(0.95); + } + to { + opacity: 1; + transform: scale(1); + } +} + +/* Arrow placement adjustments */ +.tippy-box[data-placement^="top"] > .tippy-arrow { + bottom: -5px; +} + +.tippy-box[data-placement^="bottom"] > .tippy-arrow { + top: -5px; +} + +.tippy-box[data-placement^="left"] > .tippy-arrow { + right: -5px; +} + +.tippy-box[data-placement^="right"] > .tippy-arrow { + left: -5px; +} + +/* Ensure tooltips appear above other elements */ +.tippy-popper, +[data-tippy-root] { + z-index: 9999 !important; +} + +/* Interactive tooltip styling (for tooltips with links, etc.) */ +.tippy-box[data-theme~="gd-material"] a, +.tippy-box[data-theme~="gd-material-dark"] a { + color: inherit; + text-decoration: underline; + text-underline-offset: 2px; +} + +.tippy-box[data-theme~="gd-material"] a:hover, +.tippy-box[data-theme~="gd-material-dark"] a:hover { + opacity: 0.85; +} + +/* Disable native tooltips on elements that have Tippy */ +[data-tippy-content] { + /* Ensure no lingering title attribute displays */ + title: none; +} + + +/* ===================================================== + Mermaid Diagram Dark Mode Support + Adjusts the neutral theme for dark backgrounds + ===================================================== */ + +/* Mermaid diagram container - center in content area */ +/* Target the cell containing mermaid diagrams */ +.cell:has(.mermaid-js), +.cell:has(.mermaid) { + display: block; +} + +.cell-output-display:has(.mermaid-js), +.cell-output-display:has(.mermaid) { + display: flex; + justify-content: center; + width: 100%; +} + +/* The figure element wrapping the diagram */ +.cell-output-display figure.figure:has(.mermaid-js), +.cell-output-display figure.figure:has(.mermaid) { + display: flex; + justify-content: center; + margin: 1.5rem auto; + width: 100%; +} + +/* The immediate parent div of the SVG */ +.cell-output-display figure.figure > div:has(> .mermaid-js), +.cell-output-display figure.figure > div:has(> svg.mermaid-js) { + display: flex; + justify-content: center; + width: 100%; +} + +/* The rendered SVG diagram itself */ +svg.mermaid-js { + display: block; + margin: 0 auto; +} + +pre.mermaid { + background: transparent; + padding: 0.5rem; + border-radius: 6px; + text-align: center; +} + +/* Light mode: add subtle border to mermaid diagrams */ +.cell-output-display:has(.mermaid-js), +.cell-output-display:has(.mermaid) { + border: 1px solid #dee2e6; + border-radius: 8px; + padding: 1rem; + margin: 0.5rem 0; +} + +/* Dark mode: invert mermaid diagrams for proper contrast */ +body.quarto-dark .cell-output-display:has(.mermaid-js), +html.quarto-dark .cell-output-display:has(.mermaid-js) { + background: #f8f9fa; + border-color: #dee2e6; + border-radius: 8px; + padding: 1rem; + margin: 0.5rem 0; +} + +body.quarto-dark svg.mermaid-js, +html.quarto-dark svg.mermaid-js { + /* No filter needed - diagram is on light background */ +} + +/* Dark mode: fix mermaid text colors (force dark text on light background) */ +body.quarto-dark svg.mermaid-js p, +html.quarto-dark svg.mermaid-js p, +body.quarto-dark svg[id^="mermaid-"] p, +html.quarto-dark svg[id^="mermaid-"] p { + color: #333 !important; +} + +body.quarto-dark svg.mermaid-js span, +html.quarto-dark svg.mermaid-js span, +body.quarto-dark svg[id^="mermaid-"] span, +html.quarto-dark svg[id^="mermaid-"] span { + color: #333 !important; +} + +body.quarto-dark svg.mermaid-js div, +html.quarto-dark svg.mermaid-js div, +body.quarto-dark svg[id^="mermaid-"] div, +html.quarto-dark svg[id^="mermaid-"] div { + color: #333 !important; +} + +body.quarto-dark svg.mermaid-js .nodeLabel, +html.quarto-dark svg.mermaid-js .nodeLabel, +body.quarto-dark svg[id^="mermaid-"] .nodeLabel, +html.quarto-dark svg[id^="mermaid-"] .nodeLabel { + color: #333 !important; +} + +body.quarto-dark svg.mermaid-js .edgeLabel, +html.quarto-dark svg.mermaid-js .edgeLabel, +body.quarto-dark svg[id^="mermaid-"] .edgeLabel, +html.quarto-dark svg[id^="mermaid-"] .edgeLabel { + color: #333 !important; +} + +body.quarto-dark svg.mermaid-js foreignObject *, +html.quarto-dark svg.mermaid-js foreignObject *, +body.quarto-dark svg[id^="mermaid-"] foreignObject *, +html.quarto-dark svg[id^="mermaid-"] foreignObject * { + color: #333 !important; +} + +/* Pre-rendered mermaid diagrams: theme switching */ +.mermaid-diagram { + text-align: center; + margin: 1rem 0; +} + +.mermaid-diagram img { + max-width: 100%; + height: auto; +} + +/* Light mode: show light image, hide dark */ +.light-mode-only { + display: block !important; +} +.dark-mode-only { + display: none !important; +} + +/* Dark mode: show dark image, hide light */ +body.quarto-dark .light-mode-only, +html.quarto-dark .light-mode-only { + display: none !important; +} +body.quarto-dark .dark-mode-only, +html.quarto-dark .dark-mode-only { + display: block !important; +} + + +/* ========================================================================== + Responsive Tables + Enhances table display on narrow viewports with: + - Horizontal scroll containers for wide tables + - Scroll indicators showing more content + - Touch-friendly interactions + - Smaller font size on narrow viewports + + Uses double-wrapper structure for Safari compatibility: + - Outer wrapper (.gd-table-responsive) has position:relative for indicators + - Inner wrapper (.gd-table-scroll) has overflow-x:auto for scrolling + ========================================================================== */ + +/* Responsive table outer wrapper - positions indicators */ +.gd-table-responsive { + position: relative; + width: 100%; + margin-bottom: 1rem; +} + +/* Inner scroll container - handles the actual scrolling */ +.gd-table-scroll { + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; /* Smooth momentum scrolling on iOS */ + + /* Focus state for keyboard navigation */ + &:focus { + outline: 2px solid $primary; + outline-offset: 2px; + } + + &:focus:not(:focus-visible) { + outline: none; + } + + /* Table inside the scroll container - prevent auto-shrink, allow scroll */ + > table { + margin-bottom: 0; + width: max-content; + min-width: 100%; + } +} + +/* Scroll indicators - appear at edges when content is scrollable */ +.gd-table-scroll-indicator { + position: absolute; + top: 0; + bottom: 0; + width: 40px; + display: flex; + align-items: center; + justify-content: center; + pointer-events: none; + opacity: 0; + transition: opacity 0.2s ease; + z-index: 2; + + &.visible { + opacity: 1; + pointer-events: auto; + cursor: pointer; + } +} + +.gd-table-scroll-left { + left: 0; + background: linear-gradient(to right, rgba(255, 255, 255, 0.95) 0%, transparent 100%); + padding-left: 4px; +} + +.gd-table-scroll-right { + right: 0; + background: linear-gradient(to left, rgba(255, 255, 255, 0.95) 0%, transparent 100%); + padding-right: 4px; +} + +.gd-scroll-arrow { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 50%; + background: rgba(0, 0, 0, 0.06); + color: $gray-600; + font-size: 1.25rem; + font-weight: 300; + line-height: 1; + transition: background 0.15s ease, color 0.15s ease; + + .gd-table-scroll-indicator:hover & { + background: rgba(0, 0, 0, 0.12); + color: $gray-800; + } +} + +/* Smaller font size on narrow viewports */ +@media (max-width: 767.98px) { + .gd-table-scroll > table { + font-size: 0.85em; + } +} + +@media (max-width: 575.98px) { + .gd-table-scroll > table { + font-size: 0.8em; + } +} + +/* Dark mode overrides for responsive tables */ +body.quarto-dark, +html[data-bs-theme="dark"] { + .gd-table-scroll-left { + background: linear-gradient(to right, rgba(26, 26, 26, 0.95) 0%, transparent 100%); + } + + .gd-table-scroll-right { + background: linear-gradient(to left, rgba(26, 26, 26, 0.95) 0%, transparent 100%); + } + + .gd-scroll-arrow { + background: rgba(255, 255, 255, 0.08); + color: $gray-400; + + .gd-table-scroll-indicator:hover & { + background: rgba(255, 255, 255, 0.15); + color: $gray-200; + } + } +} + +/* Print: disable scroll and show full table */ +@media print { + .gd-table-scroll { + overflow: visible; + } + + .gd-table-scroll-indicator { + display: none; + } +} + +/* ── Inline icon shortcode ───────────────────────────────────── */ + +/* Strip the paragraph margin Pandoc adds when wrapping inline icons + inside table cells. Without this,

+ gets ~1rem of bottom margin and rows appear double-height. */ +td > p:has(> svg.gd-icon) { + margin: 0; + line-height: inherit; +} + + +/* ── Keyboard Keys Shortcode ──────────────────────────────────── */ + +.gd-keys { + display: inline-block; + font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, + "Liberation Mono", monospace; + font-size: 0.8em; + font-weight: 500; + line-height: 1; + padding: 0.15em 0.45em; + min-width: 1.6em; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + color: #1f2328; + background: linear-gradient(180deg, #f6f8fa 0%, #eaeef2 100%); + border: 1px solid #d0d7de; + border-bottom-width: 2px; + border-radius: 5px; + box-shadow: 0 1px 0 rgba(27, 31, 36, 0.04), + inset 0 1px 0 rgba(255, 255, 255, 0.25); +} + +.gd-keys-sep { + display: inline-block; + margin: 0 0.15em; + font-size: 0.85em; + color: #656d76; + vertical-align: baseline; + user-select: none; +} + +/* Function keys (F1–F20): smallcaps-height text on the baseline */ +.gd-keys-fn { + font-size: 0.7em; + font-weight: 600; + letter-spacing: 0.04em; + padding: 0.25em 0.45em; + text-transform: uppercase; + position: relative; + top: -1.1px; +} + +/* Dark mode */ +body.quarto-dark .gd-keys, +html.quarto-dark .gd-keys, +:root[data-bs-theme="dark"] .gd-keys { + color: #e6edf3; + background: linear-gradient(180deg, #2d333b 0%, #22272e 100%); + border-color: #444c56; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.04); +} + +body.quarto-dark .gd-keys-sep, +html.quarto-dark .gd-keys-sep, +:root[data-bs-theme="dark"] .gd-keys-sep { + color: #8b949e; +} + + +/* ── Video embedding enhancements ────────────────────────────── */ + +/* Subtle border around video containers so the frame edge is visible */ +.quarto-video { + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 6px; + overflow: hidden; +} + +body.quarto-dark .quarto-video, +html[data-bs-theme="dark"] .quarto-video { + border-color: rgba(255, 255, 255, 0.15); +} + + +/* ---- Keyboard Shortcuts Help Overlay ---- */ + +.gd-keyboard-overlay { + position: fixed; + inset: 0; + z-index: 1090; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.45); + opacity: 0; + visibility: hidden; + transition: opacity 0.2s ease, visibility 0.2s ease; +} + +.gd-keyboard-overlay-visible { + opacity: 1; + visibility: visible; +} + +.gd-keyboard-overlay-inner { + width: 90%; + max-width: 520px; + max-height: 80vh; + overflow-y: auto; + background: #fff; + border-radius: 0.75rem; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18); + padding: 1.5rem 2rem 2rem; + transform: translateY(12px); + transition: transform 0.2s ease; +} + +.gd-keyboard-overlay-visible .gd-keyboard-overlay-inner { + transform: translateY(0); +} + +.gd-keyboard-overlay-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 1.25rem; + + h2 { + margin: 0; + font-size: 1.15rem; + font-weight: 600; + color: #212529; + } +} + +.gd-keyboard-overlay-close { + display: flex; + align-items: center; + justify-content: center; + width: 30px; + height: 30px; + padding: 0; + border: none; + border-radius: 50%; + background: transparent; + color: #6c757d; + cursor: pointer; + transition: background-color 0.15s ease, color 0.15s ease; + + &:hover { + background: rgba(0, 0, 0, 0.06); + color: #212529; + } + + &:focus-visible { + outline: 2px solid $primary; + outline-offset: 2px; + } +} + +.gd-keyboard-overlay-body { + display: flex; + flex-direction: column; + gap: 1.25rem; +} + +.gd-keyboard-group { + h3 { + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: #868e96; + margin: 0 0 0.5rem; + } + + dl { + margin: 0; + } +} + +.gd-keyboard-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.35rem 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + + &:last-child { + border-bottom: none; + } + + dt { + display: flex; + align-items: center; + gap: 0.35rem; + font-weight: normal; + margin: 0; + } + + dd { + margin: 0; + color: #495057; + font-size: 0.9rem; + } +} + +.gd-keyboard-or { + font-size: 0.75rem; + color: #adb5bd; +} + +kbd { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 1.6em; + padding: 0.15em 0.45em; + font-family: inherit; + font-size: 0.8rem; + font-weight: 500; + line-height: 1; + color: #495057; + background: #f8f9fa; + border: 1px solid #dee2e6; + border-radius: 0.3rem; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08); +} + +/* Dark mode */ +[data-bs-theme="dark"] { + .gd-keyboard-overlay { + background: rgba(0, 0, 0, 0.6); + } + + .gd-keyboard-overlay-inner { + background: #2b3035; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); + } + + .gd-keyboard-overlay-header h2 { + color: #f8f9fa; + } + + .gd-keyboard-overlay-close { + color: #adb5bd; + + &:hover { + background: rgba(255, 255, 255, 0.08); + color: #f8f9fa; + } + } + + .gd-keyboard-group h3 { + color: #868e96; + } + + .gd-keyboard-row { + border-bottom-color: rgba(255, 255, 255, 0.06); + + dd { + color: #ced4da; + } + } + + kbd { + color: #ced4da; + background: #343a40; + border-color: #495057; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); + } +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + .gd-keyboard-overlay, + .gd-keyboard-overlay-inner { + transition: none; + } +} + + +/* ---- Menu Overlay (keyboard shortcut 'm') ---- */ + +.gd-menu-overlay { + position: fixed; + inset: 0; + z-index: 1090; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.45); + opacity: 0; + visibility: hidden; + transition: opacity 0.2s ease, visibility 0.2s ease; +} + +.gd-menu-overlay-visible { + opacity: 1; + visibility: visible; +} + +.gd-menu-overlay-inner { + width: 90%; + max-width: 420px; + max-height: 80vh; + overflow-y: auto; + background: #fff; + border-radius: 0.75rem; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18); + padding: 1.25rem 1.5rem 1.5rem; + transform: translateY(12px); + transition: transform 0.2s ease; +} + +.gd-menu-overlay-visible .gd-menu-overlay-inner { + transform: translateY(0); +} + +.gd-menu-overlay-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 1rem; + + h2 { + margin: 0; + font-size: 1.05rem; + font-weight: 600; + color: #212529; + } +} + +.gd-menu-overlay-close { + display: flex; + align-items: center; + justify-content: center; + width: 30px; + height: 30px; + padding: 0; + border: none; + border-radius: 50%; + background: transparent; + color: #6c757d; + cursor: pointer; + transition: background-color 0.15s ease, color 0.15s ease; + + &:hover { + background: rgba(0, 0, 0, 0.06); + color: #212529; + } + + &:focus-visible { + outline: 2px solid $primary; + outline-offset: 2px; + } +} + +/* Menu list */ +.gd-menu-list { + list-style: none; + margin: 0; + padding: 0; +} + +.gd-menu-section { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: #868e96; + padding: 0.65rem 0.75rem 0.25rem; + cursor: default; + + &:first-child { + padding-top: 0; + } +} + +.gd-menu-item { + display: flex; + align-items: center; + padding: 0.45rem 0.75rem; + border-radius: 0.4rem; + color: #495057; + font-size: 0.9rem; + text-decoration: none; + transition: background-color 0.12s ease, color 0.12s ease; + + &:hover { + background: rgba(0, 0, 0, 0.04); + color: #212529; + text-decoration: none; + } + + &:focus-visible { + outline: 2px solid $primary; + outline-offset: -2px; + background: rgba(0, 0, 0, 0.03); + } +} + +/* Label contains icon + text + inline badge; fills remaining space */ +.gd-menu-item-label { + flex: 1 1 auto; + min-width: 0; + + /* Sidebar icons inside the overlay */ + .gd-nav-icon { + flex-shrink: 0; + width: 15px; + height: 15px; + margin-right: 0.4em; + vertical-align: -0.15em; + opacity: 0.7; + } + + /* Status badges sit inline right after the text */ + .gd-sidebar-status-badge { + margin-left: 4px; + vertical-align: middle; + } +} + +.gd-menu-item:hover .gd-nav-icon, +.gd-menu-item-active .gd-nav-icon { + opacity: 1; +} + +/* Upcoming rocket icon — pushed to the far right of the row */ +.gd-menu-item > .gd-sidebar-upcoming { + flex-shrink: 0; + margin-left: auto; + padding-left: 6px; +} + +/* Section headers with icons */ +.gd-menu-section .gd-nav-icon { + width: 14px; + height: 14px; + margin-right: 0.35em; + vertical-align: -0.1em; + opacity: 0.6; +} + +.gd-menu-item-active { + font-weight: 600; + color: $primary; + background: rgba($primary, 0.06); +} + +.gd-menu-item-focused { + background: rgba(0, 0, 0, 0.06); + color: #212529; + outline: 2px solid $primary; + outline-offset: -2px; +} + +/* Dark mode */ +[data-bs-theme="dark"] { + .gd-menu-overlay { + background: rgba(0, 0, 0, 0.6); + } + + .gd-menu-overlay-inner { + background: #2b3035; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); + } + + .gd-menu-overlay-header h2 { + color: #f8f9fa; + } + + .gd-menu-overlay-close { + color: #adb5bd; + + &:hover { + background: rgba(255, 255, 255, 0.08); + color: #f8f9fa; + } + } + + .gd-menu-section { + color: #868e96; + } + + .gd-menu-item { + color: #ced4da; + + &:hover { + background: rgba(255, 255, 255, 0.06); + color: #f8f9fa; + } + } + + .gd-menu-item-active { + color: lighten($primary, 15%); + background: rgba($primary, 0.12); + } + + .gd-menu-item-focused { + background: rgba(255, 255, 255, 0.08); + color: #f8f9fa; + outline: 2px solid lighten($primary, 15%); + outline-offset: -2px; + } +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + .gd-menu-overlay, + .gd-menu-overlay-inner { + transition: none; + } +} + +/* ── Mobile menu overlay refinements ── + When opened via the Title Bar button the overlay acts as the primary + sidebar navigation. We add backdrop blur, scroll lock, keep the + Title Bar visible above the overlay, and use fixed-height inner + scrolling so the card borders stay in place for long nav lists. */ + +/* Scroll lock: prevent body from scrolling while menu is open */ +body.gd-menu-open { + overflow: hidden; +} + +@media (max-width: 991.98px) { + /* Suppress Bootstrap's collapse sidebar on mobile — the overlay + replaces it entirely. The sidebar DOM stays in the page so + keyboard-nav.js can still read its links. */ + #quarto-sidebar { + display: none !important; + } + + #quarto-sidebar-glass { + display: none !important; + } + + /* Backdrop blur behind the overlay */ + .gd-menu-overlay { + -webkit-backdrop-filter: blur(6px); + backdrop-filter: blur(6px); + } + + /* Keep the Title Bar above the overlay when the menu is open. + The Title Bar lives inside #quarto-header, so we raise the + header's z-index above the overlay (1090) while the menu is + active. The top navbar stays behind the overlay so only the + Title Bar peeks through. */ + body.gd-menu-open #quarto-header { + z-index: 1091; + } + + body.gd-menu-open #quarto-header > .navbar { + position: relative; + z-index: -1; + } + + /* Size the card to sit below the Title Bar with internal scrolling. + margin-top 15px → breathing room below the Title Bar + margin-bottom 20px → clearance for mobile Safari bottom chrome */ + .gd-menu-overlay-inner { + width: calc(100% - 2rem); + max-width: 420px; + max-height: calc(100vh - 5rem - 35px); + margin-top: 15px; + margin-bottom: 20px; + display: flex; + flex-direction: column; + } + + /* Fixed header, scrollable body */ + .gd-menu-overlay-body { + flex: 1 1 auto; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + margin: 0 -1.5rem -1.5rem; + padding: 0 1.5rem 1.5rem; + } + + .gd-menu-overlay-header { + flex-shrink: 0; + } +} + +/* ── Reference overlay: API/CLI switcher + filter inside menu overlay ── + On reference pages the overlay includes the reference switcher and a + live-filter input above the item list. */ +.gd-menu-overlay .gd-menu-ref-switcher { + display: flex; + gap: 0.25rem; + background: #f0f0f0; + border-radius: 6px; + padding: 0.2rem; + margin-bottom: 0.75rem; +} + +.gd-menu-overlay .gd-menu-ref-switcher-btn { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + gap: 0.35rem; + padding: 0.45rem 0.5rem; + border: none; + border-radius: 4px; + background: transparent; + color: #666; + font-size: 0.85rem; + font-weight: 500; + cursor: pointer; + transition: all 0.15s ease; +} + +.gd-menu-overlay .gd-menu-ref-switcher-btn:hover { + background: rgba(255, 255, 255, 0.5); + color: #333; +} + +.gd-menu-overlay .gd-menu-ref-switcher-btn.active { + background: #fff; + color: #333; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.gd-menu-overlay .gd-menu-ref-filter { + position: relative; + margin-bottom: 0.5rem; +} + +.gd-menu-overlay .gd-menu-ref-filter-input { + width: 100%; + padding: 0.4rem 0.75rem 0.4rem 2rem; + font-size: 16px; /* prevent iOS zoom */ + border: 1px solid #e9e9e9; + border-radius: 6px; + background-color: #fff; + transition: border-color 0.15s ease, box-shadow 0.15s ease; +} + +.gd-menu-overlay .gd-menu-ref-filter-input:focus { + outline: none; + border-color: #86b7fe; + box-shadow: 0 0 0 0.15rem rgba(13, 110, 253, 0.12); +} + +.gd-menu-overlay .gd-menu-ref-filter-input::placeholder { + color: #999; +} + +.gd-menu-overlay .gd-menu-ref-filter-icon { + position: absolute; + left: 0.6rem; + top: 50%; + transform: translateY(-50%); + color: #999; + pointer-events: none; + font-size: 0.8rem; +} + +/* Dark mode overrides for reference overlay widgets */ +[data-bs-theme="dark"] .gd-menu-overlay .gd-menu-ref-switcher { + background: #2a2a2a; +} + +[data-bs-theme="dark"] .gd-menu-overlay .gd-menu-ref-switcher-btn { + color: #999; +} + +[data-bs-theme="dark"] .gd-menu-overlay .gd-menu-ref-switcher-btn:hover { + background: rgba(255, 255, 255, 0.1); + color: #ccc; +} + +[data-bs-theme="dark"] .gd-menu-overlay .gd-menu-ref-switcher-btn.active { + background: #3a3a3a; + color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +[data-bs-theme="dark"] .gd-menu-overlay .gd-menu-ref-filter-input { + background-color: #2a2a2a; + border-color: #3d3d3d; + color: #e0e0e0; +} + +[data-bs-theme="dark"] .gd-menu-overlay .gd-menu-ref-filter-input:focus { + border-color: #6ea8fe; + box-shadow: 0 0 0 0.15rem rgba(13, 110, 253, 0.25); +} + +[data-bs-theme="dark"] .gd-menu-overlay .gd-menu-ref-filter-icon { + color: #9e9e9e; +} + +/* Reference overlay items: monospace to match the desktop sidebar */ +.gd-ref-sidebar .gd-menu-overlay .gd-menu-item { + font-family: $font-family-monospace; + font-size: 0.8rem; +} + + +/* ---- Back-to-Top Button ---- */ + +.gd-back-to-top { + position: fixed; + bottom: 2rem; + right: 2rem; + z-index: 1040; + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + padding: 0; + border: 1px solid rgba(0, 0, 0, 0.12); + border-radius: 50%; + background: rgba(255, 255, 255, 0.92); + color: #495057; + cursor: pointer; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); + opacity: 0; + visibility: hidden; + transition: opacity 0.25s ease, visibility 0.25s ease, bottom 0.25s ease, + background-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease; + + &:hover { + background: rgba(255, 255, 255, 1); + color: #212529; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18); + } + + &:focus-visible { + outline: 2px solid $primary; + outline-offset: 2px; + } + + svg { + display: block; + } +} + +.gd-back-to-top-visible { + opacity: 1; + visibility: visible; +} + +/* Dark mode */ +[data-bs-theme="dark"] .gd-back-to-top { + background: rgba(52, 58, 64, 0.92); + color: #dee2e6; + border-color: rgba(255, 255, 255, 0.12); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); + + &:hover { + background: rgba(73, 80, 87, 1); + color: #f8f9fa; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); + } +} + +/* Reduced motion: disable transitions */ +@media (prefers-reduced-motion: reduce) { + .gd-back-to-top { + transition: none; + } +} + +/* Mobile: slightly smaller and tighter to edge */ +@media (max-width: 767.98px) { + .gd-back-to-top { + bottom: 1.25rem; + right: 1.25rem; + width: 36px; + height: 36px; + } +} + + +/* ---- On This Page – Mobile Floating Button & Panel ---- */ + +.gd-otp-btn { + position: fixed; + bottom: 4.5rem; /* above back-to-top; JS fine-tunes this */ + right: 1.25rem; + z-index: 1040; + display: none; /* JS controls visibility via inline style */ + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + padding: 0; + border: 1px solid rgba(0, 0, 0, 0.12); + border-radius: 50%; + background: rgba(255, 255, 255, 0.92); + color: #495057; + cursor: pointer; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); + transition: opacity 0.25s ease, bottom 0.25s ease, + background-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease; + + &:hover, &.gd-otp-btn-active { + background: rgba(255, 255, 255, 1); + color: #212529; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18); + } + + &:focus-visible { + outline: 2px solid $primary; + outline-offset: 2px; + } + + svg { + display: block; + } +} + +/* Backdrop for dismissing the panel */ +.gd-otp-backdrop { + position: fixed; + inset: 0; + z-index: 1041; + background: rgba(0, 0, 0, 0.25); + opacity: 0; + visibility: hidden; + transition: opacity 0.2s ease, visibility 0.2s ease; +} + +.gd-otp-backdrop-visible { + opacity: 1; + visibility: visible; +} + +/* Floating panel */ +.gd-otp-panel { + position: fixed; + bottom: 6rem; + right: 1.25rem; + z-index: 1042; + width: min(280px, calc(100vw - 2.5rem)); + max-height: min(360px, 60vh); + overflow-y: auto; + background: #fff; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 12px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16); + opacity: 0; + visibility: hidden; + transform: translateY(12px) scale(0.95); + transform-origin: bottom right; + transition: opacity 0.2s ease, visibility 0.2s ease, transform 0.2s ease; + -webkit-overflow-scrolling: touch; +} + +.gd-otp-panel-visible { + opacity: 1; + visibility: visible; + transform: translateY(0) scale(1); +} + +.gd-otp-panel-heading { + padding: 0.75rem 1rem 0.375rem; + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: #6c757d; + border-bottom: 1px solid rgba(0, 0, 0, 0.06); +} + +.gd-otp-panel-list { + list-style: none; + margin: 0; + padding: 0.375rem 0; +} + +.gd-otp-panel-list li { + margin: 0; + padding: 0; +} + +.gd-otp-panel-list li.gd-otp-nested { + padding-left: 0.75rem; +} + +.gd-otp-panel-link { + display: block; + padding: 0.5rem 1rem; + font-size: 0.85rem; + line-height: 1.35; + color: #343a40; + text-decoration: none; + border-radius: 0; + transition: background-color 0.1s ease; + + &:hover { + background: rgba(0, 0, 0, 0.04); + color: #212529; + text-decoration: none; + } + + &:active { + background: rgba(0, 0, 0, 0.08); + } +} + +/* Dark mode */ +[data-bs-theme="dark"] .gd-otp-btn { + background: rgba(52, 58, 64, 0.92); + color: #dee2e6; + border-color: rgba(255, 255, 255, 0.12); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); + + &:hover, &.gd-otp-btn-active { + background: rgba(73, 80, 87, 1); + color: #f8f9fa; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); + } +} + +[data-bs-theme="dark"] .gd-otp-backdrop { + background: rgba(0, 0, 0, 0.45); +} + +[data-bs-theme="dark"] .gd-otp-panel { + background: #2b3035; + border-color: rgba(255, 255, 255, 0.1); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); +} + +[data-bs-theme="dark"] .gd-otp-panel-heading { + color: #adb5bd; + border-bottom-color: rgba(255, 255, 255, 0.08); +} + +[data-bs-theme="dark"] .gd-otp-panel-link { + color: #dee2e6; + + &:hover { + background: rgba(255, 255, 255, 0.06); + color: #f8f9fa; + } + + &:active { + background: rgba(255, 255, 255, 0.1); + } +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + .gd-otp-btn, + .gd-otp-panel, + .gd-otp-backdrop { + transition: none; + } +} + + +/*-- License Features Dropdown (mirrors Skills-page install dropdown) ----------*/ + +.gd-license-features { + border: 1px solid tint-color($primary, 70%); + border-radius: 0.5rem; + margin-bottom: 1.5rem; + overflow: hidden; + width: 100%; +} + +.gd-license-features-toggle { + display: flex; + align-items: center; + gap: 0.5rem; + width: 100%; + padding: 0.75rem 1.25rem; + border: none; + background: tint-color($primary, 93%); + color: $primary; + font-weight: 600; + font-size: 1rem; + cursor: pointer; + text-align: left; + transition: background 0.15s ease; + + &:hover { + background: tint-color($primary, 87%); + } + + &[aria-expanded="true"] { + border-bottom: 1px solid tint-color($primary, 70%); + } +} + +.gd-license-features-icon { + display: inline-block; + font-size: 0.65rem; + transition: transform 0.25s ease; + line-height: 1; + + .gd-license-features-toggle[aria-expanded="true"] & { + transform: rotate(90deg); + } +} + +.gd-license-features-body { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows 0.35s ease; + background: tint-color($primary, 97%); + + > * { + overflow: hidden; + min-height: 0; + } + + &.gd-license-features-open { + grid-template-rows: 1fr; + } + + .gd-license-features-inner { + // no padding here — keeps 0fr collapse clean + } + + .gd-license-features-pad { + padding: 0.6rem 1.25rem 0.6rem; + display: flex; + flex-direction: column; + gap: 0.25rem; + } +} + +.license-feature-group h4 { + font-size: 0.8rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: 0.3rem; + color: var(--bs-secondary-color, #6c757d); +} + +.license-feature-group:first-child h4 { + margin-top: 0; +} + +.license-badges { + display: flex; + flex-wrap: wrap; + gap: 0.375rem; +} + +.license-badge { + display: inline-block; + padding: 0.25rem 0.6rem; + font-size: 0.8rem; + font-weight: 500; + border-radius: 1rem; + line-height: 1.4; + white-space: nowrap; +} + +.license-badge-permission { + background: rgba(25, 135, 84, 0.12); + color: #146c43; + border: 1px solid rgba(25, 135, 84, 0.25); +} + +.license-badge-condition { + background: rgba(13, 110, 253, 0.12); + color: #0a58ca; + border: 1px solid rgba(13, 110, 253, 0.25); +} + +.license-badge-limitation { + background: rgba(220, 53, 69, 0.12); + color: #b02a37; + border: 1px solid rgba(220, 53, 69, 0.25); +} + +/* SPDX short-code badge in homepage sidebar */ +.gd-spdx-badge { + display: inline-block; + padding: 0.05rem 0.35rem; + padding-bottom: 0; + font-size: 0.72rem; + font-weight: 600; + font-family: var(--bs-font-monospace); + border-radius: 0.2rem; + background: var(--bs-tertiary-bg, #f8f9fa); + border: 1px solid var(--bs-border-color, #dee2e6); + color: var(--bs-body-color); + text-decoration: none; + cursor: default; + vertical-align: middle; + line-height: 1.3; + transition: background 0.15s, border-color 0.15s; + + &:hover { + background: var(--bs-secondary-bg, #e9ecef); + border-color: var(--bs-secondary-color, #6c757d); + text-decoration: none; + color: var(--bs-body-color); + } +} + +/* Dark-mode overrides for license features & badges */ +html[data-bs-theme="dark"] { + .gd-license-features { + border-color: shade-color($primary, 50%); + } + + .gd-license-features-toggle { + background: shade-color($primary, 80%); + color: tint-color($primary, 50%); + + &:hover { + background: shade-color($primary, 72%); + } + + &[aria-expanded="true"] { + border-bottom-color: shade-color($primary, 50%); + } + } + + .gd-license-features-body { + background: shade-color($primary, 88%); + } + + .license-badge-permission { + background: rgba(25, 135, 84, 0.2); + color: #75b798; + border-color: rgba(25, 135, 84, 0.35); + } + + .license-badge-condition { + background: rgba(13, 110, 253, 0.2); + color: #6ea8fe; + border-color: rgba(13, 110, 253, 0.35); + } + + .license-badge-limitation { + background: rgba(220, 53, 69, 0.2); + color: #ea868f; + border-color: rgba(220, 53, 69, 0.35); + } +} + +/* ── Navigation Icons (Lucide SVG) ──────────────────────────────────────── */ + +/* Shared icon base — applies to both navbar and sidebar icons */ +.gd-nav-icon { + flex-shrink: 0; + margin-right: 0.4em; + vertical-align: -0.15em; /* optical alignment with text baseline */ + opacity: 0.7; + transition: opacity 0.15s ease; +} + +/* Navbar icons */ +.navbar .nav-link > .menu-text > .gd-nav-icon { + width: 16px; + height: 16px; +} + +.navbar .nav-link:hover > .menu-text > .gd-nav-icon { + opacity: 1; +} + +/* Sidebar icons */ +#quarto-sidebar .menu-text > .gd-nav-icon, +#quarto-sidebar .sidebar-item-text > .gd-nav-icon { + width: 15px; + height: 15px; +} + +#quarto-sidebar .sidebar-item:hover .gd-nav-icon { + opacity: 1; +} + +/* Active sidebar item — full opacity */ +#quarto-sidebar .sidebar-link.active > .menu-text > .gd-nav-icon, +#quarto-sidebar a.sidebar-item-text.sidebar-link.active > .gd-nav-icon { + opacity: 1; +} + +/* Section header icons — slightly larger */ +#quarto-sidebar .sidebar-item-section > .sidebar-item-container .gd-nav-icon { + width: 16px; + height: 16px; +} + +/* Dark mode — icon color inherits from text (stroke: currentColor) */ +/* No extra rules needed because Lucide uses stroke="currentColor" */ + +// ── Page Tags ─────────────────────────────────────────────────────────────── + +// Tag pills displayed below page titles +.gd-page-tags { + display: flex; + flex-wrap: wrap; + gap: 0.4rem; + margin-top: 0.35rem; + margin-bottom: 0.8rem; +} + +.gd-tag-pill { + display: inline-flex; + align-items: center; + gap: 0.2rem; + padding: 0.15rem 0.55rem; + font-size: 0.75rem; + font-weight: 500; + line-height: 1.4; + color: mix($primary, $body-color, 60%); + background-color: tint-color($primary, 90%); + border: 1px solid tint-color($primary, 75%); + border-radius: 1rem; + text-decoration: none; + transition: background-color 0.15s ease, border-color 0.15s ease; + white-space: nowrap; + + &:hover, + &:focus-visible { + background-color: tint-color($primary, 80%); + border-color: tint-color($primary, 60%); + color: shade-color($primary, 10%); + text-decoration: none; + } + + .gd-tag-icon { + display: inline-flex; + align-items: center; + margin-right: 0.15rem; + opacity: 0.7; + } +} + +// Tags index page — headings styled as pills +.gd-tag-heading { + margin-top: 1.5rem; + margin-bottom: 0.35rem; + + .gd-tag-pill { + cursor: default; + pointer-events: none; + } +} + +// Indentation for subtags (depth 1 = child, depth 2 = grandchild) +.gd-tag-indent-1 { + margin-left: 2rem; +} + +.gd-tag-indent-2 { + margin-left: 4rem; +} + +// Page links under each tag (no bullets, indented) +.gd-tag-pages { + margin-bottom: 0.75rem; +} + +.gd-tag-page-link { + padding: 0.15rem 0; + padding-left: 1.25rem; + + a { + color: $body-color; + text-decoration: underline; + + &:hover { + color: $primary; + } + } +} + +// Segmented pills for hierarchical tags (e.g. Python | Advanced) +.gd-tag-pill-segmented { + padding: 0; + overflow: hidden; + gap: 0; + + .gd-tag-pill-segment { + display: inline-flex; + align-items: center; + padding: 0.15rem 0.55rem; + } + + .gd-tag-pill-parent { + background-color: tint-color($primary, 90%); + } + + .gd-tag-pill-segment:not(.gd-tag-pill-parent) { + background-color: tint-color($primary, 95%); + } + + .gd-tag-pill-sep { + display: inline-block; + width: 1px; + align-self: stretch; + background-color: tint-color($primary, 60%); + } +} + +.gd-tag-section { + display: inline-block; + font-size: 0.7rem; + font-weight: 500; + color: $text-muted; + background-color: $gray-100; + padding: 0.05rem 0.4rem; + border-radius: 0.25rem; + margin-left: 0.4rem; + vertical-align: middle; +} + +// Dark mode overrides for tag pills +body.quarto-dark { + .gd-tag-pill { + color: tint-color($primary, 70%); + background-color: rgba($primary, 0.15); + border-color: rgba($primary, 0.3); + + &:hover, + &:focus-visible { + background-color: rgba($primary, 0.25); + border-color: rgba($primary, 0.5); + color: tint-color($primary, 85%); + } + } + + .gd-tag-section { + color: $gray-400; + background-color: $gray-800; + } + + .gd-tag-pill-sep { + background-color: rgba($primary, 0.4); + } + + .gd-tag-pill-segmented .gd-tag-pill-parent { + background-color: rgba($primary, 0.15); + } + + .gd-tag-pill-segmented .gd-tag-pill-segment:not(.gd-tag-pill-parent) { + background-color: rgba($primary, 0.08); + } + + .gd-tag-page-link a { + color: $gray-300; + } +} + +// ── Page Status Badges ────────────────────────────────────────────────────── + +// Page-level status indicator (below page title) +.gd-page-status { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.25rem 0.65rem; + margin-top: 0.3rem; + margin-bottom: 0.6rem; + font-size: 14px; + font-weight: 500; + line-height: 1.4; + border-radius: 0.35rem; + color: var(--gd-status-color, $text-muted); + background-color: color-mix(in srgb, var(--gd-status-color, $text-muted) 8%, transparent); + border: 1px solid color-mix(in srgb, var(--gd-status-color, $text-muted) 25%, transparent); + + .gd-status-badge-icon { + display: inline-flex; + align-items: center; + opacity: 0.85; + + svg { + width: 14px; + height: 14px; + } + } + + .gd-status-badge-label { + font-weight: 600; + } + + .gd-status-badge-desc { + font-weight: 400; + opacity: 0.8; + } +} + +// Sidebar status badges (inline after link text) +.gd-sidebar-status-badge { + display: inline-flex; + align-items: center; + justify-content: center; + margin-left: 4px; + padding: 0.05rem 0.35rem; + font-size: 0.65rem; + font-weight: 600; + line-height: 1.3; + border-radius: 0.75rem; + color: var(--gd-status-color, $text-muted); + background-color: color-mix(in srgb, var(--gd-status-color, $text-muted) 10%, transparent); + white-space: nowrap; + flex-shrink: 0; + + svg { + width: 11px; + height: 11px; + } +} + +// Make sidebar links flex so badges align right +// #quarto-sidebar has .sidebar-navigation on itself (not a descendant), +// so use #quarto-sidebar.sidebar-navigation for correct matching. +#quarto-sidebar.sidebar-navigation .sidebar-item .sidebar-link { + display: flex; + align-items: center; +} + +// Dark mode overrides for status badges +body.quarto-dark { + .gd-page-status { + background-color: color-mix(in srgb, var(--gd-status-color, $text-muted) 12%, transparent); + border-color: color-mix(in srgb, var(--gd-status-color, $text-muted) 30%, transparent); + } + + .gd-sidebar-status-badge { + background-color: color-mix(in srgb, var(--gd-status-color, $text-muted) 15%, transparent); + } +} + +// Upcoming indicator: animated gradient title text (Christopher Doyle palette) +.gd-upcoming-title { + background: linear-gradient(90deg, #e63946, #eab308, #2a9d8f, #e63946); + background-size: 300% auto; + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + animation: gd-upcoming-gradient 5s ease-in-out infinite; +} + +@keyframes gd-upcoming-gradient { + 0% { background-position: 0% center; } + 50% { background-position: 100% center; } + 100% { background-position: 0% center; } +} + +.gd-upcoming-icon { + display: inline-flex; + align-items: center; + margin-left: 0.4em; + color: #e63946; + -webkit-text-fill-color: #e63946; + cursor: help; + vertical-align: middle; +} + +// Smaller icon in the mobile secondary nav title +h1.quarto-secondary-nav-title .gd-upcoming-icon svg { + width: 16px; + height: 16px; +} + +.gd-sidebar-upcoming { + display: inline-flex; + align-items: center; + margin-left: auto; + cursor: help; +} + + +/*-------------------------------- Color Swatch Extension --------------------------------*/ + +/* ── Wrapper ── */ + +.gd-color-swatch { + margin: 1.5rem 0; + border-radius: 12px; +} + +.gd-color-swatch--bordered { + border: 1px solid var(--bs-border-color); +} + +.gd-color-swatch--circles { + padding: 1.25rem; +} + +.gd-color-swatch--rectangles { + overflow: hidden; + padding: 0; +} + +/* ── Title & description ── */ + +.gd-cs-title { + width: 100%; + font-weight: 600; + font-size: 1rem; + margin-bottom: 0.5rem; + color: var(--bs-body-color); +} + +.gd-cs-description { + width: 100%; + font-size: 0.9375rem; + color: var(--bs-secondary-color); + margin-bottom: 1rem; + line-height: 1.6; +} + +/* ── Circle swatches ── */ + +.gd-cs-swatches { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(var(--gd-cs-size, 56px), 1fr)); + gap: 1.25rem; +} + +.gd-swatch { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.375rem; + cursor: pointer; + transition: transform 0.15s ease; + + &:hover { + transform: translateY(-2px); + } + + &:active { + transform: translateY(0); + } + + &:focus-visible { + outline: 2px solid var(--bs-primary); + outline-offset: 4px; + border-radius: 4px; + } +} + +.gd-swatch-color { + width: var(--gd-cs-size, 56px); + height: var(--gd-cs-size, 56px); + border-radius: 50%; + position: relative; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + transition: box-shadow 0.15s ease; + + &:hover { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); + } + + &[data-needs-ring="true"] { + box-shadow: inset 0 0 0 1px var(--gd-ring-color), 0 2px 8px rgba(0, 0, 0, 0.1); + } +} + +.gd-swatch-name { + font-size: 0.8125rem; + font-weight: 500; + color: var(--bs-body-color); + text-align: center; + overflow-wrap: break-word; + word-break: break-word; + line-height: 1.3; +} + +.gd-swatch-hex { + font-family: var(--bs-font-monospace); + font-size: 0.6875rem; + color: var(--bs-secondary-color); + text-align: center; +} + +.gd-swatch-contrast { + font-family: var(--bs-font-monospace); + font-size: 0.625rem; + color: var(--bs-secondary-color); + text-align: center; +} + +/* ── Rectangle swatches ── */ + +.gd-swatch-rect { + display: flex; + align-items: center; + padding: 0.875rem 1.25rem; + cursor: pointer; + transition: filter 0.15s ease; + min-height: 56px; + position: relative; + + &:hover { + filter: brightness(0.95); + } + + &:not(:last-child) { + border-bottom: 1px solid rgba(0, 0, 0, 0.06); + } + + &:focus-visible { + outline: 2px solid var(--bs-primary); + outline-offset: -2px; + } +} + +.gd-swatch-rect-name { + font-weight: 600; + flex: 1; +} + +.gd-swatch-rect-hex { + font-family: var(--bs-font-monospace); + font-size: 0.875rem; + margin-right: 1.5rem; +} + +.gd-swatch-contrast-samples { + display: flex; + gap: 0.5rem; +} + +.gd-swatch-aa-sample { + font-weight: 700; + font-size: 0.875rem; + padding: 0.125rem 0.375rem; + border-radius: 4px; +} + +/* ── Contrast pass/fail ── */ + +.gd-cs-pass { + color: #16a34a; +} + +.gd-cs-fail { + color: #dc2626; +} + +/* ── Copy overlay ── */ + +.gd-swatch-copy-overlay { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.35); + border-radius: inherit; + opacity: 0; + transition: opacity 0.3s ease; + pointer-events: none; + + svg { + color: #fff; + width: 24px; + height: 24px; + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3)); + } +} + +/* ── Tooltip styles ── */ + +.gd-cs-tooltip { + display: flex; + gap: 0.625rem; + padding: 0.25rem; + font-size: 0.8125rem; + min-width: 200px; +} + +.gd-cs-tooltip-swatch { + width: 32px; + aspect-ratio: 1; + border-radius: 6px; + flex-shrink: 0; + margin-top: 2px; +} + +.gd-cs-tooltip-name { + font-weight: 600; + margin-bottom: 0.25rem; +} + +.gd-cs-tooltip-table { + width: 100%; + border-collapse: collapse; + font-size: 0.75rem; + + td { + padding: 1px 0; + } + + td:first-child { + color: rgba(255, 255, 255, 0.55); + padding-right: 0.75rem; + white-space: nowrap; + } + + code { + font-size: 0.75rem; + background: none; + padding: 0; + } +} + +.gd-cs-tooltip-sep { + border-top: 1px solid var(--bs-border-color-translucent); + padding-top: 4px !important; +} + +.gd-cs-tooltip-copy { + background: none; + border: none; + cursor: pointer; + padding: 0 0.25rem; + font-size: 0.75rem; + opacity: 0.6; + transition: opacity 0.15s ease; + + &:hover { + opacity: 1; + } +} + +/* ── Dark mode overrides ── */ + +html[data-bs-theme="dark"] { + .gd-swatch-color { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); + + &:hover { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4); + } + + &[data-needs-ring="true"] { + box-shadow: inset 0 0 0 1px var(--gd-ring-color), 0 2px 8px rgba(0, 0, 0, 0.3); + } + } + + .gd-swatch-rect:not(:last-child) { + border-bottom-color: rgba(255, 255, 255, 0.08); + } + + .gd-swatch-rect:hover { + filter: brightness(1.1); + } + + .gd-swatch-copy-overlay { + background: rgba(255, 255, 255, 0.25); + } + + .gd-cs-pass { + color: #4ade80; + } + + .gd-cs-fail { + color: #f87171; + } +} + +/* ── Reduced motion ── */ + +@media (prefers-reduced-motion: reduce) { + .gd-swatch:hover { + transform: none; + } + + .gd-swatch-copy-overlay { + transition: none; + } +} + +/* ── Responsive ── */ + +@media (max-width: 575.98px) { + .gd-cs-swatches { + gap: 0.75rem; + grid-template-columns: repeat(auto-fill, minmax(44px, 1fr)); + } + + .gd-swatch-color { + width: 44px !important; + height: 44px !important; + } + + .gd-swatch-rect { + flex-wrap: wrap; + gap: 0.5rem; + } + + .gd-swatch-rect-hex { + margin-right: 0; + } +} + + +/* ── Output Title Container ───────────────────────────────────────── + Wraps code cell output with a labelled header. + Used by #| output-title: "..." hash-pipe option. +*/ +.gd-output-title-container { + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 0.375rem; + margin-top: 0.5rem; + margin-bottom: 1rem; + overflow: hidden; +} + +.gd-output-title-header { + background: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + padding: 0.35rem 0.75rem; + font-size: 0.8rem; + font-weight: 600; + color: rgba(0, 0, 0, 0.55); + letter-spacing: 0.02em; +} + +.gd-output-title-body { + padding: 0.5rem 0.75rem; +} + +.gd-output-title-body .cell-output { + margin: 0; + padding: 0; +} + +.gd-output-title-body .cell-output pre { + margin: 0; + border: none; + background: transparent; + padding: 0; +} + +/* Frameless variant for rich HTML outputs (GT tables, styled DataFrames, etc.) + These objects carry their own visual structure; a surrounding frame creates + an ugly double-border. We keep the title label but drop the container + border and body padding so the HTML output breathes. + We target display outputs that contain a child div (rich HTML wrapper) + rather than just a
 block (which is a plain return value). */
+.gd-output-title-container:has(.gd-output-title-body .cell-output-display > div) {
+    border: none;
+}
+
+.gd-output-title-container:has(.gd-output-title-body .cell-output-display > div)
+    .gd-output-title-header {
+    background: transparent;
+    border-bottom: none;
+    padding-left: 0;
+}
+
+.gd-output-title-container:has(.gd-output-title-body .cell-output-display > div)
+    .gd-output-title-body {
+    padding: 0;
+}
+
+body.quarto-dark .gd-output-title-container {
+    border-color: rgba(255, 255, 255, 0.12);
+}
+
+body.quarto-dark .gd-output-title-header {
+    background: rgba(255, 255, 255, 0.04);
+    border-bottom-color: rgba(255, 255, 255, 0.12);
+    color: rgba(255, 255, 255, 0.55);
+}
+
+/*------------------------------- Collapsible Details --------------------------------*/
+
+// Base details element
+.gd-details {
+    border: 1px solid tint-color($primary, 70%);
+    border-radius: 0.5rem;
+    margin-bottom: 1rem;
+    overflow: hidden;
+    transition: height 0.3s ease;
+
+    // Remove the default marker/triangle from 
+    > summary {
+        list-style: none;
+        &::-webkit-details-marker { display: none; }
+        &::marker { display: none; }
+    }
+}
+
+// Summary bar (the clickable title row)
+.gd-details-summary {
+    display: flex;
+    align-items: center;
+    gap: 0.5rem;
+    width: 100%;
+    padding: 0.75rem 0.75rem;
+    background: tint-color($primary, 93%);
+    color: $primary;
+    font-weight: 600;
+    font-size: 1rem;
+    cursor: pointer;
+    user-select: none;
+    transition: background 0.15s ease;
+
+    &:hover {
+        background: tint-color($primary, 87%);
+    }
+
+    // Show bottom border when open
+    .gd-details[open] & {
+        border-bottom: 1px solid tint-color($primary, 70%);
+    }
+}
+
+// Chevron indicator (CSS-only rotating arrow)
+.gd-details-chevron {
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    flex-shrink: 0;
+    width: 1rem;
+    height: 1rem;
+    transition: transform 0.25s ease;
+
+    &::before {
+        content: "";
+        display: block;
+        width: 0.45rem;
+        height: 0.45rem;
+        border-right: 2px solid currentColor;
+        border-bottom: 2px solid currentColor;
+        transform: rotate(-45deg);
+        transition: transform 0.25s ease;
+    }
+
+    .gd-details[open] &::before,
+    .gd-details--open &::before {
+        transform: rotate(45deg);
+    }
+}
+
+// Icon wrapper (Lucide icon before the title)
+.gd-details-icon-wrap {
+    display: inline-flex;
+    align-items: center;
+    flex-shrink: 0;
+    line-height: 1;
+}
+
+.gd-details-icon {
+    width: 1em;
+    height: 1em;
+}
+
+// Title text
+.gd-details-title {
+    flex: 1 1 auto;
+}
+
+// Body content area
+.gd-details-body {
+    padding: 0.75rem 1.0rem 0.75rem;
+    background: tint-color($primary, 97%);
+
+    > :last-child {
+        margin-bottom: 0;
+    }
+
+    // Code blocks inside details
+    .sourceCode {
+        margin: 0.35rem 0 0.75rem;
+    }
+
+    pre.sourceCode {
+        padding: 0.5rem 2.5rem 0.5rem 0.75rem;
+        font-size: 0.88rem;
+
+        code {
+            padding: 0 !important;
+        }
+    }
+}
+
+// Animation state classes (managed by details.js)
+.gd-details--animating {
+    overflow: hidden;
+    transition: height 0.3s ease;
+}
+
+// ── Type variants (callout-like styling) ─────────────────────────────
+
+.gd-details--note {
+    border-color: #3b82f6;
+
+    .gd-details-summary {
+        background: tint-color(#3b82f6, 90%);
+        color: shade-color(#3b82f6, 20%);
+
+        &:hover { background: tint-color(#3b82f6, 83%); }
+    }
+    .gd-details[open] > .gd-details-summary,
+    &[open] > .gd-details-summary {
+        border-bottom-color: tint-color(#3b82f6, 70%);
+    }
+    .gd-details-body { background: tint-color(#3b82f6, 96%); }
+}
+
+.gd-details--warning {
+    border-color: #f59e0b;
+
+    .gd-details-summary {
+        background: tint-color(#f59e0b, 90%);
+        color: shade-color(#f59e0b, 30%);
+
+        &:hover { background: tint-color(#f59e0b, 83%); }
+    }
+    &[open] > .gd-details-summary {
+        border-bottom-color: tint-color(#f59e0b, 70%);
+    }
+    .gd-details-body { background: tint-color(#f59e0b, 96%); }
+}
+
+.gd-details--tip {
+    border-color: #10b981;
+
+    .gd-details-summary {
+        background: tint-color(#10b981, 90%);
+        color: shade-color(#10b981, 20%);
+
+        &:hover { background: tint-color(#10b981, 83%); }
+    }
+    &[open] > .gd-details-summary {
+        border-bottom-color: tint-color(#10b981, 70%);
+    }
+    .gd-details-body { background: tint-color(#10b981, 96%); }
+}
+
+.gd-details--danger {
+    border-color: #ef4444;
+
+    .gd-details-summary {
+        background: tint-color(#ef4444, 90%);
+        color: shade-color(#ef4444, 20%);
+
+        &:hover { background: tint-color(#ef4444, 83%); }
+    }
+    &[open] > .gd-details-summary {
+        border-bottom-color: tint-color(#ef4444, 70%);
+    }
+    .gd-details-body { background: tint-color(#ef4444, 96%); }
+}
+
+// ── Gradient variant (animated theme gradient) ───────────────────────
+
+.gd-details--gradient {
+    border-color: color-mix(in srgb, var(--gd-accent, #6366f1) 40%, transparent);
+
+    .gd-details-summary {
+        background: linear-gradient(
+            -45deg,
+            color-mix(in srgb, var(--gd-accent, #6366f1) 15%, white),
+            color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 12%, white),
+            color-mix(in srgb, var(--gd-accent, #6366f1) 10%, white),
+            color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 15%, white)
+        );
+        background-size: 400% 400%;
+        animation: gd-gradient-shift 15s ease infinite;
+        color: color-mix(in srgb, var(--gd-accent, #6366f1) 85%, black);
+
+        &:hover {
+            background: linear-gradient(
+                -45deg,
+                color-mix(in srgb, var(--gd-accent, #6366f1) 22%, white),
+                color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 18%, white),
+                color-mix(in srgb, var(--gd-accent, #6366f1) 15%, white),
+                color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 22%, white)
+            );
+            background-size: 400% 400%;
+            animation: gd-gradient-shift 15s ease infinite;
+        }
+    }
+
+    &[open] > .gd-details-summary {
+        border-bottom-color: color-mix(in srgb, var(--gd-accent, #6366f1) 30%, transparent);
+    }
+
+    .gd-details-body {
+        background: linear-gradient(
+            -45deg,
+            color-mix(in srgb, var(--gd-accent, #6366f1) 4%, white),
+            color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 3%, white),
+            color-mix(in srgb, var(--gd-accent, #6366f1) 2%, white),
+            color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 4%, white)
+        );
+        background-size: 400% 400%;
+        animation: gd-gradient-shift 15s ease infinite;
+    }
+}
+
+// ── Gradient preset variants ─────────────────────────────────────────
+// Each preset reuses gd-details--gradient base and overrides colors.
+
+// Shared base for all named gradient presets
+.gd-details--gradient-sky,
+.gd-details--gradient-peach,
+.gd-details--gradient-prism,
+.gd-details--gradient-lilac,
+.gd-details--gradient-slate,
+.gd-details--gradient-honey,
+.gd-details--gradient-dusk,
+.gd-details--gradient-mint {
+    .gd-details-summary,
+    .gd-details-body {
+        background-size: 400% 400%;
+        animation: gd-gradient-shift 15s ease infinite;
+    }
+}
+
+.gd-details--gradient-sky {
+    border-color: #90cdf4;
+    .gd-details-summary {
+        background: linear-gradient(-45deg, #d0ecf9, #e0f4ff, #c5e8f7, #b8e0f5);
+        color: #023e8a;
+        &:hover { filter: brightness(0.96); }
+    }
+    &[open] > .gd-details-summary { border-bottom-color: #90cdf4; }
+    .gd-details-body { background: linear-gradient(-45deg, #edf7fd, #f2faff, #eaf6fc, #e7f4fb); }
+}
+
+.gd-details--gradient-peach {
+    border-color: #f9b89a;
+    .gd-details-summary {
+        background: linear-gradient(-45deg, #ffddc1, #ffe4cc, #fdd0d8, #fbc4d4);
+        color: #7c2d12;
+        &:hover { filter: brightness(0.96); }
+    }
+    &[open] > .gd-details-summary { border-bottom-color: #f9b89a; }
+    .gd-details-body { background: linear-gradient(-45deg, #fff4ec, #fff7f0, #fef0f2, #fdedf3); }
+}
+
+.gd-details--gradient-prism {
+    border-color: #a7d8c8;
+    .gd-details-summary {
+        background: linear-gradient(-45deg, #c4f0e0, #d0e8f5, #e4d4f4, #d8cef0);
+        color: #1e3a5f;
+        &:hover { filter: brightness(0.96); }
+    }
+    &[open] > .gd-details-summary { border-bottom-color: #a7d8c8; }
+    .gd-details-body { background: linear-gradient(-45deg, #ecfaf4, #eff5fb, #f5eefc, #f2eefa); }
+}
+
+.gd-details--gradient-lilac {
+    border-color: #d8a8e8;
+    .gd-details-summary {
+        background: linear-gradient(-45deg, #e8d0f0, #f5d0e0, #f0d4f8, #eac8ee);
+        color: #4a1462;
+        &:hover { filter: brightness(0.96); }
+    }
+    &[open] > .gd-details-summary { border-bottom-color: #d8a8e8; }
+    .gd-details-body { background: linear-gradient(-45deg, #f7eefc, #fdf0f5, #faeefb, #f8ecf9); }
+}
+
+.gd-details--gradient-slate {
+    border-color: #b0b8c1;
+    .gd-details-summary {
+        background: linear-gradient(-45deg, #e0e4e8, #eceff1, #dde2e6, #d5dadf);
+        color: #263238;
+        &:hover { filter: brightness(0.96); }
+    }
+    &[open] > .gd-details-summary { border-bottom-color: #b0b8c1; }
+    .gd-details-body { background: linear-gradient(-45deg, #f4f5f7, #f8f9fa, #f3f4f6, #f1f2f4); }
+}
+
+.gd-details--gradient-honey {
+    border-color: #f5c97a;
+    .gd-details-summary {
+        background: linear-gradient(-45deg, #ffe0c2, #ffedcc, #ffe5b4, #ffd6a8);
+        color: #7c2d12;
+        &:hover { filter: brightness(0.96); }
+    }
+    &[open] > .gd-details-summary { border-bottom-color: #f5c97a; }
+    .gd-details-body { background: linear-gradient(-45deg, #fff6ec, #fffaf0, #fff5e6, #fff2e0); }
+}
+
+.gd-details--gradient-dusk {
+    border-color: #b0b4d8;
+    .gd-details-summary {
+        background: linear-gradient(-45deg, #d8daf0, #dddff5, #d4d0ee, #dad4f2);
+        color: #1a1050;
+        &:hover { filter: brightness(0.96); }
+    }
+    &[open] > .gd-details-summary { border-bottom-color: #b0b4d8; }
+    .gd-details-body { background: linear-gradient(-45deg, #f0f1fa, #f2f3fc, #eeedf9, #f0eefb); }
+}
+
+.gd-details--gradient-mint {
+    border-color: #80cbc4;
+    .gd-details-summary {
+        background: linear-gradient(-45deg, #ccece8, #d5f0ec, #c4e8e4, #d0f2ee);
+        color: #004d40;
+        &:hover { filter: brightness(0.96); }
+    }
+    &[open] > .gd-details-summary { border-bottom-color: #80cbc4; }
+    .gd-details-body { background: linear-gradient(-45deg, #ebf8f6, #eff9f8, #e9f7f5, #ecfaf8); }
+}
+
+// ── Nesting ──────────────────────────────────────────────────────────
+
+.gd-details .gd-details {
+    margin: 0.5rem 0;
+    border-radius: 0.375rem;
+
+    .gd-details-summary {
+        padding: 0.5rem 1rem;
+        font-size: 0.92rem;
+    }
+
+    .gd-details-body {
+        padding: 0.75rem 1rem 0.5rem;
+    }
+}
+
+// ── Dark mode ────────────────────────────────────────────────────────
+
+html[data-bs-theme="dark"] {
+
+    .gd-details {
+        border-color: shade-color($primary, 50%);
+    }
+
+    .gd-details-summary {
+        background: shade-color($primary, 80%);
+        color: tint-color($primary, 50%);
+
+        &:hover {
+            background: shade-color($primary, 72%);
+        }
+    }
+
+    .gd-details[open] > .gd-details-summary {
+        border-bottom-color: shade-color($primary, 50%);
+    }
+
+    .gd-details-body {
+        background: shade-color($primary, 88%);
+
+        .code-copy-outer-scaffold,
+        .sourceCode,
+        pre.sourceCode {
+            background: transparent;
+        }
+    }
+
+    // Type variants — dark mode
+    .gd-details--note {
+        border-color: shade-color(#3b82f6, 40%);
+
+        .gd-details-summary {
+            background: shade-color(#3b82f6, 75%);
+            color: tint-color(#3b82f6, 55%);
+            &:hover { background: shade-color(#3b82f6, 65%); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: shade-color(#3b82f6, 40%); }
+        .gd-details-body { background: shade-color(#3b82f6, 88%); }
+    }
+
+    .gd-details--warning {
+        border-color: shade-color(#f59e0b, 50%);
+
+        .gd-details-summary {
+            background: shade-color(#f59e0b, 75%);
+            color: tint-color(#f59e0b, 55%);
+            &:hover { background: shade-color(#f59e0b, 65%); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: shade-color(#f59e0b, 50%); }
+        .gd-details-body { background: shade-color(#f59e0b, 88%); }
+    }
+
+    .gd-details--tip {
+        border-color: shade-color(#10b981, 50%);
+
+        .gd-details-summary {
+            background: shade-color(#10b981, 75%);
+            color: tint-color(#10b981, 55%);
+            &:hover { background: shade-color(#10b981, 65%); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: shade-color(#10b981, 50%); }
+        .gd-details-body { background: shade-color(#10b981, 88%); }
+    }
+
+    .gd-details--danger {
+        border-color: shade-color(#ef4444, 50%);
+
+        .gd-details-summary {
+            background: shade-color(#ef4444, 75%);
+            color: tint-color(#ef4444, 55%);
+            &:hover { background: shade-color(#ef4444, 65%); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: shade-color(#ef4444, 50%); }
+        .gd-details-body { background: shade-color(#ef4444, 88%); }
+    }
+
+    .gd-details--gradient {
+        border-color: color-mix(in srgb, var(--gd-accent, #818cf8) 35%, transparent);
+
+        .gd-details-summary {
+            background: linear-gradient(
+                -45deg,
+                color-mix(in srgb, var(--gd-accent, #818cf8) 25%, black),
+                color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 20%, black),
+                color-mix(in srgb, var(--gd-accent, #818cf8) 18%, black),
+                color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 25%, black)
+            );
+            background-size: 400% 400%;
+            animation: gd-gradient-shift 15s ease infinite;
+            color: #ffffff;
+
+            &:hover {
+                background: linear-gradient(
+                    -45deg,
+                    color-mix(in srgb, var(--gd-accent, #818cf8) 32%, black),
+                    color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 28%, black),
+                    color-mix(in srgb, var(--gd-accent, #818cf8) 25%, black),
+                    color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 32%, black)
+                );
+                background-size: 400% 400%;
+                animation: gd-gradient-shift 15s ease infinite;
+            }
+        }
+
+        &[open] > .gd-details-summary {
+            border-bottom-color: color-mix(in srgb, var(--gd-accent, #818cf8) 25%, transparent);
+        }
+
+        .gd-details-body {
+            background: linear-gradient(
+                -45deg,
+                color-mix(in srgb, var(--gd-accent, #818cf8) 8%, black),
+                color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 6%, black),
+                color-mix(in srgb, var(--gd-accent, #818cf8) 5%, black),
+                color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 8%, black)
+            );
+            background-size: 400% 400%;
+            animation: gd-gradient-shift 15s ease infinite;
+        }
+    }
+
+    // Named gradient presets — dark mode
+    .gd-details--gradient-sky {
+        border-color: #0077b6;
+        .gd-details-summary {
+            background: linear-gradient(-45deg, #023e8a, #0077b6, #005f73, #0096c7);
+            color: #ffffff;
+            &:hover { filter: brightness(1.15); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: #005f73; }
+        .gd-details-body { background: linear-gradient(-45deg, #021c3d, #012e4a, #012a38, #01374b); }
+    }
+
+    .gd-details--gradient-peach {
+        border-color: #cc4a1a;
+        .gd-details-summary {
+            background: linear-gradient(-45deg, #cc4a1a, #c7760f, #b84a5f, #a33560);
+            color: #ffffff;
+            &:hover { filter: brightness(1.15); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: #a33560; }
+        .gd-details-body { background: linear-gradient(-45deg, #3d160a, #3b2405, #37161d, #31101d); }
+    }
+
+    .gd-details--gradient-prism {
+        border-color: #048a65;
+        .gd-details-summary {
+            background: linear-gradient(-45deg, #048a65, #0c6a8a, #52077d, #2a0978);
+            color: #ffffff;
+            &:hover { filter: brightness(1.15); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: #0c6a8a; }
+        .gd-details-body { background: linear-gradient(-45deg, #02291e, #042029, #180225, #0d0224); }
+    }
+
+    .gd-details--gradient-lilac {
+        border-color: #561e64;
+        .gd-details-summary {
+            background: linear-gradient(-45deg, #561e64, #8b1140, #a02db3, #6e1a7d);
+            color: #ffffff;
+            &:hover { filter: brightness(1.15); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: #8b1140; }
+        .gd-details-body { background: linear-gradient(-45deg, #1a091e, #290613, #300e35, #210826); }
+    }
+
+    .gd-details--gradient-slate {
+        border-color: #455a64;
+        .gd-details-summary {
+            background: linear-gradient(-45deg, #37474f, #455a64, #3e525e, #263238);
+            color: #ffffff;
+            &:hover { filter: brightness(1.15); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: #3e525e; }
+        .gd-details-body { background: linear-gradient(-45deg, #111518, #15191e, #13181b, #0c0f11); }
+    }
+
+    .gd-details--gradient-honey {
+        border-color: #bf360c;
+        .gd-details-summary {
+            background: linear-gradient(-45deg, #bf360c, #e65100, #ef6c00, #b71c1c);
+            color: #ffffff;
+            &:hover { filter: brightness(1.15); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: #e65100; }
+        .gd-details-body { background: linear-gradient(-45deg, #391004, #441800, #482000, #370808); }
+    }
+
+    .gd-details--gradient-dusk {
+        border-color: #1a0f52;
+        .gd-details-summary {
+            background: linear-gradient(-45deg, #0d1244, #141b55, #1a0f52, #261560);
+            color: #ffffff;
+            &:hover { filter: brightness(1.15); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: #141b55; }
+        .gd-details-body { background: linear-gradient(-45deg, #040514, #060819, #080518, #0b061c); }
+    }
+
+    .gd-details--gradient-mint {
+        border-color: #00695c;
+        .gd-details-summary {
+            background: linear-gradient(-45deg, #00695c, #00796b, #004d40, #00897b);
+            color: #ffffff;
+            &:hover { filter: brightness(1.15); }
+        }
+        &[open] > .gd-details-summary { border-bottom-color: #004d40; }
+        .gd-details-body { background: linear-gradient(-45deg, #001f1b, #002420, #001713, #002924); }
+    }
+}
+
+// ── Gleam border effect ──────────────────────────────────────────────
+// A traveling light that sweeps around the outer border of the details frame.
+// Uses a background-layering trick: a conic-gradient background clipped to
+// border-box shows through a transparent border, while a solid fill covers
+// the padding-box (content area). Animation is JS-driven via --gd-gleam-angle.
+//
+// Light mode: subtle colored border with a bright white highlight sweeping.
+// Dark mode: transparent border with a colored highlight sweeping.
+
+.gd-details--gleam {
+    --gd-gleam-color: #{tint-color($primary, 20%)};
+    --gd-gleam-angle: 0deg;
+    border: 2px solid transparent;
+    background:
+        linear-gradient(var(--gd-gleam-bg, var(--bs-body-bg, #ffffff)), var(--gd-gleam-bg, var(--bs-body-bg, #ffffff))) padding-box,
+        conic-gradient(
+            from var(--gd-gleam-angle),
+            var(--gd-gleam-color) 0%,
+            var(--gd-gleam-color) 60%,
+            white 75%,
+            white 82%,
+            var(--gd-gleam-color) 92%,
+            var(--gd-gleam-color) 100%
+        ) border-box;
+}
+
+// Gleam + gradient preset combinations
+.gd-details--gleam.gd-details--gradient-sky { --gd-gleam-color: #38bdf8; }
+.gd-details--gleam.gd-details--gradient-peach { --gd-gleam-color: #fb923c; }
+.gd-details--gleam.gd-details--gradient-prism { --gd-gleam-color: #a78bfa; }
+.gd-details--gleam.gd-details--gradient-lilac { --gd-gleam-color: #c084fc; }
+.gd-details--gleam.gd-details--gradient-slate { --gd-gleam-color: #94a3b8; }
+.gd-details--gleam.gd-details--gradient-honey { --gd-gleam-color: #fbbf24; }
+.gd-details--gleam.gd-details--gradient-dusk { --gd-gleam-color: #818cf8; }
+.gd-details--gleam.gd-details--gradient-mint { --gd-gleam-color: #2dd4bf; }
+.gd-details--gleam.gd-details--gradient { --gd-gleam-color: var(--gd-accent, #6366f1); }
+
+// Type-based gleam colors
+.gd-details--gleam.gd-details--note { --gd-gleam-color: #60a5fa; }
+.gd-details--gleam.gd-details--warning { --gd-gleam-color: #fbbf24; }
+.gd-details--gleam.gd-details--tip { --gd-gleam-color: #34d399; }
+.gd-details--gleam.gd-details--danger { --gd-gleam-color: #f87171; }
+
+// Dark mode gleam adjustments — inverted: transparent base, colored highlight
+html[data-bs-theme="dark"] {
+    .gd-details--gleam {
+        --gd-gleam-color: #{tint-color($primary, 55%)};
+        border-color: transparent;
+        background:
+            linear-gradient(var(--bs-body-bg, #212529), var(--bs-body-bg, #212529)) padding-box,
+            conic-gradient(
+                from var(--gd-gleam-angle),
+                transparent 0%,
+                transparent 60%,
+                var(--gd-gleam-color) 75%,
+                color-mix(in srgb, var(--gd-gleam-color) 60%, white) 80%,
+                var(--gd-gleam-color) 85%,
+                transparent 95%,
+                transparent 100%
+            ) border-box;
+    }
+
+    .gd-details--gleam.gd-details--gradient-sky { --gd-gleam-color: #7dd3fc; }
+    .gd-details--gleam.gd-details--gradient-peach { --gd-gleam-color: #fdba74; }
+    .gd-details--gleam.gd-details--gradient-prism { --gd-gleam-color: #c4b5fd; }
+    .gd-details--gleam.gd-details--gradient-lilac { --gd-gleam-color: #d8b4fe; }
+    .gd-details--gleam.gd-details--gradient-slate { --gd-gleam-color: #cbd5e1; }
+    .gd-details--gleam.gd-details--gradient-honey { --gd-gleam-color: #fde68a; }
+    .gd-details--gleam.gd-details--gradient-dusk { --gd-gleam-color: #a5b4fc; }
+    .gd-details--gleam.gd-details--gradient-mint { --gd-gleam-color: #5eead4; }
+    .gd-details--gleam.gd-details--gradient { --gd-gleam-color: var(--gd-accent, #818cf8); }
+    .gd-details--gleam.gd-details--note { --gd-gleam-color: #93c5fd; }
+    .gd-details--gleam.gd-details--warning { --gd-gleam-color: #fde68a; }
+    .gd-details--gleam.gd-details--tip { --gd-gleam-color: #6ee7b7; }
+    .gd-details--gleam.gd-details--danger { --gd-gleam-color: #fca5a5; }
+}
+
+// ── Reduced motion ───────────────────────────────────────────────────
+
+@media (prefers-reduced-motion: reduce) {
+    .gd-details {
+        transition: none;
+    }
+    .gd-details--animating {
+        transition: none;
+    }
+    .gd-details-chevron::before {
+        transition: none;
+    }
+    .gd-details-summary {
+        transition: none;
+    }
+    .gd-details--gradient .gd-details-summary,
+    .gd-details--gradient .gd-details-body,
+    .gd-details--gradient-sky .gd-details-summary,
+    .gd-details--gradient-sky .gd-details-body,
+    .gd-details--gradient-peach .gd-details-summary,
+    .gd-details--gradient-peach .gd-details-body,
+    .gd-details--gradient-prism .gd-details-summary,
+    .gd-details--gradient-prism .gd-details-body,
+    .gd-details--gradient-lilac .gd-details-summary,
+    .gd-details--gradient-lilac .gd-details-body,
+    .gd-details--gradient-slate .gd-details-summary,
+    .gd-details--gradient-slate .gd-details-body,
+    .gd-details--gradient-honey .gd-details-summary,
+    .gd-details--gradient-honey .gd-details-body,
+    .gd-details--gradient-dusk .gd-details-summary,
+    .gd-details--gradient-dusk .gd-details-body,
+    .gd-details--gradient-mint .gd-details-summary,
+    .gd-details--gradient-mint .gd-details-body {
+        animation: none;
+    }
+}
+
+
+/*-- scss:functions --*/
+
+/*-- scss:uses --*/
diff --git a/great-docs/index.qmd b/great-docs/index.qmd
new file mode 100644
index 0000000..d3c5a75
--- /dev/null
+++ b/great-docs/index.qmd
@@ -0,0 +1,231 @@
+---
+title: ""
+toc: false
+body-classes: "gd-homepage"
+---
+
+
+
+::: {.column-margin}
+#### Links
+
+[View on PyPI](https://pypi.org/project/dash-mantine-datatable/)
+ +#### AI / Agents + +[Skills](skills.html)
+[llms.txt](llms.txt)
+[llms-full.txt](llms-full.txt)
+ +#### Developers + +

Jeff Gallini

Maintainer

+ +#### Community + +[Contributing guide](contributing.qmd)
+[Full license](license.qmd)
+::: + +## dash-mantine-datatable + +`dash-mantine-datatable` is a Dash wrapper around Mantine DataTable for apps +that already use `dash-mantine-components` and want a table that feels native +to the Mantine stack. It adds a Dash-friendly prop model, Mantine style props, +Dash-safe render and editor slots, and chainable Python helpers for columns, +grouping, rows, selection, pagination, sorting, and search. + +![Basic formatting example](assets/examples/hero-basic-formatting.png) + +### Install + +```bash +pip install dash-mantine-datatable +``` + +Install the optional demo dependency bundle when you want to run the live +market-data examples from `usage.py`: + +```bash +pip install "dash-mantine-datatable[demo]" +``` + +### Quick Start + +```python +from dash import Dash +import dash_mantine_components as dmc +import dash_mantine_datatable as dmdt + +app = Dash() + +app.layout = dmc.MantineProvider( + dmdt.DataTable( + id="employees", + data=[ + {"id": 1, "name": "Avery Stone", "team": "Platform", "status": "On Track"}, + {"id": 2, "name": "Mina Patel", "team": "Growth", "status": "Planning"}, + ], + columns=[ + {"accessor": "name", "sortable": True}, + {"accessor": "team", "sortable": True}, + {"accessor": "status", "presentation": "badge"}, + ], + ).update_layout(radius="lg", withTableBorder=True, striped=True) +) + +if __name__ == "__main__": + app.run(debug=True) +``` + +### Highlights + +- Mantine-flavored Dash props such as `radius`, `bg`, `classNames`, `styles`, + `bd`, and `bdrs` +- Chainable helpers including `update_layout()`, `update_table_properties()`, + `update_columns()`, `group_columns()`, `update_rows()`, + `update_selection()`, `update_pagination()`, `update_sorting()`, and + `update_search()` +- Dash-safe component templates for column renderers, editors, filters, empty + states, custom loaders, row expansion content, and sort icons +- Support for grouped headers, grouped rows, nested child rows, row dragging, + server-side pagination, server-side sorting, server-side search, and + selector-based row styling rules +- Multi-language Dash component assets for Python, R, and Julia generated from + the same source tree + +### Compared With `dash-ag-grid` + +The comparison below reflects this package's current `0.1.0` surface and the +official Dash AG Grid docs as of April 17, 2026. + +| Area | `dash-mantine-datatable` | `dash-ag-grid` | +| --- | --- | --- | +| UI fit | Best when the rest of the app is already Mantine/DMC and visual consistency matters | Best when the grid is its own major product surface and can use AG Grid's theme/system | +| Authoring model | Compact Dash API with Python helpers like `update_columns()` and `update_rows()` | Richer but more verbose grid configuration with AG Grid concepts and options | +| Styling | Mantine props, Mantine tokens, Dash components in table slots | AG Grid theme system plus extensive cell, row, header, and menu customization | +| Dash component slots | Strong support for Dash components in renderers, editors, filters, empty states, loaders, and row expansion | Strong custom rendering and editing support, with a broader grid API around it | +| Common app-table features | Sorting, search, selection, pagination, row expansion, row dragging, grouped headers, conditional row rules | All of the above plus a much broader spreadsheet-style feature set | +| Grouping and hierarchy | Inline row grouping, aggregations, grouped headers, nested child rows | Broader grouping/tree/master-detail model; some advanced features are enterprise-only | +| Large-data strategy | Client and server modes for pagination, sorting, and search; no AG Grid-style row-model surface exposed | Client-side, infinite, viewport, and server-side row models | +| Export and clipboard workflows | Not a current focus of the package surface | Mature CSV/export/clipboard workflows and more Excel-like interactions | +| Analytics features | Focused on application tables, formatting, and interaction | Pivoting, advanced aggregation, charts, sidebars, and other grid-heavy workflows; many advanced features are enterprise-only | +| Licensing story | MIT package built on the Mantine DataTable ecosystem | Core grid is free; advanced AG Grid features may require an Enterprise license | +| Best fit | Dash apps that want a polished Mantine-native table without AG Grid complexity | Data-heavy apps that need deep grid mechanics, very large-data tooling, or enterprise spreadsheet features | + +Choose `dash-mantine-datatable` when you want the table to feel like the rest +of a Mantine app and you value a smaller Dash-native API. Choose +`dash-ag-grid` when the grid itself is the power-user surface and you need row +models, export, pivoting, or other spreadsheet-grade features. + +### Helper Example + +```python +table = ( + dmdt.DataTable( + data=[{"id": 1, "name": "Avery", "salary": 128000, "status": "On Track"}], + columns=[ + dmdt.Column("name"), + dmdt.Column("salary", textAlign="right", presentation="currency", currency="USD"), + dmdt.Column("status", presentation="badge"), + ], + ) + .update_columns(selector="name", title="Employee") + .update_rows(selector={"status": "On Track"}, className="row-ok") + .update_selection(selectionTrigger="checkbox") + .update_pagination(recordsPerPage=10) +) +``` + +### Documentation + +Build the Great Docs site locally: + +```bash +python -m pip install -e ".[docs]" +quarto --version # requires Quarto 1.5.0 or newer +python scripts/build_docs.py +``` + +This regenerates the recipe pages from `usage.py`, builds the Great Docs site, +and copies the rendered output to `site/`. Great Docs also generates +`llms.txt`, `llms-full.txt`, Markdown page copies, and the API reference from +the public Python exports. + +On Windows, `great-docs` installs JupyterLab assets with very long filenames. +If `python -m pip install -e ".[docs]"` fails under a deeply nested `venv` +path, either enable Windows Long Paths or create the virtual environment in a +shorter directory such as `C:\venvs\dmdt`. + +```powershell +py -m venv C:\venvs\dmdt +C:\venvs\dmdt\Scripts\Activate.ps1 +Set-Location C:\Users\galli\Documents\GitHub\Repositories\dash-mantine-datatable +python -m pip install -U pip +python -m pip install -e ".[docs]" +``` + +To enable deployment on GitHub, open `Settings -> Pages` and set the publishing +source to `GitHub Actions`. + +### Local Development + +```bash +npm install --legacy-peer-deps +python -m pip install -r requirements.txt -r tests/requirements.txt +npm run build +python -m pytest +python usage.py +``` + +### Publishing + +```powershell +.\scripts\check-release.ps1 +``` + +```bash +python scripts/check_release.py +``` + +Use `staging` as the integration branch for contributor PRs, then open a +release PR from `staging` into `main` when you are ready to publish. The +release PR title is the source of truth for the next package version, so title +it like `v0.1.1 Release - Improved Documentation and reduced console warnings`. + +The release guard validates that: + +- the PR is `staging -> main` +- the title starts with `vX.Y.Z Release` +- the requested version is newer than the current package version + +When that release PR is merged, `.github/workflows/publish-release.yml` will: + +- stamp the requested version into `package.json`, `package-lock.json`, + `dash_mantine_datatable/package-info.json`, and `Project.toml` +- promote `## Unreleased` in `CHANGELOG.md` into `## X.Y.Z - YYYY-MM-DD` + or, if needed, create a release section from the title summary +- commit those release metadata changes back to `main` +- rebuild, test, package, upload to PyPI, and create or update a GitHub release + +Recommended changelog flow: + +- Keep a `## Unreleased` section at the top of `CHANGELOG.md` on `staging`. +- Add release notes there as contributors land changes. +- Let the publish workflow convert that section into the final versioned entry. + +One-time GitHub setup: + +- Create a long-lived `staging` branch. +- Protect `main` so changes land by pull request, not direct push. +- Require the `Release PR Guard` workflow on `main`. +- Add a `PYPI_API_TOKEN` secret to the `pypi` environment used by the publish + workflow. + diff --git a/great-docs/keyboard-nav.js b/great-docs/keyboard-nav.js new file mode 100644 index 0000000..a067040 --- /dev/null +++ b/great-docs/keyboard-nav.js @@ -0,0 +1,1092 @@ +/** + * Keyboard Navigation & Shortcuts for Great Docs + * + * Features: + * - `/` or `s` to focus search + * - `[` / `]` for previous/next page navigation + * - `q` to navigate to homepage + * - `u` to navigate to User Guide (when available) + * - `r` to navigate to API Reference (when available) + * - `m` or `n` to show/hide floating menu overlay (sidebar nav or navbar links) + * - `d` to toggle dark mode + * - `c` to copy page as Markdown (when available) + * - `h` or `?` to show/hide keyboard shortcuts help overlay + * - `Escape` to close overlay or unfocus active element + * - Dark mode aware + * - Respects reduced-motion preferences + * - Skips shortcuts when user is typing in inputs/textareas + * - ARIA attributes for screen reader accessibility + */ + +(function() { + 'use strict'; + + // i18n helper — read translations from + var _i18nCache = null; + function _gdT(key, fallback) { + if (!_i18nCache) { + try { + var meta = document.querySelector('meta[name="gd-i18n"]'); + _i18nCache = meta ? JSON.parse(meta.getAttribute('content')) : {}; + } catch (e) { _i18nCache = {}; } + } + return _i18nCache[key] || fallback; + } + + // State + var overlay = null; + var isOverlayOpen = false; + var menuOverlay = null; + var isMenuOpen = false; + + /** + * Check if the user prefers reduced motion + */ + function prefersReducedMotion() { + return window.matchMedia('(prefers-reduced-motion: reduce)').matches; + } + + /** + * Check if the active element is an input or editable area + */ + function isTyping() { + var el = document.activeElement; + if (!el) return false; + var tag = el.tagName; + if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true; + if (el.isContentEditable) return true; + // Quarto search autocomplete input + if (el.classList.contains('aa-Input')) return true; + return false; + } + + // ── Search Focus ───────────────────────────────────────────────────── + + function focusSearch() { + // Try Quarto's Algolia-style autocomplete input first + var searchInput = document.querySelector('.aa-Input'); + if (!searchInput) { + // Fall back to the Quarto search container (clicking it usually opens the search) + var searchContainer = document.querySelector('#quarto-search'); + if (searchContainer) { + var btn = searchContainer.querySelector('button') || + searchContainer.querySelector('[role="button"]'); + if (btn) { + btn.click(); + return; + } + } + } + if (searchInput) { + searchInput.focus(); + if (searchInput.select) searchInput.select(); + } + } + + // ── Page Navigation ────────────────────────────────────────────────── + + function navigatePrev() { + var link = document.querySelector('.nav-page-previous a.pagination-link'); + if (link) { + link.click(); + } + } + + function navigateNext() { + var link = document.querySelector('.nav-page-next a.pagination-link'); + if (link) { + link.click(); + } + } + + function navigateHome() { + // Use the navbar brand link (always points to site root) + var brand = document.querySelector('.navbar-brand'); + if (brand && brand.href) { + window.location.href = brand.href; + return; + } + // Fallback: navigate to site root + window.location.href = './'; + } + + /** + * Find a navbar link whose href contains the given path segment. + */ + function findNavbarLink(pathSegment) { + var links = document.querySelectorAll( + '#navbarCollapse > .navbar-nav.me-auto > .nav-item > .nav-link' + ); + for (var i = 0; i < links.length; i++) { + var href = links[i].getAttribute('href') || ''; + if (href.indexOf(pathSegment) !== -1) return links[i]; + } + return null; + } + + function hasUserGuide() { return !!findNavbarLink('user-guide/'); } + function hasReference() { return !!findNavbarLink('reference/'); } + + function navigateUserGuide() { + var link = findNavbarLink('user-guide/'); + if (link) window.location.href = link.getAttribute('href'); + } + + function navigateReference() { + var link = findNavbarLink('reference/'); + if (link) window.location.href = link.getAttribute('href'); + } + + // ── Show Menu Overlay ────────────────────────────────────────────── + + /** + * Detect whether the current page is the homepage. + * Homepage body has `nav-fixed` but NOT `nav-sidebar`. + */ + function isHomepage() { + return !document.body.classList.contains('nav-sidebar'); + } + + /** + * Build menu items from the top navbar links (used on homepage). + * Returns an array of {text, href, active, section, html, badgeHtml} objects. + */ + function getNavbarItems() { + var items = []; + var links = document.querySelectorAll( + '#navbarCollapse > .navbar-nav.me-auto > .nav-item > .nav-link' + ); + for (var i = 0; i < links.length; i++) { + var a = links[i]; + var text = a.querySelector('.menu-text'); + if (!text) continue; + items.push({ + text: text.textContent.trim(), + html: text.innerHTML, + badgeHtml: '', + href: a.getAttribute('href') || '#', + active: a.classList.contains('active'), + section: null + }); + } + return items; + } + + /** + * Build menu items from the left sidebar navigation (used on content pages). + * Handles both sectioned sidebars (User Guide) and flat sidebars (Recipes). + * Returns an array of {text, href, active, section, html, badgeHtml, upcomingHtml} objects. + * - html: innerHTML of .menu-text (includes icons + text) + * - badgeHtml: outerHTML of .gd-sidebar-status-badge (if present) + * - upcomingHtml: outerHTML of .gd-sidebar-upcoming rocket icon (if present) + */ + function getSidebarItems() { + var items = []; + var sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) return items; + + function extractItem(a, sectionTitle) { + var menuText = a.querySelector('.menu-text'); + if (!menuText) return null; + var badge = a.querySelector('.gd-sidebar-status-badge'); + var upcoming = a.querySelector('.gd-sidebar-upcoming'); + return { + text: menuText.textContent.trim(), + html: menuText.innerHTML, + badgeHtml: badge ? badge.outerHTML : '', + upcomingHtml: upcoming ? upcoming.outerHTML : '', + href: a.getAttribute('href') || '#', + active: a.classList.contains('active'), + section: sectionTitle + }; + } + + function extractSectionHtml(sec) { + var headerEl = sec.querySelector(':scope > .sidebar-item-container .menu-text'); + if (!headerEl) { + // Try sidebar-item-text for section headers without .menu-text + headerEl = sec.querySelector(':scope > .sidebar-item-container .sidebar-item-text'); + } + return headerEl ? headerEl.innerHTML : null; + } + + var sections = sidebar.querySelectorAll('.sidebar-item-section'); + + if (sections.length > 0) { + // Sectioned sidebar (e.g., User Guide pages) + // First, capture any top-level links outside sections (e.g., "API Index") + var menuContainer = sidebar.querySelector('.sidebar-menu-container'); + if (menuContainer) { + var topLis = menuContainer.querySelectorAll(':scope > ul > li.sidebar-item:not(.sidebar-item-section)'); + for (var t = 0; t < topLis.length; t++) { + var topLink = topLis[t].querySelector('.sidebar-link'); + if (topLink) { + var topItem = extractItem(topLink, null); + if (topItem) items.push(topItem); + } + } + } + + for (var s = 0; s < sections.length; s++) { + var sec = sections[s]; + var sectionHtml = extractSectionHtml(sec); + + var links = sec.querySelectorAll('.sidebar-section .sidebar-link'); + for (var i = 0; i < links.length; i++) { + var item = extractItem(links[i], sectionHtml); + if (item) { + items.push(item); + sectionHtml = null; + } + } + } + } else { + // Flat sidebar (e.g., Recipes, custom sections) + var links = sidebar.querySelectorAll('.sidebar-item .sidebar-link'); + for (var i = 0; i < links.length; i++) { + var item = extractItem(links[i], null); + if (item) items.push(item); + } + } + + return items; + } + + /** + * Detect whether the current page is a Reference page (API or CLI). + */ + function isReferencePage() { + return document.body.classList.contains('gd-ref-sidebar'); + } + + /** + * Detect whether the current page is CLI Reference (vs API Reference). + */ + function isCliReferencePage() { + return window.location.pathname.indexOf('/reference/cli/') !== -1; + } + + /** + * Check if CLI Reference docs exist (switcher should show both tabs). + */ + function hasCliReference() { + // Check multiple signals: the reference-switcher widget (injected by + // reference-switcher.js into the hidden sidebar), any to CLI docs, + // or being on a CLI page itself. + return !!document.querySelector('.reference-switcher-container') || + !!document.querySelector('a[href*="/reference/cli/"]') || + isCliReferencePage(); + } + + /** + * Build the reference switcher HTML (API / CLI tabs). + */ + function buildRefSwitcherHtml() { + if (!hasCliReference()) return ''; + var isCli = isCliReferencePage(); + var apiLabel = _gdT('api', 'API'); + var cliLabel = _gdT('cli', 'CLI'); + var html = '
'; + html += ''; + html += ''; + html += '
'; + return html; + } + + /** + * Build the reference filter input HTML. + */ + function buildRefFilterHtml(itemCount) { + if (itemCount < 15) return ''; + var placeholder = _gdT('sidebar_filter_placeholder', 'Filter...'); + var html = '
'; + html += ''; + html += ''; + html += '
'; + return html; + } + + /** + * Attach filter behaviour to the overlay for reference pages. + */ + function attachRefFilter(overlay) { + var input = overlay.querySelector('.gd-menu-ref-filter-input'); + if (!input) return; + + input.addEventListener('input', function() { + var query = input.value.toLowerCase().trim(); + var items = overlay.querySelectorAll('.gd-menu-item'); + var sections = overlay.querySelectorAll('.gd-menu-section'); + + // Show/hide items based on text match + for (var i = 0; i < items.length; i++) { + var text = items[i].textContent.toLowerCase(); + items[i].parentElement.style.display = (!query || text.indexOf(query) !== -1) ? '' : 'none'; + } + + // Show section headers only if at least one child item is visible + for (var s = 0; s < sections.length; s++) { + var li = sections[s]; + var next = li.nextElementSibling; + var anyVisible = false; + while (next && !next.classList.contains('gd-menu-section')) { + if (next.style.display !== 'none') anyVisible = true; + next = next.nextElementSibling; + } + li.style.display = anyVisible ? '' : 'none'; + } + }); + + // Focus filter on open (after transition) + setTimeout(function() { input.focus(); }, 220); + } + + /** + * Parse sidebar items from an HTML string (fetched from another page). + * Returns an array of {text, html, href, section} objects. + */ + function parseSidebarItemsFromHtml(htmlStr, baseUrl) { + var parser = new DOMParser(); + var doc = parser.parseFromString(htmlStr, 'text/html'); + var sidebar = doc.getElementById('quarto-sidebar'); + if (!sidebar) return []; + + var items = []; + var sections = sidebar.querySelectorAll('.sidebar-item-section'); + + // Resolve relative URLs against the fetched page's base + var fullBase = new URL(baseUrl, window.location.origin).href; + function resolveHref(href) { + if (!href || href === '#') return '#'; + try { return new URL(href, fullBase).pathname; } + catch (e) { return href; } + } + + function extractParsedItem(a, sectionText) { + var menuText = a.querySelector('.menu-text'); + if (!menuText) return null; + return { + text: menuText.textContent.trim(), + html: menuText.innerHTML, + href: resolveHref(a.getAttribute('href')), + active: false, + section: sectionText + }; + } + + if (sections.length > 0) { + // Top-level links outside sections (like "API Index") + var menuContainer = sidebar.querySelector('.sidebar-menu-container'); + if (menuContainer) { + var topLis = menuContainer.querySelectorAll(':scope > ul > li.sidebar-item:not(.sidebar-item-section)'); + for (var t = 0; t < topLis.length; t++) { + var topLink = topLis[t].querySelector('.sidebar-link'); + if (topLink) { + var topItem = extractParsedItem(topLink, null); + if (topItem) items.push(topItem); + } + } + } + + for (var s = 0; s < sections.length; s++) { + var sec = sections[s]; + var headerEl = sec.querySelector(':scope > .sidebar-item-container .menu-text') || + sec.querySelector(':scope > .sidebar-item-container .sidebar-item-text'); + var sectionText = headerEl ? headerEl.innerHTML : null; + var links = sec.querySelectorAll('.sidebar-section .sidebar-link'); + for (var i = 0; i < links.length; i++) { + var item = extractParsedItem(links[i], sectionText); + if (item) { + items.push(item); + sectionText = null; + } + } + } + } else { + var flatLinks = sidebar.querySelectorAll('.sidebar-item .sidebar-link'); + for (var i = 0; i < flatLinks.length; i++) { + var item = extractParsedItem(flatLinks[i], null); + if (item) items.push(item); + } + } + + return items; + } + + /** + * Render items into the overlay list (replacing current contents). + */ + function renderItemsInOverlay(overlay, items) { + var listEl = overlay.querySelector('.gd-menu-list'); + if (!listEl) return; + + var html = ''; + var currentSection = null; + for (var i = 0; i < items.length; i++) { + var item = items[i]; + if (item.section && item.section !== currentSection) { + currentSection = item.section; + html += ''; + } + var activeClass = item.active ? ' gd-menu-item-active' : ''; + var label = item.html || escapeHtml(item.text); + html += '
  • ' + + '' + label + '' + + '
  • '; + } + listEl.innerHTML = html; + + // Clear filter input if present + var filterInput = overlay.querySelector('.gd-menu-ref-filter-input'); + if (filterInput) { + filterInput.value = ''; + filterInput.dispatchEvent(new Event('input')); + } + } + + /** + * Attach switcher behaviour: clicking a tab fetches items from the + * other reference section and swaps the list in the overlay without + * navigating away. + */ + function attachRefSwitcher(overlay) { + var buttons = overlay.querySelectorAll('.gd-menu-ref-switcher-btn'); + if (!buttons.length) return; + + var basePath = window.location.pathname.split('/reference/')[0]; + var cache = {}; // cache fetched items by ref type + + // Pre-populate current section's items from what's already rendered + var currentType = isCliReferencePage() ? 'cli' : 'api'; + // (No need to cache — the overlay already shows these) + + buttons.forEach(function(btn) { + btn.addEventListener('click', function() { + var refType = btn.getAttribute('data-ref'); + + // Update active state on buttons + buttons.forEach(function(b) { b.classList.remove('active'); }); + btn.classList.add('active'); + + // If switching to the section we're already on, re-render from sidebar + if (refType === currentType) { + var items = getSidebarItems(); + renderItemsInOverlay(overlay, items); + return; + } + + // If cached, render immediately + if (cache[refType]) { + renderItemsInOverlay(overlay, cache[refType]); + return; + } + + // Fetch the other section's index page and parse its sidebar + var url = refType === 'cli' + ? basePath + '/reference/cli/index.html' + : basePath + '/reference/index.html'; + + fetch(url) + .then(function(res) { return res.text(); }) + .then(function(htmlStr) { + var items = parseSidebarItemsFromHtml(htmlStr, url); + cache[refType] = items; + // Only render if this tab is still active + if (btn.classList.contains('active')) { + renderItemsInOverlay(overlay, items); + } + }) + .catch(function() { + // On error, fall back to navigation + window.location.href = url; + }); + }); + }); + } + + /** + * Create the floating menu overlay element. + */ + function createMenuOverlay() { + var el = document.createElement('div'); + el.className = 'gd-menu-overlay'; + el.setAttribute('role', 'dialog'); + el.setAttribute('aria-modal', 'true'); + el.setAttribute('aria-label', + _gdT('kb_show_menu', 'Show menu')); + + var homepage = isHomepage(); + var refPage = isReferencePage(); + var items = homepage ? getNavbarItems() : getSidebarItems(); + var title; + if (homepage) { + title = _gdT('kb_menu_title_site', 'Site Navigation'); + } else if (refPage) { + title = isCliReferencePage() + ? _gdT('cli_reference', 'CLI Reference') + : _gdT('api_reference', 'API Reference'); + } else { + title = _gdT('kb_menu_title_section', 'Section Navigation'); + } + + var html = '
    '; + html += '
    '; + html += '

    ' + escapeHtml(title) + '

    '; + html += ''; + html += '
    '; + + // Reference pages: inject switcher before the list + if (refPage) { + html += buildRefSwitcherHtml(); + } + + html += '
    '; + + el.innerHTML = html; + + // Attach reference-specific interactivity + if (refPage) { + attachRefSwitcher(el); + } + + return el; + } + + // Menu keyboard navigation state + var menuSelectedIndex = -1; + + /** + * Get all navigable menu items from the overlay. + */ + function getMenuItems() { + if (!menuOverlay) return []; + return menuOverlay.querySelectorAll('.gd-menu-item'); + } + + /** + * Update the visual focus indicator on menu items. + */ + function updateMenuFocus() { + var items = getMenuItems(); + for (var i = 0; i < items.length; i++) { + if (i === menuSelectedIndex) { + items[i].classList.add('gd-menu-item-focused'); + items[i].scrollIntoView({ block: 'nearest' }); + } else { + items[i].classList.remove('gd-menu-item-focused'); + } + } + } + + /** + * Handle keyboard events within the menu overlay. + */ + function handleMenuKeydown(e) { + var items = getMenuItems(); + if (items.length === 0) return; + + switch (e.key) { + case 'ArrowDown': + case 'ArrowRight': + case 'ArrowUp': + case 'ArrowLeft': + e.preventDefault(); + // Any arrow press selects the first item + if (menuSelectedIndex < 0) { + menuSelectedIndex = 0; + } else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') { + menuSelectedIndex = Math.min(menuSelectedIndex + 1, items.length - 1); + } else { + menuSelectedIndex = Math.max(menuSelectedIndex - 1, 0); + } + updateMenuFocus(); + break; + + case 'Enter': + if (menuSelectedIndex >= 0 && menuSelectedIndex < items.length) { + e.preventDefault(); + items[menuSelectedIndex].click(); + } + break; + } + } + + function showMenu() { + // Always recreate to pick up current page state + if (menuOverlay) { + menuOverlay.remove(); + menuOverlay = null; + } + + menuOverlay = createMenuOverlay(); + document.body.appendChild(menuOverlay); + menuSelectedIndex = -1; + + // Close button + var closeBtn = menuOverlay.querySelector('.gd-menu-overlay-close'); + closeBtn.addEventListener('click', hideMenu); + + // Click on backdrop + menuOverlay.addEventListener('click', function(e) { + if (e.target === menuOverlay) { + hideMenu(); + } + }); + + // Lock body scroll and add backdrop blur on mobile + document.body.classList.add('gd-menu-open'); + + // On mobile, force headroom into the "unpinned" state so the + // full navbar slides up and only the Title Bar stays visible. + // This prevents the overlay card from appearing behind a tall + // header when the user is at the top of the page or has just + // scrolled up. + var header = document.querySelector('#quarto-header'); + var didFreezeHeadroom = false; + if (header && window.matchMedia('(max-width: 991.98px)').matches) { + header.classList.remove('headroom--pinned'); + header.classList.add('headroom--unpinned'); + // Freeze headroom via Quarto's toggle so it doesn't re-pin + if (typeof window.quartoToggleHeadroom === 'function') { + window.quartoToggleHeadroom(); // freeze + didFreezeHeadroom = true; + } + } + // Store so hideMenu can unfreeze only if we froze + showMenu._frozeHeadroom = didFreezeHeadroom; + + // Force reflow then show + void menuOverlay.offsetWidth; + menuOverlay.classList.add('gd-menu-overlay-visible'); + isMenuOpen = true; + + // Auto-scroll the active item into view (centered) + requestAnimationFrame(function() { + var activeItem = menuOverlay.querySelector('.gd-menu-item-active'); + if (activeItem) { + activeItem.scrollIntoView({ block: 'center', behavior: 'instant' }); + } + }); + } + + function hideMenu() { + if (!menuOverlay) return; + menuOverlay.classList.remove('gd-menu-overlay-visible'); + document.body.classList.remove('gd-menu-open'); + + // Resume headroom so it can pin/unpin normally again + if (showMenu._frozeHeadroom && typeof window.quartoToggleHeadroom === 'function') { + window.quartoToggleHeadroom(); // unfreeze + showMenu._frozeHeadroom = false; + } + + isMenuOpen = false; + menuSelectedIndex = -1; + // Remove after transition + setTimeout(function() { + if (menuOverlay && !isMenuOpen) { + menuOverlay.remove(); + menuOverlay = null; + } + }, 200); + } + + // ── Copy Page ──────────────────────────────────────────────────────── + + function copyPage() { + var btn = document.querySelector('.gd-copy-md-btn'); + if (btn) btn.click(); + } + + // ── Dark Mode Toggle ───────────────────────────────────────────────── + + function toggleDarkMode() { + // Delegate to the existing dark-mode-toggle button if present + var btn = document.getElementById('dark-mode-toggle'); + if (btn) { + btn.click(); + return; + } + } + + // ── Help Overlay ───────────────────────────────────────────────────── + + var SHORTCUT_GROUPS = [ + { + titleKey: 'kb_group_navigation', + titleFallback: 'Navigation', + shortcuts: [ + { keys: ['s', '/'], descKey: 'kb_focus_search', descFallback: 'Focus search' }, + { keys: ['[', ']'], descKey: 'kb_prev_next_page', descFallback: 'Previous / next page', separator: ' / ' }, + { keys: ['m', 'n'], descKey: 'kb_show_menu', descFallback: 'Show menu' }, + { keys: ['q'], descKey: 'kb_home', descFallback: 'Go to homepage' }, + { keys: ['u'], descKey: 'kb_user_guide', descFallback: 'User Guide', visible: hasUserGuide }, + { keys: ['r'], descKey: 'kb_api_reference', descFallback: 'API Reference', visible: hasReference }, + ] + }, + { + titleKey: 'kb_group_display', + titleFallback: 'Display', + shortcuts: [ + { keys: ['d'], descKey: 'kb_toggle_dark', descFallback: 'Toggle dark mode' }, + { keys: ['c'], descKey: 'kb_copy_page', descFallback: 'Copy page as Markdown' }, + ] + }, + { + titleKey: 'kb_group_general', + titleFallback: 'General', + shortcuts: [ + { keys: ['h', '?'], descKey: 'kb_show_help', descFallback: 'Show keyboard shortcuts' }, + { keys: ['Esc'], descKey: 'kb_close_dismiss', descFallback: 'Close / dismiss' }, + ] + }, + ]; + + function createOverlay() { + var el = document.createElement('div'); + el.className = 'gd-keyboard-overlay'; + el.setAttribute('role', 'dialog'); + el.setAttribute('aria-modal', 'true'); + el.setAttribute('aria-label', + _gdT('kb_overlay_title', 'Keyboard shortcuts')); + + var title = _gdT('kb_overlay_title', 'Keyboard shortcuts'); + + var html = '
    '; + html += '
    '; + html += '

    ' + escapeHtml(title) + '

    '; + html += ''; + html += '
    '; + + html += '
    '; + + for (var g = 0; g < SHORTCUT_GROUPS.length; g++) { + var group = SHORTCUT_GROUPS[g]; + html += '
    '; + html += '

    ' + escapeHtml(_gdT(group.titleKey, group.titleFallback)) + '

    '; + html += '
    '; + for (var s = 0; s < group.shortcuts.length; s++) { + var sc = group.shortcuts[s]; + if (sc.visible && !sc.visible()) continue; + html += '
    '; + html += '
    '; + for (var k = 0; k < sc.keys.length; k++) { + if (k > 0) { + var sep = sc.separator != null ? sc.separator : + ' ' + + escapeHtml(_gdT('kb_or', 'or')) + ' '; + html += sep; + } + html += '' + escapeHtml(sc.keys[k]) + ''; + } + html += '
    '; + html += '
    ' + escapeHtml(_gdT(sc.descKey, sc.descFallback)) + '
    '; + html += '
    '; + } + html += '
    '; + html += '
    '; + } + + html += '
    '; + + el.innerHTML = html; + return el; + } + + function escapeHtml(str) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + } + + function showOverlay() { + if (!overlay) { + overlay = createOverlay(); + document.body.appendChild(overlay); + + // Close button + var closeBtn = overlay.querySelector('.gd-keyboard-overlay-close'); + closeBtn.addEventListener('click', hideOverlay); + + // Click on backdrop + overlay.addEventListener('click', function(e) { + if (e.target === overlay) { + hideOverlay(); + } + }); + } + + if (prefersReducedMotion()) { + overlay.classList.add('gd-keyboard-overlay-visible'); + } else { + // Force reflow before adding the class for animation + void overlay.offsetWidth; + overlay.classList.add('gd-keyboard-overlay-visible'); + } + isOverlayOpen = true; + + // Focus the close button for keyboard users + var closeBtn = overlay.querySelector('.gd-keyboard-overlay-close'); + if (closeBtn) closeBtn.focus(); + } + + function hideOverlay() { + if (!overlay) return; + overlay.classList.remove('gd-keyboard-overlay-visible'); + isOverlayOpen = false; + } + + // ── Keyboard Event Handler ─────────────────────────────────────────── + + function handleKeydown(e) { + // When menu is open, handle all menu-related keys + if (isMenuOpen) { + if (e.key === 'Escape' || e.key === 'm' || e.key === 'n') { + e.preventDefault(); + hideMenu(); + return; + } + // Delegate arrow keys and Enter to menu navigation + handleMenuKeydown(e); + return; + } + + // When help overlay is open, handle Escape and toggle keys (h/?) + if (isOverlayOpen) { + if (e.key === 'Escape' || e.key === 'h' || e.key === '?') { + e.preventDefault(); + hideOverlay(); + } + return; + } + + // Skip if user is typing in an input + if (isTyping()) return; + + // Skip if modifier keys are held (allow browser/OS shortcuts) + if (e.ctrlKey || e.metaKey || e.altKey) return; + + switch (e.key) { + case '?': + case 'h': + e.preventDefault(); + showOverlay(); + break; + + case 's': + e.preventDefault(); + focusSearch(); + break; + + // Note: '/' is handled by sidebar-filter.js when it's active. + // When sidebar-filter is not present, we handle it here. + case '/': + // Only if sidebar-filter hasn't already handled it + if (!document.querySelector('.sidebar-filter-input')) { + e.preventDefault(); + focusSearch(); + } + break; + + case '[': + e.preventDefault(); + navigatePrev(); + break; + + case ']': + e.preventDefault(); + navigateNext(); + break; + + case 'm': + case 'n': + e.preventDefault(); + showMenu(); + break; + + case 'q': + e.preventDefault(); + navigateHome(); + break; + + case 'u': + if (hasUserGuide()) { + e.preventDefault(); + navigateUserGuide(); + } + break; + + case 'r': + if (hasReference()) { + e.preventDefault(); + navigateReference(); + } + break; + + case 'd': + e.preventDefault(); + toggleDarkMode(); + break; + + case 'c': + e.preventDefault(); + copyPage(); + break; + + case 'Escape': + // Blur the active element + if (document.activeElement && document.activeElement !== document.body) { + document.activeElement.blur(); + } + break; + } + } + + // ── Navbar Button ──────────────────────────────────────────────── + + /** + * Create the keyboard shortcuts navbar button. + * Uses the Lucide "keyboard" icon (MIT-licensed). + */ + function createKeyboardButton() { + var container = document.createElement('div'); + container.id = 'gd-keyboard-btn-container'; + + var btn = document.createElement('button'); + btn.id = 'gd-keyboard-btn'; + btn.className = 'gd-keyboard-btn'; + btn.type = 'button'; + btn.setAttribute('aria-label', + _gdT('kb_show_help', 'Show keyboard shortcuts')); + btn.setAttribute('data-tippy-content', + _gdT('kb_show_help', 'Show keyboard shortcuts')); + btn.innerHTML = + ''; + + container.appendChild(btn); + return container; + } + + /** + * Insert the keyboard button into the navbar. + */ + function insertKeyboardButton() { + // Insert into navbarCollapse; navbar-widgets.js will collect it + // into the unified #gd-navbar-widgets container. + var collapse = document.getElementById('navbarCollapse'); + if (!collapse) return; + + var container = createKeyboardButton(); + var navItem = document.createElement('li'); + navItem.className = 'nav-item'; + navItem.appendChild(container); + + // Append to navbarCollapse (the collector will move it) + collapse.appendChild(navItem); + + // Click handler + var btn = document.getElementById('gd-keyboard-btn'); + if (btn) { + btn.addEventListener('click', function() { + if (isOverlayOpen) { + hideOverlay(); + } else { + showOverlay(); + } + }); + + // Initialize tooltip directly — window.tippy is available from + // Quarto's bundle before any include-after-body scripts run. + if (window.tippy) { + window.tippy(btn, { + content: btn.getAttribute('data-tippy-content'), + placement: 'bottom', + animation: 'shift-away', + duration: [200, 150], + delay: [0, 0], + arrow: true, + }); + } + } + } + + // ── Initialization ─────────────────────────────────────────────────── + + function init() { + document.addEventListener('keydown', handleKeydown); + insertKeyboardButton(); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } + + // Expose menu API so the sidebar toggle button can reuse it + window.__gdMenu = { + show: showMenu, + hide: hideMenu, + isOpen: function() { return isMenuOpen; } + }; +})(); diff --git a/great-docs/license.qmd b/great-docs/license.qmd new file mode 100644 index 0000000..0d302e8 --- /dev/null +++ b/great-docs/license.qmd @@ -0,0 +1,40 @@ +--- +title: "License" +toc: false +sidebar: false +page-layout: full +body-classes: "gd-license-page" +--- + +```{=html} +
    +```
    +
    +````markdown
    +MIT License
    +
    +Copyright (c) 2026 jeffgallini
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy
    +of this software and associated documentation files (the "Software"), to deal
    +in the Software without restriction, including without limitation the rights
    +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the Software is
    +furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all
    +copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    +SOFTWARE.
    +
    +````
    +
    +```{=html}
    +
    +``` diff --git a/great-docs/llms-full.txt b/great-docs/llms-full.txt new file mode 100644 index 0000000..b5d0ef1 --- /dev/null +++ b/great-docs/llms-full.txt @@ -0,0 +1,601 @@ +---------------------------------------------------------------------- +This is the API documentation for the dash_mantine_datatable library. +---------------------------------------------------------------------- + + +## Component + +Main generated Dash component. + + +DataTable(id: Union[str, dict, NoneType] = None, data: Optional[Sequence[dict]] = None, records: Optional[Sequence[dict]] = None, columns: Optional[Sequence[dict]] = None, groups: Optional[Sequence[dict]] = None, groupBy: Union[str, Sequence[str], NoneType] = None, childRowsAccessor: Optional[str] = None, groupAggregations: Optional[dict] = None, idAccessor: Union[str, dict, Sequence[str], NoneType] = None, locale: Optional[str] = None, direction: Optional[Literal['ltr', 'rtl']] = None, paginationMode: Optional[Literal['client', 'server', 'none']] = None, sortMode: Optional[Literal['client', 'server']] = None, searchMode: Optional[Literal['client', 'server']] = None, filterMode: Optional[Literal['client', 'server', 'none']] = None, searchQuery: Optional[str] = None, searchableAccessors: Optional[Sequence[str]] = None, filterValues: Optional[dict] = None, page: Union[SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, recordsPerPage: Union[SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, pageSize: Union[SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, totalRecords: Union[SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, sortStatus: Optional[dict] = None, selectedRecordIds: Optional[Sequence] = None, selectedRecords: Optional[Sequence] = None, expandedRecordIds: Optional[Sequence] = None, selectionTrigger: Optional[Literal['cell', 'checkbox']] = None, selectionColumnClassName: Optional[str] = None, selectionColumnStyle: Optional[dict] = None, selectionCheckboxProps: Optional[dict] = None, allRecordsSelectionCheckboxProps: Optional[dict] = None, selectableRowRules: Union[bool, dict, Sequence, NoneType] = None, disabledSelectionRowRules: Union[bool, dict, Sequence, NoneType] = None, selectionCheckboxRules: Union[dict, Sequence, NoneType] = None, rowDragging: Union[bool, dict, NoneType] = None, rowColor: Union[str, dict, Sequence, NoneType] = None, rowBackgroundColor: Union[str, dict, Sequence, NoneType] = None, rowClassName: Union[str, dict, Sequence, NoneType] = None, rowAttributes: Union[dict, Sequence, NoneType] = None, rowStyle: Union[dict, Sequence, NoneType] = None, rowExpansion: Optional[dict] = None, rowClick: Optional[dict] = None, rowDoubleClick: Optional[dict] = None, rowContextMenu: Optional[dict] = None, cellClick: Optional[dict] = None, cellDoubleClick: Optional[dict] = None, cellContextMenu: Optional[dict] = None, pagination: Optional[dict] = None, scrollPosition: Optional[dict] = None, scrollEdge: Optional[dict] = None, lastRowDragChange: Optional[dict] = None, lastSortChange: Optional[dict] = None, lastSelectionChange: Optional[dict] = None, lastExpansionChange: Optional[dict] = None, lastFilterChange: Optional[dict] = None, emptyState: Union[str, dict, NoneType] = None, noRecordsIcon: Optional[Any] = None, noRecordsText: Optional[str] = None, recordsPerPageOptions: Optional[Sequence[Union[SupportsFloat, SupportsInt, SupportsComplex]]] = None, pageSizeOptions: Optional[Sequence[Union[SupportsFloat, SupportsInt, SupportsComplex]]] = None, recordsPerPageLabel: Optional[str] = None, paginationSize: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, paginationActiveTextColor: Union[str, dict, NoneType] = None, paginationActiveBackgroundColor: Union[str, dict, NoneType] = None, loadingText: Optional[str] = None, tableProps: Optional[dict] = None, scrollAreaProps: Optional[dict] = None, className: Optional[str] = None, tableClassName: Optional[str] = None, classNames: Optional[dict] = None, style: Optional[Any] = None, styles: Optional[dict] = None, radius: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, height: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, minHeight: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, maxHeight: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, shadow: Optional[str] = None, bg: Union[str, dict, NoneType] = None, c: Union[str, dict, NoneType] = None, backgroundColor: Union[str, dict, NoneType] = None, borderColor: Union[str, dict, NoneType] = None, rowBorderColor: Union[str, dict, NoneType] = None, stripedColor: Union[str, dict, NoneType] = None, highlightOnHoverColor: Union[str, dict, NoneType] = None, withRowBorders: Optional[bool] = None, withTableBorder: Optional[bool] = None, withColumnBorders: Optional[bool] = None, horizontalSpacing: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, verticalSpacing: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, borderRadius: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, striped: Optional[bool] = None, highlightOnHover: Optional[bool] = None, textSelectionDisabled: Optional[bool] = None, fetching: Optional[bool] = None, loaderBackgroundBlur: Union[SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, loaderSize: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, loaderType: Optional[str] = None, loaderColor: Optional[str] = None, customLoader: Optional[Any] = None, noHeader: Optional[bool] = None, pinFirstColumn: Optional[bool] = None, pinLastColumn: Optional[bool] = None, stickyHeader: Optional[bool] = None, stickyHeaderOffset: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, verticalAlign: Optional[Literal['top', 'center', 'bottom']] = None, paginationWithEdges: Optional[bool] = None, paginationWithControls: Optional[bool] = None, storeColumnsKey: Optional[str] = None, defaultColumnProps: Optional[dict] = None, defaultColumnRender: Optional[Any] = None, sortIcons: Optional[dict] = None, bodyRef: Optional[Any] = None, tableRef: Optional[Any] = None, m: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, mx: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, my: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, mt: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, mb: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, ms: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, me: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, ml: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, mr: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, p: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, px: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, py: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, pt: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, pb: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, ps: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, pe: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, pl: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, pr: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, w: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, miw: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, maw: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, h: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, mih: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, mah: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, opacity: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, ff: Optional[str] = None, fz: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, fw: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, lts: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, ta: Optional[str] = None, lh: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, fs: Optional[str] = None, tt: Optional[str] = None, display: Optional[str] = None, flex: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, bd: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, bdrs: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, td: Optional[str] = None, bgsz: Optional[str] = None, bgp: Optional[str] = None, bgr: Optional[str] = None, bga: Optional[str] = None, pos: Optional[str] = None, top: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, left: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, bottom: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, right: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, inset: Union[str, SupportsFloat, SupportsInt, SupportsComplex, NoneType] = None, hiddenFrom: Optional[str] = None, visibleFrom: Optional[str] = None) + +Description +----------- +Declarative Dash table component with chainable Python-side configuration +helpers. `DataTable` wraps Mantine DataTable in a Dash-friendly API that +works well with `dash-mantine-components`, while also adding helpers for +columns, grouped headers, row rules, selection, pagination, sorting, and +search. + +If you are new to the package, the usual pattern is: + +1. Pass `data` and `columns` when you construct the table. +2. Set `idAccessor` if your row id field is not named `id`. +3. Choose client-side or server-side behavior with + `paginationMode`, `sortMode`, and `searchMode`. +4. Use chainable helpers like `update_columns()` and `update_rows()` to + refine behavior after the base table is created. + +Parameters +---------- +id : str | dict, optional + Description: Dash component id used in callbacks. + Example: `id="employees-table"`. +data : list[dict], optional + Description: Table records. This is the preferred Dash-facing alias + for row data. + Example: `data=[{"id": 1, "name": "Avery"}]`. +records : list[dict], optional + Description: Alias for `data` kept for Mantine DataTable familiarity. + If both are supplied, use one source of truth. + Example: `records=[{"id": 1, "name": "Avery"}]`. +columns : list[dict], optional + Description: Column definitions. Each column typically has an + `accessor`, and may also include formatting, sorting, filtering, or + editing behavior. + Example: `columns=[Column("name"), Column("salary", presentation="currency")]`. +groups : list[dict], optional + Description: Grouped-header definitions for multi-row column headers. + Example: `groups=[ColumnGroup("profile", title="Profile", columns=["name", "team"])]`. +idAccessor : str | dict | list[str], optional + Description: Record identifier accessor used for selection, expansion, + row rules, and drag operations. Use this when your row key is not the + default `id`. + Example: `idAccessor="employeeId"`. +groupBy : str | list[str], optional + Description: Accessor or accessors used for inline row grouping. + Example: `groupBy="team"`. +childRowsAccessor : str, optional + Description: Accessor containing nested child rows when your data is + already hierarchical. + Example: `childRowsAccessor="children"`. +groupAggregations : dict, optional + Description: Aggregation mapping for grouped parent rows. + Expected inputs: built-in aggregations such as `'sum'`, `'mean'`, + `'median'`, `'min'`, `'max'`, `'count'`, or a custom client-side + function string. + Example: `groupAggregations={"salary": "sum"}`. +paginationMode : str, optional + Description: Chooses where pagination is handled. + Expected inputs: `'client'`, `'server'`, `'none'`. + Example: `paginationMode="server"`. +sortMode : str, optional + Description: Chooses where sorting is handled. + Expected inputs: `'client'`, `'server'`. + Example: `sortMode="client"`. +searchMode : str, optional + Description: Chooses where search filtering is handled. + Expected inputs: `'client'`, `'server'`. + Example: `searchMode="client"`. +searchQuery : str, optional + Description: Controlled search text. + Example: `searchQuery="platform"`. +searchableAccessors : list[str], optional + Description: Limits client-side search to specific record fields. + Example: `searchableAccessors=["name", "team", "role"]`. +page : int | float, optional + Description: Current page in controlled pagination mode. + Example: `page=1`. +recordsPerPage : int | float, optional + Description: Number of rows shown per page. + Example: `recordsPerPage=25`. +totalRecords : int | float, optional + Description: Total record count, usually required in server-side + pagination mode. + Example: `totalRecords=248`. +selectionTrigger : str, optional + Description: Enables selection and decides how it is triggered. + Expected inputs: `'cell'`, `'checkbox'`. + Example: `selectionTrigger="checkbox"`. +selectedRecordIds : list[Any], optional + Description: Controlled ids for selected rows. + Example: `selectedRecordIds=[1, 3]`. +rowExpansion : dict, optional + Description: Configuration for per-row detail panels. + Example: `rowExpansion=RowExpansionConfig(content=dmc.Text("Details"))`. +rowDragging : bool | dict, optional + Description: Enables drag-and-drop row reordering. + Example: `rowDragging=True`. +locale : str, optional + Description: Locale used for number and date formatting. + Example: `locale="en-US"`. +direction : str, optional + Description: Layout direction for LTR or RTL UIs. + Expected inputs: `'ltr'`, `'rtl'`. + Example: `direction="rtl"`. +radius : str | int | float, optional + Description: Border radius for the table container. + Expected inputs: Mantine size tokens such as `'xs'`, `'sm'`, `'md'`, + `'lg'`, `'xl'`, or a numeric/CSS value. + Example: `radius="lg"`. +striped : bool, optional + Description: Alternates row backgrounds for easier scanning. + Example: `striped=True`. +highlightOnHover : bool, optional + Description: Highlights the active row on hover. + Example: `highlightOnHover=True`. +withTableBorder : bool, optional + Description: Draws an outer table border. + Example: `withTableBorder=True`. +withColumnBorders : bool, optional + Description: Draws vertical borders between columns. + Example: `withColumnBorders=False`. +withRowBorders : bool, optional + Description: Draws borders between body rows. + Example: `withRowBorders=True`. +height : str | int | float, optional + Description: Fixed table height, often used with sticky headers or + scrollable layouts. + Example: `height=420`. +minHeight : str | int | float, optional + Description: Minimum table height. + Example: `minHeight=240`. +maxHeight : str | int | float, optional + Description: Maximum table height before scrolling. + Example: `maxHeight=560`. +horizontalSpacing : str | int | float, optional + Description: Horizontal cell padding. + Expected inputs: Mantine spacing tokens such as `'xs'`, `'sm'`, `'md'`, + `'lg'`, `'xl'`, or numeric values. + Example: `horizontalSpacing="sm"`. +verticalSpacing : str | int | float, optional + Description: Vertical cell padding. + Expected inputs: Mantine spacing tokens such as `'xs'`, `'sm'`, `'md'`, + `'lg'`, `'xl'`, or numeric values. + Example: `verticalSpacing="xs"`. +verticalAlign : str, optional + Description: Vertical alignment for cell content. + Expected inputs: `'top'`, `'center'`, `'bottom'`. + Example: `verticalAlign="center"`. +bg : str | dict, optional + Description: Mantine background color prop for the table wrapper. + Example: `bg="white"`. +c : str | dict, optional + Description: Mantine text color prop for the table wrapper. + Example: `c="dark.8"`. +emptyState : str | dict, optional + Description: Content shown when there are no rows to display. + Example: `emptyState=dmc.Text("No matching employees")`. +customLoader : Any, optional + Description: Custom loader shown while `fetching=True`. + Example: `customLoader=dmc.Loader(color="blue")`. +noRecordsIcon : Any, optional + Description: Icon or component shown beside the empty-state text. + Example: `noRecordsIcon=dmc.ThemeIcon("!")`. +storeColumnsKey : str, optional + Description: Local-storage key used to persist draggable, toggleable, + or resizable column state in the browser. + Example: `storeColumnsKey="employees-columns-v1"`. + +Attributes +---------- +data : list of dict + Records rendered by the table. `records` is normalized into this + property during initialization. +columns : list of dict + Column configuration currently attached to the table. +groups : list of dict or None + Column-group configuration for grouped headers. +groupBy : str or list of str or None + Active row-grouping accessor or accessors. +idAccessor : str or dict or list of str + Record identity accessor used by selection, expansion, and row rules. +selectedRecordIds : list + Selected record identifiers. +selectedRecords : list + Selected record payloads mirrored from the front end. +expandedRecordIds : list + Expanded row identifiers for `rowExpansion` or grouped child rows. +sortStatus : dict or None + Current sort descriptor used by client-side or server-side sorting. +searchQuery : str or None + Current table search query. +pagination : dict or None + Pagination event payload reported by the component. +lastSortChange : dict or None + Latest sort interaction payload emitted by the component. +lastSelectionChange : dict or None + Latest selection interaction payload emitted by the component. +lastExpansionChange : dict or None + Latest expansion interaction payload emitted by the component. +lastRowDragChange : dict or None + Latest row-drag interaction payload emitted by the component. + +Notes +----- +The complete constructor keyword surface comes from the generated +`DataTable.py` component. This wrapper keeps those canonical keywords and +adds a small set of Python-friendly aliases. + +Python-friendly aliases are accepted for a few common props, including +`records -> data`, `group_by -> groupBy`, `group_aggregations -> +groupAggregations`, `child_rows_accessor -> childRowsAccessor`, and +`dir -> direction`. + +Mapping-style properties such as `style`, `styles`, `classNames`, +`tableProps`, and `scrollAreaProps` are merged when updated through the +fluent helpers instead of being blindly replaced. + +Examples +-------- +>>> table = DataTable( +... id="employees", +... data=[{"id": 1, "name": "Avery", "team": "Platform", "salary": 128000}], +... columns=[ +... Column("name", title="Employee", sortable=True), +... Column("team", sortable=True), +... Column("salary", presentation="currency", currency="USD", textAlign="right"), +... ], +... idAccessor="id", +... paginationMode="client", +... radius="lg", +... ) +>>> table.update_columns(selector="name", title="Employee") +DataTable(...) +>>> table.update_selection(selectionTrigger="checkbox") +DataTable(...) +>>> table.update_rows(selector={"team": "Platform"}, className="team-platform") +DataTable(...) + + +## Helper Builders + +Dictionary factories for readable table configuration. + + +Column(accessor=None, /, *, title=None, presentation=None, sortable=None, editable=None, editor=None, render=None, filter=None, textAlign=None, width=None, cellsStyle=None, titleStyle=None, draggable=None, toggleable=None, resizable=None, defaultToggle=None) + +Description +----------- +Build a column-definition dictionary for `DataTable(columns=[...])`. +This helper is the quickest way to create readable column configs from +Python without manually repeating `{"accessor": ...}` for every column. + +Parameters +---------- +accessor : str | None, optional + Description: Record key rendered by the column. This becomes the + column identifier used by helpers such as + `table.update_columns(selector="salary", ...)`. + Example: `Column("salary")`. +title : str, optional + Description: Header label shown above the column. If omitted, the + frontend falls back to the accessor or its built-in title formatting. + Example: `title="Annual Salary"`. +presentation : str, optional + Description: Built-in display mode used to format cell values. + Expected inputs: `'text'`, `'number'`, `'currency'`, `'date'`, + `'datetime'`, `'badge'`, `'link'`, `'code'`, `'json'`, `'progress'`. + Example: `presentation="currency"`. +sortable : bool, optional + Description: Enables sorting for the column. + Example: `sortable=True`. +editable : bool, optional + Description: Enables double-click editing for the column. Pair this + with `editor` when you want a custom Dash input component. + Example: `editable=True`. +editor : Any, optional + Description: Dash component used as the in-place editor for editable + cells. + Example: `editor=dmc.NumberInput(min=0, thousandSeparator=",")`. +render : Any, optional + Description: Dash component or renderer payload used for custom cell + content. + Example: `render=dmc.Text("View", c="blue")`. +filter : Any, optional + Description: Dash component rendered in the column filter popover. + Example: `filter=dmc.TextInput(placeholder="Filter names")`. +textAlign : str, optional + Description: Horizontal alignment for cell content. + Expected inputs: values accepted by Mantine/DataTable such as + `'left'`, `'center'`, `'right'`. + Example: `textAlign="right"`. +width : int | float | str, optional + Description: Column width. You can pass a numeric pixel value or a CSS + width string. + Example: `width=140`. +cellsStyle : dict, optional + Description: Inline style mapping applied to body cells. + Example: `cellsStyle={"fontVariantNumeric": "tabular-nums"}`. +titleStyle : dict, optional + Description: Inline style mapping applied to the header cell. + Example: `titleStyle={"textTransform": "uppercase"}`. +draggable : bool, optional + Description: Allows the column to participate in column dragging. + Example: `draggable=True`. +toggleable : bool, optional + Description: Allows the column to be shown or hidden by column + customization controls. + Example: `toggleable=True`. +resizable : bool, optional + Description: Allows the column width to be resized by the user. + Example: `resizable=True`. +defaultToggle : bool, optional + Description: Initial visibility state used when column toggling is + enabled. + Example: `defaultToggle=False`. + +Returns +------- +dict + A Dash-safe column configuration dictionary. + +Notes +----- +The helper does not validate every possible column key. It simply builds a +plain dictionary, which makes it safe to use with existing Mantine +DataTable column options and this package's Dash-specific additions. + +Examples +-------- +>>> Column("salary", title="Salary", presentation="currency", currency="USD") +{'accessor': 'salary', 'title': 'Salary', 'presentation': 'currency', 'currency': 'USD'} +>>> Column("status", presentation="badge", badgeColorAccessor="statusColor") +{'accessor': 'status', 'presentation': 'badge', 'badgeColorAccessor': 'statusColor'} + +ColumnGroup(group_id=None, /, *, columns=None, groups=None, title=None, style=None, headerStyle=None, textAlign=None) + +Description +----------- +Build a grouped-header definition for `DataTable(groups=[...])`. Use this +when you want multiple header rows, such as a "Compensation" group above +salary and bonus columns. + +Parameters +---------- +group_id : str | None, optional + Description: Stable identifier for the group. This is the id you use + later with `table.group_columns(selector="compensation", ...)`. + Example: `group_id="compensation"`. +columns : list[Any] | None, optional + Description: Column references attached directly to this group. Each + item may be an accessor string like `"salary"` or a full column + dictionary. + Example: `columns=["salary", "bonus"]`. +groups : list[dict[str, Any]] | None, optional + Description: Nested child groups for multi-row grouped headers. + Example: `groups=[ColumnGroup("cash", columns=["salary", "bonus"])]`. +title : str, optional + Description: Visible header label for the group. + Example: `title="Compensation"`. +style : dict, optional + Description: Inline style mapping applied to the group header cell. + Example: `style={"textAlign": "center"}`. +headerStyle : dict, optional + Description: Header-specific style mapping forwarded to the frontend. + Example: `headerStyle={"backgroundColor": "var(--mantine-color-gray-0)"}`. +textAlign : str, optional + Description: Alignment hint for grouped-header content. + Expected inputs: values accepted by Mantine/DataTable such as + `'left'`, `'center'`, `'right'`. + Example: `textAlign="center"`. + +Returns +------- +dict + A grouped-header configuration dictionary. + +Notes +----- +Group dictionaries are plain Python objects, so they can be freely mixed +with `Column(...)` output and raw dictionaries in the same `groups` list. + +Examples +-------- +>>> ColumnGroup("profile", title="Profile", columns=["name", "team"]) +{'id': 'profile', 'columns': ['name', 'team'], 'title': 'Profile'} + +SelectionConfig(*, selectionTrigger=None, selectedRecordIds=None, selectedRecords=None, selectableRowRules=None, disabledSelectionRowRules=None, selectionCheckboxRules=None, selectionCheckboxProps=None, allRecordsSelectionCheckboxProps=None, selectionColumnClassName=None, selectionColumnStyle=None) + +Description +----------- +Build a compact selection configuration dictionary that you can unpack into +`DataTable(...)` or pass to `table.update_selection(...)`. + +Parameters +---------- +selectionTrigger : str, optional + Description: Enables row selection and decides how it is triggered. + Expected inputs: `'cell'`, `'checkbox'`. + Example: `selectionTrigger="checkbox"`. +selectedRecordIds : list[Any], optional + Description: Controlled list of selected row ids. + Example: `selectedRecordIds=[1, 4, 8]`. +selectedRecords : list[dict], optional + Description: Controlled list of selected record payloads. + Example: `selectedRecords=[{"id": 1, "name": "Avery"}]`. +selectableRowRules : bool | dict | list, optional + Description: Rule definition that marks which rows are selectable. + Example: `selectableRowRules=[{"selector": {"status": "Active"}, "value": True}]`. +disabledSelectionRowRules : bool | dict | list, optional + Description: Rule definition that disables row selection for matching + rows. + Example: `disabledSelectionRowRules=[{"selector": {"archived": True}, "value": True}]`. +selectionCheckboxRules : dict | list, optional + Description: Conditional checkbox props for the selection column. + Example: `selectionCheckboxRules=[{"selector": {"locked": True}, "value": {"disabled": True}}]`. +selectionCheckboxProps : dict, optional + Description: Shared props for each row-selection checkbox. + Example: `selectionCheckboxProps={"size": "sm"}`. +allRecordsSelectionCheckboxProps : dict, optional + Description: Props for the "select all" checkbox in the header. + Example: `allRecordsSelectionCheckboxProps={"aria-label": "Select all rows"}`. +selectionColumnClassName : str, optional + Description: CSS class applied to the selection column. + Example: `selectionColumnClassName="table-selection-col"`. +selectionColumnStyle : dict, optional + Description: Inline style mapping applied to the selection column. + Example: `selectionColumnStyle={"width": 44}`. + +Returns +------- +dict + A dictionary with `None` values removed. + +Notes +----- +This helper is a convenience for building clean config objects. It does +not mutate a table and it drops keys whose value is `None`. + +Examples +-------- +>>> SelectionConfig(selectionTrigger="checkbox", selectedRecordIds=[1, 2]) +{'selectionTrigger': 'checkbox', 'selectedRecordIds': [1, 2]} + +PaginationConfig(*, page=None, pageSize=None, recordsPerPage=None, totalRecords=None, recordsPerPageOptions=None, pageSizeOptions=None, recordsPerPageLabel=None, paginationSize=None, paginationActiveTextColor=None, paginationActiveBackgroundColor=None, paginationWithEdges=None, paginationWithControls=None) + +Description +----------- +Build a compact pagination configuration dictionary for client-side or +server-side paging. + +Parameters +---------- +page : int | float, optional + Description: Current page number in controlled pagination mode. + Example: `page=1`. +pageSize : int | float, optional + Description: Number of rows shown per page when using the `pageSize` + prop. + Example: `pageSize=25`. +recordsPerPage : int | float, optional + Description: Preferred page-size prop matching Mantine DataTable's API. + Example: `recordsPerPage=25`. +totalRecords : int | float, optional + Description: Total number of records available, typically required for + server-side pagination. + Example: `totalRecords=248`. +recordsPerPageOptions : list[int | float], optional + Description: Page-size choices shown in the footer control. + Example: `recordsPerPageOptions=[10, 25, 50, 100]`. +pageSizeOptions : list[int | float], optional + Description: Alternative page-size options prop. + Example: `pageSizeOptions=[10, 25, 50]`. +recordsPerPageLabel : str, optional + Description: Label shown next to the page-size selector. + Example: `recordsPerPageLabel="Rows"`. +paginationSize : str | int | float, optional + Description: Visual size of the pagination controls. + Expected inputs: Mantine size tokens such as `'xs'`, `'sm'`, `'md'`, + `'lg'`, `'xl'`, or a numeric size when supported. + Example: `paginationSize="sm"`. +paginationActiveTextColor : str | dict, optional + Description: Text color for the active page button. + Example: `paginationActiveTextColor="white"`. +paginationActiveBackgroundColor : str | dict, optional + Description: Background color for the active page button. + Example: `paginationActiveBackgroundColor="blue.6"`. +paginationWithEdges : bool, optional + Description: Shows first/last page controls when `True`. + Example: `paginationWithEdges=True`. +paginationWithControls : bool, optional + Description: Shows previous/next controls when `True`. + Example: `paginationWithControls=True`. + +Returns +------- +dict + A dictionary with `None` values removed. + +Notes +----- +For most apps you will set either `recordsPerPage` or `pageSize`, not +both. This helper simply forwards whatever keys you provide. + +Examples +-------- +>>> PaginationConfig(page=2, recordsPerPage=25, totalRecords=240) +{'page': 2, 'recordsPerPage': 25, 'totalRecords': 240} + +RowExpansionConfig(content=None, /, *, allowMultiple=None, trigger=None) + +Description +----------- +Build a row-expansion configuration dictionary for detail panels shown +beneath a record. + +Parameters +---------- +content : Any, optional + Description: Dash component or payload rendered when a row is expanded. + Example: `content=dmc.Text("Employee details")`. +allowMultiple : bool, optional + Description: Allows multiple rows to stay expanded at the same time. + Example: `allowMultiple=True`. +trigger : str, optional + Description: Chooses how expansion is toggled. + Expected inputs: frontend-supported trigger values such as `'click'` + when available. + Example: `trigger="click"`. + +Returns +------- +dict + A dictionary with `None` values removed. + +Notes +----- +This helper is especially useful when you want to keep expansion config in +one place and reuse it across multiple table instances. + +Examples +-------- +>>> RowExpansionConfig(content="More details", allowMultiple=True) +{'allowMultiple': True, 'content': 'More details'} + + +---------------------------------------------------------------------- +This is the User Guide documentation for the package. +---------------------------------------------------------------------- + +# Getting Started + +Install the package from PyPI: + +```bash +pip install dash-mantine-datatable +``` + +Then create a small Dash app: + +```python +from dash import Dash +import dash_mantine_components as dmc +import dash_mantine_datatable as dmdt + +app = Dash() + +app.layout = dmc.MantineProvider( + dmdt.DataTable( + id="employees", + data=[ + {"id": 1, "name": "Avery Stone", "team": "Platform", "status": "On Track"}, + {"id": 2, "name": "Mina Patel", "team": "Growth", "status": "Planning"}, + ], + columns=[ + dmdt.Column("name", title="Name", sortable=True), + dmdt.Column("team", title="Team", sortable=True), + dmdt.Column("status", title="Status", presentation="badge"), + ], + ).update_layout(radius="lg", withTableBorder=True, striped=True) +) + +if __name__ == "__main__": + app.run(debug=True) +``` + +Use the API reference when you need the complete constructor and helper-method +surface. Use the recipes when you want copy-pasteable patterns pulled from the +interactive `usage.py` demo. + diff --git a/great-docs/llms.txt b/great-docs/llms.txt new file mode 100644 index 0000000..734b1cd --- /dev/null +++ b/great-docs/llms.txt @@ -0,0 +1,19 @@ +# dash_mantine_datatable + +## Docs + +### API Reference + +#### Component +> Main generated Dash component. + +- [DataTable](reference/DataTable.html): Description + +#### Helper Builders +> Dictionary factories for readable table configuration. + +- [Column](reference/Column.html): Description +- [ColumnGroup](reference/ColumnGroup.html): Description +- [SelectionConfig](reference/SelectionConfig.html): Description +- [PaginationConfig](reference/PaginationConfig.html): Description +- [RowExpansionConfig](reference/RowExpansionConfig.html): Description diff --git a/great-docs/mermaid-renderer.js b/great-docs/mermaid-renderer.js new file mode 100644 index 0000000..7a23f45 --- /dev/null +++ b/great-docs/mermaid-renderer.js @@ -0,0 +1,205 @@ +/** + * Great Docs Mermaid Theme Fix + * + * Forces mermaid diagrams to use light theme colors in dark mode + * by modifying the SVG's internal style block after Quarto renders. + */ + +(function() { + 'use strict'; + + function isDarkMode() { + return document.documentElement.classList.contains('quarto-dark') || + document.body.classList.contains('quarto-dark'); + } + + /** + * Light mode CSS rules to inject into SVG style blocks when in dark mode. + * These override the dark theme colors mermaid generates. + * Must be comprehensive to catch all text elements. + */ + function getLightModeOverrides(id) { + return '\n' + + /* Universal text color overrides - catch everything */ + '#' + id + ' text { fill: #333 !important; }\n' + + '#' + id + ' tspan { fill: #333 !important; }\n' + + '#' + id + ' .label { fill: #333 !important; color: #333 !important; }\n' + + '#' + id + ' .label text { fill: #333 !important; }\n' + + '#' + id + ' .label tspan { fill: #333 !important; }\n' + + '#' + id + ' span { color: #333 !important; }\n' + + '#' + id + ' p { color: #333 !important; }\n' + + '#' + id + ' div { color: #333 !important; }\n' + + '#' + id + ' foreignObject { color: #333 !important; }\n' + + '#' + id + ' foreignObject * { color: #333 !important; }\n' + + /* Node-specific text */ + '#' + id + ' .nodeLabel { color: #333 !important; fill: #333 !important; }\n' + + '#' + id + ' .nodeLabel p { color: #333 !important; }\n' + + '#' + id + ' .nodeLabel span { color: #333 !important; }\n' + + '#' + id + ' .node text { fill: #333 !important; }\n' + + '#' + id + ' .node tspan { fill: #333 !important; }\n' + + '#' + id + ' .node foreignObject div { color: #333 !important; }\n' + + /* Node shapes */ + '#' + id + ' .node rect, #' + id + ' .node circle, #' + id + ' .node ellipse, #' + id + ' .node polygon, #' + id + ' .node path { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + /* Edge labels */ + '#' + id + ' .edgeLabel { background-color: #e8e8e8 !important; color: #333 !important; }\n' + + '#' + id + ' .edgeLabel rect { fill: #e8e8e8 !important; }\n' + + '#' + id + ' .edgeLabel p { background-color: transparent !important; color: #333 !important; }\n' + + '#' + id + ' .edgeLabel span { color: #333 !important; }\n' + + '#' + id + ' .edgeLabel text { fill: #333 !important; }\n' + + '#' + id + ' .edgeLabel tspan { fill: #333 !important; }\n' + + '#' + id + ' .labelBkg { fill: #e8e8e8 !important; }\n' + + /* Edges and arrows */ + '#' + id + ' .edgePath .path, #' + id + ' .flowchart-link { stroke: #333 !important; }\n' + + '#' + id + ' .marker { fill: #333 !important; stroke: #333 !important; }\n' + + '#' + id + ' .arrowheadPath { fill: #333 !important; }\n' + + /* Clusters */ + '#' + id + ' .cluster rect { fill: #ffffde !important; stroke: #aaaa33 !important; }\n' + + '#' + id + ' .cluster text { fill: #333 !important; }\n' + + '#' + id + ' .cluster tspan { fill: #333 !important; }\n' + + '#' + id + ' .cluster span { color: #333 !important; }\n' + + '#' + id + ' .cluster-label text { fill: #333 !important; }\n' + + '#' + id + ' .cluster-label span { color: #333 !important; }\n' + + /* Sequence diagrams */ + '#' + id + ' .actor { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + '#' + id + ' .actor text { fill: #333 !important; }\n' + + '#' + id + ' .actor tspan { fill: #333 !important; }\n' + + '#' + id + ' text.actor { fill: #333 !important; }\n' + + '#' + id + ' text.actor > tspan { fill: #333 !important; }\n' + + '#' + id + ' .messageText { fill: #333 !important; stroke: none !important; }\n' + + '#' + id + ' .loopText { fill: #333 !important; }\n' + + '#' + id + ' .loopText tspan { fill: #333 !important; }\n' + + '#' + id + ' .noteText { fill: #333 !important; }\n' + + '#' + id + ' .noteText tspan { fill: #333 !important; }\n' + + '#' + id + ' .labelText { fill: #333 !important; color: #333 !important; }\n' + + '#' + id + ' .labelText tspan { fill: #333 !important; }\n' + + '#' + id + ' .sequenceNumber { fill: #fff !important; }\n' + + '#' + id + ' line { stroke: #999 !important; }\n' + + '#' + id + ' .messageLine0, #' + id + ' .messageLine1 { stroke: #333 !important; }\n' + + '#' + id + ' .labelBox { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + '#' + id + ' .loopLine { stroke: #9370DB !important; fill: #ECECFF !important; }\n' + + /* State diagrams */ + '#' + id + ' g.stateGroup rect { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + '#' + id + ' g.stateGroup text { fill: #333 !important; }\n' + + '#' + id + ' g.stateGroup .state-title { fill: #333 !important; }\n' + + '#' + id + ' .statediagram-state text { fill: #333 !important; }\n' + + '#' + id + ' .transition { stroke: #333 !important; }\n' + + /* Gantt */ + '#' + id + ' .section0, #' + id + ' .section2 { fill: #ECECFF !important; }\n' + + '#' + id + ' .section1, #' + id + ' .section3 { fill: #f8f8f8 !important; }\n' + + '#' + id + ' .taskText { fill: #333 !important; }\n' + + '#' + id + ' .taskTextOutsideLeft, #' + id + ' .taskTextOutsideRight { fill: #333 !important; }\n' + + '#' + id + ' .sectionTitle { fill: #333 !important; }\n' + + '#' + id + ' .grid .tick line { stroke: #ccc !important; }\n' + + '#' + id + ' .grid .tick text { fill: #333 !important; }\n' + + '#' + id + ' .titleText { fill: #333 !important; }\n' + + /* Pie */ + '#' + id + ' .pieCircle { stroke: #fff !important; }\n' + + '#' + id + ' .pieTitleText { fill: #333 !important; }\n' + + '#' + id + ' .pieOuterCircle { stroke: #333 !important; }\n' + + '#' + id + ' .slice { stroke: #fff !important; }\n' + + '#' + id + ' .legend text { fill: #333 !important; }\n' + + /* Class diagrams */ + '#' + id + ' .classGroup rect { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + '#' + id + ' .classGroup text { fill: #333 !important; }\n' + + '#' + id + ' .classGroup tspan { fill: #333 !important; }\n' + + '#' + id + ' .classGroup line, #' + id + ' .divider { stroke: #9370DB !important; }\n' + + '#' + id + ' .relation { stroke: #333 !important; }\n' + + '#' + id + ' .cardinality { fill: #333 !important; }\n' + + '#' + id + ' .classLabel text { fill: #333 !important; }\n' + + '#' + id + ' .classLabel tspan { fill: #333 !important; }\n' + + /* Flowchart title */ + '#' + id + ' .flowchartTitleText { fill: #333 !important; }\n'; + } + + /** + * Fix a single SVG by injecting light mode overrides and fixing inline styles + */ + function fixSvg(svg) { + if (!svg.id) return; + if (svg.dataset.gdFixed === 'true') return; + + var styleEl = svg.querySelector('style'); + if (!styleEl) return; + + // Inject CSS overrides + styleEl.textContent += getLightModeOverrides(svg.id); + + // Also directly fix inline styles on p, span, div elements + // This handles cases where mermaid sets inline style="color: ..." + var textElements = svg.querySelectorAll('p, span, div, .nodeLabel, .edgeLabel'); + textElements.forEach(function(el) { + el.style.setProperty('color', '#333', 'important'); + }); + + // Fix foreignObject children + var foreignObjects = svg.querySelectorAll('foreignObject *'); + foreignObjects.forEach(function(el) { + if (el.style) { + el.style.setProperty('color', '#333', 'important'); + } + }); + + svg.dataset.gdFixed = 'true'; + } + + /** + * Process all mermaid SVGs + */ + function processAllSvgs() { + var svgs = document.querySelectorAll('svg.mermaid-js, svg[id^="mermaid-"]'); + + if (isDarkMode()) { + svgs.forEach(fixSvg); + } + } + + /** + * Set up observer for theme changes and new SVGs + */ + function setupObserver() { + var observer = new MutationObserver(function(mutations) { + var shouldProcess = false; + + for (var i = 0; i < mutations.length; i++) { + var mutation = mutations[i]; + if (mutation.type === 'attributes' && mutation.attributeName === 'class') { + shouldProcess = true; + break; + } + if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { + shouldProcess = true; + break; + } + } + + if (shouldProcess) { + setTimeout(processAllSvgs, 100); + } + }); + + observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); + observer.observe(document.body, { + attributes: true, + attributeFilter: ['class'], + childList: true, + subtree: true + }); + } + + function init() { + setupObserver(); + + function afterLoad() { + setTimeout(processAllSvgs, 300); + setTimeout(processAllSvgs, 1000); + } + + if (document.readyState === 'complete') { + afterLoad(); + } else { + window.addEventListener('load', afterLoad); + } + } + + init(); +})(); diff --git a/great-docs/navbar-style.js b/great-docs/navbar-style.js new file mode 100644 index 0000000..a913a36 --- /dev/null +++ b/great-docs/navbar-style.js @@ -0,0 +1,107 @@ +/** + * Navbar Gradient Style for Great Docs + * + * Reads the gd-navbar-style meta tag and applies the corresponding + * animated gradient CSS class to the navbar element. + */ +(function () { + "use strict"; + + var meta = document.querySelector('meta[name="gd-navbar-style"]'); + if (!meta) return; + + var preset = meta.getAttribute("data-preset") || ""; + if (!preset) return; + + var navbar = document.querySelector(".navbar"); + if (navbar) { + navbar.classList.add("gd-gradient-" + preset); + } +})(); + +/** + * Sticky navbar on desktop — keep sidebars positioned below the header. + * + * Quarto's headroom.js hides the navbar on scroll-down and shifts sidebars + * (top: 0) to fill the vacated space. Our CSS keeps the navbar visible on + * desktop (>= 992px), so we must also prevent the sidebar repositioning. + * Listens for the quarto-hrChanged event that fires after every headroom + * pin/unpin and re-applies the correct sidebar top/maxHeight. + */ +(function () { + "use strict"; + + var mql = window.matchMedia("(min-width: 992px)"); + + function fixSidebars() { + if (!mql.matches) return; + + var header = document.querySelector("#quarto-header"); + if (!header) return; + var h = header.offsetHeight; + + var els = document.querySelectorAll(".sidebar, .headroom-target"); + els.forEach(function (el) { + // Skip the floating sidebar — sidebar-float.js manages its own bounds + if (el.classList.contains('gd-sidebar-float')) return; + el.style.top = h + "px"; + el.style.maxHeight = "calc(100vh - " + h + "px)"; + }); + } + + window.addEventListener("quarto-hrChanged", fixSidebars); + mql.addEventListener("change", fixSidebars); +})(); + +/** + * Move the footer inside #quarto-content on desktop so sticky sidebars + * remain pinned through the footer region. + * + * Sticky positioning is bounded by the parent container. Because the footer + * lives outside #quarto-content, the sidebars unstick when the container + * ends. Moving the footer inside extends the grid rows, keeping the + * sidebars' sticky context active through the footer. + */ +(function () { + "use strict"; + + var mql = window.matchMedia("(min-width: 992px)"); + var moved = false; + var originalParent = null; + var originalNext = null; + + function update() { + var content = document.getElementById("quarto-content"); + var footer = document.querySelector("footer.footer"); + if (!content || !footer) return; + + if (mql.matches && !moved) { + // Remember original position so we can restore on mobile + originalParent = footer.parentNode; + originalNext = footer.nextSibling; + // Move footer inside the grid container, spanning all columns + footer.style.gridColumn = "1 / -1"; + content.appendChild(footer); + moved = true; + } else if (!mql.matches && moved) { + // Restore footer to its original position for mobile + footer.style.gridColumn = ""; + if (originalNext) { + originalParent.insertBefore(footer, originalNext); + } else { + originalParent.appendChild(footer); + } + moved = false; + } + } + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", update); + } else { + update(); + } + mql.addEventListener("change", update); +})(); + +/* Widget collection is handled by navbar-widgets.js (always loaded). + Mobile sidebar toggle is also in navbar-widgets.js. */ diff --git a/great-docs/navbar-widgets.js b/great-docs/navbar-widgets.js new file mode 100644 index 0000000..8d270c4 --- /dev/null +++ b/great-docs/navbar-widgets.js @@ -0,0 +1,196 @@ +/** + * Navbar Widget Collector for Great Docs + * + * Consolidates all right-side navbar widgets (dark-mode toggle, keyboard + * shortcuts button, GitHub icon/widget, and search) into a single flex + * container (#gd-navbar-widgets) placed inside .quarto-navbar-tools. + * + * This guarantees uniform spacing (via CSS gap) and a predictable order + * regardless of which widgets are enabled or the order scripts execute. + * + * Must be loaded AFTER the individual widget scripts (dark-mode-toggle.js, + * keyboard-nav.js, github-widget.js) and is included unconditionally. + */ +(function () { + 'use strict'; + + function ensureWrapper(containerFluid) { + var wrapper = document.getElementById('gd-navbar-widgets'); + if (wrapper) return wrapper; + + wrapper = document.createElement('div'); + wrapper.id = 'gd-navbar-widgets'; + + var tools = containerFluid.querySelector('.quarto-navbar-tools'); + if (tools) { + tools.appendChild(wrapper); + } else { + containerFluid.appendChild(wrapper); + } + + return wrapper; + } + + function moveToWrapper(wrapper, el) { + if (!el || wrapper.contains(el)) return; + wrapper.appendChild(el); + } + + function collect() { + var containerFluid = document.querySelector('.navbar .container-fluid'); + if (!containerFluid) return; + + var wrapper = ensureWrapper(containerFluid); + + // 1. Dark-mode toggle (unwrap from its
  • ) + var toggleContainer = document.getElementById('dark-mode-toggle-container'); + if (toggleContainer) { + var li = toggleContainer.closest('li.nav-item'); + moveToWrapper(wrapper, toggleContainer); + if (li && !li.hasChildNodes()) li.remove(); + } + + // 2. Keyboard shortcuts button (unwrap from its
  • ) + var kbContainer = document.getElementById('gd-keyboard-btn-container'); + if (kbContainer) { + var kbLi = kbContainer.closest('li.nav-item'); + moveToWrapper(wrapper, kbContainer); + if (kbLi && !kbLi.hasChildNodes()) kbLi.remove(); + } + + // 3. GitHub icon — compact nav-item (unwrap the from its
  • ) + var compactItem = containerFluid.querySelector( + '#navbarCollapse .nav-item.compact' + ); + if (compactItem) { + var link = compactItem.querySelector('.nav-link'); + if (link) { + link.classList.add('gd-navbar-icon'); + moveToWrapper(wrapper, link); + compactItem.remove(); + } + } + + // 4. GitHub widget — #github-widget (unwrap from its
  • ) + var ghWidget = document.getElementById('github-widget'); + if (ghWidget) { + var ghLi = ghWidget.closest('li.nav-item'); + moveToWrapper(wrapper, ghWidget); + if (ghLi && !ghLi.hasChildNodes()) ghLi.remove(); + } + + // 4b. Version selector — #gd-version-selector + var vsWidget = document.getElementById('gd-version-selector'); + if (vsWidget) { + moveToWrapper(wrapper, vsWidget); + } + + // 5. Search button + var search = document.getElementById('quarto-search'); + if (search) moveToWrapper(wrapper, search); + + // Clean up the now-empty ul.ms-auto + var msAuto = containerFluid.querySelector( + '#navbarCollapse .navbar-nav.ms-auto' + ); + if (msAuto) { + Array.prototype.forEach.call( + msAuto.querySelectorAll('li.nav-item'), + function (li) { + if ( + !li.textContent.trim() && + !li.querySelector('button, input, img, svg') + ) { + li.remove(); + } + } + ); + if (msAuto.children.length === 0) msAuto.remove(); + } + } + + function init() { + collect(); + + // Re-collect when widgets are injected after DOMContentLoaded + var scheduled = false; + function scheduleCollect() { + if (scheduled) return; + scheduled = true; + requestAnimationFrame(function () { + scheduled = false; + collect(); + }); + } + + var navbarCollapse = document.getElementById('navbarCollapse'); + if (navbarCollapse) { + var observer = new MutationObserver(scheduleCollect); + observer.observe(navbarCollapse, { childList: true, subtree: true }); + } + + // Also watch container-fluid for widgets appended outside navbarCollapse + // (e.g. version selector) + var containerFluid = document.querySelector('.navbar .container-fluid'); + if (containerFluid) { + var cfObserver = new MutationObserver(scheduleCollect); + cfObserver.observe(containerFluid, { childList: true }); + } + + window.addEventListener('load', scheduleCollect, { once: true }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})(); + +/** + * Mobile sidebar toggle → menu overlay redirect. + * + * On mobile (< 992px) the sidebar toggle button in the Title Bar + * (.quarto-btn-toggle) opens the polished menu overlay (same as the + * 'm'/'n' keyboard shortcut) instead of Bootstrap's collapse sidebar. + * This gives a smooth fade-in/slide, rounded card, backdrop blur, and + * auto-scroll to the current page — matching the desktop overlay UX. + */ +(function () { + "use strict"; + + var mql = window.matchMedia("(max-width: 991.98px)"); + + function intercept(e) { + if (!mql.matches) return; // desktop — let Bootstrap handle it + if (!window.__gdMenu) return; // keyboard-nav.js not loaded yet + + // Stop Bootstrap collapse and Quarto headroom toggle + e.preventDefault(); + e.stopPropagation(); + + if (window.__gdMenu.isOpen()) { + window.__gdMenu.hide(); + } else { + window.__gdMenu.show(); + } + } + + function attach() { + // The secondary-nav has two clickable elements: the + +
  • + `; + + // Insert at the top of the sidebar-menu-container, before the filter if it exists + const menuContainer = sidebar.querySelector('.sidebar-menu-container'); + if (!menuContainer) { + return; + } + + const filterContainer = menuContainer.querySelector('.sidebar-filter-container'); + if (filterContainer) { + // Insert before the filter + menuContainer.insertBefore(switcherContainer, filterContainer); + } else { + // Insert at the beginning of the menu container + menuContainer.insertBefore(switcherContainer, menuContainer.firstChild); + } + + // Add click handlers + const buttons = switcherContainer.querySelectorAll('.reference-switcher-btn'); + buttons.forEach(btn => { + btn.addEventListener('click', function() { + const refType = this.dataset.ref; + navigateToReference(refType); + }); + }); + } + + function navigateToReference(refType) { + const basePath = window.location.pathname.split('/reference/')[0]; + + if (refType === 'cli') { + window.location.href = basePath + '/reference/cli/index.html'; + } else { + window.location.href = basePath + '/reference/index.html'; + } + } +})(); diff --git a/great-docs/reference/Column.qmd b/great-docs/reference/Column.qmd new file mode 100644 index 0000000..b0ab3ef --- /dev/null +++ b/great-docs/reference/Column.qmd @@ -0,0 +1,149 @@ +--- +title: "[Column()]{.doc-object-name .doc-function .doc-label .doc-label-function}" +body-classes: doc-api-page +page-navigation: false +--- + +# [Column()]{.doc-object-name .doc-function .doc-label .doc-label-function} + +::: {.doc-subject} + +::: + +::: {.doc-usage-source} +Usage + +[Source](https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\__init__.py#L263-L357){target="_blank" rel="noopener"} +::: + +::: {.doc-signature .doc-Kind.FUNCTION} +```python +Column(accessor=None, /, **kwargs) +``` +::: + +## Description {.doc-description} + +Build a column-definition dictionary for `DataTable(columns=[...])`. +This helper is the quickest way to create readable column configs from +Python without manually repeating `{"accessor": ...}` for every column. + +## Parameters {.doc-parameters} + +::: {.doc-definition-items} +[accessor]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str | None]{.doc-parameter-annotation} [=]{.doc-parameter-default-sep .op} [None]{.doc-parameter-default} + +: Description: Record key rendered by the column. This becomes the + column identifier used by helpers such as + `table.update_columns(selector="salary", ...)`. + Example: `Column("salary")`. + +[title]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: Header label shown above the column. If omitted, the + frontend falls back to the accessor or its built-in title formatting. + Example: `title="Annual Salary"`. + +[presentation]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: Built-in display mode used to format cell values. + Expected inputs: `'text'`, `'number'`, `'currency'`, `'date'`, + `'datetime'`, `'badge'`, `'link'`, `'code'`, `'json'`, `'progress'`. + Example: `presentation="currency"`. + +[sortable]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Enables sorting for the column. + Example: `sortable=True`. + +[editable]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Enables double-click editing for the column. Pair this + with `editor` when you want a custom Dash input component. + Example: `editable=True`. + +[editor]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [Any]{.doc-parameter-annotation} + +: Description: Dash component used as the in-place editor for editable + cells. + Example: `editor=dmc.NumberInput(min=0, thousandSeparator=",")`. + +[render]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [Any]{.doc-parameter-annotation} + +: Description: Dash component or renderer payload used for custom cell + content. + Example: `render=dmc.Text("View", c="blue")`. + +[filter]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [Any]{.doc-parameter-annotation} + +: Description: Dash component rendered in the column filter popover. + Example: `filter=dmc.TextInput(placeholder="Filter names")`. + +[textAlign]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: Horizontal alignment for cell content. + Expected inputs: values accepted by Mantine/DataTable such as + `'left'`, `'center'`, `'right'`. + Example: `textAlign="right"`. + +[width]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [int | float | str]{.doc-parameter-annotation} + +: Description: Column width. You can pass a numeric pixel value or a CSS + width string. + Example: `width=140`. + +[cellsStyle]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [dict]{.doc-parameter-annotation} + +: Description: Inline style mapping applied to body cells. + Example: `cellsStyle={"fontVariantNumeric": "tabular-nums"}`. + +[titleStyle]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [dict]{.doc-parameter-annotation} + +: Description: Inline style mapping applied to the header cell. + Example: `titleStyle={"textTransform": "uppercase"}`. + +[draggable]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Allows the column to participate in column dragging. + Example: `draggable=True`. + +[toggleable]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Allows the column to be shown or hidden by column + customization controls. + Example: `toggleable=True`. + +[resizable]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Allows the column width to be resized by the user. + Example: `resizable=True`. + +[defaultToggle]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Initial visibility state used when column toggling is + enabled. + Example: `defaultToggle=False`. +::: + +## Returns {.doc-returns} + +::: {.doc-definition-items} + [dict]{.doc-parameter-annotation} + +: A Dash-safe column configuration dictionary. +::: + +## Notes {.doc-notes} + +The helper does not validate every possible column key. It simply builds a +plain dictionary, which makes it safe to use with existing Mantine +DataTable column options and this package's Dash-specific additions. + +## Examples {.doc-examples} + +```python +>>> Column("salary", title="Salary", presentation="currency", currency="USD") +{'accessor': 'salary', 'title': 'Salary', 'presentation': 'currency', 'currency': 'USD'} +>>> Column("status", presentation="badge", badgeColorAccessor="statusColor") +{'accessor': 'status', 'presentation': 'badge', 'badgeColorAccessor': 'statusColor'} +``` \ No newline at end of file diff --git a/great-docs/reference/ColumnGroup.qmd b/great-docs/reference/ColumnGroup.qmd new file mode 100644 index 0000000..0828ebe --- /dev/null +++ b/great-docs/reference/ColumnGroup.qmd @@ -0,0 +1,93 @@ +--- +title: "[ColumnGroup()]{.doc-object-name .doc-function .doc-label .doc-label-function}" +body-classes: doc-api-page +page-navigation: false +--- + +# [ColumnGroup()]{.doc-object-name .doc-function .doc-label .doc-label-function} + +::: {.doc-subject} + +::: + +::: {.doc-usage-source} +Usage + +[Source](https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\__init__.py#L360-L427){target="_blank" rel="noopener"} +::: + +::: {.doc-signature .doc-Kind.FUNCTION} +```python +ColumnGroup(group_id=None, /, *, columns=None, groups=None, **kwargs) +``` +::: + +## Description {.doc-description} + +Build a grouped-header definition for `DataTable(groups=[...])`. Use this +when you want multiple header rows, such as a "Compensation" group above +salary and bonus columns. + +## Parameters {.doc-parameters} + +::: {.doc-definition-items} +[group_id]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str | None]{.doc-parameter-annotation} [=]{.doc-parameter-default-sep .op} [None]{.doc-parameter-default} + +: Description: Stable identifier for the group. This is the id you use + later with `table.group_columns(selector="compensation", ...)`. + Example: `group_id="compensation"`. + +[columns]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [list[Any] | None]{.doc-parameter-annotation} [=]{.doc-parameter-default-sep .op} [None]{.doc-parameter-default} + +: Description: Column references attached directly to this group. Each + item may be an accessor string like `"salary"` or a full column + dictionary. + Example: `columns=["salary", "bonus"]`. + +[groups]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [list[dict[str, Any]] | None]{.doc-parameter-annotation} [=]{.doc-parameter-default-sep .op} [None]{.doc-parameter-default} + +: Description: Nested child groups for multi-row grouped headers. + Example: `groups=[ColumnGroup("cash", columns=["salary", "bonus"])]`. + +[title]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: Visible header label for the group. + Example: `title="Compensation"`. + +[style]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [dict]{.doc-parameter-annotation} + +: Description: Inline style mapping applied to the group header cell. + Example: `style={"textAlign": "center"}`. + +[headerStyle]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [dict]{.doc-parameter-annotation} + +: Description: Header-specific style mapping forwarded to the frontend. + Example: `headerStyle={"backgroundColor": "var(--mantine-color-gray-0)"}`. + +[textAlign]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: Alignment hint for grouped-header content. + Expected inputs: values accepted by Mantine/DataTable such as + `'left'`, `'center'`, `'right'`. + Example: `textAlign="center"`. +::: + +## Returns {.doc-returns} + +::: {.doc-definition-items} + [dict]{.doc-parameter-annotation} + +: A grouped-header configuration dictionary. +::: + +## Notes {.doc-notes} + +Group dictionaries are plain Python objects, so they can be freely mixed +with `Column(...)` output and raw dictionaries in the same `groups` list. + +## Examples {.doc-examples} + +```python +>>> ColumnGroup("profile", title="Profile", columns=["name", "team"]) +{'id': 'profile', 'columns': ['name', 'team'], 'title': 'Profile'} +``` \ No newline at end of file diff --git a/great-docs/reference/DataTable.qmd b/great-docs/reference/DataTable.qmd new file mode 100644 index 0000000..c33d72f --- /dev/null +++ b/great-docs/reference/DataTable.qmd @@ -0,0 +1,19 @@ +--- +title: "[DataTable]{.doc-object-name .doc-module .doc-label .doc-label-module}" +body-classes: doc-api-page +page-navigation: false +--- + +# [DataTable]{.doc-object-name .doc-module .doc-label .doc-label-module} + +::: {.doc-signature .doc-module} +`DataTable` +::: + +::: {.doc-usage-source} +Usage +::: + +::: {.doc-subject} + +::: \ No newline at end of file diff --git a/great-docs/reference/PaginationConfig.qmd b/great-docs/reference/PaginationConfig.qmd new file mode 100644 index 0000000..0687db2 --- /dev/null +++ b/great-docs/reference/PaginationConfig.qmd @@ -0,0 +1,116 @@ +--- +title: "[PaginationConfig()]{.doc-object-name .doc-function .doc-label .doc-label-function}" +body-classes: doc-api-page +page-navigation: false +--- + +# [PaginationConfig()]{.doc-object-name .doc-function .doc-label .doc-label-function} + +::: {.doc-subject} + +::: + +::: {.doc-usage-source} +Usage + +[Source](https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\__init__.py#L490-L555){target="_blank" rel="noopener"} +::: + +::: {.doc-signature .doc-Kind.FUNCTION} +```python +PaginationConfig(**kwargs) +``` +::: + +## Description {.doc-description} + +Build a compact pagination configuration dictionary for client-side or +server-side paging. + +## Parameters {.doc-parameters} + +::: {.doc-definition-items} +[page]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [int | float]{.doc-parameter-annotation} + +: Description: Current page number in controlled pagination mode. + Example: `page=1`. + +[pageSize]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [int | float]{.doc-parameter-annotation} + +: Description: Number of rows shown per page when using the `pageSize` + prop. + Example: `pageSize=25`. + +[recordsPerPage]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [int | float]{.doc-parameter-annotation} + +: Description: Preferred page-size prop matching Mantine DataTable's API. + Example: `recordsPerPage=25`. + +[totalRecords]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [int | float]{.doc-parameter-annotation} + +: Description: Total number of records available, typically required for + server-side pagination. + Example: `totalRecords=248`. + +[recordsPerPageOptions]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [list[int | float]]{.doc-parameter-annotation} + +: Description: Page-size choices shown in the footer control. + Example: `recordsPerPageOptions=[10, 25, 50, 100]`. + +[pageSizeOptions]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [list[int | float]]{.doc-parameter-annotation} + +: Description: Alternative page-size options prop. + Example: `pageSizeOptions=[10, 25, 50]`. + +[recordsPerPageLabel]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: Label shown next to the page-size selector. + Example: `recordsPerPageLabel="Rows"`. + +[paginationSize]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str | int | float]{.doc-parameter-annotation} + +: Description: Visual size of the pagination controls. + Expected inputs: Mantine size tokens such as `'xs'`, `'sm'`, `'md'`, + `'lg'`, `'xl'`, or a numeric size when supported. + Example: `paginationSize="sm"`. + +[paginationActiveTextColor]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str | dict]{.doc-parameter-annotation} + +: Description: Text color for the active page button. + Example: `paginationActiveTextColor="white"`. + +[paginationActiveBackgroundColor]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str | dict]{.doc-parameter-annotation} + +: Description: Background color for the active page button. + Example: `paginationActiveBackgroundColor="blue.6"`. + +[paginationWithEdges]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Shows first/last page controls when `True`. + Example: `paginationWithEdges=True`. + +[paginationWithControls]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Shows previous/next controls when `True`. + Example: `paginationWithControls=True`. +::: + +## Returns {.doc-returns} + +::: {.doc-definition-items} + [dict]{.doc-parameter-annotation} + +: A dictionary with `None` values removed. +::: + +## Notes {.doc-notes} + +For most apps you will set either `recordsPerPage` or `pageSize`, not +both. This helper simply forwards whatever keys you provide. + +## Examples {.doc-examples} + +```python +>>> PaginationConfig(page=2, recordsPerPage=25, totalRecords=240) +{'page': 2, 'recordsPerPage': 25, 'totalRecords': 240} +``` \ No newline at end of file diff --git a/great-docs/reference/RowExpansionConfig.qmd b/great-docs/reference/RowExpansionConfig.qmd new file mode 100644 index 0000000..a98d6ca --- /dev/null +++ b/great-docs/reference/RowExpansionConfig.qmd @@ -0,0 +1,69 @@ +--- +title: "[RowExpansionConfig()]{.doc-object-name .doc-function .doc-label .doc-label-function}" +body-classes: doc-api-page +page-navigation: false +--- + +# [RowExpansionConfig()]{.doc-object-name .doc-function .doc-label .doc-label-function} + +::: {.doc-subject} + +::: + +::: {.doc-usage-source} +Usage + +[Source](https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\__init__.py#L558-L597){target="_blank" rel="noopener"} +::: + +::: {.doc-signature .doc-Kind.FUNCTION} +```python +RowExpansionConfig(content=None, /, **kwargs) +``` +::: + +## Description {.doc-description} + +Build a row-expansion configuration dictionary for detail panels shown +beneath a record. + +## Parameters {.doc-parameters} + +::: {.doc-definition-items} +[content]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [Any]{.doc-parameter-annotation} [=]{.doc-parameter-default-sep .op} [None]{.doc-parameter-default} + +: Description: Dash component or payload rendered when a row is expanded. + Example: `content=dmc.Text("Employee details")`. + +[allowMultiple]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool]{.doc-parameter-annotation} + +: Description: Allows multiple rows to stay expanded at the same time. + Example: `allowMultiple=True`. + +[trigger]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: Chooses how expansion is toggled. + Expected inputs: frontend-supported trigger values such as `'click'` + when available. + Example: `trigger="click"`. +::: + +## Returns {.doc-returns} + +::: {.doc-definition-items} + [dict]{.doc-parameter-annotation} + +: A dictionary with `None` values removed. +::: + +## Notes {.doc-notes} + +This helper is especially useful when you want to keep expansion config in +one place and reuse it across multiple table instances. + +## Examples {.doc-examples} + +```python +>>> RowExpansionConfig(content="More details", allowMultiple=True) +{'allowMultiple': True, 'content': 'More details'} +``` \ No newline at end of file diff --git a/great-docs/reference/SelectionConfig.qmd b/great-docs/reference/SelectionConfig.qmd new file mode 100644 index 0000000..d284c8f --- /dev/null +++ b/great-docs/reference/SelectionConfig.qmd @@ -0,0 +1,104 @@ +--- +title: "[SelectionConfig()]{.doc-object-name .doc-function .doc-label .doc-label-function}" +body-classes: doc-api-page +page-navigation: false +--- + +# [SelectionConfig()]{.doc-object-name .doc-function .doc-label .doc-label-function} + +::: {.doc-subject} + +::: + +::: {.doc-usage-source} +Usage + +[Source](https://github.com/jeffgallini/dash-mantine-datatable/blob/main/dash_mantine_datatable\__init__.py#L430-L487){target="_blank" rel="noopener"} +::: + +::: {.doc-signature .doc-Kind.FUNCTION} +```python +SelectionConfig(**kwargs) +``` +::: + +## Description {.doc-description} + +Build a compact selection configuration dictionary that you can unpack into +`DataTable(...)` or pass to `table.update_selection(...)`. + +## Parameters {.doc-parameters} + +::: {.doc-definition-items} +[selectionTrigger]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: Enables row selection and decides how it is triggered. + Expected inputs: `'cell'`, `'checkbox'`. + Example: `selectionTrigger="checkbox"`. + +[selectedRecordIds]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [list[Any]]{.doc-parameter-annotation} + +: Description: Controlled list of selected row ids. + Example: `selectedRecordIds=[1, 4, 8]`. + +[selectedRecords]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [list[dict]]{.doc-parameter-annotation} + +: Description: Controlled list of selected record payloads. + Example: `selectedRecords=[{"id": 1, "name": "Avery"}]`. + +[selectableRowRules]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool | dict | list]{.doc-parameter-annotation} + +: Description: Rule definition that marks which rows are selectable. + Example: `selectableRowRules=[{"selector": {"status": "Active"}, "value": True}]`. + +[disabledSelectionRowRules]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [bool | dict | list]{.doc-parameter-annotation} + +: Description: Rule definition that disables row selection for matching + rows. + Example: `disabledSelectionRowRules=[{"selector": {"archived": True}, "value": True}]`. + +[selectionCheckboxRules]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [dict | list]{.doc-parameter-annotation} + +: Description: Conditional checkbox props for the selection column. + Example: `selectionCheckboxRules=[{"selector": {"locked": True}, "value": {"disabled": True}}]`. + +[selectionCheckboxProps]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [dict]{.doc-parameter-annotation} + +: Description: Shared props for each row-selection checkbox. + Example: `selectionCheckboxProps={"size": "sm"}`. + +[allRecordsSelectionCheckboxProps]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [dict]{.doc-parameter-annotation} + +: Description: Props for the "select all" checkbox in the header. + Example: `allRecordsSelectionCheckboxProps={"aria-label": "Select all rows"}`. + +[selectionColumnClassName]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [str]{.doc-parameter-annotation} + +: Description: CSS class applied to the selection column. + Example: `selectionColumnClassName="table-selection-col"`. + +[selectionColumnStyle]{.doc-parameter-name}[:]{.doc-parameter-annotation-sep} [dict]{.doc-parameter-annotation} + +: Description: Inline style mapping applied to the selection column. + Example: `selectionColumnStyle={"width": 44}`. +::: + +## Returns {.doc-returns} + +::: {.doc-definition-items} + [dict]{.doc-parameter-annotation} + +: A dictionary with `None` values removed. +::: + +## Notes {.doc-notes} + +This helper is a convenience for building clean config objects. It does +not mutate a table and it drops keys whose value is `None`. + +## Examples {.doc-examples} + +```python +>>> SelectionConfig(selectionTrigger="checkbox", selectedRecordIds=[1, 2]) +{'selectionTrigger': 'checkbox', 'selectedRecordIds': [1, 2]} +``` \ No newline at end of file diff --git a/great-docs/reference/index.qmd b/great-docs/reference/index.qmd new file mode 100644 index 0000000..a791a56 --- /dev/null +++ b/great-docs/reference/index.qmd @@ -0,0 +1,45 @@ +--- +title: Reference +body-classes: doc-reference +page-navigation: false +--- + +::: {.doc-description} +The Python API centers on the Dash DataTable component, small dictionary builders for common nested props, and fluent methods for updating table behavior in place. +::: + +## Component {.doc-group} + +::: {.doc-description} +Main generated Dash component. +::: + +[DataTable](DataTable.qmd#dash_mantine_datatable.DataTable){.doc-module .doc-label .doc-label-module} + +: + +## Helper Builders {.doc-group} + +::: {.doc-description} +Dictionary factories for readable table configuration. +::: + +[Column()](Column.qmd#dash_mantine_datatable.Column){.doc-function .doc-label .doc-label-function} + +: + +[ColumnGroup()](ColumnGroup.qmd#dash_mantine_datatable.ColumnGroup){.doc-function .doc-label .doc-label-function} + +: + +[SelectionConfig()](SelectionConfig.qmd#dash_mantine_datatable.SelectionConfig){.doc-function .doc-label .doc-label-function} + +: + +[PaginationConfig()](PaginationConfig.qmd#dash_mantine_datatable.PaginationConfig){.doc-function .doc-label .doc-label-function} + +: + +[RowExpansionConfig()](RowExpansionConfig.qmd#dash_mantine_datatable.RowExpansionConfig){.doc-function .doc-label .doc-label-function} + +: \ No newline at end of file diff --git a/great-docs/responsive-tables.js b/great-docs/responsive-tables.js new file mode 100644 index 0000000..e7743a7 --- /dev/null +++ b/great-docs/responsive-tables.js @@ -0,0 +1,346 @@ +/** + * Responsive Tables for Great Docs + * + * Enhances table display on narrow viewports with: + * - Horizontal scroll containers for wide tables + * - Touch-friendly scroll indicators + * - Consistent dark mode styling + * + * Uses double-wrapper structure for Safari compatibility: + * - Outer wrapper (.gd-table-responsive) has position:relative for indicators + * - Inner wrapper (.gd-table-scroll) has overflow-x:auto for scrolling + */ +(function () { + "use strict"; + + // Minimum width difference to consider a table "wide" + var OVERFLOW_THRESHOLD = 20; + + /** + * Wrap a table in a responsive scroll container + */ + function wrapTable(table) { + // Skip if already wrapped + if (table.closest(".gd-table-responsive")) { + return; + } + + // Skip tables inside code blocks or other special contexts + if (table.closest("pre, code, .sourceCode")) { + return; + } + + // Skip Great Tables output — these have their own styling and layout + if (table.classList.contains("gt_table")) { + return; + } + + // Create outer wrapper (for indicator positioning) + var outerWrapper = document.createElement("div"); + outerWrapper.className = "gd-table-responsive"; + + // Create inner scroll container + var scrollContainer = document.createElement("div"); + scrollContainer.className = "gd-table-scroll"; + scrollContainer.setAttribute("tabindex", "0"); + scrollContainer.setAttribute("role", "region"); + scrollContainer.setAttribute("aria-label", "Scrollable table"); + + // Insert outer wrapper and move table inside inner container + table.parentNode.insertBefore(outerWrapper, table); + scrollContainer.appendChild(table); + outerWrapper.appendChild(scrollContainer); + + // Add scroll indicators to outer wrapper (not inside scroll container) + var indicatorLeft = document.createElement("div"); + indicatorLeft.className = "gd-table-scroll-indicator gd-table-scroll-left"; + indicatorLeft.innerHTML = ''; + outerWrapper.appendChild(indicatorLeft); + + var indicatorRight = document.createElement("div"); + indicatorRight.className = "gd-table-scroll-indicator gd-table-scroll-right"; + indicatorRight.innerHTML = ''; + outerWrapper.appendChild(indicatorRight); + + // Update scroll indicator visibility based on scroll position + function updateScrollIndicators() { + var scrollLeft = scrollContainer.scrollLeft; + var maxScroll = scrollContainer.scrollWidth - scrollContainer.clientWidth; + + // Only show indicators if scrollable + if (maxScroll <= OVERFLOW_THRESHOLD) { + indicatorLeft.classList.remove("visible"); + indicatorRight.classList.remove("visible"); + return; + } + + // Show/hide based on scroll position + indicatorLeft.classList.toggle("visible", scrollLeft > OVERFLOW_THRESHOLD); + indicatorRight.classList.toggle("visible", scrollLeft < maxScroll - OVERFLOW_THRESHOLD); + } + + // Debounced scroll handler + var scrollTimeout; + scrollContainer.addEventListener("scroll", function () { + if (scrollTimeout) { + clearTimeout(scrollTimeout); + } + scrollTimeout = setTimeout(updateScrollIndicators, 50); + }); + + // Click to scroll + indicatorLeft.addEventListener("click", function () { + scrollContainer.scrollBy({ left: -150, behavior: "smooth" }); + }); + + indicatorRight.addEventListener("click", function () { + scrollContainer.scrollBy({ left: 150, behavior: "smooth" }); + }); + + // Initial indicator update + setTimeout(updateScrollIndicators, 100); + + // Update on resize + var resizeObserver; + if (typeof ResizeObserver !== "undefined") { + resizeObserver = new ResizeObserver(function () { + updateScrollIndicators(); + }); + resizeObserver.observe(scrollContainer); + } + + return outerWrapper; + } + + /** + * Scale content inside a .scale-to-fit container to fill the container width. + * + * Usage in .qmd: + * :::{.scale-to-fit} + * ```{python} + * my_wide_table() + * ``` + * ::: + */ + // Viewport breakpoints for keyword-based min-scale thresholds. + // Below the given width, scaling is disabled and horizontal scrolling is + // used instead. + var SCALE_BREAKPOINTS = { mobile: 576, tablet: 768, desktop: 992 }; + + /** + * Parse a data-min-scale attribute value. + * Returns an object: { type: "number", value: 0.4 } + * or { type: "keyword", width: 768 } + * or null (no threshold). + */ + function parseMinScale(raw) { + if (!raw) return null; + var lower = raw.toLowerCase(); + if (SCALE_BREAKPOINTS[lower] !== undefined) { + return { type: "keyword", width: SCALE_BREAKPOINTS[lower] }; + } + var n = parseFloat(raw); + if (!isNaN(n) && n > 0 && n < 1) { + return { type: "number", value: n }; + } + return null; + } + + function applyScaleToFit(container, minScaleObj) { + // minScaleObj: parsed result from parseMinScale(), or null. + // Per-container data-min-scale overrides the page/global threshold. + var containerMinScale = parseMinScale(container.getAttribute("data-min-scale")); + if (containerMinScale) { + minScaleObj = containerMinScale; + } + // Find the content to scale — first child element that has measurable width + var inner = container.querySelector(".cell-output-display, .cell-output, table, .gt_table"); + if (!inner) { + // Fall back to first element child + inner = container.firstElementChild; + } + if (!inner) return; + + // Wrap content in a scaling div if not already wrapped + var scaleWrapper = container.querySelector(".gd-scale-wrapper"); + if (!scaleWrapper) { + scaleWrapper = document.createElement("div"); + scaleWrapper.className = "gd-scale-wrapper"; + // Move all children into the wrapper + while (container.firstChild) { + scaleWrapper.appendChild(container.firstChild); + } + container.appendChild(scaleWrapper); + } + + function updateScale() { + // Reset transform to measure natural width + scaleWrapper.style.transform = "none"; + scaleWrapper.style.transformOrigin = "top left"; + scaleWrapper.style.width = "max-content"; + scaleWrapper.style.height = ""; + container.style.height = ""; + + // Allow layout to settle + var containerWidth = container.clientWidth; + var contentWidth = scaleWrapper.scrollWidth; + + if (contentWidth <= 0 || containerWidth <= 0) return; + + var scale = containerWidth / contentWidth; + + // Never upscale — only shrink to fit + if (scale >= 1) { + scaleWrapper.style.transform = "none"; + scaleWrapper.style.width = ""; + scaleWrapper.style.height = ""; + container.style.height = ""; + container.style.overflow = ""; + container.classList.remove("gd-scale-scrollable"); + return; + } + + // Check whether we should skip scaling and scroll instead. + // Keyword thresholds: if viewport is at or below the breakpoint, scroll. + // Numeric thresholds: if computed scale < min, scroll. + var shouldScroll = false; + if (minScaleObj) { + if (minScaleObj.type === "keyword") { + shouldScroll = window.innerWidth <= minScaleObj.width; + } else if (minScaleObj.type === "number") { + shouldScroll = scale < minScaleObj.value; + } + } + + if (shouldScroll) { + scaleWrapper.style.transform = "none"; + scaleWrapper.style.width = "max-content"; + scaleWrapper.style.height = ""; + container.style.height = ""; + container.style.overflowX = "auto"; + container.classList.add("gd-scale-scrollable"); + return; + } + + // Apply scale + scaleWrapper.style.transform = "scale(" + scale + ")"; + scaleWrapper.style.width = contentWidth + "px"; + + // Adjust container height to match scaled content + var contentHeight = scaleWrapper.scrollHeight; + container.style.height = (contentHeight * scale) + "px"; + container.style.overflow = "hidden"; + } + + updateScale(); + + // Re-scale on window resize + if (typeof ResizeObserver !== "undefined") { + var ro = new ResizeObserver(function () { + updateScale(); + }); + ro.observe(container); + } + } + + /** + * Initialize responsive tables + */ + function init() { + // Find all tables in the content area + var content = document.querySelector("#quarto-content, .content, main, article"); + if (!content) { + content = document.body; + } + + var tables = content.querySelectorAll("table"); + for (var i = 0; i < tables.length; i++) { + wrapTable(tables[i]); + } + + // Apply scale-to-fit to marked containers (manual :::{.scale-to-fit}) + var fitContainers = content.querySelectorAll(".scale-to-fit"); + for (var i = 0; i < fitContainers.length; i++) { + applyScaleToFit(fitContainers[i]); + } + + // Auto-scale elements matching CSS selectors from config or page frontmatter. + // Global selectors come from: + // Page-level selectors come from: + // Both may carry data-min-scale (float like "0.4" or keyword like "tablet"). + var allSelectors = []; + var minScaleObj = null; + var globalMeta = document.querySelector('meta[name="gd-scale-to-fit"]'); + var pageMeta = document.querySelector('meta[name="gd-scale-to-fit-page"]'); + + // Page-level takes precedence over global for both selectors and min-scale + var activeMeta = pageMeta || globalMeta; + if (activeMeta) { + try { allSelectors = JSON.parse(activeMeta.getAttribute("data-selectors") || "[]"); } catch (e) { /* ignore */ } + minScaleObj = parseMinScale(activeMeta.getAttribute("data-min-scale")); + // If page meta didn't specify min-scale, fall back to global meta + if (!minScaleObj && pageMeta && globalMeta && pageMeta !== globalMeta) { + minScaleObj = parseMinScale(globalMeta.getAttribute("data-min-scale")); + } + } + + // Also pass minScaleObj to manual .scale-to-fit containers + for (var i = 0; i < fitContainers.length; i++) { + // Re-apply with minScaleObj if we have one (first call was with null) + if (minScaleObj) { applyScaleToFit(fitContainers[i], minScaleObj); } + } + + for (var si = 0; si < allSelectors.length; si++) { + var selector = allSelectors[si]; + var matches; + try { matches = content.querySelectorAll(selector); } catch (e) { continue; } + + for (var mi = 0; mi < matches.length; mi++) { + var el = matches[mi]; + // Walk up to the nearest output container to scale + var scaleTarget = el.closest(".cell-output-display") || el.closest(".cell-output") || el.parentElement; + if (scaleTarget && !scaleTarget.classList.contains("scale-to-fit")) { + scaleTarget.classList.add("scale-to-fit"); + applyScaleToFit(scaleTarget, minScaleObj); + } + } + } + + // Handle dynamically added tables (e.g., from AJAX) + if (typeof MutationObserver !== "undefined") { + var observer = new MutationObserver(function (mutations) { + for (var i = 0; i < mutations.length; i++) { + var mutation = mutations[i]; + for (var j = 0; j < mutation.addedNodes.length; j++) { + var node = mutation.addedNodes[j]; + if (node.nodeType === 1) { + // Element node + if (node.tagName === "TABLE") { + wrapTable(node); + } else { + var nestedTables = node.querySelectorAll + ? node.querySelectorAll("table") + : []; + for (var k = 0; k < nestedTables.length; k++) { + wrapTable(nestedTables[k]); + } + } + } + } + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + }); + } + } + + // Run after DOM is ready + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } +})(); diff --git a/great-docs/scripts/post-render.py b/great-docs/scripts/post-render.py new file mode 100644 index 0000000..1988985 --- /dev/null +++ b/great-docs/scripts/post-render.py @@ -0,0 +1,4859 @@ +from __future__ import annotations + +import glob +import html +import json +import os +import re + +# Skip post-render processing during freeze-only renders +if os.environ.get("GD_FREEZE_ONLY"): + print("Skipping post-render (freeze-only mode)") + raise SystemExit(0) + +from pygments import highlight +from pygments.formatters import HtmlFormatter +from pygments.lexers import PythonLexer + +# Print the working directory +print("Current working directory:", os.getcwd()) + +# Get a list of all files in the working directory +files = os.listdir(".") +print("Files in working directory:", files) + +site_files = os.listdir("_site") +print("Files in '_site' directory:", site_files) + +# Load source links if available +source_links = {} +source_links_path = "_source_links.json" +if os.path.exists(source_links_path): + print(f"Loading source links from {source_links_path}") + with open(source_links_path, "r", encoding="utf-8") as f: + source_links = json.load(f) + print(f"Loaded {len(source_links)} source links") +else: + print("No source links file found, skipping source link injection") + +# Load object type metadata for accurate classification +# Keys are object names (e.g., "parser.ParserError"), values are type strings +# ("class", "namedtuple", "typeddict", "protocol", "abc", "exception", "function", "method", "constant", "enum", "type_alias", "other") +object_types = {} +object_types_path = "_object_types.json" +if os.path.exists(object_types_path): + print(f"Loading object types from {object_types_path}") + with open(object_types_path, "r", encoding="utf-8") as f: + object_types = json.load(f) + print(f"Loaded {len(object_types)} object type entries") +else: + print("No object types file found, falling back to heuristic classification") + +# Load constant value metadata for displaying values on constant reference pages. +# Keys are constant names, values are dicts with optional "value" and "annotation". +constant_values: dict[str, dict[str, str]] = {} +constant_values_path = "_constant_values.json" +if os.path.exists(constant_values_path): + with open(constant_values_path, "r", encoding="utf-8") as f: + constant_values = json.load(f) + print(f"Loaded {len(constant_values)} constant value entries") + +# Load dataclass attributes metadata for fixing incomplete Attributes tables. +# Written by great-docs core during build step 1.7. +# Keys are fully qualified object paths (e.g., "pkg.Config"), values are +# dicts mapping field name -> description. +dataclass_attrs_metadata: dict[str, dict[str, str]] = {} +dataclass_attrs_path = "_dataclass_attrs.json" +if os.path.exists(dataclass_attrs_path): + with open(dataclass_attrs_path, "r", encoding="utf-8") as f: + dataclass_attrs_metadata = json.load(f) + if dataclass_attrs_metadata: + print(f"Loaded dataclass attribute metadata for {len(dataclass_attrs_metadata)} class(es)") + +# Load great-docs options (written by core.py during build) +_gd_options: dict[str, object] = {} +_gd_options_path = "_gd_options.json" +if os.path.exists(_gd_options_path): + with open(_gd_options_path, "r", encoding="utf-8") as f: + _gd_options = json.load(f) + +# i18n helper — look up a translated string from _gd_options["i18n"] +_i18n_bundle: dict[str, str] = _gd_options.get("i18n", {}) + + +def _t(key: str, fallback: str | None = None) -> str: + """Look up a translated string, falling back to English default.""" + return _i18n_bundle.get(key, fallback if fallback is not None else key) + + +# Load objects.json inventory for resolving interlinks +# Maps qualified names -> {uri, dispname} for cross-reference resolution +_interlinks_inventory: dict[str, dict[str, str]] = {} +_objects_json_path = "objects.json" +if os.path.exists(_objects_json_path): + with open(_objects_json_path, "r", encoding="utf-8") as f: + _inv_data = json.load(f) + for item in _inv_data.get("items", []): + name = item.get("name", "") + if name: + _interlinks_inventory[name] = { + "uri": item.get("uri", ""), + "dispname": item.get("dispname", "-"), + "role": item.get("role", ""), + } + print(f"Loaded {len(_interlinks_inventory)} interlinks inventory entries") +else: + print("No objects.json found, interlinks resolution disabled") + + +# ══════════════════════════════════════════════════════════════════════════════ +# SEO PROCESSING FUNCTIONS +# ══════════════════════════════════════════════════════════════════════════════ + + +def inject_canonical_url(html_content: str, page_path: str) -> str: + """ + Inject a canonical URL link tag into the HTML head. + + Parameters + ---------- + html_content + The HTML content to modify. + page_path + The page path relative to the site root (e.g., "reference/MyClass.html"). + + Returns + ------- + str + The modified HTML with canonical URL injected. + """ + if not _gd_options.get("canonical_enabled", False): + return html_content + + base_url = _gd_options.get("canonical_base_url") + if not base_url: + return html_content + + # Build the canonical URL + if page_path == "index.html": + canonical_url = base_url + elif page_path.endswith("/index.html"): + canonical_url = base_url + page_path[:-10] # Remove /index.html + else: + canonical_url = base_url + page_path + + # Check if canonical already exists + if 'rel="canonical"' in html_content: + return html_content + + # Inject canonical link before + canonical_tag = f'' + html_content = html_content.replace("", f" {canonical_tag}\n", 1) + + return html_content + + +def inject_meta_description(html_content: str, page_path: str) -> str: + """ + Inject or update meta description tag in the HTML head. + + Extracts description from: + 1. Existing description meta tag (if present) + 2. First paragraph of content + 3. Default description from config + + Parameters + ---------- + html_content + The HTML content to modify. + page_path + The page path relative to the site root. + + Returns + ------- + str + The modified HTML with meta description. + """ + if not _gd_options.get("seo_enabled", False): + return html_content + + # Check if description meta already exists + if re.search(r']*>(.*?)", html_content, re.DOTALL) + if main_match: + main_content = main_match.group(1) + # Find the first paragraph that has actual text (not just whitespace or code) + p_match = re.search(r"]*>([^<]+(?:<(?!/?p)[^>]*>[^<]*)*)

    ", main_content) + if p_match: + desc_text = re.sub(r"<[^>]+>", "", p_match.group(1)).strip() + if len(desc_text) > 30: # Only use if meaningful + # Truncate to ~155 chars for optimal SEO + if len(desc_text) > 155: + desc_text = desc_text[:152].rsplit(" ", 1)[0] + "..." + description = desc_text + + # Fall back to default description + if not description: + description = _gd_options.get("default_description", "") + + if not description: + return html_content + + # Escape HTML entities in description + description = ( + description.replace("&", "&") + .replace('"', """) + .replace("<", "<") + .replace(">", ">") + ) + + # Inject meta description before + meta_tag = f'' + html_content = html_content.replace("", f" {meta_tag}\n", 1) + + return html_content + + +# Mapping of common license identifiers to their canonical URLs +# Uses SPDX identifiers (https://spdx.org/licenses/) as keys +LICENSE_URL_MAP = { + # MIT variants + "mit": "https://opensource.org/licenses/MIT", + "mit license": "https://opensource.org/licenses/MIT", + # Apache variants + "apache-2.0": "https://opensource.org/licenses/Apache-2.0", + "apache 2.0": "https://opensource.org/licenses/Apache-2.0", + "apache license 2.0": "https://opensource.org/licenses/Apache-2.0", + # GPL variants + "gpl-3.0": "https://opensource.org/licenses/GPL-3.0", + "gpl-3.0-only": "https://opensource.org/licenses/GPL-3.0", + "gpl-3.0-or-later": "https://opensource.org/licenses/GPL-3.0", + "gpl-2.0": "https://opensource.org/licenses/GPL-2.0", + "gpl-2.0-only": "https://opensource.org/licenses/GPL-2.0", + "lgpl-3.0": "https://opensource.org/licenses/LGPL-3.0", + "lgpl-2.1": "https://opensource.org/licenses/LGPL-2.1", + # BSD variants + "bsd-3-clause": "https://opensource.org/licenses/BSD-3-Clause", + "bsd-2-clause": "https://opensource.org/licenses/BSD-2-Clause", + "bsd 3-clause": "https://opensource.org/licenses/BSD-3-Clause", + "bsd 2-clause": "https://opensource.org/licenses/BSD-2-Clause", + # ISC + "isc": "https://opensource.org/licenses/ISC", + # MPL + "mpl-2.0": "https://opensource.org/licenses/MPL-2.0", + # Unlicense + "unlicense": "https://opensource.org/licenses/unlicense", + # CC licenses + "cc0-1.0": "https://creativecommons.org/publicdomain/zero/1.0/", + "cc-by-4.0": "https://creativecommons.org/licenses/by/4.0/", + "cc-by-sa-4.0": "https://creativecommons.org/licenses/by-sa/4.0/", +} + + +def _get_license_url(license_value: str) -> str: + """ + Convert a license identifier to its canonical URL. + + If the value is already a URL, return it as-is. + If it's a known license identifier, return the canonical URL. + Otherwise, return the original value. + """ + if not license_value: + return "" + + # If it's already a URL, use it directly + if license_value.startswith(("http://", "https://")): + return license_value + + # Look up in the mapping (case-insensitive) + normalized = license_value.lower().strip() + if normalized in LICENSE_URL_MAP: + return LICENSE_URL_MAP[normalized] + + # Fallback: return original value (better than nothing) + return license_value + + +def inject_json_ld(html_content: str, page_path: str) -> str: + """ + Inject JSON-LD structured data into the HTML head. + + Parameters + ---------- + html_content + The HTML content to modify. + page_path + The page path relative to the site root. + + Returns + ------- + str + The modified HTML with JSON-LD structured data. + """ + if not _gd_options.get("structured_data_enabled", False): + return html_content + + # Only inject on the homepage and reference pages + if page_path != "index.html" and not page_path.startswith("reference/"): + return html_content + + # Check if JSON-LD already exists + if 'type="application/ld+json"' in html_content: + return html_content + + schema_type = _gd_options.get("structured_data_type", "SoftwareSourceCode") + package_name = _gd_options.get("package_name", "") + package_description = _gd_options.get("package_description", "") + package_license = _gd_options.get("package_license", "") + repo_url = _gd_options.get("repo_url", "") + site_name = _gd_options.get("site_name", "") + base_url = _gd_options.get("canonical_base_url", "") + + # Build JSON-LD schema + json_ld = { + "@context": "https://schema.org", + "@type": schema_type, + } + + if site_name: + json_ld["name"] = site_name + if package_description: + json_ld["description"] = package_description + if repo_url: + json_ld["codeRepository"] = repo_url + if package_license: + json_ld["license"] = _get_license_url(package_license) + if base_url: + json_ld["url"] = base_url.rstrip("/") + + # Add documentation URL + if base_url: + json_ld["documentation"] = base_url.rstrip("/") + + # Add programming language + json_ld["programmingLanguage"] = { + "@type": "ComputerLanguage", + "name": "Python", + } + + # For reference pages, add WebPage type as well + if page_path.startswith("reference/") and page_path != "reference/index.html": + # Extract the item name from the path + item_name = page_path.replace("reference/", "").replace(".html", "") + page_json_ld = { + "@context": "https://schema.org", + "@type": "WebPage", + "name": f"{item_name} - {site_name}", + "isPartOf": {"@type": "WebSite", "name": site_name}, + } + if base_url: + page_json_ld["url"] = base_url + page_path + + # Use an array with both schemas + json_ld = [json_ld, page_json_ld] + + # Serialize to JSON + import json as json_module + + json_str = json_module.dumps(json_ld, indent=2, ensure_ascii=False) + + # Inject JSON-LD script before + script_tag = f'' + html_content = html_content.replace("", f" {script_tag}\n", 1) + + return html_content + + +def apply_title_template(html_content: str, page_path: str) -> str: + """ + Apply page title template for better SEO. + + Parameters + ---------- + html_content + The HTML content to modify. + page_path + The page path relative to the site root. + + Returns + ------- + str + The modified HTML with templated title. + """ + if not _gd_options.get("seo_enabled", False): + return html_content + + template = _gd_options.get("title_template", "{page_title} | {site_name}") + site_name = _gd_options.get("site_name", "") + + if not site_name or not template: + return html_content + + # Extract current page title + title_match = re.search(r"([^<]*)", html_content) + if not title_match: + return html_content + + current_title = title_match.group(1).strip() + + # Skip if already has a pipe (already templated) + if " | " in current_title or " - " in current_title: + # Check if it ends with site name already + if current_title.endswith(site_name): + return html_content + + # Build new title from template + new_title = template.replace("{page_title}", current_title).replace("{site_name}", site_name) + + # Replace title tag + html_content = html_content.replace( + f"{title_match.group(1)}", f"{new_title}" + ) + + return html_content + + +def inject_noindex_meta(html_content: str, page_path: str) -> str: + """ + Inject noindex/nofollow meta tags for internal or draft pages. + + Pages that should be noindexed: + - Any page with `noindex: true` in frontmatter (processed earlier) + - Skill pages (internal/machine-readable) + + Parameters + ---------- + html_content + The HTML content to modify. + page_path + The page path relative to the site root. + + Returns + ------- + str + The modified HTML with noindex meta if applicable. + """ + if not _gd_options.get("seo_enabled", False): + return html_content + + # Check if noindex meta already exists + if 'name="robots"' in html_content: + return html_content + + # Pages that should be noindexed by default + noindex_paths = ["skills.html"] + + should_noindex = any(page_path == p or page_path.endswith("/" + p) for p in noindex_paths) + + if should_noindex: + meta_tag = '' + html_content = html_content.replace("", f" {meta_tag}\n", 1) + + return html_content + + +def inject_social_cards(html_content: str, page_path: str) -> str: + """ + Inject Open Graph and Twitter/X Card meta tags for social media previews. + + Generates per-page `og:title`, `og:description`, `og:url`, and `og:image` tags (plus Twitter + Card equivalents) so that links shared on LinkedIn, Discord, Slack, Bluesky, Mastodon, X, and + other platforms show rich previews. + + Parameters + ---------- + html_content + The HTML content to modify. + page_path + The page path relative to the site root (e.g., "reference/MyClass.html"). + + Returns + ------- + str + The modified HTML with social card meta tags. + """ + if not _gd_options.get("social_cards_enabled", False): + return html_content + + # Skip if OG tags already exist (e.g., user added manually) + if 'property="og:title"' in html_content: + return html_content + + site_name = _gd_options.get("site_name", "") + base_url = _gd_options.get("canonical_base_url", "") + default_description = _gd_options.get("default_description", "") + image_url = _gd_options.get("social_cards_image") + twitter_site = _gd_options.get("social_cards_twitter_site") + twitter_card_override = _gd_options.get("social_cards_twitter_card") + + # ── Extract page title ──────────────────────────────────────────────── + page_title = site_name + title_match = re.search(r"([^<]*)", html_content) + if title_match: + page_title = title_match.group(1).strip() + + # ── Extract page description ────────────────────────────────────────── + description = "" + + # First try existing meta description + desc_match = re.search(r']*>(.*?)", html_content, re.DOTALL) + if main_match: + p_match = re.search( + r"]*>([^<]+(?:<(?!/?p)[^>]*>[^<]*)*)

    ", + main_match.group(1), + ) + if p_match: + desc_text = re.sub(r"<[^>]+>", "", p_match.group(1)).strip() + if len(desc_text) > 30: + if len(desc_text) > 200: + desc_text = desc_text[:197].rsplit(" ", 1)[0] + "..." + description = desc_text + + # Fall back to site-level default + if not description: + description = default_description + + # HTML-escape attribute values + def _esc(val: str) -> str: + return ( + val.replace("&", "&") + .replace('"', """) + .replace("<", "<") + .replace(">", ">") + ) + + # ── Build page URL ──────────────────────────────────────────────────── + page_url = "" + if base_url: + if page_path == "index.html": + page_url = base_url.rstrip("/") + elif page_path.endswith("/index.html"): + page_url = base_url + page_path[:-10] # Remove /index.html + else: + page_url = base_url + page_path + + # ── Assemble meta tags ──────────────────────────────────────────────── + tags: list[str] = [] + + # Open Graph (works on LinkedIn, Discord, Slack, Bluesky, Mastodon, etc.) + tags.append('') + tags.append(f'') + if description: + tags.append(f'') + if page_url: + tags.append(f'') + if site_name: + tags.append(f'') + if image_url: + tags.append(f'') + + # Twitter/X Card + if twitter_card_override: + card_type = twitter_card_override + else: + card_type = "summary_large_image" if image_url else "summary" + tags.append(f'') + tags.append(f'') + if description: + tags.append(f'') + if image_url: + tags.append(f'') + if twitter_site: + handle = twitter_site if twitter_site.startswith("@") else f"@{twitter_site}" + tags.append(f'') + + # Inject all tags before + tag_block = "\n ".join(tags) + html_content = html_content.replace("", f" {tag_block}\n", 1) + + return html_content + + +def apply_seo_processing(html_content: str, page_path: str) -> str: + """ + Apply all SEO processing to an HTML page. + + Parameters + ---------- + html_content + The HTML content to modify. + page_path + The page path relative to the site root (e.g., "reference/MyClass.html"). + + Returns + ------- + str + The modified HTML with all SEO enhancements. + """ + html_content = inject_canonical_url(html_content, page_path) + html_content = inject_meta_description(html_content, page_path) + html_content = inject_json_ld(html_content, page_path) + html_content = apply_title_template(html_content, page_path) + html_content = inject_noindex_meta(html_content, page_path) + html_content = inject_social_cards(html_content, page_path) + return html_content + + +def get_source_link_html(item_name): + """Generate HTML for a source link given an item name.""" + if item_name in source_links: + url = source_links[item_name]["url"] + return f'
    SOURCE' + return "" + + +# Roles that represent callable objects and should display with trailing "()" +_CALLABLE_ROLES = {"function", "method"} + + +def _resolve_interlink_name(name): + """Resolve a qualified name to its inventory entry. + + Tries exact match first, then looks for suffix matches (e.g., `DuckDBStore` matches + `raghilda.store.DuckDBStore`). + + Returns (uri, short_name, role) or `None` if not found. + """ + # Exact match + if name in _interlinks_inventory: + entry = _interlinks_inventory[name] + short = name.rsplit(".", 1)[-1] + return entry["uri"], short, entry.get("role", "") + + # Suffix match: find the shortest qualified name that ends with the given name + candidates = [] + for full_name, entry in _interlinks_inventory.items(): + if full_name == name or full_name.endswith(f".{name}"): + candidates.append((full_name, entry)) + + if candidates: + # Prefer shortest match (most specific) + candidates.sort(key=lambda x: len(x[0])) + full_name, entry = candidates[0] + short = name.rsplit(".", 1)[-1] + return entry["uri"], short, entry.get("role", "") + + return None + + +def _make_relative_uri(uri, page_path): + """Convert a site-root-relative URI to a path relative to *page_path*. + + *page_path* is relative to ``_site/`` (e.g. ``"reference/Foo.html"``, + ``"user-guide/intro.html"``, ``"index.html"``). + + If *page_path* is ``None``, the legacy behaviour is used: strip the + ``reference/`` prefix (assumes the page lives inside ``reference/``). + """ + if page_path is None: + # Legacy: reference-page context — just strip the shared prefix + if uri.startswith("reference/"): + return uri[len("reference/") :] + return uri + + # Compute a relative path from the directory containing *page_path* + # to the URI (both relative to _site/). + import posixpath + + page_dir = posixpath.dirname(page_path) # e.g. "user-guide" + return posixpath.relpath(uri, page_dir) + + +def resolve_interlinks(html_content, page_path=None): + """Resolve interlink references in rendered HTML. + + Quarto renders interlink syntax as `` tags with backtick-wrapped hrefs: + + - ``[](`~pkg.Name`)`` -> shortened display (`Name`) + - ``[](`pkg.Name`)`` -> full qualified display (`pkg.Name`) + - ``[custom text](`pkg.Name`)`` -> custom display text preserved + - ``[custom text](`~pkg.Name`)`` -> custom display text preserved + + This function resolves those links against the objects.json inventory. + + *page_path* is the page's path relative to ``_site/`` (e.g. + ``"user-guide/intro.html"``). When ``None``, the legacy + reference-page behaviour is used (strip ``reference/`` prefix). + """ + if not _interlinks_inventory: + return html_content + + # Single-pass: match tags with backtick-wrapped interlink hrefs. + # The href may or may not have a ~ prefix. Captures: + # (1) optional ~ prefix + # (2) the qualified name + # (3) everything between > and (link text, possibly empty) + def _replace_full_interlink(m): + tilde = m.group(1) + name = m.group(2) + link_text = m.group(3) + result = _resolve_interlink_name(name) + if result is None: + return m.group(0) + uri, short_name, role = result + # Convert site-root-relative URI to a path relative to this page + uri = _make_relative_uri(uri, page_path) + # Determine display text: + # 1. Custom text provided by user → keep it + # 2. ~ prefix (shortened) → use short name + # 3. No ~ prefix (default) → use full qualified name + text = link_text.strip() + if not text or re.match(r"^`~?[\w.]+`$", text): + text = short_name if tilde else name + # Append () for callable objects (functions, methods) + if role in _CALLABLE_ROLES: + text += "()" + css = "gdls-link gdls-code" + else: + css = "gdls-link" + return f'{text}' + + html_content = re.sub( + r'(.*?)', + _replace_full_interlink, + html_content, + ) + + return html_content + + +def autolink_code_references(html_content, page_path=None): + """Auto-convert inline code matching API names into clickable links. + + Scans `` tags (outside `
    ` blocks) for text that matches an entry in the objects.json
    +    inventory. Matching code is wrapped in an `` link to the corresponding reference page.
    +
    +    Supported patterns inside inline code:
    +
    +    - `Name` or `Name()` — exact/suffix match, display as-is
    +    - `pkg.Name` or `pkg.Name()` — qualified match, display as-is
    +    - `~~pkg.Name` or `~~pkg.Name()` — shortened display (`Name`)
    +    - `~~.pkg.Name` or `~~.pkg.Name()` — dot-prefixed short (`·Name`)
    +
    +    Code with the `gd-no-link` class is never autolinked. Code inside `
    ` blocks (fenced code)
    +    is never autolinked. Code containing spaces, operators, or arguments is never autolinked.
    +
    +    *page_path* is the page's path relative to ``_site/`` (e.g.
    +    ``"user-guide/intro.html"``).  When ``None``, the legacy
    +    reference-page behaviour is used (strip ``reference/`` prefix).
    +    """
    +    if not _interlinks_inventory:
    +        return html_content
    +
    +    # Step 1: protect 
    ...
    blocks by replacing them with placeholders + pre_blocks = [] + + def _save_pre(m): + pre_blocks.append(m.group(0)) + return f"\x00PRE{len(pre_blocks) - 1}\x00" + + html_content = re.sub(r"].*?
    ", _save_pre, html_content, flags=re.DOTALL) + + # Step 2: match tags that might be autolink candidates + # Pattern: text where text is a valid identifier path, + # optionally prefixed with ~~ or ~~. and optionally suffixed with () + def _autolink_code(m): + full_tag = m.group(0) + class_attr = m.group(1) or "" + text = m.group(2) + + # Skip if gd-no-link class is present + if "gd-no-link" in class_attr: + return full_tag + + # Skip if already inside an
    tag (check preceding context) + # This is handled by the negative lookbehind in the regex + + # Parse the code text for autolink patterns + code_match = re.match( + r"^(~~\.?)?(\w[\w.]*?)(\(\))?$", + text, + ) + if not code_match: + return full_tag + + prefix = code_match.group(1) or "" # "", "~~", or "~~." + name = code_match.group(2) + parens = code_match.group(3) or "" # "" or "()" + + # Try to resolve the name + result = _resolve_interlink_name(name) + if result is None: + # If unresolved but has ~~ prefix, strip it for display + if prefix: + if prefix == "~~.": + display = f".{name.rsplit('.', 1)[-1]}{parens}" + else: + display = f"{name.rsplit('.', 1)[-1]}{parens}" + return f"{display}" + return full_tag + + uri, short_name, _role = result + uri = _make_relative_uri(uri, page_path) + + # Determine display text based on prefix + if prefix == "~~.": + display = f".{short_name}{parens}" + elif prefix == "~~": + display = f"{short_name}{parens}" + else: + display = f"{name}{parens}" + + return f'{display}' + + # Match tags. We check if they're inside tags during replacement. + # Captures: (1) optional class attribute, (2) inner text + def _autolink_code_with_context(m): + # Skip if this is inside an tag + start = m.start() + preceding = html_content[max(0, start - 200) : start] + # Check if there's an unclosed tag before this + last_a_open = preceding.rfind("") + if last_a_open > last_a_close: + return m.group(0) + return _autolink_code(m) + + html_content = re.sub( + r"]*)?>([^<]+)", + _autolink_code_with_context, + html_content, + ) + + # Step 3: restore
     blocks
    +    for i, block in enumerate(pre_blocks):
    +        html_content = html_content.replace(f"\x00PRE{i}\x00", block)
    +
    +    return html_content
    +
    +
    +# Pygments class to Quarto class mapping
    +# Quarto uses different class names than Pygments default
    +PYGMENTS_TO_QUARTO_CLASS = {
    +    "n": "va",  # Name -> variable (generic names)
    +    "nc": "fu",  # Name.Class -> function (we want class names highlighted)
    +    "nf": "fu",  # Name.Function -> function
    +    "fm": "fu",  # Name.Function.Magic -> function
    +    "nb": "bu",  # Name.Builtin -> builtin
    +    "bp": "bu",  # Name.Builtin.Pseudo -> builtin
    +    "k": "kw",  # Keyword -> keyword
    +    "kc": "cn",  # Keyword.Constant -> constant (None, True, False) - will be split further
    +    "kd": "kw",  # Keyword.Declaration -> keyword
    +    "kn": "kw",  # Keyword.Namespace -> keyword
    +    "kr": "kw",  # Keyword.Reserved -> keyword
    +    "o": "op",  # Operator -> operator
    +    "ow": "op",  # Operator.Word -> operator
    +    "p": "",  # Punctuation -> no special class
    +    "s": "st",  # String -> string
    +    "s1": "st",  # String.Single -> string
    +    "s2": "st",  # String.Double -> string
    +    "mi": "dv",  # Number.Integer -> decimal value
    +    "mf": "fl",  # Number.Float -> float
    +    "c": "co",  # Comment -> comment
    +    "c1": "co",  # Comment.Single -> comment
    +}
    +
    +
    +def highlight_signature_with_pygments(html_content):
    +    """
    +    Re-highlight the main signature block (cb1) with Pygments for better syntax coloring.
    +
    +    This extracts the signature code, highlights it with Pygments, then maps the Pygments CSS
    +    classes to Quarto's highlighting classes for consistency.
    +    """
    +    # Find the main signature code block (id="cb1")
    +    cb1_pattern = re.compile(
    +        r'(
    .*?)' + r"(.*?)" + r"(.*?
    )", + re.DOTALL, + ) + + def replace_signature(match): + prefix = match.group(1) + code_content = match.group(2) + suffix = match.group(3) + + # Extract plain text from the HTML spans + # Remove HTML tags but preserve the text content + plain_code = re.sub(r"<[^>]+>", "", code_content) + # Clean up the text (unescape HTML entities) + plain_code = plain_code.replace("<", "<").replace(">", ">").replace("&", "&") + + # Highlight with Pygments + lexer = PythonLexer() + # Use a custom formatter that generates short class names + formatter = HtmlFormatter(nowrap=True, classprefix="") + + highlighted = highlight(plain_code, lexer, formatter) + + # Map Pygments classes to Quarto classes + for pg_class, quarto_class in PYGMENTS_TO_QUARTO_CLASS.items(): + if quarto_class: + highlighted = highlighted.replace(f'class="{pg_class}"', f'class="{quarto_class}"') + else: + # Remove empty class attributes + highlighted = re.sub( + rf'([^<]*)', r"\1", highlighted + ) + + # Special handling: make method/function name stand out on every signature line + # Pattern: ClassName.method_name( or function_name( + # Replace the name before ( with a function class for better highlighting + # Uses re.MULTILINE so ^ matches each line (important for @overload signatures) + sig_name_pattern = re.compile( + r'^()(\w+)()(\.)?' + r'()?(\w+)?()?(\()', + re.MULTILINE, + ) + + def enhance_sig_name(m): + # If there's a dot, it's ClassName.method_name + if m.group(4): # Has dot + class_name = m.group(2) + method_name = m.group(6) or "" + return ( + f'{class_name}' + f'.' + f'{method_name}(' + ) + else: + # Just function_name( + func_name = m.group(2) + return f'{func_name}(' + + highlighted = sig_name_pattern.sub(enhance_sig_name, highlighted) + + # Differentiate None from True/False + # None gets 'cn-none' class, True/False get 'cn-bool' class + highlighted = highlighted.replace( + 'None', 'None' + ) + highlighted = highlighted.replace( + 'True', 'True' + ) + highlighted = highlighted.replace( + 'False', 'False' + ) + + # Convert single quotes to double quotes in string literals + # Pygments outputs HTML entities: ' for single quote + # Match both s1 (string single) and st (after class mapping) classes + highlighted = re.sub( + r''([^&]*)'', + r'"\2"', + highlighted, + ) + + # Wrap each line in a span with proper id for line linking + # For overloaded functions (multiple signature lines), insert a blank spacer + # span between each signature for visual separation. + lines = highlighted.split("\n") + # Filter out empty trailing lines + while lines and not lines[-1].strip(): + lines.pop() + is_overloaded = len(lines) > 1 and all(line.strip() == "" or "(" in line for line in lines) + wrapped_lines = [] + line_num = 1 + for idx, line in enumerate(lines): + if not line and not is_overloaded: + continue # Skip empty lines for non-overloaded functions + if not line: + continue # Skip blank lines; we insert spacers ourselves + wrapped_lines.append( + f'
    {line}' + ) + line_num += 1 + # Add a blank spacer line between overload signatures (not after the last) + if is_overloaded and idx < len(lines) - 1: + wrapped_lines.append(f' ') + line_num += 1 + + new_code = "\n".join(wrapped_lines) + + return f"{prefix}{new_code}{suffix}" + + return cb1_pattern.sub(replace_signature, html_content) + + +def format_signature_multiline(html_content): + """ + Format function/method signatures with multiple arguments onto separate lines. + + If a signature has more than one argument, format it as: + FunctionName( + arg1=default1, + arg2=default2, + ) + + Signatures that are already multiline are skipped. + """ + # Pattern to match the content inside signature spans + # The signature is inside ...(args) + # We need to handle HTML tags within the arguments + + def reformat_signature(match): + full_match = match.group(0) + span_start = match.group(1) + anchor = match.group(2) or "" + content = match.group(3) + span_end = match.group(4) + + # Skip if signature is already multiline; this is detected by checking if content ends with + # just "(" or has a newline + if content.strip().endswith("(") or "\n" in content: + return full_match + + # Find the opening paren position + paren_pos = content.find("(") + if paren_pos == -1: + return full_match + + func_name = content[: paren_pos + 1] # Include the ( + + # Find the closing paren - it's the last ) in the content + close_paren_pos = content.rfind(")") + if close_paren_pos == -1: + return full_match + + args_content = content[paren_pos + 1 : close_paren_pos] + + # Count arguments by looking for commas not inside HTML tags or nested parens + # We need to track both HTML tag depth and paren depth + arg_count = 1 if args_content.strip() else 0 + html_depth = 0 + paren_depth = 0 + i = 0 + while i < len(args_content): + if args_content[i : i + 1] == "<": + html_depth += 1 + elif args_content[i : i + 1] == ">": + html_depth -= 1 + elif html_depth == 0: + if args_content[i] in "([{": + paren_depth += 1 + elif args_content[i] in ")]}": + paren_depth -= 1 + elif args_content[i] == "," and paren_depth == 0: + arg_count += 1 + i += 1 + + # Only reformat if more than 1 argument + if arg_count <= 1: + return full_match + + # Split arguments while preserving HTML + args = [] + current_arg = "" + html_depth = 0 + paren_depth = 0 + i = 0 + while i < len(args_content): + char = args_content[i] + if char == "<": + html_depth += 1 + current_arg += char + elif char == ">": + html_depth -= 1 + current_arg += char + elif html_depth == 0: + if char in "([{": + paren_depth += 1 + current_arg += char + elif char in ")]}": + paren_depth -= 1 + current_arg += char + elif char == "," and paren_depth == 0: + args.append(current_arg.strip()) + current_arg = "" + else: + current_arg += char + else: + current_arg += char + i += 1 + if current_arg.strip(): + args.append(current_arg.strip()) + + # Build multi-line signature + formatted_args = ",\n ".join(args) + new_content = f"{func_name}\n {formatted_args},\n)" + + return f"{span_start}{anchor}{new_content}{span_end}" + + # Only match the FIRST code block (cb1) which is always the main signature + # Other code blocks (cb2, cb3, etc.) are method signatures or examples + signature_pattern = re.compile( + r'(]*>)' + r"(]*>)?" + r"(.*?\))" + r"()", + re.DOTALL, + ) + + return signature_pattern.sub(reformat_signature, html_content) + + +def strip_directives_from_html(html_content): + """ + Remove Great Docs %directive lines from rendered HTML. + + Directives like %seealso and %nodoc are used for organizing documentation but they should not + appear in the final rendered output. This function removes them after rendering. + """ + # Match directives wrapped in

    tags + # e.g.,

    %seealso func_a, func_b

    + p_directive_pattern = re.compile( + r"

    \s*%(?:seealso|nodoc)(?:\s+[^<]*)?\s*

    \s*\n?", + re.IGNORECASE, + ) + + # Match standalone directive lines (plain text) + # e.g., %seealso func_a + standalone_directive_pattern = re.compile( + r"^\s*%(?:seealso|nodoc)(?:\s+.*)?\s*$\n?", + re.MULTILINE | re.IGNORECASE, + ) + + # Match directives that might be inline within text + inline_directive_pattern = re.compile( + r"%(?:seealso|nodoc)(?:\s+[^\n<]*)?", + re.IGNORECASE, + ) + + # Apply patterns in order of specificity + cleaned = p_directive_pattern.sub("", html_content) + cleaned = standalone_directive_pattern.sub("", cleaned) + cleaned = inline_directive_pattern.sub("", cleaned) + + # Clean up any resulting empty paragraphs + cleaned = re.sub(r"

    \s*

    \s*\n?", "", cleaned) + + return cleaned + + +def strip_colgroup_tags(html_content): + """ + Remove `` tags from tables, preserving those inside GT tables. + + Quarto/Pandoc adds `` with fixed column widths, but we want the browser to determine + column widths based on content. GT tables (Great Tables) rely on their `` for proper + layout with `table-layout: fixed`, so those are left intact. + """ + # Match the entire colgroup element including its contents + colgroup_pattern = re.compile( + r".*?\s*", + re.DOTALL, + ) + + def _replace_if_not_gt(match): + # Find the nearest preceding = 0: + table_end = preceding.find(">", last_table) + if table_end >= 0: + table_tag = preceding[last_table : table_end + 1] + if "gt_table" in table_tag: + return match.group(0) # Preserve GT table colgroups + return "" # Strip non-GT colgroups + + return colgroup_pattern.sub(_replace_if_not_gt, html_content) + + +def translate_sphinx_fields(html_content): + """ + Convert Sphinx field-list directives into structured doc sections. + + After rendering, Sphinx-style docstrings with `:param:`, `:type:`, `:returns:`, `:rtype:`, and + `:raises:` fields end up mashed into a single `

    ` tag: + + ```html +

    :param x: Desc. :type x: int :returns: Desc. :rtype: str :raises ValueError: Desc.

    + ``` + + This function parses those fields and emits the same `
    ` / `
    ` / `
    ` / `
    ` + structure that the renderer produces for NumPy-style Parameters / Returns / Raises sections. + """ + + # Regex for a

    tag whose text contains Sphinx field markers. + # Allow inline HTML (e.g. ...) inside the field text, but + # prevent matching across paragraph boundaries by refusing

    in the body. + _FIELD_P = re.compile( + r"

    ((?:(?!

    ).)*?:(?:param|type|returns?|rtype|raises?)(?:(?!

    ).)*)

    ", + re.DOTALL, + ) + + # Individual field markers within the text. + # The body captures everything up to the next field marker or end of string, + # including inline HTML tags like . + _FIELD_TOKEN = re.compile( + r":(?Pparam|type|returns?|rtype|raises?)" + r"(?:\s+(?P[^:]*?))?:\s*(?P(?:(?!:(?:param|type|returns?|rtype|raises?)\b).)*)", + re.DOTALL, + ) + + def _build_sections(m): + text = m.group(1) + fields = list(_FIELD_TOKEN.finditer(text)) + + if not fields: + return m.group(0) + + # Collect structured data + params = {} # name -> {"desc": ..., "type": ...} + returns = {} # key -> {"desc": ..., "type": ...} + raises = [] # [(exception, desc), ...] + + ret_idx = 0 + for field in fields: + directive = field.group("directive") + name = (field.group("name") or "").strip() + body = (field.group("body") or "").strip() + + if directive == "param": + params.setdefault(name, {"desc": "", "type": ""}) + params[name]["desc"] = body + elif directive == "type": + params.setdefault(name, {"desc": "", "type": ""}) + params[name]["type"] = body + elif directive in ("returns", "return"): + key = f"_ret_{ret_idx}" + returns[key] = {"desc": body, "type": ""} + ret_idx += 1 + elif directive == "rtype": + # Assign to the last return entry, or create one + if returns: + last_key = list(returns.keys())[-1] + returns[last_key]["type"] = body + else: + returns["_ret_0"] = {"desc": "", "type": body} + elif directive in ("raises", "raise"): + raises.append((name, body)) + + parts = [] + + # ── Parameters section ─────────────────────────────────────────── + if params: + items = [] + for pname, pinfo in params.items(): + ptype = pinfo["type"] + pdesc = pinfo["desc"] + if ptype: + dt = ( + f'
    ' + f"{pname} " + f': ' + f'{ptype}' + f"
    " + ) + else: + dt = ( + f'
    ' + f"{pname}
    " + ) + dd = f"
    \n

    {pdesc}

    \n
    " if pdesc else "
    " + items.append(dt + "\n" + dd) + parts.append( + '
    \n' + f'

    {_t("parameters", "Parameters")}

    \n' + "
    \n" + "\n".join(items) + "\n
    \n
    " + ) + + # ── Returns section ────────────────────────────────────────────── + if returns: + items = [] + for _key, rinfo in returns.items(): + rtype = rinfo["type"] + rdesc = rinfo["desc"] + if rtype: + dt = ( + f'
    ' + f' ' + f'{rtype}' + f"
    " + ) + else: + dt = "
    " + dd = f"
    \n

    {rdesc}

    \n
    " if rdesc else "
    " + items.append(dt + "\n" + dd) + parts.append( + '
    \n' + f'

    {_t("returns", "Returns")}

    \n' + "
    \n" + "\n".join(items) + "\n
    \n
    " + ) + + # ── Raises section ─────────────────────────────────────────────── + if raises: + items = [] + for exc, desc in raises: + dt = f'
    {exc}
    ' + dd = f"
    \n

    {desc}

    \n
    " if desc else "
    " + items.append(dt + "\n" + dd) + parts.append( + '
    \n' + f'

    {_t("raises", "Raises")}

    \n' + "
    \n" + "\n".join(items) + "\n
    \n
    " + ) + + return "\n".join(parts) + + html_content = _FIELD_P.sub(_build_sections, html_content) + return html_content + + +def translate_google_fields(html_content): + """ + Convert Google-style docstring sections into structured doc sections. + + After rendering, Google-style docstrings with sections like `Args:`, `Returns:`, `Raises:`, + `Note:`, `Example:`, `Warning:`, `References:`, and `See Also:` end up as flat `

    ` tags: + +

    Args: items: desc. strict: desc.

    +

    Returns: A dict...

    details
    +

    Raises: ValueError: desc. TypeError: desc.

    +

    Note: text

    + + Indented continuation text renders as `
    ` blocks adjacent to the section `

    `. This + function detects both patterns and emits the same `

    `/`

    `/`
    `/`
    `/`
    ` markup + that the renderer produces for NumPy-style sections. + """ + + _PARAM_SECTIONS = {"Args", "Arguments", "Parameters", "Params"} + _RETURN_SECTIONS = {"Returns", "Return"} + _RAISE_SECTIONS = {"Raises", "Raise"} + _SECTION_MAP = { + "Note": "notes", + "Notes": "notes", + "Example": "examples", + "Examples": "examples", + "Warning": "warnings", + "Warnings": "warnings", + "References": "references", + "See Also": "see-also", + } + + ALL_SECTIONS = _PARAM_SECTIONS | _RETURN_SECTIONS | _RAISE_SECTIONS | set(_SECTION_MAP) + # Sort longest-first so "See Also" matches before "See" + section_names = "|".join(re.escape(s) for s in sorted(ALL_SECTIONS, key=len, reverse=True)) + + # Match

    SectionName: body

    , optionally followed by
    + _GOOGLE_P = re.compile( + rf"

    (?P

    {section_names}):\s*(?P(?:(?!

    ).)*)

    " + r"(?:\s*
    (?P.*?)
    )?", + re.DOTALL, + ) + + # ── helpers ────────────────────────────────────────────────────────── + + def _dbl_bt(text): + """Convert ``word`` → word.""" + return re.sub(r"``(.*?)``", r"\1", text) + + def _pre_to_html(pre_text): + """Convert
     block text (bullet lists + backticks) to HTML."""
    +        lines = pre_text.split("\n")
    +        out, in_list = [], False
    +        for line in lines:
    +            line = _dbl_bt(line)
    +            stripped = line.strip()
    +            if stripped.startswith("- "):
    +                if not in_list:
    +                    out.append("
      ") + in_list = True + out.append(f"
    • {stripped[2:]}
    • ") + else: + if in_list: + out.append("
    ") + in_list = False + if stripped: + out.append(f"

    {stripped}

    ") + if in_list: + out.append("") + return "\n".join(out) + + def _parse_params(body): + """Parse 'name: desc. name2: desc2.' into [(name, desc), …].""" + hits = list(re.finditer(r"(?:^|(?<=\.\s))([a-z_]\w*)\s*:\s*", body)) + if not hits: + return [] + params = [] + for i, hit in enumerate(hits): + name = hit.group(1) + start = hit.end() + end = hits[i + 1].start() if i + 1 < len(hits) else len(body) + desc = body[start:end].strip() + params.append((name, desc)) + return params + + def _parse_raises(body): + """Parse 'ExcType: desc. ExcType2: desc2.' into [(exc, desc), …].""" + hits = list(re.finditer(r"(?:^|(?<=\.\s))([A-Z][a-zA-Z]+)\s*:\s*", body)) + if not hits: + return [] + raises = [] + for i, hit in enumerate(hits): + exc = hit.group(1) + start = hit.end() + end = hits[i + 1].start() if i + 1 < len(hits) else len(body) + desc = body[start:end].strip() + raises.append((exc, desc)) + return raises + + # ── main replacer ──────────────────────────────────────────────────── + + def _replace(m): + section = m.group("section") + body = (m.group("body") or "").strip() + pre_body = m.group("pre_body").strip() if m.group("pre_body") else None + + # ── Args / Parameters ───────────────────────────────────────── + if section in _PARAM_SECTIONS: + full = f"{body} {pre_body}" if pre_body and body else (body or pre_body or "") + params = _parse_params(full) + if not params: + return m.group(0) + items = [] + for pname, pdesc in params: + pdesc = _dbl_bt(pdesc) + dt = ( + f'
    ' + f"{pname}
    " + ) + dd = f"
    \n

    {pdesc}

    \n
    " if pdesc else "
    " + items.append(f"{dt}\n{dd}") + return ( + '
    \n' + f'

    {_t("parameters", "Parameters")}

    \n' + "
    \n" + "\n".join(items) + "\n
    \n
    " + ) + + # ── Returns ─────────────────────────────────────────────────── + if section in _RETURN_SECTIONS: + parts = [] + if body: + parts.append(f"

    {_dbl_bt(body)}

    ") + if pre_body: + parts.append(_pre_to_html(pre_body)) + content = "\n".join(parts) + return ( + '
    \n' + f'

    {_t("returns", "Returns")}

    \n' + f"{content}\n
    " + ) + + # ── Raises ──────────────────────────────────────────────────── + if section in _RAISE_SECTIONS: + full = f"{body} {pre_body}" if pre_body and body else (body or pre_body or "") + raises = _parse_raises(full) + if not raises: + return m.group(0) + items = [] + for exc, desc in raises: + desc = _dbl_bt(desc) + dt = f'
    {exc}
    ' + dd = f"
    \n

    {desc}

    \n
    " if desc else "
    " + items.append(f"{dt}\n{dd}") + return ( + '
    \n' + f'

    {_t("raises", "Raises")}

    \n' + "
    \n" + "\n".join(items) + "\n
    \n
    " + ) + + # ── Example / Examples (code blocks) ────────────────────────── + if section in {"Example", "Examples"}: + code_parts = [] + if body: + code_parts.append(body) + if pre_body: + code_parts.append(pre_body) + code = "\n".join(code_parts) + return ( + '
    \n' + f'

    {_t("examples", "Examples")}

    \n' + f"
    {code}
    \n
    " + ) + + # ── Other sections (Note, Warning, References, See Also) ───── + # Map English section names to i18n keys + _section_i18n_key = { + "Note": "notes", + "Notes": "notes", + "Warning": "warnings_section", + "Warnings": "warnings_section", + "References": "references_section", + "See Also": "see_also", + } + slug = _SECTION_MAP.get(section, section.lower().replace(" ", "-")) + i18n_key = _section_i18n_key.get(section) + display = _t(i18n_key, section) if i18n_key else section + full = body + if pre_body: + full = f"{body}\n{pre_body}" if body else pre_body + full = _dbl_bt(full) + content = f"

    {full}

    " if full else "" + return ( + f'
    \n' + f'

    {display}

    \n' + f"{content}\n
    " + ) + + html_content = _GOOGLE_P.sub(_replace, html_content) + return html_content + + +def translate_sphinx_roles(html_content): + """ + Convert Sphinx cross-reference roles into clean HTML. + + The renderer sometimes passes through Sphinx-style roles verbatim. The most common rendered + patterns are: + + * `:py:exc:ValueError` -> `ValueError` + * `:class:Foo` -> `Foo` + * `:func:bar` -> `bar()` + * `:func:`bar`` (inside `
    `)   ->  `bar()`
    +
    +    For *function* and *method* roles the name gets trailing `()` so the reader can tell it is
    +    callable.
    +    """
    +
    +    _CALLABLE_ROLES = {"func", "meth"}
    +
    +    # Pattern 1: role prefix followed by 
    +    # e.g.  :py:class:datetime.datetime
    +    #       :func:get_object
    +    def _replace_code_role(m):
    +        role = m.group("role")
    +        inner = m.group("inner")
    +        if role in _CALLABLE_ROLES and not inner.endswith("()"):
    +            inner += "()"
    +        return f"{inner}"
    +
    +    html_content = re.sub(
    +        r":(?:py:)?(?Pexc|class|func|meth|attr|const|mod|obj|data|type):"
    +        r"(?P[^<]+)",
    +        _replace_code_role,
    +        html_content,
    +    )
    +
    +    # Pattern 2: role with backtick-delimited text (inside 
     blocks
    +    # or other contexts where markdown didn't convert backticks to )
    +    # e.g., :func:`get_zonefile_instance`
    +    def _replace_backtick_role(m):
    +        role = m.group("role")
    +        inner = m.group("inner")
    +        if role in _CALLABLE_ROLES and not inner.endswith("()"):
    +            inner += "()"
    +        return f"{inner}"
    +
    +    html_content = re.sub(
    +        r":(?:py:)?(?Pexc|class|func|meth|attr|const|mod|obj|data|type):"
    +        r"`(?P[^`]+)`",
    +        _replace_backtick_role,
    +        html_content,
    +    )
    +
    +    return html_content
    +
    +
    +def translate_rst_directives(html_content):
    +    """
    +    Convert RST admonition / version directives into styled HTML callouts.
    +
    +    Handles directives that appear as literal text in `

    ` tags after rendering, for example: + + * `

    .. versionadded:: 2.8.1

    ` + * `

    .. deprecated:: 2.6 Use X instead.

    ` + * `

    .. note:: Some important note.

    ` + * `

    .. warning:: Be careful.

    ` + + Each directive type gets a distinct icon, colour and label. + """ + + _DIRECTIVE_STYLES = { + # (icon, bg_color, border_color, i18n_key, english_fallback) + "versionadded": ("🆕", "#ECFDF5", "#059669", "added_in_version", "Added in version"), + "versionchanged": ("🔄", "#EFF6FF", "#3B82F6", "changed_in_version", "Changed in version"), + "deprecated": ( + "⚠️", + "#FEF2F2", + "#DC2626", + "deprecated_since_version", + "Deprecated since version", + ), + "note": ("ℹ️", "#EFF6FF", "#3B82F6", "note_callout", "Note"), + "warning": ("⚠️", "#FFFBEB", "#D97706", "warning_callout", "Warning"), + "caution": ("⚠️", "#FFFBEB", "#D97706", "caution_callout", "Caution"), + "danger": ("🚨", "#FEF2F2", "#DC2626", "danger_callout", "Danger"), + "important": ("❗", "#FFF7ED", "#EA580C", "important_callout", "Important"), + "tip": ("💡", "#ECFDF5", "#059669", "tip_callout", "Tip"), + "hint": ("💡", "#ECFDF5", "#059669", "hint_callout", "Hint"), + } + + # Version directives have the version number right after :: + # e.g. .. versionadded:: 2.8.1 + # .. deprecated:: 2.6 Use X instead. + _VERSION_DIRECTIVES = {"versionadded", "versionchanged", "deprecated"} + + directive_names = "|".join(_DIRECTIVE_STYLES.keys()) + + def _replace_directive(m): + directive = m.group("directive") + body = (m.group("body") or "").strip() + style = _DIRECTIVE_STYLES[directive] + icon, bg, border, i18n_key, fallback = style + label = _t(i18n_key, fallback) + + if directive in _VERSION_DIRECTIVES: + # Split version number from optional description + parts = body.split(None, 1) if body else [] + version = parts[0] if parts else "" + desc = parts[1] if len(parts) > 1 else "" + if "{v}" in label and version: + title = label.replace("{v}", version) + elif version: + title = f"{label} {version}" + else: + title = label.replace(" {v}", "").replace("{v}", "") + content = desc + else: + title = label + content = body + + # Build the callout HTML + content_html = f'

    {content}

    ' if content else "" + return ( + f'
    ' + f'

    {icon} {title}

    ' + f"{content_html}" + f"
    " + ) + + # Pattern 1: directive

    followed by a

     block body.
    +    # RST block directives like `.. note::` with indented body text
    +    # become: 

    .. note::

    \n
    body text
    + def _replace_block_directive(m): + directive = m.group("directive") + pre_body = m.group("pre_body").strip() + style = _DIRECTIVE_STYLES[directive] + icon, bg, border, i18n_key, fallback = style + label = _t(i18n_key, fallback) + + if directive in _VERSION_DIRECTIVES: + parts = pre_body.split(None, 1) if pre_body else [] + version = parts[0] if parts else "" + desc = parts[1] if len(parts) > 1 else "" + title = f"{label} {version}" if version else label + content = desc + else: + title = label + content = pre_body + + content_html = f'

    {content}

    ' if content else "" + return ( + f'
    ' + f'

    {icon} {title}

    ' + f"{content_html}" + f"
    " + ) + + html_content = re.sub( + rf"

    \s*\.\.\s+(?P{directive_names})::\s*

    " + r"\s*
    (?P.*?)
    ", + _replace_block_directive, + html_content, + flags=re.DOTALL, + ) + + # Pattern 2: directive with inline body text in the same

    tag. + # e.g.

    .. versionadded:: 2.8.1

    + # The body may contain inline HTML tags (e.g. ...) produced + # by the Sphinx-role translation step that runs before this function. + html_content = re.sub( + rf"

    \s*\.\.\s+(?P{directive_names})::\s*(?P.*?)\s*

    ", + _replace_directive, + html_content, + ) + + # Pattern 3: directive misinterpreted as a return-type annotation in a + #
    /
    pair. the renderer's numpy parser sometimes treats directives + # like `.. versionadded:: 2.0` at the end of a docstring as an extra + # return entry, producing: + #
    ..... versionadded:: 2.0 + #
    + #

    Optional description.

    + def _replace_dt_directive(m): + directive = m.group("directive") + body = (m.group("body") or "").strip() + dd_body = (m.group("dd_body") or "").strip() + style = _DIRECTIVE_STYLES[directive] + icon, bg, border, i18n_key, fallback = style + label = _t(i18n_key, fallback) + + if directive in _VERSION_DIRECTIVES: + parts = body.split(None, 1) if body else [] + version = parts[0] if parts else "" + desc = parts[1] if len(parts) > 1 else "" + if dd_body and not desc: + desc = dd_body + elif dd_body: + desc = f"{desc} {dd_body}" + title = f"{label} {version}" if version else label + content = desc + else: + title = label + content = dd_body if dd_body else body + + content_html = f'

    {content}

    ' if content else "" + return ( + f'
    ' + f'

    {icon} {title}

    ' + f"{content_html}" + f"
    " + ) + + _dt_pattern = re.compile( + rf'
    [^<]*\s*' + rf']*>[^<]*\s*' + rf'' + rf"\.\.\s+(?P{directive_names})::\s*(?P[^<]*?)" + rf"
    " + rf"\s*
    \s*(?:

    (?P.*?)

    \s*)?
    ", + re.DOTALL, + ) + _dt_count = len(_dt_pattern.findall(html_content)) + html_content = _dt_pattern.sub(_replace_dt_directive, html_content) + + return html_content + + +def translate_bold_section_headers(html_content): + """ + Convert bold-text section headings into proper doc-section markup. + + Sphinx-format docstrings sometimes use `**Examples**::` to introduce + a section. After rendering this becomes: + +

    Examples:

    + + This function converts those into the same `
    `/`

    ` structure that the renderer uses + for NumPy-style sections so the page has a consistent look. + """ + + # Map of recognized section names → CSS id / class suffix + _SECTION_NAMES = { + "Examples": "examples", + "Example": "examples", + "Notes": "notes", + "Note": "notes", + "References": "references", + "Warnings": "warnings", + "Warning": "warnings", + "See Also": "see-also", + } + + # Map English section names to i18n keys for translation + _BOLD_I18N_KEY = { + "Examples": "examples", + "Example": "examples", + "Notes": "notes", + "Note": "notes", + "References": "references_section", + "Warnings": "warnings_section", + "Warning": "warnings_section", + "See Also": "see_also", + } + + section_pattern = "|".join(re.escape(n) for n in _SECTION_NAMES) + + def _replace_header(m): + name = m.group("name") + slug = _SECTION_NAMES.get(name, name.lower().replace(" ", "-")) + i18n_key = _BOLD_I18N_KEY.get(name) + display = _t(i18n_key, name) if i18n_key else name + return ( + f'
    \n' + f'

    {display}

    ' + ) + + html_content = re.sub( + rf"

    (?P{section_pattern})::

    ", + _replace_header, + html_content, + ) + + return html_content + + +def translate_renderer_headings(html_content): + """ + Translate section headings and labels produced by the renderer. + + The renderer emits headings with `doc-*` CSS classes (e.g. + `

    Parameters

    `) and a `Usage` label inside + `
    `. These are rendered at Quarto build time and pass through + untranslated. + + This function replaces the English heading text with the corresponding i18n translation, and + also updates matching TOC sidebar links so the table-of-contents stays in sync. + """ + + # Map CSS class suffix → (i18n key, English fallback) + _HEADING_MAP = { + "parameters": ("parameters", "Parameters"), + "returns": ("returns", "Returns"), + "raises": ("raises", "Raises"), + "examples": ("examples", "Examples"), + "notes": ("notes", "Notes"), + "attributes": ("attributes", "Attributes"), + "methods": ("methods", "Methods"), + "see-also": ("see_also", "See Also"), + "warnings": ("warnings_section", "Warnings"), + "references": ("references_section", "References"), + } + + # Map group heading text → i18n key + _GROUP_MAP = { + "Classes": "classes", + "Functions": "functions", + "Methods": "methods", + } + + # ── Translate doc-section / doc-* headings ────────────────────────── + # Matches:

    Parameters

    + #
    Returns
    + def _replace_heading(m): + prefix = m.group("prefix") + css_class = m.group("cls") + _english = m.group("text") + tag = m.group("tag") + entry = _HEADING_MAP.get(css_class) + if entry: + key, fallback = entry + translated = _t(key, fallback) + else: + translated = _english + return f"{prefix}{translated}" + + html_content = re.sub( + r'(?P<(?Ph[1-6])\s+class="doc-(?P[a-z-]+)[^"]*"[^>]*>)' + r"(?P[^<]+)" + r"", + _replace_heading, + html_content, + ) + + # ── Translate doc-group headings ──────────────────────────────────── + # Matches:

    Classes

    + def _replace_group(m): + prefix = m.group("prefix") + text = m.group("text") + tag = m.group("tag") + key = _GROUP_MAP.get(text) + translated = _t(key, text) if key else text + return f"{prefix}{translated}" + + html_content = re.sub( + r'(?P<(?Ph[1-6])\s+class="doc-group"[^>]*>)' + r"(?P[^<]+)" + r"", + _replace_group, + html_content, + ) + + # ── Translate "Usage" label ───────────────────────────────────────── + # Matches:
    \n

    Usage

    + html_content = re.sub( + r'(\s*

    )Usage(

    )', + lambda m: f"{m.group(1)}{_t('usage', 'Usage')}{m.group(2)}", + html_content, + ) + + # ── Translate "Source" link text ───────────────────────────────────── + # Matches: Source + html_content = re.sub( + r'(]*class="doc-source"[^>]*>)Source()', + lambda m: f"{m.group(1)}{_t('source', 'Source')}{m.group(2)}", + html_content, + ) + + # ── Update TOC sidebar links to match translated headings ─────────── + # Matches: Parameters + _TOC_SECTIONS = { + "parameters": ("parameters", "Parameters"), + "returns": ("returns", "Returns"), + "raises": ("raises", "Raises"), + "examples": ("examples", "Examples"), + "notes": ("notes", "Notes"), + "attributes": ("attributes", "Attributes"), + "methods": ("methods", "Methods"), + "see-also": ("see_also", "See Also"), + "warnings": ("warnings_section", "Warnings"), + "references": ("references_section", "References"), + } + + def _replace_toc(m): + prefix = m.group("prefix") + slug = m.group("slug") + entry = _TOC_SECTIONS.get(slug) + if entry: + key, fallback = entry + translated = _t(key, fallback) + else: + translated = m.group("text") + return f"{prefix}{translated}" + + html_content = re.sub( + r'(?P]*id="toc-(?P[a-z-]+)"[^>]*>)' + r"(?P[^<]+)" + r"", + _replace_toc, + html_content, + ) + + # ── Translate
    headings ─────────────────────── + # q renders See Also sections as: + #

    See Also

    + html_content = re.sub( + r'(]*class="see-also"[^>]*>\s*<(?:h[1-6])[^>]*>)See Also()', + lambda m: f"{m.group(1)}{_t('see_also', 'See Also')}{m.group(2)}", + html_content, + ) + + # ── Translate Quarto callout titles ──────────────────────────────── + # Quarto renders callouts with titles like: + #
    + # NoteAdded in version 2.0 + # or a standalone: + #
    Note
    + + # Version-related callout titles (versionadded, versionchanged, deprecated) + _CALLOUT_VERSION_MAP = { + "Added in version": "added_in_version", + "Changed in version": "changed_in_version", + "Deprecated since version": "deprecated_since_version", + } + + for eng_label, i18n_key in _CALLOUT_VERSION_MAP.items(): + translated = _t(i18n_key, eng_label) + if translated != eng_label: + if "{v}" in translated: + # Handle translations with {v} placeholder (e.g. ja, ko, zh) + # Match "Added in version 0.1.0" and insert version into {v} + _ver_pat = re.compile(re.escape(eng_label) + r"(\s+[\d][\d.]*)") + html_content = _ver_pat.sub( + lambda m: translated.replace("{v}", m.group(1).strip()), + html_content, + ) + # Replace any remaining standalone label (no version) + html_content = html_content.replace( + eng_label, + translated.replace(" {v}", "").replace("{v}", ""), + ) + else: + html_content = html_content.replace(eng_label, translated) + + # Standalone callout type labels (Note, Warning, etc.) + _CALLOUT_LABEL_MAP = { + "Note": "note_callout", + "Warning": "warning_callout", + "Caution": "caution_callout", + "Danger": "danger_callout", + "Important": "important_callout", + "Tip": "tip_callout", + "Hint": "hint_callout", + } + + for eng_label, i18n_key in _CALLOUT_LABEL_MAP.items(): + translated = _t(i18n_key, eng_label) + if translated != eng_label: + # Only replace inside callout title containers and screen-reader spans + # to avoid affecting other content + html_content = re.sub( + rf'(){re.escape(eng_label)}()', + rf"\g<1>{translated}\g<2>", + html_content, + ) + html_content = re.sub( + rf'(\s*){re.escape(eng_label)}(\s*
    )', + rf"\g<1>{translated}\g<2>", + html_content, + ) + + return html_content + + +def fix_doctest_blockquotes(html_content): + """ + Convert nested blockquotes from doctest `>>>` lines into code blocks. + + When the renderer produces an Example section with raw `>>>` lines in the `.qmd` file, + Quarto/Pandoc interprets the leading `>` characters as Markdown blockquote markers. A `>>>` + line becomes triple-nested `
    ` elements: + + ```html +
    +
    +
    +

    func(x) 'result'

    +
    +
    +
    + ``` + + This function detects that pattern inside Example/Examples doc-sections and replaces it with a + proper `
    ` block so the content renders in monospace as code.
    +    """
    +    # Match one or more triple-nested blockquote clusters inside an
    +    # Example or Examples doc-section.
    +    _SECTION_RE = re.compile(
    +        r'(]*class="[^"]*doc-section-examples?[^"]*"[^>]*>\s*'
    +        r"]*>.*?

    \s*)" + r"((?:\s*]*>\s*]*>\s*]*>" + r"\s*

    .*?

    \s*\s*\s*\s*)+)", + re.DOTALL, + ) + + # Extract individual

    content from triple-nested blockquotes + _BQ_TEXT_RE = re.compile( + r"]*>\s*]*>\s*]*>" + r"\s*

    (.*?)

    \s*\s*\s*", + re.DOTALL, + ) + + def _replace_section(m): + header = m.group(1) + bq_block = m.group(2) + lines = [] + for bq in _BQ_TEXT_RE.finditer(bq_block): + text = bq.group(1).strip() + # Reconstruct the doctest line with >>> prefix + lines.append(f">>> {text}") + code = "\n".join(lines) + return f"{header}
    {code}
    \n" + + return _SECTION_RE.sub(_replace_section, html_content) + + +def fix_plain_doctest_code_blocks(html_content): + """ + Convert plain `
    ` blocks containing doctest `>>>` lines into properly highlighted
    +    Python code blocks.
    +
    +    When the renderer renders consecutive doctest examples separated by blank lines, only the first
    +    block gets a proper ```` ```python ```` fence. Subsequent blocks become 4-space-indented text in
    +    the `.qmd` file, which Quarto renders as plain ``
    `` without syntax highlighting.
    +
    +    This function finds those plain code blocks, re-highlights them with Pygments, and wraps them in
    +    the same `sourceCode python` structure that Quarto uses for fenced code blocks.
    +    """
    +    # Match 
     blocks that contain >>> (i.e. >>>) but
    +    # are NOT already inside a sourceCode div.  We look for 
    
    +    # (no class) immediately, which distinguishes them from Quarto's
    +    # 
     blocks.
    +    _PLAIN_DOCTEST_RE = re.compile(
    +        r"
    (.*?)
    ", + re.DOTALL, + ) + + # Track a counter for generating unique cb IDs + _cb_counter = [0] + + def _find_max_cb_id(html): + """Find the highest existing cb ID to avoid collisions.""" + ids = re.findall(r'id="cb(\d+)"', html) + return max(int(i) for i in ids) if ids else 0 + + _cb_counter[0] = _find_max_cb_id(html_content) + + def _replace_plain_doctest(m): + code_html = m.group(1) + + # Only process blocks that contain doctest >>> markers + if ">>>" not in code_html: + return m.group(0) + + # Decode HTML entities to get plain text for Pygments + plain_text = code_html + plain_text = plain_text.replace("<", "<") + plain_text = plain_text.replace(">", ">") + plain_text = plain_text.replace("&", "&") + plain_text = plain_text.replace(""", '"') + plain_text = plain_text.replace("'", "'") + # Strip any existing HTML tags (unlikely but safe) + plain_text = re.sub(r"<[^>]+>", "", plain_text) + + # Highlight with Pygments + lexer = PythonLexer() + formatter = HtmlFormatter(nowrap=True, classprefix="") + highlighted = highlight(plain_text, lexer, formatter) + + # Map Pygments CSS classes to Quarto CSS classes + for pg_class, quarto_class in PYGMENTS_TO_QUARTO_CLASS.items(): + if quarto_class: + highlighted = highlighted.replace(f'class="{pg_class}"', f'class="{quarto_class}"') + else: + highlighted = re.sub( + rf'([^<]*)', + r"\1", + highlighted, + ) + + # Assign a unique cb ID + _cb_counter[0] += 1 + cb_id = f"cb{_cb_counter[0]}" + + # Wrap each line in a span with proper id for line linking + lines = highlighted.rstrip("\n").split("\n") + wrapped_lines = [] + for j, line in enumerate(lines, 1): + span_id = f"{cb_id}-{j}" + wrapped_lines.append( + f'' + f'' + f"{line}" + ) + highlighted = "\n".join(wrapped_lines) + + return ( + f'
    ' + f'" + f'
    ' + f'
    '
    +            f''
    +            f"{highlighted}"
    +            f"
    " + ) + + return _PLAIN_DOCTEST_RE.sub(_replace_plain_doctest, html_content) + + +def translate_rst_math(html_content): + """ + Convert RST `.. math::` directives into display-math blocks. + + After rendering, a `.. math::` block in a docstring becomes literal HTML of the form: + + ```html +

    .. math::

    +
    LATEX EXPRESSION
    + ``` + + This function converts that pattern into a proper KaTeX display math block and injects the KaTeX + CSS/JS from a CDN so the browser can render the equations. + """ + _KATEX_VERSION = "0.16.11" + _KATEX_CDN = f"https://cdn.jsdelivr.net/npm/katex@{_KATEX_VERSION}/dist" + + _KATEX_HEAD = ( + f'\n' + f'\n' + f'\n' + ) + + # Replace

    .. math::

    ...
    → display math + # (original two-colon pattern from RST) + new_content, count = re.subn( + r"

    \s*\.\.\s*math::\s*

    \s*
    (.*?)
    ", + lambda m: '

    \\[' + m.group(1).strip() + "\\]

    ", + html_content, + flags=re.DOTALL, + ) + + # Also handle the single-colon variant produced when Pandoc reduces + # trailing :: to : (e.g.

    .. math:

    followed by a sourceCode block) + new_content, count2 = re.subn( + r"

    \s*\.\.\s*math:\s*

    \s*" + r"(?:]*>\s*)?" # optional wrapper div + r"]*>]*>(.*?)
    " + r"(?:\s*)?", # optional closing wrapper div + lambda m: ( + '

    \\[' + + re.sub(r"]*>", "", m.group(1)).strip() + + "\\]

    " + ), + new_content, + flags=re.DOTALL, + ) + count += count2 + + # Only inject KaTeX CDN if we actually converted any math blocks + if count > 0 and _KATEX_CDN not in new_content: + new_content = new_content.replace("", _KATEX_HEAD + "", 1) + + return new_content + + +def translate_rst_references(html_content): + """ + Convert RST citation references into a styled numbered list. + + After rendering, RST citations like: + + .. [1] Author (Year). "Title." + .. [2] https://example.com + + end up as a single `

    ` tag with the markers run together:: + +

    .. [1] First ref. .. [2] Second ref.

    + + This function splits them apart and renders each as a styled list item with the citation number + as a label. + """ + + def _format_refs(m): + text = m.group(1) + # Split on citation markers: .. [N] + parts = re.split(r"\.\.\s*\[(\d+)\]", text) + # parts = ['', '1', ' First ref. ', '2', ' Second ref.', ...] + if len(parts) < 3: + return m.group(0) # No valid citations found + + items = [] + # parts[0] is text before first marker (usually empty), then pairs of (number, text) + for i in range(1, len(parts), 2): + num = parts[i] + body = parts[i + 1].strip() if i + 1 < len(parts) else "" + if not body: + continue + # Auto-link bare URLs in the body + body = re.sub( + r"(https?://\S+)", + r'\1', + body, + ) + items.append( + f'
  • ' + f'[{num}] ' + f"{body}
  • " + ) + + if not items: + return m.group(0) + + return ( + '
      ' + + "\n".join(items) + + "
    " + ) + + # Match

    tags containing at least one .. [N] citation marker. + # Use [^<]* instead of .*? to prevent matching across HTML tag boundaries, + # and omit re.DOTALL so the match stays within a single line. + html_content = re.sub( + r"

    ((?:[^<]*\.\.\s*\[\d+\][^<]*)+)

    ", + _format_refs, + html_content, + ) + return html_content + + +def extract_seealso_from_html(html_content): + """ + Extract %seealso values from HTML content before stripping. + + Returns a list of `(name, description)` tuples. The description is an empty string when no + `: description` suffix was provided. + """ + # Match %seealso in

    tags (most common after markdown rendering) + # This handles both standalone %seealso and when it follows other directives + p_pattern = re.compile( + r"

    [^<]*%seealso\s+([^<%]+?)(?:%|

    )", + re.IGNORECASE, + ) + + # Match standalone %seealso lines (not in HTML tags) + standalone_pattern = re.compile( + r"%seealso\s+([^\n%<]+)", + re.IGNORECASE, + ) + + # Try

    pattern first + match = p_pattern.search(html_content) + if not match: + match = standalone_pattern.search(html_content) + + if match: + # Parse comma-separated list, each entry may have ": description" + items_str = match.group(1).strip() + items = [] + for entry in items_str.split(","): + entry = entry.strip() + if not entry: + continue + # Split on first " : " or ": " to separate name from description + parts = re.split(r"\s*:\s*", entry, maxsplit=1) + name = parts[0].strip() + desc = parts[1].strip() if len(parts) > 1 else "" + if name: + items.append((name, desc)) + return items + + return [] + + +def extract_seealso_from_doc_section(html_content): + """ + Extract See Also items from rendered doc-section `

    ` blocks. + + NumPy-style and Google-style docstrings produce sections like: + +
    +

    See Also

    +

    transform : Transform data before analysis.

    +
    + + Returns a list of `(name, description)` tuples. + """ + # Match
    ...
    blocks + section_pat = re.compile( + r']*\bid=["\']see-also["\'][^>]*>' + r"(.*?)" + r"
    ", + re.DOTALL, + ) + items = [] + for m in section_pat.finditer(html_content): + body = m.group(1) + # Remove the heading tags + body = re.sub(r"]*>.*?", "", body, flags=re.DOTALL) + + # Q renderer: names live in href attributes like href="`~Name`" + # Also look for description text in
    or after the link + interlink_names = re.findall(r'href="`~([\w.]+)`"', body) + if interlink_names: + # Try to extract descriptions from definition list structure + # Pattern:
    .........
    description
    + dt_dd_pairs = re.findall( + r']*>.*?href="`~([\w.]+)`".*?\s*]*>(.*?)
    ', + body, + re.DOTALL, + ) + if dt_dd_pairs: + for name, desc_html in dt_dd_pairs: + desc = re.sub(r"<[^>]+>", "", desc_html).strip() + items.append((name, desc)) + else: + items.extend((name, "") for name in interlink_names) + continue + + # Classic renderer: names appear as plain text + plain = re.sub(r"<[^>]+>", "", body).strip() + if not plain: + continue + # Parse entries: each may be "name : description" or "name: description" + # or multiple comma-separated or newline-separated entries + for line in plain.split("\n"): + line = line.strip() + if not line: + continue + # Handle comma-separated items on a single line + parts = line.split(",") + for part in parts: + part = part.strip() + if not part: + continue + # Extract the name and description + # e.g., "transform : Transform data before analysis." + # e.g., "``validate``: Validate a schema before processing." + # Strip backticks first + part = part.replace("``", "").replace("`", "") + name_match = re.match(r"^([\w.]+)(?:\s*:\s*(.*))?$", part) + if name_match: + name = name_match.group(1) + desc = (name_match.group(2) or "").strip() + items.append((name, desc)) + return items + + +def remove_seealso_doc_section(html_content): + """ + Remove `
    ` blocks from the HTML. + + Also removes the corresponding TOC entry. + """ + # Remove the section block + html_content = re.sub( + r']*\bid=["\']see-also["\'][^>]*>' + r".*?" + r"
    ", + "", + html_content, + flags=re.DOTALL, + ) + # Remove the TOC entry for See Also + html_content = re.sub( + r'\s*
  • ]*href=["\']#see-also["\'][^>]*>See Also
  • ', + "", + html_content, + ) + return html_content + + +def generate_seealso_html(seealso_items): + """ + Generate HTML for a "See Also" section with links to other reference pages. + + Each item is a `(name, description)` tuple. When description is non-empty, it is rendered after + the link. + """ + if not seealso_items: + return "" + + links = [] + for item in seealso_items: + if isinstance(item, tuple): + name, desc = item + else: + name, desc = item, "" + # Generate link to the reference page + # Item could be "Graph.add_edge" or just "add_edge" + html_filename = f"{name}.html" + # Append () for callable objects (functions, methods) + display = name + sa_result = _resolve_interlink_name(name) + if sa_result and sa_result[2] in _CALLABLE_ROLES: + display += "()" + link = f'{display}' + if desc: + link = f"{link}: {desc}" + links.append(link) + + # Use a list layout when any item has a description, otherwise comma-separated + has_descriptions = any((item[1] if isinstance(item, tuple) else "") for item in seealso_items) + if has_descriptions: + items_html = "\n".join(f'
  • {link}
  • ' for link in links) + body = f'
      {items_html}
    ' + else: + body = f'

    {", ".join(links)}

    ' + + _see_also_label = _t("see_also", "See Also") + + return f""" +
    +

    {_see_also_label}

    +{body} +
    +""" + + +def fix_dataclass_attributes(content_str): + """Rebuild the Attributes table for dataclass pages using *_dataclass_attrs.json* metadata. + + The renderer may only discover a subset of dataclass fields. This function replaces the + `

    ` of the Attributes `
    ` with the complete set of fields recorded in the metadata + file. + """ + if not dataclass_attrs_metadata: + return content_str + + # Locate the Attributes
    (Quarto wraps each ## heading in a section) + attrs_match = re.search(r']*\bid="attributes"[^>]*>', content_str) + if not attrs_match: + return content_str + + # Determine the object path by inspecting existing + # anchors inside the Attributes table. + attrs_section_start = attrs_match.start() + attrs_section_end = content_str.find("
    ", attrs_section_start) + if attrs_section_end < 0: + return content_str + + attrs_section = content_str[attrs_section_start : attrs_section_end + len("")] + + # Extract obj_path from an existing anchor (e.g., href="#pkg.Cls.field" -> "pkg.Cls") + anchor_re = re.search(r'href="#([^"]+)\.(\w+)"', attrs_section) + if not anchor_re: + return content_str + + obj_path = anchor_re.group(1) + + if obj_path not in dataclass_attrs_metadata: + return content_str + + fields = dataclass_attrs_metadata[obj_path] + + # Build new table rows + rows = [] + for i, (fname, desc) in enumerate(fields.items()): + row_class = "odd" if i % 2 == 0 else "even" + anchor = f"{obj_path}.{fname}" + rows.append( + f'
    \n' + f'\n' + f"\n" + f"" + ) + + new_tbody = "\n" + "\n".join(rows) + "\n" + + # Replace the inside the Attributes section + new_attrs_section = re.sub(r".*?", new_tbody, attrs_section, flags=re.DOTALL) + + content_str = ( + content_str[:attrs_section_start] + + new_attrs_section + + content_str[attrs_section_end + len("") :] + ) + return content_str + + +# Process all HTML files in the `_site/reference/` directory (except `index.html`) +# and apply the specified transformations +html_files = [f for f in glob.glob("_site/reference/*.html") if os.path.basename(f) != "index.html"] + +print(f"Found {len(html_files)} HTML files to process") + +for html_file in html_files: + print(f"Processing: {html_file}") + + # Extract the item name from the filename (e.g., "GreatDocs.html" -> "GreatDocs") + item_name_from_file = os.path.basename(html_file).replace(".html", "") + + with open(html_file, "r", encoding="utf-8") as file: + content = file.read() + + # Extract %seealso before stripping directives + seealso_items = extract_seealso_from_html(content) + + # Strip %directive lines from rendered HTML (safety net for docstring directives) + content = strip_directives_from_html(content) + + # Translate Sphinx field lists (:param, :type, :returns, :rtype, :raises) + content = translate_sphinx_fields(content) + + # Translate Google-style field sections (Args:, Returns:, Raises:, etc.) + content = translate_google_fields(content) + + # Translate Sphinx cross-reference roles (e.g. :py:exc:`ValueError`) + content = translate_sphinx_roles(content) + + # Translate RST directives (e.g. .. versionadded:: 2.8.1) + content = translate_rst_directives(content) + + # Translate bold section headers (e.g. **Examples**::) into doc-sections + content = translate_bold_section_headers(content) + + # Translate renderer-rendered headings and Usage/Source labels + content = translate_renderer_headings(content) + + # Fix doctest >>> lines that Quarto rendered as nested blockquotes + content = fix_doctest_blockquotes(content) + + # Fix plain
     blocks containing >>> doctest lines
    +    # (consecutive examples where only the first got a proper code fence)
    +    content = fix_plain_doctest_code_blocks(content)
    +
    +    # Translate RST .. math:: blocks into display math
    +    content = translate_rst_math(content)
    +
    +    # Translate RST citation references (.. [1] ...)
    +    content = translate_rst_references(content)
    +
    +    # Re-highlight the signature with Pygments for better syntax coloring
    +    content = highlight_signature_with_pygments(content)
    +
    +    # Format signatures with multiple arguments onto separate lines
    +    content = format_signature_multiline(content)
    +
    +    # For non-callable types (e.g., TypedDict, Enum), strip empty () from the signature
    +    # TypedDicts are structural type definitions, not constructors
    +    # Enums are accessed via members (e.g., Color.RED), not called
    +    _NON_CALLABLE_SIGNATURE_TYPES = {"typeddict", "enum"}
    +    obj_type_for_sig = object_types.get(item_name_from_file)
    +    if obj_type_for_sig and obj_type_for_sig in _NON_CALLABLE_SIGNATURE_TYPES:
    +        content = re.sub(
    +            r'([^<]+)\(\)',
    +            r"\1",
    +            content,
    +        )
    +
    +    # Convert back to lines for line-by-line processing
    +    content = content.splitlines(keepends=True)
    +
    +    # Determine the classification of each h1 tag based on its content
    +    # Remove the literal text `Validate.` from the h1 tag
    +    # TODO: Add line below stating the class name for the method
    +    content = [
    +        line.replace(
    +            '

    Validate.', + '

    ', + ) + for line in content + ] + + # Add `()` only to functions and methods in the h1 title + # Uses object_types metadata when available, otherwise falls back to heuristics + _CALLABLE_TYPES = {"function", "method"} + + for i, line in enumerate(content): + # Use regex to find h1 tags (both class="title" and styled versions) + h1_match = re.search(r'', line) + + if not h1_match: + h1_match = re.search(r'', line) + + if h1_match: + # Extract the content of the h1 tag + start = h1_match.end() + end = line.find("

    ", start) + h1_content = line[start:end].strip() + + # Determine whether this item should get () + obj_type = object_types.get(item_name_from_file) + + # Replace the h1 tag with the modified content + content[i] = line[:start] + h1_content + line[end:] + + # Wrap bare h1 tags (those with style attribute but no quarto-title wrapper) in proper structure + for i, line in enumerate(content): + # Look for h1 tags with style attribute that aren't already wrapped + if "

    \n{h1_content}\n\n' + content[i] = wrapped_h1 + + # Add a style attribute to the h1 tag to use a monospace font for code-like appearance + content = [ + line.replace( + '

    ', + "

    ", + ) + for line in content + ] + + # Some h1 tags may not have a class attribute, so we handle that case too + # But skip "Attributes" and "Methods" section headings — they should look like + # the Parameters section label (doc-section style), not code font. + _SECTION_HEADINGS = {"Attributes", "Methods"} + new_content = [] + for line in content: + if "

    " in line: + # Check if this is a section heading like Attributes or Methods + h1_text_match = re.search(r"

    (.*?)

    ", line) + if h1_text_match and h1_text_match.group(1).strip() in _SECTION_HEADINGS: + # Style like Parameters: use doc-section class instead of code font + line = line.replace( + "

    ", + '

    ', + ) + else: + line = line.replace( + "

    ", + "

    ", + ) + new_content.append(line) + content = new_content + + # Fix return value formatting in individual function pages, removing the `:` before the + # return value and adjusting the style of the parameter annotation separator + content_str = "".join(content) + + # Inject constant value/annotation into constant reference pages. + # Replaces the bare ``

    NAME

    `` that the renderer emits with a + # styled display showing the type annotation and assigned value. + obj_type_for_value = object_types.get(item_name_from_file) + if obj_type_for_value == "constant" and item_name_from_file in constant_values: + meta = constant_values[item_name_from_file] + annotation = meta.get("annotation", "") + value = meta.get("value", "") + + # Build the display string: NAME: type = value + parts = [f"{item_name_from_file}"] + if annotation: + parts.append(f': {annotation}') + if value: + parts.append(f' = {value}') + replacement_html = "

    " + "".join(parts) + "

    " + + # Replace the original bare name paragraph + bare_name_html = f"

    {item_name_from_file}

    " + if bare_name_html in content_str: + content_str = content_str.replace(bare_name_html, replacement_html, 1) + + return_value_pattern = ( + r' :' + ) + return_value_replacement = r' ' + content_str = re.sub(return_value_pattern, return_value_replacement, content_str) + + # Remove empty annotation separator + annotation (e.g., Attributes with no type) + # Pattern: ` : ` + # This leaves just the parameter name without a trailing colon and space. + content_str = re.sub( + r' ]*>:\s*', + "", + content_str, + ) + + # Normalize single quotes to double quotes in parameter default values + content_str = re.sub( + r''([^&]*)'', + r'"\1"', + content_str, + ) + content_str = re.sub( + r"""'([^']*)'""", + r'"\1"', + content_str, + ) + + # Fix incomplete Attributes tables for dataclass pages + content_str = fix_dataclass_attributes(content_str) + + # Fix double asterisks in **kwargs and **attributes style parameters + # Pattern: ****name** -> **name (with proper styling) + content_str = re.sub(r"\*\*\*\*(\w+)\*\*", r"**\1", content_str) + + # Fix leading colon in Raises/Returns sections (e.g., ": ValueError" -> "ValueError") + # This handles cases like:
    : ValueError
    + content_str = re.sub( + r'
    :\s*([^<]+)
    ', + r'
    \1
    ', + content_str, + ) + + content = content_str.splitlines(keepends=True) + + # Turn all h3 tags into h4 tags + content = [line.replace("", "

    ") for line in content] + + # Turn all h2 tags into h3 tags + content = [line.replace("", "") for line in content] + + # Add separator lines between class details and individual members, + # and between individual member sections. + # - Thin solid line after the Methods/Attributes summary table (before first member section) + # - Dotted line between each individual member section + for i, line in enumerate(content): + # Detect
    — these are individual member sections + if "
    in
    ) + # or is another level2 section close + for j in range(i - 1, max(0, i - 5), -1): + prev = content[j].strip() + if not prev: + continue + if "
    {fname}{desc}
    " in prev: + # First member section after a summary table — solid line + content[i] = ( + '
    \n' + + content[i] + ) + elif "" in prev: + # Between member sections — dotted line + content[i] = ( + '
    \n' + + content[i] + ) + break + + # Merge See Also items from %seealso directives and doc-section blocks + content_str = "".join(content) + doc_section_seealso = extract_seealso_from_doc_section(content_str) + if doc_section_seealso: + content_str = remove_seealso_doc_section(content_str) + # Merge with %seealso items (deduplicate by name, preserving order) + seen = {name for name, _ in seealso_items} + for name, desc in doc_section_seealso: + if name not in seen: + seealso_items.append((name, desc)) + seen.add(name) + + # Resolve interlinks (`~Name` references) throughout the page + content_str = resolve_interlinks(content_str) + + # Auto-convert inline code matching API names into clickable links + content_str = autolink_code_references(content_str) + + # Inject unified "See Also" section at the bottom + if seealso_items: + seealso_html = generate_seealso_html(seealso_items) + # Insert before + content_str = content_str.replace("", f"{seealso_html}") + + # Place a horizontal rule at the end of each reference page + main_end_pattern = r"" + main_end_replacement = '\n
    \n' + content_str = re.sub(main_end_pattern, main_end_replacement, content_str) + + # Replace breadcrumb with a "API / object_name" title bar label. + # Extract the display name from the doc-object-name span (includes parens + # for callables like methods/functions). + _api_label = _t("api", "API") + _obj_name_match = re.search(r'([^<]+)', content_str) + _display_name = _obj_name_match.group(1) if _obj_name_match else item_name_from_file + _ref_title_html = ( + f'

    ' + f'{_api_label}' + f'/' + f'{html.escape(_display_name)}' + f"

    " + ) + breadcrumb_pattern = r'' + # Replace only the first breadcrumb (in the secondary nav bar, outside
    ); + # a second breadcrumb may exist inside the title-block-header — remove it. + content_str = re.sub(breadcrumb_pattern, _ref_title_html, content_str, count=1, flags=re.DOTALL) + content_str = re.sub(breadcrumb_pattern, "", content_str, flags=re.DOTALL) + + # Shift all heading levels down by 1 within
    content so that + # reference page titles use

    instead of

    , differentiating them + # from the top-level "Reference" heading on the index page. + main_start = content_str.find("") + if main_start != -1 and main_end != -1: + before = content_str[:main_start] + main_content = content_str[main_start : main_end + len("

    ")] + after = content_str[main_end + len("
    ") :] + + # Shift in reverse order (h5→h6, h4→h5, ..., h1→h2) to avoid + # double-shifting (e.g. h1→h2→h3). + for level in range(5, 0, -1): + main_content = main_content.replace(f"", f"") + main_content = re.sub( + rf'\bclass="level{level}\b', + f'class="level{level + 1}', + main_content, + ) + + content_str = before + main_content + after + + content = content_str.splitlines(keepends=True) + + with open(html_file, "w", encoding="utf-8") as file: + file.writelines(content) + + +# Modify the `index.html` file in the `_site/reference/` directory +index_file = "_site/reference/index.html" + +if os.path.exists(index_file): + print(f"Processing index file: {index_file}") + + with open(index_file, "r", encoding="utf-8") as file: + content = file.read() + + # Convert tables to dl/dt/dd format + def convert_table_to_dl(match): + table_content = match.group(1) + + # Extract all table rows + row_pattern = r"]*>(.*?)" + rows = re.findall(row_pattern, table_content, re.DOTALL) + + dl_items = [] + for row in rows: + # Extract the two td elements + td_pattern = r"]*>(.*?)" + tds = re.findall(td_pattern, row, re.DOTALL) + + if len(tds) == 2: + link_content = tds[0].strip() + description = tds[1].strip() + + dt = f"
    {link_content}
    " + dd = f'
    {description}
    ' + dl_items.append(f"{dt}\n{dd}") + + dl_content = "\n\n".join(dl_items) + return f'
    \n
    \n\n{dl_content}\n\n
    \n
    ' + + # Replace all table structures with dl/dt/dd + table_pattern = r'\s*(.*?)\s*
    ' + content = re.sub(table_pattern, convert_table_to_dl, content, flags=re.DOTALL) + + # Remove redundant "API Reference" top-level nav item + # Find the nav structure and flatten it by removing the top-level wrapper + nav_pattern = r'(]*>.*?]*>.*?\s*
    \s*(\s*)' + nav_replacement = r"\1\2\3" + content = re.sub(nav_pattern, nav_replacement, content, flags=re.DOTALL) + + # Clean up Sphinx cross-reference roles in index descriptions + content = translate_sphinx_roles(content) + + # Shift section headings down by 1 within
    so that category headings + # (Classes, Methods, etc.) render as

    , visually subordinate to the + #

    "Reference" page title. Skip the page title itself (class="title"). + main_start = content.find("") + if main_start != -1 and main_end != -1: + before = content[:main_start] + main_content = content[main_start : main_end + len("

    ")] + after = content[main_end + len("") :] + + # Protect the title heading from being shifted by replacing it with a + # temporary placeholder, then shifting everything else, then restoring. + title_pattern = re.compile(r'(]*>.*?)', re.DOTALL) + title_placeholder = "" + title_match = title_pattern.search(main_content) + if title_match: + saved_title = title_match.group(1) + main_content = main_content.replace(saved_title, title_placeholder, 1) + + for level in range(5, 0, -1): + main_content = main_content.replace(f"", f"") + main_content = re.sub( + rf'\bclass="level{level}\b', + f'class="level{level + 1}', + main_content, + ) + + # Restore the title heading + if title_match: + main_content = main_content.replace(title_placeholder, saved_title, 1) + + content = before + main_content + after + + # Translate renderer-rendered headings, TOC, and sidebar on the index page + content = translate_renderer_headings(content) + + # Replace breadcrumb with a "Reference" title bar label + _reference_label = _t("reference", "Reference") + _ref_idx_title = f'

    {html.escape(_reference_label)}

    ' + _bc_pat = r'' + content = re.sub(_bc_pat, _ref_idx_title, content, flags=re.DOTALL) + + with open(index_file, "w", encoding="utf-8") as file: + file.write(content) + + print("Index file processing complete") +else: + print(f"Index file not found: {index_file}") + + +# Update quarto-secondary-nav-title to display "User Guide" text +# This improves the mobile navigation by making it clear what the sidebar toggle reveals +all_html_files = glob.glob("_site/**/*.html", recursive=True) +print(f"Found {len(all_html_files)} HTML files to check for secondary nav title") + +# Use translated label for secondary nav if i18n is configured +_user_guide_label = (_gd_options.get("i18n") or {}).get("user_guide", "User Guide") + +for html_file in all_html_files: + with open(html_file, "r", encoding="utf-8") as file: + content = file.read() + + modified = False + + # Replace empty h1.quarto-secondary-nav-title with h5 containing "User Guide" + original_pattern = r'

    ' + replacement = f'
    {_user_guide_label}
    ' + + if original_pattern in content: + print(f"Updating secondary nav title in: {html_file}") + content = content.replace(original_pattern, replacement) + modified = True + + # Remove the title attribute from #quarto-search to prevent a duplicate + # tooltip: Quarto sets title="" on the parent div, but the + # autocomplete library also creates a child button with its own title. + # Stripping the parent avoids two tooltips stacking on hover. + _search_title_pat = r'(<div id="github-widget" ' + r'data-owner="([^"]*)" data-repo="([^"]*)"></div>' + ) + + widget_count = 0 + + for html_file in all_html_files: + with open(html_file, "r", encoding="utf-8") as file: + content = file.read() + + # Check if this file has an escaped widget placeholder + match = widget_escaped_pattern.search(content) + if match: + owner = match.group(1) + repo = match.group(2) + + # Replace with actual widget HTML + replacement = f'
    ' + content = widget_escaped_pattern.sub(replacement, content) + + with open(html_file, "w", encoding="utf-8") as file: + file.write(content) + + widget_count += 1 + + if widget_count > 0: + print(f"Injected GitHub widget into {widget_count} HTML files") + else: + print("No GitHub widget placeholders found") + + +inject_github_widget() +print("##GD:PASS:GitHub widget injected", flush=True) + + +# ============================================================================ +# Version Badge Injection +# ============================================================================ +# Insert a version badge into the navbar title from _package_meta.json + + +def inject_version_badge(): + """ + Inject a version badge next to the package name in the navbar. + + Reads package version (and optional release date) from `_package_meta.json` (written by the + build) and inserts a small badge span inside each `` element across + all rendered HTML files. When a `published_at` date is present the badge receives a `title` + attribute so the release date appears as a native browser tooltip on hover. + """ + meta_path = "_package_meta.json" + if not os.path.exists(meta_path): + print("No _package_meta.json found, skipping version badge injection") + return + + with open(meta_path, "r", encoding="utf-8") as f: + meta = json.load(f) + + version = meta.get("version", "") + if not version: + print("No version in _package_meta.json, skipping version badge injection") + return + + # Build an optional title attribute with the release date + published_at = meta.get("published_at", "") + title_attr = "" + if published_at: + # published_at is ISO-8601 e.g. "2025-06-15T12:00:00Z" + date_str = published_at[:10] # "2025-06-15" + title_attr = f' title="Released {date_str}"' + + print(f"Injecting version badge v{version} into navbar...") + + # Match PackageName + navbar_title_pattern = re.compile(r'()(.*?)()') + + badge_html = f'v{version}' + + # Build a Tippy.js tooltip for the logo (used when navbar has a logo + # instead of a text title). The tooltip shows version tag + release date. + # Uses HTML content: for the version,
    for the line break. + import html as _html_esc + + version_html = f"v{_html_esc.escape(version)}" + if published_at: + date_str = published_at[:10] + released_line = _t("logo_tooltip_released", "Released {date}").replace( + "{date}", _html_esc.escape(date_str) + ) + logo_tooltip_html = f"{version_html}
    {_html_esc.escape(released_line)}" + else: + logo_tooltip_html = version_html + + # Pattern to match the navbar-brand-logo link wrapping logo images + logo_brand_pattern = re.compile(r'(]*class="navbar-brand navbar-brand-logo"[^>]*)>') + + badge_count = 0 + logo_count = 0 + + for html_file in all_html_files: + with open(html_file, "r", encoding="utf-8") as file: + content = file.read() + + modified = False + + match = navbar_title_pattern.search(content) + if match: + # Only inject if badge not already present + if "version-badge" not in content: + replacement = f"{match.group(1)}{match.group(2)} {badge_html}{match.group(3)}" + content = navbar_title_pattern.sub(replacement, content) + modified = True + badge_count += 1 + + # When there's a logo but no text title, add a tooltip to the logo link + if not match: + logo_match = logo_brand_pattern.search(content) + if logo_match and 'data-tippy-content="' not in logo_match.group(0): + escaped_tooltip = logo_tooltip_html.replace('"', """) + replacement = f'{logo_match.group(1)} data-tippy-content="{escaped_tooltip}">' + content = logo_brand_pattern.sub(replacement, content, count=1) + modified = True + logo_count += 1 + + if modified: + with open(html_file, "w", encoding="utf-8") as file: + file.write(content) + + if badge_count > 0: + print(f"Injected version badge into {badge_count} HTML files") + if logo_count > 0: + print(f"Added version tooltip to navbar logo in {logo_count} HTML files") + if badge_count == 0 and logo_count == 0: + print("No navbar titles or logos found for version badge injection") + + +inject_version_badge() +print("##GD:PASS:Version badge injected", flush=True) + + +# ============================================================================ +# Process CLI reference pages to style titles like API reference pages + + +def process_cli_reference_pages(): + """ + Process CLI reference pages to add consistent styling. + + This adds the 'cli-title' class to h1 elements in CLI reference pages so they match the + monospaced font style of API reference pages. + """ + cli_html_files = glob.glob("_site/reference/cli/*.html") + + if not cli_html_files: + return + + print(f"Processing {len(cli_html_files)} CLI reference pages...") + + for html_file in cli_html_files: + with open(html_file, "r", encoding="utf-8") as file: + content = file.read() + + # Add 'cli-title' class to h1.title elements + # This matches the pattern:

    + content = content.replace('

    ', '

    ') + + # Replace breadcrumb with a "CLI / great-docs cmd" title bar label + cmd_name = os.path.basename(html_file).replace(".html", "") + _cli_label = _t("cli", "CLI") + _bc_pat = r'' + if cmd_name != "index": + # Extract full command name from the page title (e.g., "great-docs init") + _title_match = re.search(r'

    ([^<]+)

    ', content) + _full_cmd = _title_match.group(1).strip() if _title_match else f"great-docs {cmd_name}" + _cli_title_html = ( + f'

    ' + f'{_cli_label}' + f'/' + f'{html.escape(_full_cmd)}' + f"

    " + ) + else: + # CLI index: show "CLI / great-docs" + _cli_title_html = ( + f'

    ' + f'{_cli_label}' + f'/' + f'great-docs' + f"

    " + ) + content = re.sub(_bc_pat, _cli_title_html, content, flags=re.DOTALL) + + with open(html_file, "w", encoding="utf-8") as file: + file.write(content) + + print(f"Styled {len(cli_html_files)} CLI reference page titles") + + +process_cli_reference_pages() +print("##GD:PASS:CLI reference styled", flush=True) + + +def disable_sidebar_collapse(): + """ + Strip Bootstrap collapse attributes from sidebar section toggles and ensure all sidebar sections + remain permanently expanded. + + Removes data-bs-toggle, data-bs-target, aria-expanded, and role attributes from sidebar collapse + triggers. Also removes the collapse class from sidebar section `
    \s*", + re.DOTALL, + ) + + for html_file in html_files: + with open(html_file, "r", encoding="utf-8") as f: + content = f.read() + + original = content + content = empty_div_pattern.sub("\n", content) + + if content != original: + with open(html_file, "w", encoding="utf-8") as f: + f.write(content) + modified_count += 1 + + print(f"Removed empty footer divs from {modified_count} HTML files") + + +remove_empty_footer_divs() +print("##GD:PASS:Empty footer divs removed", flush=True) + + +def fix_script_paths(): + """ + Fix relative script paths for HTML files in subdirectories. + + Quarto's include-after-body with text doesn't resolve paths relative to the output file's + location. This function finds script tags with relative paths and adjusts them based on the + file's depth in the directory structure. + """ + print("Fixing script paths for subdirectory pages...") + + fixed_count = 0 + + for html_file in all_html_files: + # Calculate depth relative to _site directory + rel_path = os.path.relpath(html_file, "_site") + depth = rel_path.count(os.sep) + + # Skip files at root level (depth 0) + if depth == 0: + continue + + with open(html_file, "r", encoding="utf-8") as file: + content = file.read() + + # Build the relative path prefix (e.g., "../" for depth 1, "../../" for depth 2) + prefix = "../" * depth + + modified = False + + # Fix github-widget.js path + old_gh_script = '' + new_gh_script = f'' + + if old_gh_script in content: + content = content.replace(old_gh_script, new_gh_script) + modified = True + + # Fix sidebar-filter.js path + old_filter_script = '' + new_filter_script = f'' + + if old_filter_script in content: + content = content.replace(old_filter_script, new_filter_script) + modified = True + + # Fix sidebar-wrap.js path + old_wrap_script = '' + new_wrap_script = f'' + + if old_wrap_script in content: + content = content.replace(old_wrap_script, new_wrap_script) + modified = True + + # Fix reference-switcher.js path + old_ref_switcher = '' + new_ref_switcher = f'' + + if old_ref_switcher in content: + content = content.replace(old_ref_switcher, new_ref_switcher) + modified = True + + # Fix version-selector.js path + old_version_sel = '' + new_version_sel = f'' + + if old_version_sel in content: + content = content.replace(old_version_sel, new_version_sel) + modified = True + + # Fix dark-mode-toggle.js path + old_dark_mode = '' + new_dark_mode = f'' + + if old_dark_mode in content: + content = content.replace(old_dark_mode, new_dark_mode) + modified = True + + # Fix theme-init.js path + old_theme_init = '' + new_theme_init = f'' + + if old_theme_init in content: + content = content.replace(old_theme_init, new_theme_init) + modified = True + + # Fix copy-page.js path + old_copy_page = '' + new_copy_page = f'' + + if old_copy_page in content: + content = content.replace(old_copy_page, new_copy_page) + modified = True + + # Fix announcement-banner.js path + old_ann_banner = '' + new_ann_banner = f'' + + if old_ann_banner in content: + content = content.replace(old_ann_banner, new_ann_banner) + modified = True + + # Fix navbar-style.js path + old_nb_style = '' + new_nb_style = f'' + + if old_nb_style in content: + content = content.replace(old_nb_style, new_nb_style) + modified = True + + # Fix content-style.js path + old_cs_style = '' + new_cs_style = f'' + + if old_cs_style in content: + content = content.replace(old_cs_style, new_cs_style) + modified = True + + # Fix copy-code.js path + old_copy_code = '' + new_copy_code = f'' + + if old_copy_code in content: + content = content.replace(old_copy_code, new_copy_code) + modified = True + + # Fix page-metadata.js path + old_page_meta = '' + new_page_meta = f'' + + if old_page_meta in content: + content = content.replace(old_page_meta, new_page_meta) + modified = True + + # Fix tooltips.js path + old_tooltips = '' + new_tooltips = f'' + + if old_tooltips in content: + content = content.replace(old_tooltips, new_tooltips) + modified = True + + # Fix responsive-tables.js path + old_resp_tables = '' + new_resp_tables = f'' + + if old_resp_tables in content: + content = content.replace(old_resp_tables, new_resp_tables) + modified = True + + # Fix back-to-top.js path + old_back_to_top = '' + new_back_to_top = f'' + + if old_back_to_top in content: + content = content.replace(old_back_to_top, new_back_to_top) + modified = True + + # Fix keyboard-nav.js path + old_keyboard_nav = '' + new_keyboard_nav = f'' + + if old_keyboard_nav in content: + content = content.replace(old_keyboard_nav, new_keyboard_nav) + modified = True + + # Fix navbar-widgets.js path + old_navbar_widgets = '' + new_navbar_widgets = f'' + + if old_navbar_widgets in content: + content = content.replace(old_navbar_widgets, new_navbar_widgets) + modified = True + + # Fix mermaid-renderer.js path + old_mermaid = '' + new_mermaid = f'' + + if old_mermaid in content: + content = content.replace(old_mermaid, new_mermaid) + modified = True + + # Fix details.js path + old_details = '' + new_details = f'' + + if old_details in content: + content = content.replace(old_details, new_details) + modified = True + + # Fix page-tags.js path + old_page_tags = '' + new_page_tags = f'' + + if old_page_tags in content: + content = content.replace(old_page_tags, new_page_tags) + modified = True + + if modified: + with open(html_file, "w", encoding="utf-8") as file: + file.write(content) + fixed_count += 1 + + if fixed_count > 0: + print(f"Fixed script paths in {fixed_count} HTML files in subdirectories") + else: + print("No script path fixes needed") + + +fix_script_paths() +print("##GD:PASS:Script paths fixed", flush=True) + + +# Remove copy-page widget from the root index page (homepage) and the +# reference index page. Neither is a regular documentation page so the +# Copy / View-as-Markdown buttons are not useful. +for _idx_label, _idx_path in [ + ("homepage", os.path.join("_site", "index.html")), + ("reference index", os.path.join("_site", "reference", "index.html")), +]: + if os.path.isfile(_idx_path): + with open(_idx_path, "r", encoding="utf-8") as f: + _idx_html = f.read() + _idx_cleaned = re.sub( + r'\n?', + "", + _idx_html, + ) + if _idx_cleaned != _idx_html: + with open(_idx_path, "w", encoding="utf-8") as f: + f.write(_idx_cleaned) + print(f"Removed copy-page widget from {_idx_label}") + + +def inject_sidebar_body_classes(): + """ + Inject a `gd-ref-sidebar` class on the `` tag for API/CLI reference pages. + + This allows CSS to scope monospace sidebar fonts to reference pages while keeping the default + sans-serif font for user-guide, recipe, and other pages. + """ + print("Injecting sidebar body classes...") + count = 0 + + for html_file in all_html_files: + rel_path = os.path.relpath(html_file, "_site") + # Match pages under reference/ (covers both API and CLI reference) + if not rel_path.startswith("reference" + os.sep) and rel_path != "reference": + continue + + with open(html_file, "r", encoding="utf-8") as f: + content = f.read() + + new_content = content.replace('` whose href ends with 'reference/index.html' and its parent + `\s*', + "", + main_html, + flags=re.DOTALL, + ) + + # Unwrap the title-block-header: extract just the title heading + title_match = re.search( + r']*class="quarto-title-block[^"]*"[^>]*>' + r'.*?\s*' + r"(]*>)(.*?)()" + r".*?", + main_html, + re.DOTALL, + ) + if title_match: + # Extract the heading text (strip inline HTML styling like type badges) + heading_tag_open = title_match.group(1) + heading_inner = title_match.group(2) + heading_tag_close = title_match.group(3) + # Remove inline badges (class/method/function type labels) + heading_inner = re.sub( + r'.*?', + "", + heading_inner, + flags=re.DOTALL, + ) + clean_title = f"{heading_tag_open}{heading_inner.strip()}{heading_tag_close}" + main_html = ( + main_html[: title_match.start()] + clean_title + main_html[title_match.end() :] + ) + + # Unwrap Quarto code-with-filename wrappers — extract the actual code block + main_html = re.sub( + r'\s*' + r'\s*
    (.*?)
    \s*\s*' + r'\s*', + r"

    \1

    \n", + main_html, + flags=re.DOTALL, + ) + + # Strip code-copy-outer-scaffold wrappers (keep inner code block) + main_html = re.sub( + r'\s*', + "", + main_html, + ) + # Remove the copy nav + buttons (gd-code-nav and legacy code-copy-button) + main_html = re.sub( + r'.*?', + "", + main_html, + flags=re.DOTALL, + ) + main_html = re.sub( + r']*>.*?', + "", + main_html, + flags=re.DOTALL, + ) + + # Strip USAGE/SOURCE row div (API reference pages) + main_html = re.sub( + r']*>.*?', + "", + main_html, + flags=re.DOTALL, + ) + + # Remove source-link anchors + main_html = re.sub( + r']*class="source-link"[^>]*>.*?', + "", + main_html, + flags=re.DOTALL, + ) + + # Add language hint to sourceCode blocks for pandoc + # Quarto renders `class="sourceCode python"` on the pre/code and + # `data-filename="..."` on the wrapper div. We extract the language + # and rewrite to `
    ` so pandoc
    +            # emits ``` python fences.
    +            def _rewrite_code_block(m):
    +                full = m.group(0)
    +                # Try extracting lang from 
    +                lang_m = re.search(r'...
    +                code_m = re.search(r"(]*>)(.*?)()", full, re.DOTALL)
    +                if not code_m:
    +                    return full
    +                code_content = code_m.group(2)
    +                if lang:
    +                    return f'
    {code_content}
    ' + return f"
    {code_content}
    " + + main_html = re.sub( + r']*class="sourceCode[^"]*"[^>]*>\s*]*>.*?
    \s*', + _rewrite_code_block, + main_html, + flags=re.DOTALL, + ) + + # Clean up trailing from code-with-filename and scaffold wrappers + # These are orphaned closing divs after we stripped the opening wrappers. + # Count and fix: each code-with-filename wrapper contributes 2 extra + # This is tricky with regex, so we do a simpler approach: just close the + # remaining unmatched divs by stripping excess at the end of sections. + + # ── 3. Handle _repr_html_ blocks ──────────────────────────── + # These are typically wrapped in a div with class "cell-output-display" + # containing complex HTML tables/widgets that don't convert to Markdown. + main_html = re.sub( + r']*>.*?\s*(?=|[Rich HTML output — view on the documentation site]

    \n", + main_html, + flags=re.DOTALL, + ) + + # Strip section wrapper divs (pandoc passes them through as raw HTML) + main_html = re.sub( + r'\s*', + "", + main_html, + ) + main_html = re.sub(r"\s*", "", main_html) + + # Convert Quarto callout divs to Markdown-friendly blockquotes. + # The callout structure nests 5 divs deep, so we use a helper that + # tracks div depth to find the correct closing tag. + def _convert_callouts(html): + result = [] + pos = 0 + while True: + start = html.find('
    ]", html[i:]) + close_m = re.match(r"
    ", html[i:]) + if open_m: + depth += 1 + i += open_m.end() + elif close_m: + depth -= 1 + i += close_m.end() + if depth == 0: + break + else: + i += 1 + callout_html = html[start:i] + # Extract type + type_m = re.search( + r"callout-(tip|note|warning|important|caution)", callout_html + ) + callout_type = type_m.group(1).capitalize() if type_m else "Note" + # Extract title text + title_m = re.search( + r'\s*' + r"(?:]*>[^<]*)?\s*(.*?)\s*", + callout_html, + re.DOTALL, + ) + title_text = title_m.group(1).strip() if title_m else "" + # Extract body HTML + body_m = re.search( + r'\s*(.*?)\s*', + callout_html, + re.DOTALL, + ) + body_html = body_m.group(1).strip() if body_m else "" + if title_text: + header = f"

    {callout_type}: {title_text}

    " + else: + header = f"

    {callout_type}

    " + result.append(f"
    {header}\n{body_html}
    ") + pos = i + return "".join(result) + + main_html = _convert_callouts(main_html) + + # Convert parameter definition lists to cleaner HTML before pandoc + # Replace
    ...
    parameter markup with simple paragraph lists + # that pandoc can convert to clean Markdown. + def _param_dl_to_html(m): + """Convert a
    block of parameters to simple HTML paragraphs.""" + dl_html = m.group(0) + items = [] + dt_dd_pattern = re.compile( + r'
    .*?\s*(.*?)\s*' + r'(?:.*?(.*?))?' + r'(?:.*?(.*?))?' + r".*?
    \s*
    \s*(.*?)\s*
    ", + re.DOTALL, + ) + for dt_dd in dt_dd_pattern.finditer(dl_html): + name = dt_dd.group(1).strip().strip("`") + annotation = dt_dd.group(2) or "" + default = dt_dd.group(3) or "" + desc = dt_dd.group(4) or "" + # Clean HTML from description + desc = re.sub(r"", "", desc).strip() + + sig = f"{name}" + if annotation: + sig += f" : {annotation.strip()}" + if default: + sig += f" = {default.strip()}" + + line = f"
  • {sig}" + if desc: + line += f" — {desc}" + line += "
  • " + items.append(line) + + if items: + return "
      \n" + "\n".join(items) + "\n
    " + return dl_html + + main_html = re.sub( + r"
    .*?
    ", + _param_dl_to_html, + main_html, + flags=re.DOTALL, + ) + + # Remove remaining doc-description paragraphs' inline styles + main_html = re.sub( + r']*>', + "

    ", + main_html, + ) + + # Strip remaining anchor tags within code block spans (line links) + main_html = re.sub( + r']*>', + "", + main_html, + ) + + # Remove signature highlighting span classes (sig-name, sig-class etc.) + main_html = re.sub( + r'(.*?)', + r"\1", + main_html, + ) + + # Remove parameter-* spans (parameter-name, doc-parameter-name, parameter-annotation, etc.) + # Note: The HTML may have either 'parameter-*' or 'doc-parameter-*' class names + main_html = re.sub( + r']*>(.*?)', + r"\1", + main_html, + ) + + # Trim leading/trailing whitespace inside tags (left by span removal) + main_html = re.sub( + r"\s*(.*?)\s*", + r"\1", + main_html, + ) + + # ── 4. Convert with pandoc ─────────────────────────────────── + result = subprocess.run( + ["quarto", "pandoc", "-f", "html", "-t", "gfm", "--wrap=none"], + input=main_html, + capture_output=True, + text=True, + timeout=30, + ) + + if result.returncode != 0: + print(f" pandoc error for {rel}: {result.stderr.strip()[:200]}") + errors += 1 + continue + + md_content = result.stdout + # Debug: Check if post-processing is needed + found_artifact = False + if "``:``" in md_content: + # Find the context around the artifact + lines = md_content.split("\n") + for i, line in enumerate(lines): + if "``:``" in line: + print(f" DEBUG [{rel}:{i}]: Line with artifact = {repr(line[:150])}") + found_artifact = True + break + md_content = _postprocess_markdown_content(md_content, rel) + # Debug: Verify post-processing worked + if "``:``" in md_content and found_artifact: + lines = md_content.split("\n") + for i, line in enumerate(lines): + if "``:``" in line: + print(f" WARNING [{rel}:{i}]: After post-processing = {repr(line[:150])}") + break + + # ── 5. Write .md file ──────────────────────────────────────── + md_file = html_file.rsplit(".", 1)[0] + ".md" + with open(md_file, "w", encoding="utf-8") as f: + f.write(md_content) + + generated += 1 + + except subprocess.TimeoutExpired: + print(f" pandoc timeout for {rel}") + errors += 1 + except Exception as e: + print(f" error processing {rel}: {e}") + errors += 1 + + print(f"Generated {generated} Markdown page(s) ({errors} error(s))") + + +if _gd_options.get("markdown_pages", True): + generate_markdown_pages() +print("##GD:PASS:Markdown pages generated", flush=True) + + +# ── Clean up skill.html ────────────────────────────────────────────────────── +# Quarto renders skill.md → skill.html despite the !skill.md exclusion in +# project.render when skill.md is also in project.resources. The raw skill.md +# is served as-is; the rendered skills.html page is the intended viewer. +# Delete the spurious skill.html so it doesn't confuse users or agents. +_skill_html = os.path.join("_site", "skill.html") +if os.path.exists(_skill_html): + os.remove(_skill_html) + print("Removed spurious _site/skill.html (raw skill.md is served directly)") + +# Fix links in skills.html that Quarto rewrote from skill.md → skill.html +_skills_page = os.path.join("_site", "skills.html") +if os.path.exists(_skills_page): + with open(_skills_page, "r", encoding="utf-8") as f: + _skills_content = f.read() + _fixed = _skills_content.replace('href="./skill.html"', 'href="skill.md"') + if _fixed != _skills_content: + with open(_skills_page, "w", encoding="utf-8") as f: + f.write(_fixed) + print("Fixed skill.md link in skills.html") + + +# ══════════════════════════════════════════════════════════════════════════════ +# STRIP COLGROUP TAGS FROM TABLES +# ══════════════════════════════════════════════════════════════════════════════ +# Remove tags so browsers determine column widths based on content. + +print("\nStripping tags from tables...") +colgroup_stripped = 0 +for html_file in glob.glob("_site/**/*.html", recursive=True): + try: + with open(html_file, "r", encoding="utf-8") as f: + content = f.read() + + if "" in content: + modified = strip_colgroup_tags(content) + if modified != content: + with open(html_file, "w", encoding="utf-8") as f: + f.write(modified) + colgroup_stripped += 1 + except Exception as e: + print(f" Error processing {html_file}: {e}") + +if colgroup_stripped > 0: + print(f" Stripped colgroup from {colgroup_stripped} file(s)") +print("##GD:PASS:Colgroup tags stripped", flush=True) + + +# ══════════════════════════════════════════════════════════════════════════════ +# SEO PROCESSING +# ══════════════════════════════════════════════════════════════════════════════ +# Apply SEO enhancements to all HTML files (canonical URLs, meta descriptions, +# JSON-LD structured data, title templates, noindex for internal pages) + +if _gd_options.get("seo_enabled", False): + print("\n🔍 Applying SEO enhancements to HTML files...") + seo_processed = 0 + seo_errors = 0 + + for html_file in glob.glob("_site/**/*.html", recursive=True): + try: + # Get relative path from _site + rel_path = os.path.relpath(html_file, "_site") + + with open(html_file, "r", encoding="utf-8") as f: + content = f.read() + + # Apply all SEO processing + modified_content = apply_seo_processing(content, rel_path) + + # Only write if content changed + if modified_content != content: + with open(html_file, "w", encoding="utf-8") as f: + f.write(modified_content) + seo_processed += 1 + + except Exception as e: + print(f" SEO error for {html_file}: {e}") + seo_errors += 1 + + print(f" SEO enhancements applied to {seo_processed} page(s) ({seo_errors} errors)") +else: + print("\n🔍 SEO processing: disabled") +print("##GD:PASS:SEO enhancements applied", flush=True) + + +# ══════════════════════════════════════════════════════════════════════════════ +# I18N — INJECT TRANSLATION BUNDLE +# ══════════════════════════════════════════════════════════════════════════════ +# Inject a tag containing the JSON translations bundle +# and, for RTL languages, set dir="rtl" on the element. + +_i18n_bundle = _gd_options.get("i18n") +_i18n_rtl = _gd_options.get("rtl", False) +_i18n_language = _gd_options.get("language", "en") + +if _i18n_bundle and _i18n_language != "en": + import html as _html_mod + + _i18n_json = json.dumps(_i18n_bundle, ensure_ascii=False, separators=(",", ":")) + # Escape for safe embedding in an HTML attribute + _i18n_escaped = _html_mod.escape(_i18n_json, quote=True) + _i18n_meta = f'' + if _i18n_rtl: + _i18n_meta += '\n' + + print(f"\n🌐 Injecting i18n translations (language={_i18n_language}, rtl={_i18n_rtl})...") + _i18n_count = 0 + for html_file in glob.glob("_site/**/*.html", recursive=True): + try: + with open(html_file, "r", encoding="utf-8") as f: + content = f.read() + + modified = content.replace("", f"\n{_i18n_meta}", 1) + + # Set dir="rtl" on element for RTL languages + if _i18n_rtl: + modified = re.sub( + r"]*)>", + r'', + modified, + count=1, + ) + + if modified != content: + with open(html_file, "w", encoding="utf-8") as f: + f.write(modified) + _i18n_count += 1 + except Exception as e: + print(f" i18n error for {html_file}: {e}") + + print(f" Injected i18n meta in {_i18n_count} page(s)") +else: + if _i18n_language != "en": + print(f"\n🌐 i18n: language={_i18n_language} but no translation bundle found") + else: + print("\n🌐 i18n: using default language (en)") +print("##GD:PASS:I18n translations injected", flush=True) + + +# ══════════════════════════════════════════════════════════════════════════════ +# PAGE-LEVEL SCALE-TO-FIT META TAG INJECTION +# ══════════════════════════════════════════════════════════════════════════════ +# When a .qmd page has `scale-to-fit: [".selector"]` in its frontmatter, +# inject a tag into the rendered HTML so +# the responsive-tables.js script can auto-apply scaling to those elements. + +print("\nInjecting page-level scale-to-fit meta tags...") +_stf_injected = 0 +for html_file in glob.glob("_site/**/*.html", recursive=True): + rel_path = os.path.relpath(html_file, "_site") + # Map rendered HTML back to the .qmd source in the project directory + qmd_path = os.path.splitext(rel_path)[0] + ".qmd" + if not os.path.exists(qmd_path): + continue + + try: + with open(qmd_path, "r", encoding="utf-8") as f: + qmd_content = f.read() + if not qmd_content.startswith("---"): + continue + parts = qmd_content.split("---", 2) + if len(parts) < 3: + continue + import yaml + + fm = yaml.safe_load(parts[1]) or {} + except Exception: + continue + + stf = fm.get("scale-to-fit") + if not stf: + continue + + # Normalize to list of selectors + if isinstance(stf, str): + stf = [stf] + if not isinstance(stf, list): + continue + stf = [s for s in stf if isinstance(s, str)] + if not stf: + continue + + selectors_json = json.dumps(stf, separators=(",", ":")) + escaped = html.escape(selectors_json, quote=True) + + # Optional per-page minimum scale (float 0-1 or keyword) + min_scale_attr = "" + raw_min = fm.get("scale-to-fit-min-scale") + if raw_min is not None: + if isinstance(raw_min, str) and raw_min.strip().lower() in ( + "mobile", + "tablet", + "desktop", + ): + min_scale_attr = f' data-min-scale="{raw_min.strip().lower()}"' + else: + try: + ms = float(raw_min) + if 0 < ms < 1: + min_scale_attr = f' data-min-scale="{ms}"' + except (TypeError, ValueError): + pass + + meta_tag = f'' + + try: + with open(html_file, "r", encoding="utf-8") as f: + content = f.read() + if "gd-scale-to-fit-page" in content: + continue # Already present + modified = content.replace("", f" {meta_tag}\n", 1) + if modified != content: + with open(html_file, "w", encoding="utf-8") as f: + f.write(modified) + _stf_injected += 1 + except Exception as e: + print(f" scale-to-fit error for {html_file}: {e}") + +if _stf_injected > 0: + print(f" Injected page-level scale-to-fit in {_stf_injected} page(s)") +print("##GD:PASS:Scale-to-fit tags injected", flush=True) diff --git a/great-docs/sidebar-filter.js b/great-docs/sidebar-filter.js new file mode 100644 index 0000000..349a1e0 --- /dev/null +++ b/great-docs/sidebar-filter.js @@ -0,0 +1,295 @@ +/** + * Sidebar Filter for Great Docs + * + * Adds a search/filter input to the API reference sidebar for quickly + * finding items in large APIs. Automatically enabled when there are + * 20+ items in the sidebar (configurable via data attribute). + */ + +(function() { + 'use strict'; + + // Configuration + const DEFAULT_MIN_ITEMS = 20; + const DEBOUNCE_DELAY = 150; + + /** + * Debounce function to limit filter execution rate + */ + function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + + /** + * Count total sidebar items (links to API reference pages) + */ + function countSidebarItems(sidebar) { + const items = sidebar.querySelectorAll('.sidebar-item:not(.sidebar-item-section) .sidebar-link'); + return items.length; + } + + /** + * Create the filter input element + */ + function createFilterInput() { + const container = document.createElement('div'); + container.className = 'sidebar-filter-container'; + container.innerHTML = ` +

    + + `; + return container; + } + + /** + * Check if a sidebar item is a top-level navigation link (not inside a section) + * These should not be filtered (e.g., "API" link) + */ + function isTopLevelNavItem(item) { + // Items inside a section (sidebar-item-section) are NOT top-level + // Check if any ancestor is a sidebar-item-section + let parent = item.parentElement; + while (parent) { + if (parent.classList && parent.classList.contains('sidebar-item-section')) { + return false; // Inside a section, so not top-level + } + if (parent.classList && parent.classList.contains('sidebar-menu-container')) { + break; // Reached the top of the sidebar + } + parent = parent.parentElement; + } + + // This item is directly in the main sidebar list (not inside any section) + return true; + } + + /** + * Check if we're on an API reference page (where the filter should show). + * Returns true only for /reference/ pages that are NOT CLI reference pages. + */ + function isApiReferencePage() { + const path = window.location.pathname; + return path.includes('/reference/') && !path.includes('/reference/cli/'); + } + + /** + * Filter sidebar items based on search query + */ + function filterSidebar(query, sidebar, countDisplay) { + const normalizedQuery = query.toLowerCase().trim(); + const sections = sidebar.querySelectorAll('.sidebar-item-section'); + const allItems = sidebar.querySelectorAll('.sidebar-item:not(.sidebar-item-section)'); + + // Separate top-level nav items from filterable items + const topLevelNavItems = []; + const filterableItems = []; + + allItems.forEach(item => { + if (isTopLevelNavItem(item)) { + topLevelNavItems.push(item); + } else { + filterableItems.push(item); + } + }); + + let visibleCount = 0; + const totalCount = filterableItems.length; + + // If query is empty, show everything + if (!normalizedQuery) { + filterableItems.forEach(item => { + item.style.display = ''; + item.classList.remove('sidebar-filter-match'); + }); + sections.forEach(section => { + section.style.display = ''; + // Restore original collapse state + const collapseTarget = section.querySelector('.sidebar-section'); + if (collapseTarget && !collapseTarget.classList.contains('show')) { + // Keep collapsed sections collapsed + } + }); + // Top-level nav items are always visible + topLevelNavItems.forEach(item => { + item.style.display = ''; + }); + countDisplay.style.display = 'none'; + return; + } + + // Filter items (excluding top-level nav items which are always visible) + filterableItems.forEach(item => { + const link = item.querySelector('.sidebar-link'); + const text = link ? link.textContent.toLowerCase() : ''; + const matches = text.includes(normalizedQuery); + + item.style.display = matches ? '' : 'none'; + item.classList.toggle('sidebar-filter-match', matches); + + if (matches) { + visibleCount++; + } + }); + + // Show/hide sections based on whether they have visible items + sections.forEach(section => { + const sectionItems = section.querySelectorAll('.sidebar-item:not(.sidebar-item-section)'); + const hasVisibleItems = Array.from(sectionItems).some( + item => item.style.display !== 'none' + ); + + section.style.display = hasVisibleItems ? '' : 'none'; + + // Expand sections that have matches + if (hasVisibleItems) { + const collapseTarget = section.querySelector('.sidebar-section'); + if (collapseTarget && !collapseTarget.classList.contains('show')) { + collapseTarget.classList.add('show'); + } + } + }); + + // Update count display + const countNum = countDisplay.querySelector('.filter-count-num'); + const countTotal = countDisplay.querySelector('.filter-count-total'); + countNum.textContent = visibleCount; + countTotal.textContent = totalCount; + countDisplay.style.display = ''; + } + + /** + * Initialize the sidebar filter + */ + function initSidebarFilter() { + // Only show filter on API reference pages + if (!isApiReferencePage()) { + return; + } + + // Find the sidebar + const sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) { + return; + } + + // Check if we're on a reference page (has sidebar with API items) + const sidebarMenu = sidebar.querySelector('.sidebar-menu-container'); + if (!sidebarMenu) { + return; + } + + // Get minimum items threshold from data attribute or use default + const minItems = parseInt( + document.body.dataset.sidebarFilterMinItems || DEFAULT_MIN_ITEMS, + 10 + ); + + // Check if filtering is disabled + if (document.body.dataset.sidebarFilterDisabled === 'true') { + return; + } + + // Count items and check threshold + const itemCount = countSidebarItems(sidebar); + if (itemCount < minItems) { + return; + } + + // Create and insert the filter input + const filterContainer = createFilterInput(); + const menuContainer = sidebar.querySelector('.sidebar-menu-container'); + menuContainer.insertBefore(filterContainer, menuContainer.firstChild); + + // Get references to elements + const input = filterContainer.querySelector('.sidebar-filter-input'); + const clearBtn = filterContainer.querySelector('.sidebar-filter-clear'); + const countDisplay = filterContainer.querySelector('.sidebar-filter-count'); + + // Set total count + const countTotal = countDisplay.querySelector('.filter-count-total'); + countTotal.textContent = itemCount; + + // Create debounced filter function + const debouncedFilter = debounce((query) => { + filterSidebar(query, sidebar, countDisplay); + }, DEBOUNCE_DELAY); + + // Event listeners + input.addEventListener('input', (e) => { + const query = e.target.value; + clearBtn.style.display = query ? '' : 'none'; + debouncedFilter(query); + }); + + clearBtn.addEventListener('click', () => { + input.value = ''; + clearBtn.style.display = 'none'; + filterSidebar('', sidebar, countDisplay); + input.focus(); + }); + + // Keyboard shortcut: Escape to clear + input.addEventListener('keydown', (e) => { + if (e.key === 'Escape') { + if (input.value) { + input.value = ''; + clearBtn.style.display = 'none'; + filterSidebar('', sidebar, countDisplay); + } else { + input.blur(); + } + } + }); + + // Global keyboard shortcut: "/" to focus filter (like GitHub) + document.addEventListener('keydown', (e) => { + // Don't trigger if user is typing in another input + if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') { + return; + } + + if (e.key === '/' && !e.ctrlKey && !e.metaKey && !e.altKey) { + e.preventDefault(); + input.focus(); + input.select(); + } + }); + + console.log(`Sidebar filter initialized (${itemCount} items)`); + } + + // Initialize when DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initSidebarFilter); + } else { + initSidebarFilter(); + } +})(); diff --git a/great-docs/sidebar-float.js b/great-docs/sidebar-float.js new file mode 100644 index 0000000..b3e3bb2 --- /dev/null +++ b/great-docs/sidebar-float.js @@ -0,0 +1,197 @@ +/** + * Floating Sidebar Navigation for Great Docs + * + * Transforms the default Quarto left sidebar on desktop (>= 992px) into a + * floating, pinned navigation panel with: + * - Independent scroll containment (no bleed to page body) + * - Dynamic top/bottom bounds that react to navbar and footer + * - A sticky "Pages" header label + * - Gradient + arrow scroll affordances (top & bottom) + * - Auto-scroll to the active page on load + * + * On tablet/mobile (< 992px) this script is a no-op — the overlay modal + * approach handles the sidebar there. + */ +(function () { + 'use strict'; + + // ── Constants ────────────────────────────────────────────── + var GAP = 12; // breathing room (px) between sidebar and navbar/footer + var FOOTER_BUFFER = 7; // extra px buffer before footer encroaches + + + // ── Media query guard ────────────────────────────────────── + var mql = window.matchMedia('(min-width: 992px)'); + + // ── State ────────────────────────────────────────────────── + var sidebar = null; // #quarto-sidebar + var menuContainer = null; // .sidebar-menu-container + var floatBody = null; // .gd-sidebar-float-body (scrollable wrapper) + var resizeObs = null; // ResizeObserver instance + var rafId = null; + var initialised = false; + + // ── Helpers ──────────────────────────────────────────────── + function getHeader() { + return document.getElementById('quarto-header'); + } + + function getFooter() { + return document.querySelector('footer.footer'); + } + + // ── Build the float structure ────────────────────────────── + function buildFloat() { + sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) return false; + menuContainer = sidebar.querySelector('.sidebar-menu-container'); + if (!menuContainer) return false; + + // Scrollable body wrapper + floatBody = document.createElement('div'); + floatBody.className = 'gd-sidebar-float-body'; + + // Move the menu container inside the scroll body + floatBody.appendChild(menuContainer); + + + + // Assemble inside #quarto-sidebar + sidebar.appendChild(floatBody); + + // Mark as enhanced + sidebar.classList.add('gd-sidebar-float'); + + return true; + } + + // ── Update sidebar bounds ────────────────────────────────── + // With position:sticky, `top` sets the stick offset from the viewport top. + // We can't use `bottom` to shrink the sidebar — instead we compute a + // dynamic `max-height` that accounts for the navbar and footer overlap. + function updateBounds() { + if (!sidebar || !mql.matches) return; + + var header = getHeader(); + var footer = getFooter(); + var viewportH = window.innerHeight; + + var navBottom = header ? header.getBoundingClientRect().bottom : 0; + var footerTop = footer ? footer.getBoundingClientRect().top : viewportH; + + var top = Math.max(0, navBottom) + GAP; + + // Available height = viewport minus navbar minus any footer overlap minus gaps + var footerOverlap = Math.max(0, viewportH - footerTop); + var maxH = viewportH - top - footerOverlap - GAP - FOOTER_BUFFER; + + sidebar.style.top = top + 'px'; + // Always apply maxHeight so the sidebar never overflows its bounds + sidebar.style.maxHeight = Math.max(100, maxH) + 'px'; + } + + + + // ── Scroll-to-active ─────────────────────────────────────── + function scrollToActive() { + if (!floatBody) return; + var active = floatBody.querySelector('.sidebar-link.active'); + if (active) { + // Scroll only the float body — NOT the main page. + // scrollIntoView() would bubble up and shift the document. + requestAnimationFrame(function () { + var bodyRect = floatBody.getBoundingClientRect(); + var activeRect = active.getBoundingClientRect(); + var offset = activeRect.top - bodyRect.top - (bodyRect.height / 2) + (activeRect.height / 2); + floatBody.scrollTop += offset; + }); + } + } + + // ── rAF-throttled scroll/resize handler ──────────────────── + function onFrameUpdate() { + updateBounds(); + rafId = null; + } + + function scheduleUpdate() { + if (rafId) return; + rafId = requestAnimationFrame(onFrameUpdate); + } + + // Immediate update on resize for more responsive bounds + function onResize() { + updateBounds(); + scheduleUpdate(); // also schedule a follow-up in case layout settles + } + + // ── Teardown (for breakpoint changes) ────────────────────── + function teardown() { + if (!initialised) return; + + // Move menu container back to sidebar root + if (menuContainer && sidebar) { + sidebar.appendChild(menuContainer); + } + + // Remove added elements + + if (floatBody && floatBody.parentNode) floatBody.parentNode.removeChild(floatBody); + + sidebar.classList.remove('gd-sidebar-float'); + sidebar.style.top = ''; + sidebar.style.maxHeight = ''; + + // Remove listeners + window.removeEventListener('scroll', scheduleUpdate); + window.removeEventListener('resize', onResize); + window.removeEventListener('quarto-hrChanged', scheduleUpdate); + if (resizeObs) { + resizeObs.disconnect(); + resizeObs = null; + } + floatBody = null; + initialised = false; + } + + // ── Initialise ───────────────────────────────────────────── + function init() { + if (initialised) return; + if (!mql.matches) return; + + if (!buildFloat()) return; + + // Bind events + window.addEventListener('scroll', scheduleUpdate, { passive: true }); + window.addEventListener('resize', onResize, { passive: true }); + window.addEventListener('quarto-hrChanged', scheduleUpdate); + + // ResizeObserver for more reliable size tracking + if (typeof ResizeObserver !== 'undefined') { + resizeObs = new ResizeObserver(scheduleUpdate); + resizeObs.observe(document.documentElement); + } + + initialised = true; + + // Initial measurements + updateBounds(); + scrollToActive(); + } + + // ── Respond to breakpoint changes ────────────────────────── + mql.addEventListener('change', function () { + if (mql.matches) { + init(); + } else { + teardown(); + } + }); + + // ── Boot ─────────────────────────────────────────────────── + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})(); diff --git a/great-docs/sidebar-wrap.js b/great-docs/sidebar-wrap.js new file mode 100644 index 0000000..d383f2a --- /dev/null +++ b/great-docs/sidebar-wrap.js @@ -0,0 +1,162 @@ +/** + * Sidebar Smart Wrap for Great Docs + * + * Inserts (word break opportunity) elements into long sidebar item + * names so the browser can break lines at aesthetically pleasing points: + * - After dots: store.DuckDBStore → break after each "." + * - After underscores: retrieve_bm25 → break after "_" + * - After open paren: connect() → break after "(" + * - At camelCase: DuckDBStore → break before uppercase runs + * + * The tag is invisible and zero-width; the browser only uses it as a + * line-break opportunity when the text overflows its container. + */ + +(function () { + 'use strict'; + + /** + * Insert elements at smart break points in a text node. + * + * Break opportunities are placed: + * 1. After every "." (module separators) + * 2. After every "_" (snake_case boundaries) + * 3. After every "(" (before argument lists) + * 4. Before a run of uppercase letters preceded by a lowercase letter + * (camelCase → camel + Case), but only when the run is followed by + * a lowercase letter (e.g. "DBStore" keeps "DB" together and breaks + * before "Store"). + * + * The regex uses zero-width look-behind/ahead so the actual characters + * are preserved in the output — only tags are inserted. + */ + function insertSmartBreaks(text) { + // Split text at break-opportunity points. + // The regex captures the delimiter so we can reassemble with + // after each delimiter character. + // + // Pattern pieces: + // ([._]) – capture a dot or underscore + // (\() – capture an opening paren + // (?<=[a-z])(?=[A-Z]) – zero-width camelCase boundary + // + // We use a two-pass approach because JS regex has limited support + // for look-behind in older runtimes. + + var result = document.createDocumentFragment(); + // Pattern: split around ".", "_", "(", and camelCase transitions + // Two camelCase lookarounds: + // (?<=[a-z])(?=[A-Z]) – lowercase-to-uppercase: "Duck|DB" + // (?<=[A-Z])(?=[A-Z][a-z]) – end of acronym run: "DB|Document" + var parts = text.split(/([._()])|(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/); + // Filter out empty/undefined entries produced by the regex split + var filtered = parts.filter(function (p) { return p !== undefined && p !== ''; }); + + // Merge parentheses onto preceding tokens to prevent orphan ")" or "()" + // e.g. ["directory", "(", ")"] → ["directory()"] + var merged = []; + for (var i = 0; i < filtered.length; i++) { + if (filtered[i] === '(' && i + 1 < filtered.length && filtered[i + 1] === ')') { + // "()" pair: attach to preceding token + if (merged.length > 0) { + merged[merged.length - 1] += '()'; + } else { + merged.push('()'); + } + i++; // skip the ")" + } else if (filtered[i] === ')') { + // lone ")": attach to preceding token + if (merged.length > 0) { + merged[merged.length - 1] += ')'; + } else { + merged.push(')'); + } + } else { + merged.push(filtered[i]); + } + } + + // Final pass: for any token still longer than 10 characters (e.g. + // all-lowercase names with no camelCase/separator break points), + // insert a every 10 characters as a fallback. + var CHUNK = 10; + for (var i = 0; i < merged.length; i++) { + var token = merged[i]; + if (token.length > CHUNK) { + for (var c = 0; c < token.length; c += CHUNK) { + if (c > 0) { + result.appendChild(document.createElement('wbr')); + } + result.appendChild(document.createTextNode(token.slice(c, c + CHUNK))); + } + } else { + result.appendChild(document.createTextNode(token)); + } + // Insert between every pair of adjacent parts. + if (i < merged.length - 1) { + result.appendChild(document.createElement('wbr')); + } + } + return result; + } + + /** + * Process all elements inside the sidebar. + */ + function processSidebar() { + var sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) return; + + var spans = sidebar.querySelectorAll('.menu-text'); + for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + var text = span.textContent; + if (!text) continue; + // Only process items that contain separator characters, camelCase / + // acronym boundaries, or are simply too long to fit without wrapping. + // Skip plain short words like "API", "Classes". + var dominated = /[._()]/.test(text) || /[a-z][A-Z]/.test(text) || /[A-Z]{2,}[a-z]/.test(text); + if (!dominated && text.length <= 10) continue; + // Replace the text content with smart-break nodes + var fragment = insertSmartBreaks(text); + span.textContent = ''; + span.appendChild(fragment); + } + } + + /** + * Disable sidebar section collapsing by stripping Bootstrap collapse + * data attributes and ensuring all sections stay expanded. + */ + function disableSidebarCollapse() { + var sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) return; + + // Remove data-bs-toggle/target from all sidebar collapse triggers + var triggers = sidebar.querySelectorAll('[data-bs-toggle="collapse"]'); + for (var i = 0; i < triggers.length; i++) { + triggers[i].removeAttribute('data-bs-toggle'); + triggers[i].removeAttribute('data-bs-target'); + triggers[i].removeAttribute('aria-expanded'); + triggers[i].removeAttribute('role'); + } + + // Ensure all collapsible sections are permanently shown + var sections = sidebar.querySelectorAll('ul.collapse.sidebar-section'); + for (var j = 0; j < sections.length; j++) { + sections[j].classList.remove('collapse'); + sections[j].classList.add('show'); + } + } + + // Run after DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function() { + processSidebar(); + disableSidebarCollapse(); + }); + } else { + processSidebar(); + disableSidebarCollapse(); + } +})(); diff --git a/great-docs/skill.md b/great-docs/skill.md new file mode 100644 index 0000000..dfb296f --- /dev/null +++ b/great-docs/skill.md @@ -0,0 +1,36 @@ +--- +name: dash-mantine-datatable +description: > + Use when writing Python code that uses the dash_mantine_datatable package. +--- + +# Dash Mantine DataTable + +## Installation + +```bash +pip install dash-mantine-datatable +``` + +## API overview + +### Component + +Main generated Dash component. + +- `DataTable`: Description + +### Helper Builders + +Dictionary factories for readable table configuration. + +- `Column`: Description +- `ColumnGroup`: Description +- `SelectionConfig`: Description +- `PaginationConfig`: Description +- `RowExpansionConfig`: Description + +## Resources + +- [llms.txt](llms.txt) — Indexed API reference for LLMs +- [llms-full.txt](llms-full.txt) — Comprehensive documentation for LLMs diff --git a/great-docs/skills.qmd b/great-docs/skills.qmd new file mode 100644 index 0000000..65cd87b --- /dev/null +++ b/great-docs/skills.qmd @@ -0,0 +1,107 @@ +--- +title: Skills +toc: false +sidebar: false +page-layout: full +body-classes: "gd-skills-page" +--- + +A skill is a package of structured files that teaches an AI coding agent how to work with a specific tool or framework. The skill below was generated by Great Docs from this project's documentation. Install it in your agent and it will be able to run commands, edit configuration, write content, and troubleshoot problems without step-by-step guidance from you. + +```{=html} +
    + +
    +
    +
    +``` + +**Any agent** --- install with [npx](https://github.com/vercel-labs/skills): + +```{=html} +
    npx skills add 
    +``` + +**Codex / OpenCode** + +```{=html} +
    Tell the agent:
    Fetch the skill file at <site-url>/skill.md and follow the instructions.
    +``` + +**Manual** --- download the skill file: + +```{=html} +
    curl -O <site-url>/skill.md
    +``` + +```{=html} +

    Or browse the SKILL.md file.

    +``` + +```{=html} +
    +
    +
    +
    + +``` + +```{=html} +

    SKILL.md

    +
    +```
    +
    +````markdown
    +---
    +name: dash-mantine-datatable
    +description: >
    +  Use when writing Python code that uses the dash_mantine_datatable package.
    +---
    +
    +# Dash Mantine DataTable
    +
    +## Installation
    +
    +```bash
    +pip install dash-mantine-datatable
    +```
    +
    +## API overview
    +
    +### Component
    +
    +Main generated Dash component.
    +
    +- `DataTable`: Description
    +
    +### Helper Builders
    +
    +Dictionary factories for readable table configuration.
    +
    +- `Column`: Description
    +- `ColumnGroup`: Description
    +- `SelectionConfig`: Description
    +- `PaginationConfig`: Description
    +- `RowExpansionConfig`: Description
    +
    +## Resources
    +
    +- [llms.txt](llms.txt) — Indexed API reference for LLMs
    +- [llms-full.txt](llms-full.txt) — Comprehensive documentation for LLMs
    +````
    +
    +```{=html}
    +
    +``` diff --git a/great-docs/theme-init.js b/great-docs/theme-init.js new file mode 100644 index 0000000..344f2fa --- /dev/null +++ b/great-docs/theme-init.js @@ -0,0 +1,54 @@ +// Early theme initialization to prevent flash of wrong theme +(function() { + // When dark mode toggle is disabled, always use light mode + var dmMeta = document.querySelector('meta[name="gd-dark-mode"]'); + var darkModeDisabled = dmMeta && dmMeta.getAttribute('content') === 'disabled'; + + var stored = darkModeDisabled ? null : localStorage.getItem('great-docs-theme'); + var theme = stored || (darkModeDisabled ? 'light' : (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')); + var html = document.documentElement; + + // Hide body until theme is fully applied to prevent flash + html.classList.add('theme-loading'); + + if (theme === 'dark') { + html.classList.add('quarto-dark'); + html.setAttribute('data-bs-theme', 'dark'); + } else { + html.classList.add('quarto-light'); + html.setAttribute('data-bs-theme', 'light'); + } + + // Detect page type from URL for page-specific styling + var path = window.location.pathname; + var pageName = path.endsWith('/') || path.endsWith('/index.html') || path === '/' ? 'index' : null; + if (!pageName) { + var filename = path.split('/').pop().replace('.html', ''); + if (filename === 'index' || filename === '') { + pageName = 'index'; + } + } + + // Set page identifier on body when DOM is ready + function setPageIdentifier() { + if (pageName && document.body) { + document.body.setAttribute('data-page', pageName); + } + } + + // Reveal page once DOM is ready and styles are applied + function revealPage() { + setPageIdentifier(); + // Small delay to ensure CSS is processed + requestAnimationFrame(function() { + html.classList.remove('theme-loading'); + html.classList.add('theme-loaded'); + }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', revealPage); + } else { + revealPage(); + } +})(); diff --git a/great-docs/tooltips.js b/great-docs/tooltips.js new file mode 100644 index 0000000..f32122e --- /dev/null +++ b/great-docs/tooltips.js @@ -0,0 +1,344 @@ +/** + * Custom Tooltips for Great Docs + * + * Replaces native browser title tooltips with styled Tippy.js tooltips. + * + * Features: + * - Instant appearance (no 400ms delay) + * - Consistent styling across all browsers + * - Dark mode support + * - Smart positioning (avoids viewport edges) + * - Material Filling Effect animation + * - Converts existing title attributes site-wide + * + * NOTE: Quarto already bundles Popper.js and Tippy.js, so we use those instead + * of loading from CDN. Falls back to CDN if they're not available. + */ + +(function () { + "use strict"; + + // Configuration + var CONFIG = { + // Tippy.js CDN URLs (fallback if not bundled by Quarto) + popperUrl: "https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js", + tippyUrl: "https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js", + + // Default tooltip options + defaultOptions: { + animation: "shift-away", + duration: [200, 150], + delay: [0, 0], // Instant appearance + arrow: true, + placement: "top", + theme: "gd-material", + maxWidth: 300, + touch: ["hold", 500], // Long press on touch devices + // Smart positioning — flip if not enough space + popperOptions: { + modifiers: [ + { + name: "flip", + options: { + fallbackPlacements: ["bottom", "right", "left"], + }, + }, + { + name: "preventOverflow", + options: { + boundary: "viewport", + padding: 8, + }, + }, + ], + }, + }, + + // Selectors for elements to skip (already have custom tooltips) + skipSelectors: [ + "[data-tippy-content]", // Already has Tippy + ".tippy-box", // Tippy element itself + ".gd-tooltip-skip", // Explicit skip class + ], + }; + + // Track loaded state + var tippyReady = false; + var tippyInstance = null; + + /** + * Load an external script dynamically. + * @param {string} url - Script URL + * @returns {Promise} - Resolves when loaded + */ + function loadScript(url) { + return new Promise(function (resolve, reject) { + // Check if already loaded + var existing = document.querySelector('script[src="' + url + '"]'); + if (existing) { + resolve(); + return; + } + + var script = document.createElement("script"); + script.src = url; + script.async = true; + script.onload = resolve; + script.onerror = function () { + reject(new Error("Failed to load script: " + url)); + }; + document.head.appendChild(script); + }); + } + + /** + * Load Tippy.js and its dependencies. + * Quarto bundles Popper and Tippy, so check for them first. + * @returns {Promise} - Resolves when Tippy is ready + */ + function loadTippy() { + // If Tippy is already available (Quarto bundles it), use it directly + if (window.tippy) { + tippyReady = true; + return Promise.resolve(); + } + + // Quarto might have loaded tippy but not exposed it globally yet + // Wait a tick and check again + return new Promise(function (resolve) { + setTimeout(function () { + if (window.tippy) { + tippyReady = true; + resolve(); + return; + } + + // Fall back to CDN loading if Quarto's tippy isn't available + loadScript(CONFIG.popperUrl) + .then(function () { + return loadScript(CONFIG.tippyUrl); + }) + .then(function () { + tippyReady = true; + resolve(); + }) + .catch(function (err) { + console.warn("Failed to load Tippy.js from CDN:", err); + resolve(); // Continue without tooltips + }); + }, 50); + }); + } + + /** + * Determine if dark mode is active. + * @returns {boolean} + */ + function isDarkMode() { + return ( + document.documentElement.classList.contains("quarto-dark") || + document.body.classList.contains("quarto-dark") || + document.documentElement.getAttribute("data-bs-theme") === "dark" + ); + } + + /** + * Get theme name based on current mode. + * @returns {string} + */ + function getThemeName() { + return isDarkMode() ? "gd-material-dark" : "gd-material"; + } + + /** + * Convert title attributes to data-tippy-content. + * This prevents native tooltips from appearing. + */ + function convertTitleAttributes() { + var skipSelector = CONFIG.skipSelectors.join(", "); + + // Find all elements with title attributes + var elements = document.querySelectorAll("[title]"); + + elements.forEach(function (el) { + // Skip if matches any skip selector + if (skipSelector && el.matches(skipSelector)) { + return; + } + + var title = el.getAttribute("title"); + if (title && title.trim()) { + // Store the title as data-tippy-content + el.setAttribute("data-tippy-content", title); + // Remove the native title to prevent browser tooltip + el.removeAttribute("title"); + } + }); + } + + /** + * Initialize or reinitialize all tooltips. + */ + function initTooltips() { + if (!window.tippy) { + console.warn("Tippy.js not loaded"); + return; + } + + // First convert any title attributes + convertTitleAttributes(); + + // Find all elements with data-tippy-content + var elements = document.querySelectorAll("[data-tippy-content]"); + + if (elements.length === 0) { + return; + } + + // Create options with current theme + var options = Object.assign({}, CONFIG.defaultOptions, { + theme: getThemeName(), + allowHTML: true, + // Read content from data-tippy-content so HTML tags are rendered + content: function (el) { + return el.getAttribute("data-tippy-content") || ""; + }, + // Material filling effect via CSS + onMount: function (instance) { + instance.popper.classList.add("gd-tooltip-mounted"); + }, + onHidden: function (instance) { + instance.popper.classList.remove("gd-tooltip-mounted"); + }, + }); + + // Destroy existing instances to avoid duplicates + elements.forEach(function (el) { + if (el._tippy) { + el._tippy.destroy(); + } + }); + + // Initialize Tippy on all elements + tippyInstance = window.tippy(elements, options); + } + + /** + * Update tooltip themes when dark mode changes. + */ + function updateTooltipThemes() { + if (!tippyInstance) return; + + var newTheme = getThemeName(); + + // Update all active tippy instances + var instances = Array.isArray(tippyInstance) ? tippyInstance : [tippyInstance]; + instances.forEach(function (instance) { + if (instance && instance.setProps) { + instance.setProps({ theme: newTheme }); + } + }); + } + + /** + * Observe for dynamically added elements. + */ + function observeNewElements() { + if (!window.MutationObserver) return; + + var observer = new MutationObserver(function (mutations) { + var needsReinit = false; + + mutations.forEach(function (mutation) { + // Check added nodes for title or data-tippy-content attributes + mutation.addedNodes.forEach(function (node) { + if (node.nodeType === Node.ELEMENT_NODE) { + if (node.hasAttribute && (node.hasAttribute("title") || node.hasAttribute("data-tippy-content"))) { + needsReinit = true; + } + // Also check descendants + if (node.querySelectorAll) { + var withTitle = node.querySelectorAll("[title], [data-tippy-content]"); + if (withTitle.length > 0) { + needsReinit = true; + } + } + } + }); + + // Check for attribute changes (title or data-tippy-content being set) + if (mutation.type === "attributes" && + (mutation.attributeName === "title" || mutation.attributeName === "data-tippy-content")) { + needsReinit = true; + } + }); + + if (needsReinit) { + // Debounce re-initialization + clearTimeout(observeNewElements.timeout); + observeNewElements.timeout = setTimeout(initTooltips, 100); + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ["title", "data-tippy-content"], + }); + } + + /** + * Observe dark mode changes. + */ + function observeDarkMode() { + if (!window.MutationObserver) return; + + var observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + if (mutation.attributeName === "class" || mutation.attributeName === "data-bs-theme") { + updateTooltipThemes(); + } + }); + }); + + // Observe both html and body for class changes + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ["class", "data-bs-theme"], + }); + observer.observe(document.body, { + attributes: true, + attributeFilter: ["class"], + }); + } + + /** + * Main initialization function. + */ + function init() { + loadTippy() + .then(function () { + initTooltips(); + observeNewElements(); + observeDarkMode(); + }) + .catch(function (err) { + console.error("Failed to initialize tooltips:", err); + }); + } + + // Initialize when DOM is ready + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } + + // Expose API for programmatic use + window.GDTooltips = { + init: init, + refresh: initTooltips, + updateTheme: updateTooltipThemes, + }; +})(); diff --git a/great-docs/user-guide/getting-started.qmd b/great-docs/user-guide/getting-started.qmd new file mode 100644 index 0000000..1d99fe3 --- /dev/null +++ b/great-docs/user-guide/getting-started.qmd @@ -0,0 +1,45 @@ +--- +title: Getting Started +description: Install dash-mantine-datatable and render a first Mantine-styled Dash table. +bread-crumbs: false +--- + +# Getting Started + +Install the package from PyPI: + +```bash +pip install dash-mantine-datatable +``` + +Then create a small Dash app: + +```python +from dash import Dash +import dash_mantine_components as dmc +import dash_mantine_datatable as dmdt + +app = Dash() + +app.layout = dmc.MantineProvider( + dmdt.DataTable( + id="employees", + data=[ + {"id": 1, "name": "Avery Stone", "team": "Platform", "status": "On Track"}, + {"id": 2, "name": "Mina Patel", "team": "Growth", "status": "Planning"}, + ], + columns=[ + dmdt.Column("name", title="Name", sortable=True), + dmdt.Column("team", title="Team", sortable=True), + dmdt.Column("status", title="Status", presentation="badge"), + ], + ).update_layout(radius="lg", withTableBorder=True, striped=True) +) + +if __name__ == "__main__": + app.run(debug=True) +``` + +Use the API reference when you need the complete constructor and helper-method +surface. Use the recipes when you want copy-pasteable patterns pulled from the +interactive `usage.py` demo. diff --git a/great-docs/video-embed.js b/great-docs/video-embed.js new file mode 100644 index 0000000..2e8a0dd --- /dev/null +++ b/great-docs/video-embed.js @@ -0,0 +1,72 @@ +/** + * Video embedding enhancements for Great Docs + * + * Improves performance and UX for embedded videos: + * - YouTube: uses the standard YouTube embedded player with native controls + * - Vimeo / other service iframes: IntersectionObserver lazy loading + * - Local