☰ GDG /
Docstrings (001–005)
#001 gdtest_minimal #002 gdtest_google #003 gdtest_sphinx #004 gdtest_nodocs #005 gdtest_mixed_docs
Layouts (006–013)
#006 gdtest_src_layout #007 gdtest_python_layout #008 gdtest_lib_layout #009 gdtest_hatch #010 gdtest_setuptools_find #011 gdtest_setup_cfg #012 gdtest_setup_py #013 gdtest_auto_discover
Exports (014–017)
#014 gdtest_no_all #015 gdtest_all_concat #016 gdtest_config_exclude #017 gdtest_auto_exclude
Object Types (018–027)
#018 gdtest_small_class #019 gdtest_big_class #020 gdtest_dataclasses #021 gdtest_enums #022 gdtest_typed_containers #023 gdtest_protocols #024 gdtest_descriptors #025 gdtest_dunders #026 gdtest_nested_class #027 gdtest_constants
Directives (028–032)
#028 gdtest_seealso #029 gdtest_nodoc #030 gdtest_user_guide_auto #031 gdtest_user_guide_sections #032 gdtest_user_guide_subdirs
User Guide (033–038)
#033 gdtest_user_guide_explicit #034 gdtest_user_guide_custom_dir #035 gdtest_user_guide_hyphen #036 gdtest_readme_rst #037 gdtest_index_qmd #038 gdtest_index_md
Landing Pages (039–043)
#039 gdtest_no_readme #040 gdtest_index_wins #041 gdtest_full_extras #042 gdtest_github_contrib #043 gdtest_cli_click
Extras & Config (044–050)
#044 gdtest_cli_nested #045 gdtest_explicit_ref #046 gdtest_kitchen_sink #047 gdtest_name_mismatch #048 gdtest_src_big_class #049 gdtest_google_big_class #050 gdtest_user_guide_cli
Cross-Dimension (051–065)
#051 gdtest_explicit_big_class #052 gdtest_src_no_all #053 gdtest_extras_guide #054 gdtest_google_seealso #055 gdtest_setup_cfg_src #056 gdtest_exclude_cli #057 gdtest_src_explicit_ref #058 gdtest_async_funcs #059 gdtest_generators #060 gdtest_overloads #061 gdtest_abstract_props #062 gdtest_multi_inherit #063 gdtest_slots_class #064 gdtest_frozen_dc #065 gdtest_generics
API Patterns (066–077)
#066 gdtest_context_mgr #067 gdtest_decorators #068 gdtest_exceptions #069 gdtest_reexports #070 gdtest_many_exports #071 gdtest_deep_nesting #072 gdtest_long_docs #073 gdtest_many_guides #074 gdtest_many_big_classes #075 gdtest_flit #076 gdtest_pdm #077 gdtest_namespace
Scale & Stress (078–082)
#078 gdtest_monorepo #079 gdtest_multi_module #080 gdtest_src_legacy #081 gdtest_empty_module #082 gdtest_all_private
Build Systems (083–088)
#083 gdtest_duplicate_all #084 gdtest_badge_readme #085 gdtest_math_docs #086 gdtest_mixed_guide_ext #087 gdtest_unicode_docs #088 gdtest_config_all_on
Edge Cases (089–095)
#089 gdtest_config_display #090 gdtest_config_minimal #091 gdtest_config_parser #092 gdtest_config_extra_keys #093 gdtest_github_icon #094 gdtest_source_branch #095 gdtest_source_path
Config Matrix (096–100)
#096 gdtest_source_title #097 gdtest_source_disabled #098 gdtest_sidebar_disabled #099 gdtest_sidebar_min_items #100 gdtest_sidebar_float
Config Options (101–125)
#101 gdtest_cli_name #102 gdtest_dynamic_false #103 gdtest_parser_google #104 gdtest_parser_sphinx #105 gdtest_display_name #106 gdtest_funding #107 gdtest_authors_multi #108 gdtest_no_darkmode #109 gdtest_exclude_list #110 gdtest_jupyter_kernel #111 gdtest_config_sections #112 gdtest_config_ug_string #113 gdtest_config_ug_list #114 gdtest_config_changelog #115 gdtest_config_reference #116 gdtest_config_combo_a #117 gdtest_config_combo_b #118 gdtest_config_combo_c #119 gdtest_config_combo_d #120 gdtest_config_combo_e #121 gdtest_config_combo_f #122 gdtest_attribution_on #123 gdtest_attribution_off #124 gdtest_rst_versionadded #125 gdtest_rst_deprecated
Docstring Richness (126–150)
#126 gdtest_rst_note #127 gdtest_rst_warning #128 gdtest_rst_tip #129 gdtest_rst_caution #130 gdtest_rst_danger #131 gdtest_rst_important #132 gdtest_rst_mixed_dirs #133 gdtest_sphinx_func_role #134 gdtest_sphinx_class_role #135 gdtest_sphinx_exc_role #136 gdtest_sphinx_meth_role #137 gdtest_sphinx_mixed_roles #138 gdtest_numpy_rich #139 gdtest_google_rich #140 gdtest_sphinx_rich #141 gdtest_docstring_examples #142 gdtest_docstring_notes #143 gdtest_docstring_warnings #144 gdtest_docstring_references #145 gdtest_docstring_seealso #146 gdtest_docstring_math #147 gdtest_docstring_tables #148 gdtest_docstring_combo #149 gdtest_ug_auto #150 gdtest_ug_numbered
UG Variations (151–165)
#151 gdtest_ug_sections_fm #152 gdtest_ug_subdirs #153 gdtest_ug_custom_dir #154 gdtest_ug_deep_nest #155 gdtest_ug_mixed_ext #156 gdtest_ug_many_pages #157 gdtest_ug_explicit_order #158 gdtest_ug_single_page #159 gdtest_ug_no_frontmatter #160 gdtest_ug_with_code #161 gdtest_ug_with_images #162 gdtest_ug_hyphen_dir #163 gdtest_ug_combo #164 gdtest_sec_examples #165 gdtest_sec_tutorials
Custom Sections (166–175)
#166 gdtest_sec_recipes #167 gdtest_sec_blog #168 gdtest_sec_faq #169 gdtest_sec_multi #170 gdtest_sec_navbar_after #171 gdtest_sec_with_ug #172 gdtest_sec_with_ref #173 gdtest_sec_deep #174 gdtest_sec_index_opt #175 gdtest_sec_index_hero
Reference Config (176–185)
#176 gdtest_sec_sidebar_single #177 gdtest_custom_passthrough_navbar #178 gdtest_custom_raw_navbar_after #179 gdtest_custom_mixed_modes #180 gdtest_custom_nested_combo #181 gdtest_custom_basename_output #182 gdtest_custom_nested_output #183 gdtest_custom_missing_dir_combo #184 gdtest_ref_explicit #185 gdtest_ref_members_false
Site Theming (186–195)
#186 gdtest_ref_mixed #187 gdtest_ref_reorder #188 gdtest_ref_sectioned #189 gdtest_ref_single_section #190 gdtest_ref_module_expand #191 gdtest_ref_big_class #192 gdtest_ref_multi_big #193 gdtest_ref_title #194 gdtest_theme_cosmo #195 gdtest_theme_lumen
Stress Tests (196–200)
#196 gdtest_theme_cerulean #197 gdtest_toc_disabled #198 gdtest_toc_depth #199 gdtest_toc_title #200 gdtest_site_combo #201 gdtest_display_badges #202 gdtest_display_authors #203 gdtest_display_funding #204 gdtest_stress_all_config #205 gdtest_stress_all_docstr #206 gdtest_stress_all_ug #207 gdtest_stress_all_sections #208 gdtest_stress_everything #209 gdtest_src_google_seealso #210 gdtest_hatch_nodoc #211 gdtest_pdm_big_class #212 gdtest_flit_enums #213 gdtest_namespace_ug #214 gdtest_ug_subdir_numbered #215 gdtest_homepage_ug #216 gdtest_long_names #217 gdtest_logo #218 gdtest_hero_basic #219 gdtest_hero_readme_badges #220 gdtest_hero_disabled #221 gdtest_hero_custom #222 gdtest_hero_wordmark #223 gdtest_hero_no_logo #224 gdtest_hero_explicit_badges #225 gdtest_hero_index_qmd #226 gdtest_hero_auto_logo #227 gdtest_md_disabled #228 gdtest_md_no_widget #229 gdtest_announce_simple #230 gdtest_announce_dict #231 gdtest_announce_disabled #232 gdtest_gradient_sky #233 gdtest_gradient_peach #234 gdtest_gradient_prism #235 gdtest_gradient_lilac #236 gdtest_gradient_slate #237 gdtest_gradient_honey #238 gdtest_gradient_dusk #239 gdtest_gradient_mint #240 gdtest_gradient_navbar #241 gdtest_gradient_both #242 gdtest_gradient_mixed #243 gdtest_gradient_no_dismiss #244 gdtest_header_text #245 gdtest_header_list #246 gdtest_header_file #247 gdtest_navbar_color #248 gdtest_navbar_color_light #249 gdtest_navbar_color_dark #250 gdtest_navbar_color_same #251 gdtest_navbar_color_split #252 gdtest_kitchen_sink_q #253 gdtest_stress_everything_q #254 gdtest_seealso_desc #255 gdtest_numpy_seealso_desc #256 gdtest_interlinks_prose #257 gdtest_autolink #258 gdtest_skill_default #259 gdtest_skill_curated #260 gdtest_skill_config #261 gdtest_skill_disabled #262 gdtest_skill_rich #263 gdtest_skill_combo #264 gdtest_skill_complex #265 gdtest_i18n_french #266 gdtest_i18n_japanese #267 gdtest_i18n_arabic #268 gdtest_code_cells #269 gdtest_nav_icons #270 gdtest_page_tags #271 gdtest_page_status #272 gdtest_tag_location #273 gdtest_icon_shortcode #274 gdtest_homepage_ug_subdirs #275 gdtest_gt_tables #276 gdtest_scale_to_fit #277 gdtest_scale_min_scale #278 gdtest_homepage_wide #279 gdtest_interlinks_userguide #280 gdtest_code_span_headings #281 gdtest_sec_blog_user_index #282 gdtest_sec_dir_titles #283 gdtest_namespace_src #284 gdtest_auto_include #285 gdtest_no_auto_exclude #286 gdtest_tbl_preview #287 gdtest_tbl_shortcode #288 gdtest_tbl_explorer #289 gdtest_hr_shortcode #290 gdtest_accent_color #291 gdtest_keys_shortcode #292 gdtest_inline_methods #293 gdtest_inline_always #294 gdtest_inline_never #295 gdtest_inline_threshold #296 gdtest_ref_inherited_explicit #297 gdtest_ref_include_inherited #298 gdtest_mock_code #299 gdtest_details_shortcode
299/299 built ⏱ 43.8s 🧪 9/24

gdtest-tbl-explorer

A showcase site demonstrating the tbl_explorer() function from Great Docs. Each user-guide page exercises a different combination of data sources, interactive features, and display options.

Interactive table explorer showcase exercising tbl_explorer() with eight user-guide pages: basic sorting/filtering, pagination (custom page sizes, no pagination), column toggling (wide tables, subsets, toggle disabled), copy/download controls (various combinations), missing-value highlighting, minimal chrome (hide row numbers, dtypes, dimensions), tbl-explorer Quarto shortcode with CSV/TSV/JSONL files, and a side-by-side comparison of tbl_preview() vs tbl_explorer().

Source files
📁 assets/
📄 cities.csv
city,country,population,latitude,longitude
Tokyo,Japan,13960000,35.6762,139.6503
Paris,France,2161000,48.8566,2.3522
New York,USA,8336000,40.7128,-74.0060
London,UK,8982000,51.5074,-0.1278
Sydney,Australia,5312000,-33.8688,151.2093
Berlin,Germany,3645000,52.5200,13.4050
Mumbai,India,20411000,19.0760,72.8777
São Paulo,Brazil,12330000,-23.5505,-46.6333
Cairo,Egypt,10230000,30.0444,31.2357
Toronto,Canada,2930000,43.6532,-79.3832
Seoul,South Korea,9776000,37.5665,126.9780
Mexico City,Mexico,9210000,19.4326,-99.1332
📄 logs.jsonl
{"ts":"2025-01-15T08:30:00","level":"INFO","module":"auth","msg":"User login OK"}
{"ts":"2025-01-15T08:31:12","level":"WARN","module":"db","msg":"Slow query (3.2s)"}
{"ts":"2025-01-15T08:32:45","level":"ERROR","module":"api","msg":"Timeout /v2/users"}
{"ts":"2025-01-15T08:33:01","level":"INFO","module":"cache","msg":"Cache miss user:42"}
{"ts":"2025-01-15T08:34:20","level":"DEBUG","module":"auth","msg":"Token refresh abc123"}
{"ts":"2025-01-15T08:35:55","level":"ERROR","module":"db","msg":"Pool exhausted"}
📄 products.tsv
product	category	price	stock	rating
Widget	Electronics	29.99	150	4.5
Gadget	Tools	49.50	80	3.8
Gizmo	Kitchen	12.00	300	4.9
Doohickey	Garden	8.75	0	4.2
Thingamajig	Office	199.99	25	2.1
Contraption	Electronics	65.00	44	3.5
Apparatus	Tools	120.00	12	4.7
📁 gdtest_tbl_explorer/
📄 __init__.py
"""Sample data generators for table explorer demos."""

__version__ = "0.1.0"
__all__ = [
    "sample_cities",
    "sample_products",
    "sample_wide",
    "sample_missing",
    "sample_large",
]

from .data import (
    sample_cities,
    sample_products,
    sample_wide,
    sample_missing,
    sample_large,
)
📄 data.py
"""Functions that generate sample data for explorer demos."""

from __future__ import annotations


def sample_cities(n: int = 12) -> dict[str, list]:
    """
    Generate a world cities dataset.

    Parameters
    ----------
    n
        Number of rows.

    Returns
    -------
    dict[str, list]
        Column-oriented dict with city, country, population,
        latitude, and longitude columns.

    Examples
    --------
    >>> data = sample_cities(5)
    >>> len(data["city"])
    5
    """
    cities = [
        ("Tokyo", "Japan", 13960000, 35.6762, 139.6503),
        ("Paris", "France", 2161000, 48.8566, 2.3522),
        ("New York", "USA", 8336000, 40.7128, -74.0060),
        ("London", "UK", 8982000, 51.5074, -0.1278),
        ("Sydney", "Australia", 5312000, -33.8688, 151.2093),
        ("Berlin", "Germany", 3645000, 52.5200, 13.4050),
        ("Mumbai", "India", 20411000, 19.0760, 72.8777),
        ("São Paulo", "Brazil", 12330000, -23.5505, -46.6333),
        ("Cairo", "Egypt", 10230000, 30.0444, 31.2357),
        ("Toronto", "Canada", 2930000, 43.6532, -79.3832),
        ("Seoul", "South Korea", 9776000, 37.5665, 126.9780),
        ("Mexico City", "Mexico", 9210000, 19.4326, -99.1332),
        ("Lagos", "Nigeria", 15400000, 6.5244, 3.3792),
        ("Bangkok", "Thailand", 10540000, 13.7563, 100.5018),
        ("Istanbul", "Turkey", 15460000, 41.0082, 28.9784),
    ]
    rows = cities[:n]
    return {
        "city": [r[0] for r in rows],
        "country": [r[1] for r in rows],
        "population": [r[2] for r in rows],
        "latitude": [r[3] for r in rows],
        "longitude": [r[4] for r in rows],
    }


def sample_products(n: int = 15) -> dict[str, list]:
    """
    Generate a product catalog dataset.

    Parameters
    ----------
    n
        Number of rows.

    Returns
    -------
    dict[str, list]
        Column-oriented dict with product, category, price,
        stock, rating, and in_stock columns.

    Examples
    --------
    >>> data = sample_products(5)
    >>> len(data["product"])
    5
    """
    import random
    random.seed(42)
    products = [
        "Widget", "Gadget", "Doohickey", "Thingamajig",
        "Gizmo", "Whatchamacallit", "Contraption", "Apparatus",
        "Device", "Instrument", "Mechanism", "Implement",
        "Tool", "Utensil", "Component",
    ]
    categories = ["Electronics", "Tools", "Kitchen", "Garden", "Office"]
    rows = []
    for i in range(n):
        name = products[i % len(products)]
        cat = random.choice(categories)
        price = round(random.uniform(5.0, 250.0), 2)
        stock = random.randint(0, 500)
        rating = round(random.uniform(1.0, 5.0), 1)
        rows.append((name, cat, price, stock, rating, stock > 0))
    return {
        "product": [r[0] for r in rows],
        "category": [r[1] for r in rows],
        "price": [r[2] for r in rows],
        "stock": [r[3] for r in rows],
        "rating": [r[4] for r in rows],
        "in_stock": [r[5] for r in rows],
    }


def sample_wide(n_rows: int = 10, n_cols: int = 15) -> dict[str, list]:
    """
    Generate a wide dataset with many numeric columns.

    Parameters
    ----------
    n_rows
        Number of rows.
    n_cols
        Number of data columns (plus an id column).

    Returns
    -------
    dict[str, list]
        Column-oriented dict with an ``id`` column and
        ``metric_001`` through ``metric_{n_cols:03d}``.

    Examples
    --------
    >>> data = sample_wide(5, 8)
    >>> len(data)
    9
    """
    import random
    random.seed(7)
    result = {"id": list(range(n_rows))}
    for i in range(n_cols):
        result[f"metric_{i+1:03d}"] = [
            round(random.gauss(0, 1), 3) for _ in range(n_rows)
        ]
    return result


def sample_missing(n: int = 12) -> dict[str, list]:
    """
    Generate a dataset with scattered missing values.

    Parameters
    ----------
    n
        Number of rows.

    Returns
    -------
    dict[str, list]
        Column-oriented dict with name, value, category, and
        score columns. Some cells are None.

    Examples
    --------
    >>> data = sample_missing(5)
    >>> None in data["value"]
    True
    """
    import random
    random.seed(13)
    names = ["Alpha", "Beta", "Gamma", "Delta", "Epsilon",
             "Zeta", "Eta", "Theta", "Iota", "Kappa",
             "Lambda", "Mu"]
    categories = ["A", "B", "C", None]
    rows_name = [names[i % len(names)] for i in range(n)]
    rows_val = [
        None if random.random() < 0.25
        else round(random.uniform(10, 100), 1)
        for _ in range(n)
    ]
    rows_cat = [random.choice(categories) for _ in range(n)]
    rows_score = [
        None if random.random() < 0.2
        else random.randint(1, 100)
        for _ in range(n)
    ]
    return {
        "name": rows_name,
        "value": rows_val,
        "category": rows_cat,
        "score": rows_score,
    }


def sample_large(n: int = 200) -> dict[str, list]:
    """
    Generate a large dataset for pagination testing.

    Parameters
    ----------
    n
        Number of rows.

    Returns
    -------
    dict[str, list]
        Column-oriented dict with id, name, department, salary,
        years, and active columns.

    Examples
    --------
    >>> data = sample_large(50)
    >>> len(data["id"])
    50
    """
    import random
    random.seed(123)
    first_names = [
        "Alice", "Bob", "Charlie", "Diana", "Eve", "Frank",
        "Grace", "Hank", "Iris", "Jack", "Karen", "Leo",
        "Mona", "Nate", "Olivia", "Paul", "Quinn", "Rosa",
    ]
    depts = [
        "Engineering", "Marketing", "Sales", "Finance",
        "HR", "Operations", "Legal", "R&D",
    ]
    return {
        "id": list(range(1, n + 1)),
        "name": [random.choice(first_names) for _ in range(n)],
        "department": [random.choice(depts) for _ in range(n)],
        "salary": [random.randint(50000, 200000) for _ in range(n)],
        "years": [random.randint(1, 30) for _ in range(n)],
        "active": [random.random() > 0.15 for _ in range(n)],
    }
📁 user_guide/
📄 01-basic-explorer.qmd
---
title: Basic Explorer
---

The `tbl_explorer()` function creates interactive tables with
sorting, filtering, pagination, and more.

## Default Options

Pass a dictionary and get a fully interactive table:

```{python}
#| echo: false
from great_docs import tbl_explorer
from gdtest_tbl_explorer import sample_cities

tbl_explorer(sample_cities())
```

Try clicking column headers to sort, or type in the filter box.

## With Caption

```{python}
#| echo: false
tbl_explorer(sample_cities(), caption="World Cities")
```

## Product Catalog

```{python}
#| echo: false
from gdtest_tbl_explorer import sample_products

tbl_explorer(sample_products(), caption="Product Catalog")
```
📄 02-pagination.qmd
---
title: Pagination
---

With larger datasets, `tbl_explorer()` paginates automatically.

## Default Page Size (20 rows)

```{python}
#| echo: false
from great_docs import tbl_explorer
from gdtest_tbl_explorer import sample_large

tbl_explorer(sample_large(200), caption="200 Employees")
```

## Custom Page Size (10 rows)

```{python}
#| echo: false
tbl_explorer(sample_large(200), page_size=10, caption="10 per page")
```

## Large Page Size (50 rows)

```{python}
#| echo: false
tbl_explorer(sample_large(200), page_size=50, caption="50 per page")
```

## No Pagination

Set `page_size=0` to show all rows at once:

```{python}
#| echo: false
tbl_explorer(sample_large(30), page_size=0, caption="All 30 rows")
```
📄 03-column-toggle.qmd
---
title: Column Toggling
---

Use the **Columns** dropdown in the toolbar to show/hide columns.

## Wide Table

This table has 16 columns — try hiding some:

```{python}
#| echo: false
from great_docs import tbl_explorer
from gdtest_tbl_explorer import sample_wide

tbl_explorer(sample_wide(10, 15), caption="Wide Metrics Table")
```

## Column Subset

Pre-select specific columns with `columns=`:

```{python}
#| echo: false
from gdtest_tbl_explorer import sample_cities

tbl_explorer(
    sample_cities(),
    columns=["city", "country", "population"],
    caption="Cities — 3 columns only",
)
```

## Toggle Disabled

Set `column_toggle=False` to remove the dropdown:

```{python}
#| echo: false
tbl_explorer(
    sample_cities(),
    column_toggle=False,
    caption="No column toggle",
)
```
📄 04-copy-download.qmd
---
title: Copy & Download
---

The toolbar includes **Copy** (TSV to clipboard) and **Download**
(CSV file) buttons.

## Full Controls

```{python}
#| echo: false
from great_docs import tbl_explorer
from gdtest_tbl_explorer import sample_products

tbl_explorer(sample_products(), caption="Copy or download this table")
```

## Copy Only (No Download)

```{python}
#| echo: false
tbl_explorer(
    sample_products(),
    downloadable=False,
    caption="Copy button only",
)
```

## Download Only (No Copy)

```{python}
#| echo: false
tbl_explorer(
    sample_products(),
    copyable=False,
    caption="Download button only",
)
```

## No Export Controls

```{python}
#| echo: false
tbl_explorer(
    sample_products(),
    copyable=False,
    downloadable=False,
    caption="No export buttons",
)
```
📄 05-missing-values.qmd
---
title: Missing Values
---

Missing values (`None`, `NaN`) are highlighted in red by default.

## Default Highlighting

```{python}
#| echo: false
from great_docs import tbl_explorer
from gdtest_tbl_explorer import sample_missing

tbl_explorer(sample_missing(), caption="Missing values highlighted")
```

## Highlighting Off

```{python}
#| echo: false
tbl_explorer(
    sample_missing(),
    highlight_missing=False,
    caption="Missing values NOT highlighted",
)
```
📄 06-minimal-chrome.qmd
---
title: Minimal Chrome
---

Strip away table chrome for a clean, data-focused look.

## No Row Numbers

```{python}
#| echo: false
from great_docs import tbl_explorer
from gdtest_tbl_explorer import sample_cities

tbl_explorer(
    sample_cities(),
    show_row_numbers=False,
    caption="No row numbers",
)
```

## No Dtype Labels

```{python}
#| echo: false
tbl_explorer(
    sample_cities(),
    show_dtypes=False,
    caption="No dtype labels",
)
```

## No Header Banner

```{python}
#| echo: false
tbl_explorer(
    sample_cities(),
    show_dimensions=False,
    caption="No header banner",
)
```

## Fully Minimal

No row numbers, no dtypes, no dimensions — just the data and controls:

```{python}
#| echo: false
tbl_explorer(
    sample_cities(),
    show_row_numbers=False,
    show_dtypes=False,
    show_dimensions=False,
    caption="Fully minimal",
)
```

## Filter Only (No Other Controls)

```{python}
#| echo: false
tbl_explorer(
    sample_cities(),
    sortable=False,
    column_toggle=False,
    copyable=False,
    downloadable=False,
    caption="Filter only",
)
```
📄 07-shortcode.qmd
---
title: Shortcode Explorer
---

The `{{< tbl-explorer >}}` shortcode embeds interactive tables
from data files — no Python code cells needed.

## CSV File

{{< tbl-explorer file="assets/cities.csv" >}}

## With Caption

{{< tbl-explorer file="assets/cities.csv" caption="World Cities (shortcode)" >}}

## TSV File

{{< tbl-explorer file="assets/products.tsv" caption="Products (TSV)" >}}

## JSONL File

{{< tbl-explorer file="assets/logs.jsonl" caption="Server Logs (JSONL)" >}}

## Custom Options

{{< tbl-explorer file="assets/cities.csv" page_size="5" caption="5 per page" >}}

## No Filter

{{< tbl-explorer file="assets/cities.csv" filterable="false" caption="No filter input" >}}
📄 08-comparison.qmd
---
title: Preview vs Explorer
---

Compare the static `tbl_preview()` with the interactive
`tbl_explorer()` side by side.

## Static Preview

```{python}
#| echo: false
from great_docs import tbl_preview
from gdtest_tbl_explorer import sample_cities

tbl_preview(sample_cities(), caption="Static preview")
```

## Interactive Explorer

```{python}
#| echo: false
from great_docs import tbl_explorer

tbl_explorer(sample_cities(), caption="Interactive explorer")
```

The explorer adds a toolbar with filter, column toggle, copy,
download, and reset controls. Column headers are sortable.
The static preview is lighter and works without JavaScript.
📄 README.md
# gdtest-tbl-explorer

A showcase site demonstrating the `tbl_explorer()` function from
Great Docs. Each user-guide page exercises a different combination
of data sources, interactive features, and display options.
📄 great-docs.yml
{}