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