From f0a1d63ba1d664513b13bb48f6ebf53337d63584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Leite?= Date: Sat, 13 Jun 2026 20:15:39 -0300 Subject: [PATCH] docs: rebuild pkgdown site Regenerate the site to reflect the changes merged in #7: - grouped reference index (Core, Columns, Formatting, Shiny, proxy, SSP, ...) - new @examples (dt2_order, dt2_search_global, dt2_use_buttons, dt2_language) - reciprocal dt2_buttons()/dt2_use_buttons() @seealso links - options$columns notes in the formatting & getting-started articles - logo.svg on the home page; version 0.1.1; updated author credits Also bumps bundled site assets (Bootstrap 5.3.8, dt2-binding 0.1.1) and drops the orphaned 0.1.0/5.3.1 assets and the unused logo.png. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/.nojekyll | 1 + docs/404.html | 10 +- docs/LICENSE-text.html | 6 +- docs/articles/extensions-guide.html | 22 +- .../dt2-binding-0.1.1}/dt2.js | 0 docs/articles/formatting.html | 28 +- docs/articles/formatting.md | 12 + .../formatting_files/dt2-binding-0.1.1/dt2.js | 485 ++++++++++++++++++ docs/articles/getting-started.html | 79 +-- docs/articles/getting-started.md | 8 +- .../dt2-binding-0.1.1/dt2.js | 485 ++++++++++++++++++ docs/articles/index.html | 6 +- docs/articles/js-config.html | 34 +- .../js-config_files/dt2-binding-0.1.1/dt2.js | 485 ++++++++++++++++++ docs/articles/shiny-integration.html | 10 +- docs/authors.html | 6 +- .../bootstrap-5.3.1/bootstrap.bundle.min.js | 7 - .../bootstrap.bundle.min.js.map | 1 - docs/deps/bootstrap-5.3.1/bootstrap.min.css | 5 - ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 | Bin 17628 -> 0 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 | Bin 4340 -> 0 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 | Bin 35532 -> 0 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 | Bin 26428 -> 0 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 | Bin 13040 -> 0 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 | Bin 22796 -> 0 bytes ...O7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 | Bin 40128 -> 0 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 | Bin 40688 -> 0 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 | Bin 20408 -> 0 bytes .../bootstrap-5.3.8/bootstrap.bundle.min.js | 7 + .../bootstrap.bundle.min.js.map | 1 + docs/deps/bootstrap-5.3.8/bootstrap.min.css | 5 + .../font.css | 0 .../07d40e985ad7c747025dabb9f22142c4.woff2 | Bin .../fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 | Bin .../fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 | Bin .../fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2 | Bin .../fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2 | Bin .../fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 | Bin .../1f5e011d6aae0d98fc0518e1a303e99a.woff2 | Bin .../fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2 | Bin .../fonts/4iCs6KVjbNBYlgoKcg72j00.woff2 | Bin .../fonts/4iCs6KVjbNBYlgoKcw72j00.woff2 | Bin .../fonts/4iCs6KVjbNBYlgoKew72j00.woff2 | Bin .../fonts/4iCs6KVjbNBYlgoKfA72j00.woff2 | Bin .../fonts/4iCs6KVjbNBYlgoKfw72.woff2 | Bin .../fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2 | Bin .../fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2 | Bin .../fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2 | Bin .../fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2 | Bin .../fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2 | Bin .../fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2 | Bin .../626330658504e338ee86aec8e957426b.woff2 | Bin ...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2 | Bin ...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2 | Bin .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2 | Bin ...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2 | Bin ...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2 | Bin ...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2 | Bin ...K1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2 | Bin .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 | Bin .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 | Bin .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 | Bin .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 | Bin .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 | Bin .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 | Bin .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2 | Bin ...6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 | Bin ...6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 | Bin ...6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 | Bin ...ydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 | Bin .../CSR54z1Qlv-GDxkbKVQ_dFsvWNBeudwk.woff2 | Bin .../CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2 | Bin .../CSR54z1Qlv-GDxkbKVQ_dFsvWNdeudwk.woff2 | Bin .../CSR54z1Qlv-GDxkbKVQ_dFsvWNheudwk.woff2 | Bin .../CSR54z1Qlv-GDxkbKVQ_dFsvWNleudwk.woff2 | Bin .../CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2 | Bin .../CSR54z1Qlv-GDxkbKVQ_dFsvWNteudwk.woff2 | Bin .../fonts/CSR64z1Qlv-GDxkbKVQ_fO0KTet_.woff2 | Bin .../fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2 | Bin .../fonts/CSR64z1Qlv-GDxkbKVQ_fO8KTet_.woff2 | Bin .../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2 | Bin .../fonts/CSR64z1Qlv-GDxkbKVQ_fOMKTet_.woff2 | Bin .../fonts/CSR64z1Qlv-GDxkbKVQ_fOQKTet_.woff2 | Bin .../fonts/CSR64z1Qlv-GDxkbKVQ_fOwKTet_.woff2 | Bin ..._QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2 | Bin .../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2 | Bin ..._QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2 | Bin ..._QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2 | Bin ..._QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2 | Bin ..._QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2 | Bin ..._QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2 | Bin .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2 | Bin .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2 | Bin .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2 | Bin .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2 | Bin .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2 | Bin .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2 | Bin .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2 | Bin .../fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2 | Bin .../fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2 | Bin .../fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2 | Bin .../fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2 | Bin .../fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2 | Bin ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 | Bin 0 -> 17624 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 | Bin 0 -> 4348 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 | Bin 0 -> 36652 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 | Bin 0 -> 29392 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 | Bin 0 -> 14340 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 | Bin 0 -> 23664 bytes ...O7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 | Bin 0 -> 43136 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 | Bin 0 -> 41348 bytes ...CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 | Bin 0 -> 20556 bytes .../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2 | Bin .../fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2 | Bin .../fonts/S6u8w4BMUTPHjxsAXC-q.woff2 | Bin .../fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2 | Bin .../fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 | Bin .../fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2 | Bin .../fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2 | Bin .../fonts/S6uyw4BMUTPHjx4wXg.woff2 | Bin .../fonts/S6uyw4BMUTPHjxAwXjeu.woff2 | Bin ...73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2 | Bin ...UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2 | Bin ...73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2 | Bin ...73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2 | Bin ...73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2 | Bin ...73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2 | Bin ...73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2 | Bin .../fonts/XRXV3I6Li01BKofIMeaBXso.woff2 | Bin .../fonts/XRXV3I6Li01BKofINeaB.woff2 | Bin .../fonts/XRXV3I6Li01BKofIO-aBXso.woff2 | Bin .../fonts/XRXV3I6Li01BKofIOOaBXso.woff2 | Bin .../fonts/XRXV3I6Li01BKofIOuaBXso.woff2 | Bin .../c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2 | Bin .../ee91700cdbf7ce16c054c2bb8946c736.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 | Bin ...126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 | Bin ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 | Bin ...Gs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 | Bin ...126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 | Bin .../fonts/q5uGsou0JOdh94bfuQltOxU.woff2 | Bin .../fonts/q5uGsou0JOdh94bfvQlt.woff2 | Bin docs/deps/data-deps.txt | 4 +- docs/index.html | 19 +- docs/index.md | 8 +- docs/llms.txt | 166 +++--- docs/logo.png | Bin 13066 -> 0 bytes docs/logo.svg | 7 + docs/pkgdown.yml | 4 +- docs/reference/dot-dt2_detect_extensions.html | 8 +- docs/reference/dot-dt2_lib_versions.html | 8 +- docs/reference/dot-dt2_lock_mode.html | 6 +- docs/reference/dot-dt2_npm_map.html | 6 +- docs/reference/dot-dt2_parse_ssp_request.html | 6 +- docs/reference/dot-dt2_payload.html | 6 +- .../reference/dot-dt2_resolve_extensions.html | 6 +- docs/reference/dot-dt2_shell_var_map.html | 6 +- .../dot-dt2_version_constraints.html | 8 +- docs/reference/dot-npm_latest_in_range.html | 8 +- docs/reference/dot-npm_latest_version.html | 6 +- docs/reference/dot-patch_file.html | 6 +- docs/reference/dot-print_update_table.html | 6 +- docs/reference/dot-version_gt.html | 6 +- docs/reference/dt2-extensions.html | 8 +- docs/reference/dt2.html | 34 +- docs/reference/dt2.md | 26 +- docs/reference/dt2_bind_server.html | 6 +- docs/reference/dt2_buttons.html | 14 +- docs/reference/dt2_buttons.md | 11 + docs/reference/dt2_check_updates.html | 12 +- docs/reference/dt2_check_updates.md | 4 +- docs/reference/dt2_col_button.html | 6 +- docs/reference/dt2_col_checkbox.html | 6 +- docs/reference/dt2_col_template.html | 6 +- docs/reference/dt2_cols_align.html | 6 +- docs/reference/dt2_cols_escape.html | 12 +- docs/reference/dt2_cols_escape.md | 6 +- docs/reference/dt2_cols_hide.html | 6 +- docs/reference/dt2_cols_html.html | 6 +- docs/reference/dt2_cols_render_js.html | 8 +- .../reference/dt2_cols_render_orthogonal.html | 8 +- docs/reference/dt2_cols_width.html | 6 +- docs/reference/dt2_deps.html | 8 +- docs/reference/dt2_draw.html | 6 +- docs/reference/dt2_extensions.html | 6 +- docs/reference/dt2_format_datetime.html | 8 +- docs/reference/dt2_format_number.html | 8 +- docs/reference/dt2_format_number_abbrev.html | 8 +- docs/reference/dt2_format_time_format.html | 6 +- docs/reference/dt2_format_time_relative.html | 6 +- docs/reference/dt2_language.html | 18 +- docs/reference/dt2_language.md | 13 + docs/reference/dt2_length_menu.html | 14 +- docs/reference/dt2_length_menu.md | 4 +- docs/reference/dt2_order.html | 14 +- docs/reference/dt2_order.md | 10 + docs/reference/dt2_output.html | 6 +- docs/reference/dt2_proxy.html | 6 +- docs/reference/dt2_proxy_order.html | 6 +- docs/reference/dt2_proxy_page.html | 6 +- docs/reference/dt2_proxy_search.html | 6 +- docs/reference/dt2_register_renderer.html | 6 +- docs/reference/dt2_replace_data.html | 6 +- docs/reference/dt2_search_global.html | 13 +- docs/reference/dt2_search_global.md | 9 + docs/reference/dt2_select_rows.html | 6 +- docs/reference/dt2_ssp_handler.html | 6 +- docs/reference/dt2_state.html | 8 +- docs/reference/dt2_theme.html | 19 +- docs/reference/dt2_theme.md | 7 +- docs/reference/dt2_update_libs.html | 8 +- docs/reference/dt2_use_buttons.html | 18 +- docs/reference/dt2_use_buttons.md | 15 + docs/reference/dt2_use_renderer.html | 6 +- docs/reference/figures/logo.pik | 17 + docs/reference/figures/logo.svg | 7 + docs/reference/index.html | 247 +++++---- docs/reference/index.md | 158 +++--- docs/reference/libs/dt2-binding-0.1.1/dt2.js | 485 ++++++++++++++++++ docs/reference/observe_dt2_events.html | 6 +- docs/reference/render_dt2.html | 6 +- docs/search.json | 2 +- 254 files changed, 2824 insertions(+), 584 deletions(-) create mode 100644 docs/.nojekyll rename docs/{reference/libs/dt2-binding-0.1.0 => articles/extensions-guide_files/dt2-binding-0.1.1}/dt2.js (100%) create mode 100644 docs/articles/formatting_files/dt2-binding-0.1.1/dt2.js create mode 100644 docs/articles/getting-started_files/dt2-binding-0.1.1/dt2.js create mode 100644 docs/articles/js-config_files/dt2-binding-0.1.1/dt2.js delete mode 100644 docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js delete mode 100644 docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map delete mode 100644 docs/deps/bootstrap-5.3.1/bootstrap.min.css delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 delete mode 100644 docs/deps/bootstrap-5.3.1/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js create mode 100644 docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js.map create mode 100644 docs/deps/bootstrap-5.3.8/bootstrap.min.css rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/font.css (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/07d40e985ad7c747025dabb9f22142c4.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/1f5e011d6aae0d98fc0518e1a303e99a.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCs6KVjbNBYlgoKcg72j00.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCs6KVjbNBYlgoKcw72j00.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCs6KVjbNBYlgoKew72j00.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCs6KVjbNBYlgoKfA72j00.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCs6KVjbNBYlgoKfw72.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/626330658504e338ee86aec8e957426b.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNBeudwk.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNdeudwk.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNheudwk.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNleudwk.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNteudwk.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR64z1Qlv-GDxkbKVQ_fO0KTet_.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR64z1Qlv-GDxkbKVQ_fO8KTet_.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR64z1Qlv-GDxkbKVQ_fOMKTet_.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR64z1Qlv-GDxkbKVQ_fOQKTet_.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/CSR64z1Qlv-GDxkbKVQ_fOwKTet_.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2 (100%) create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 create mode 100644 docs/deps/bootstrap-5.3.8/fonts/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/S6u8w4BMUTPHjxsAXC-q.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/S6uyw4BMUTPHjx4wXg.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/S6uyw4BMUTPHjxAwXjeu.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/XRXV3I6Li01BKofIMeaBXso.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/XRXV3I6Li01BKofINeaB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/XRXV3I6Li01BKofIO-aBXso.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/XRXV3I6Li01BKofIOOaBXso.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/XRXV3I6Li01BKofIOuaBXso.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/ee91700cdbf7ce16c054c2bb8946c736.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/q5uGsou0JOdh94bfuQltOxU.woff2 (100%) rename docs/deps/{bootstrap-5.3.1 => bootstrap-5.3.8}/fonts/q5uGsou0JOdh94bfvQlt.woff2 (100%) delete mode 100644 docs/logo.png create mode 100644 docs/logo.svg create mode 100644 docs/reference/figures/logo.pik create mode 100644 docs/reference/figures/logo.svg create mode 100644 docs/reference/libs/dt2-binding-0.1.1/dt2.js diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ + diff --git a/docs/404.html b/docs/404.html index 99b5970..37ccc3f 100644 --- a/docs/404.html +++ b/docs/404.html @@ -12,14 +12,14 @@ - - + + - + Skip to content @@ -65,7 +65,7 @@
@@ -82,7 +82,7 @@
diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index 9e4fe41..45206d9 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -1,5 +1,5 @@ -License • DT2 +License • DT2 Skip to content @@ -36,7 +36,7 @@
@@ -54,7 +54,7 @@
diff --git a/docs/articles/extensions-guide.html b/docs/articles/extensions-guide.html index 0586b53..130fd78 100644 --- a/docs/articles/extensions-guide.html +++ b/docs/articles/extensions-guide.html @@ -12,8 +12,8 @@ - - + + @@ -73,10 +73,10 @@
-
+

Grouped Buttons with Labels

@@ -164,7 +164,7 @@ 

Grouped Buttons with Labels) ))

-

Note: DT2 auto-detected that layout contains +

Note: DT2 auto-detected that layout contains buttons, so it loaded the Buttons extension automatically (no need to set extensions explicitly).

@@ -179,7 +179,7 @@

Select (Row Selection) pageLength = 10 ))

-

In Shiny, selected rows are available via +

In Shiny, selected rows are available via input$<id>_state$selected.

@@ -192,7 +192,7 @@

Responsive
 dt2(iris, responsive = FALSE, options = list(pageLength = 5))

-

To customise Responsive behaviour (e.g., disable child rows):

+

To customise Responsive behaviour (e.g., disable child rows):

 dt2(iris, options = list(
   responsive = list(details = FALSE)  # hide overflow silently
@@ -217,7 +217,7 @@ 

ColumnControl= list(indicators = FALSE, handler = FALSE) ))

- +

FixedHeader @@ -250,7 +250,7 @@

Combining Extensions= list(indicators = FALSE, handler = FALSE) ))

- + diff --git a/docs/reference/libs/dt2-binding-0.1.0/dt2.js b/docs/articles/extensions-guide_files/dt2-binding-0.1.1/dt2.js similarity index 100% rename from docs/reference/libs/dt2-binding-0.1.0/dt2.js rename to docs/articles/extensions-guide_files/dt2-binding-0.1.1/dt2.js diff --git a/docs/articles/formatting.html b/docs/articles/formatting.html index e04cb56..9504015 100644 --- a/docs/articles/formatting.html +++ b/docs/articles/formatting.html @@ -12,8 +12,8 @@ - - + + @@ -70,10 +70,10 @@

The col_specs argument accepts column names (matching options$columns) or 1-based integer indices.

+
+

Why columns = names(df)? When you refer +to columns by name, DT2 needs to know the column order to +translate names into positions. That list lives in +options$columns, so set it once +(opts <- list(columns = names(df))) before calling any +name-based helper. If you skip it, DT2 emits a warning and the target +cannot be resolved — pass 1-based indices instead if you prefer not to +set it. (dt2() itself fills options$columns +from the data for rendering, but the helpers run before +dt2(), so they need it set explicitly.)

+

Number Formatting @@ -111,7 +123,7 @@

Number Formattingopts <- dt2_format_number(opts, "volume", thousands = ",", digits = 0) dt2(df, options = opts)

- +

Abbreviated Numbers @@ -144,7 +156,7 @@

Date/Time Formattingopts <- dt2_format_datetime(opts, "date", to = "DD/MM/YYYY") dt2(df, options = opts)

- +

Relative Time @@ -160,7 +172,7 @@

Relative Timeopts <- dt2_format_time_relative(opts, "when", locale = "en") dt2(df, options = opts)

- +

Custom JS Renderers @@ -254,7 +266,7 @@

Named Renderers (Reuse Across Table

diff --git a/docs/articles/formatting.md b/docs/articles/formatting.md index e0eca1a..134adeb 100644 --- a/docs/articles/formatting.md +++ b/docs/articles/formatting.md @@ -14,6 +14,18 @@ dt2(df, options = opts) The `col_specs` argument accepts column names (matching `options$columns`) or 1-based integer indices. +> **Why `columns = names(df)`?** When you refer to columns *by name*, +> DT2 needs to know the column order to translate names into positions. +> That list lives in `options$columns`, so set it once +> (`opts <- list(columns = names(df))`) before calling any name-based +> helper. If you skip it, DT2 emits a warning and the target cannot be +> resolved — pass 1-based indices instead if you prefer not to set it. +> ([`dt2()`](https://strategicprojects.github.io/DT2/reference/dt2.md) +> itself fills `options$columns` from the data for rendering, but the +> helpers run *before* +> [`dt2()`](https://strategicprojects.github.io/DT2/reference/dt2.md), +> so they need it set explicitly.) + ## Number Formatting [`dt2_format_number()`](https://strategicprojects.github.io/DT2/reference/dt2_format_number.md) diff --git a/docs/articles/formatting_files/dt2-binding-0.1.1/dt2.js b/docs/articles/formatting_files/dt2-binding-0.1.1/dt2.js new file mode 100644 index 0000000..1da0043 --- /dev/null +++ b/docs/articles/formatting_files/dt2-binding-0.1.1/dt2.js @@ -0,0 +1,485 @@ + +/*! dt2.js — patched with hybrid accessors (arrays OR objects) + * Works for client-side (HTMLWidgets.dataframeToD3) & server-side (ajax) + * v0.2.0-aurora + */ +(function () { + // --- util: wait until jQuery & DataTables are ready + function waitForDeps(cb, needExts, tries, delay) { + tries = (typeof tries === "number" ? tries : 200); + delay = (typeof delay === "number" ? delay : 25); + (function loop(t) { + var jqOK = (typeof window.jQuery === "function"); + var dtOK = (typeof window.DataTable === "function"); + if (jqOK && dtOK) return cb(); + if (t <= 0) { + console.error("[DT2] Dependencies did not load in time.", + "jQuery:", typeof window.jQuery, "DataTable:", typeof window.DataTable); + return; + } + setTimeout(function(){ loop(t - 1); }, delay); + })(tries); + } + + // --- util: header builder (optional, cosmetic) + function buildHeader(tbl, columns) { + if (!columns || !columns.length) return; + const thead = document.createElement('thead'); + const tr = document.createElement('tr'); + columns.forEach(function (c) { + const th = document.createElement('th'); + th.textContent = c; + tr.appendChild(th); + }); + thead.appendChild(tr); + tbl.appendChild(thead); + } + + // --- util: guess names from a sample row + function inferNamesFromRow(row) { + if (!row) return null; + if (Array.isArray(row)) return row.map(function (_, i) { return "V" + (i + 1); }); + if (typeof row === "object") return Object.keys(row); + return null; + } + + // --- util: simple accessor by key (legacy; used only for dotted keys fallback) + function accessorForKey(key) { + return function (row) { return row ? row[key] : undefined; }; + } + + // --- PATCH: hybrid accessor & column factory (array OR object rows) + function hybridAccessor(name, idx) { + return function (row) { + if (row == null) return undefined; + if (Array.isArray(row)) return row[idx]; + if (typeof row === "object") return row[name]; + return undefined; + }; + } + + function columnsFromNamesHybrid(colNames, sampleRow) { + return (colNames || []).map(function (nm, i) { + var useAccessor = (typeof nm === "string" && nm.indexOf(".") >= 0); + var dataProp; + if (useAccessor) { + var flatAccessor = function (row) { + if (row == null) return undefined; + if (Array.isArray(row)) return row[i]; + return row[nm]; // keep shallow dotted behavior as before + }; + dataProp = flatAccessor; + } else { + dataProp = hybridAccessor(nm, i); + } + return { data: dataProp, title: nm, defaultContent: "" }; + }); + } + + // --- legacy helper (kept but now returns hybrid accessors when given strings) + function normalizeColumns(cols) { + if (Array.isArray(cols) && cols.length && typeof cols[0] === "string") { + return cols.map(function(nm, i){ return { data: hybridAccessor(nm, i), title: nm, defaultContent: "" }; }); + } + return cols; + } + + // --- if data comes as objects, keep previous behavior + function columnsForData(jsData, providedNames) { + const row0 = (jsData && jsData.length) ? jsData[0] : null; + const rowsAreObjects = row0 && !Array.isArray(row0) && typeof row0 === "object"; + let colNames = Array.isArray(providedNames) && providedNames.length + ? providedNames : (inferNamesFromRow(row0) || []); + if (!rowsAreObjects) { + // arrays: create by index with titles from colNames + return colNames.map(function (name, i) { + return { data: i, title: name, defaultContent: "" }; + }); + } + // objects: use hybrid so it still works if data later flips to arrays + return columnsFromNamesHybrid(colNames, row0); + } + + HTMLWidgets.widget({ + name: 'dt2', + type: 'output', + factory: function (el, width, height) { + let table; + + function initTable(x) { + if (table) { try { table.destroy(); } catch (e) {} table = null; } + el.innerHTML = ''; + + const tbl = document.createElement('table'); + const theme = (x.options && x.options.dt2_theme) || {}; + const isBS5 = (theme.bs === 'bootstrap5'); + + // Apply font_scale BEFORE DataTable init so the sometimes appearing blank. + // When font_scale shrinks the container, the browser may render the + // select before its intrinsic size is recalculated. Force a repaint. + try { + var lenSel = el.querySelector('.dt-length select'); + if (lenSel) { + // Trigger a repaint by toggling display + lenSel.style.display = 'none'; + lenSel.offsetHeight; // force layout + lenSel.style.display = ''; + // Ensure the current value is reflected + if (opts.pageLength && lenSel.value != opts.pageLength) { + lenSel.value = opts.pageLength; + } + } + } catch(e2) { /* noop */ } + + } catch (e) { + console.error("[DT2] Failed to instantiate DataTable:", e); + try { + console.log("[DT2] Sample record:", (jsData && jsData[0]) || "(server-side)"); + console.log("[DT2] opts.columns:", opts.columns); + } catch(_) {} + return; + } + + // expose for debugging + // el._dt2 = table; + + // --- push state to Shiny input$id_state + function pushState(reason) { + if (!window.Shiny || !table) return; + var selIdx = []; + try { selIdx = table.rows({ selected:true }).indexes().toArray(); } catch(e){} + var page = table.page.info(); + var state = table.state && table.state(); + Shiny.setInputValue(el.id + "_state", { + reason: reason, + order: table.order(), + search: table.search(), + page: page, + selected: selIdx, + state: state + }, {priority:"event"}); + } + + table.off('.dt2state'); + table.on('init.dt.dt2state draw.dt.dt2state order.dt.dt2state search.dt.dt2state page.dt.dt2state select.dt.dt2state deselect.dt.dt2state', + function(e){ pushState(e.type.split('.')[0]); }); + + // --- Shiny proxy (R -> JS) + if (window.Shiny && !el._proxyBound) { + el._proxyBound = true; + Shiny.addCustomMessageHandler(el.id + "_proxy", function(msg){ + if(!table) return; + switch(msg.cmd || msg.type){ + case "replaceData": + try { table.clear(); table.rows.add(msg.data || []); table.draw(false); } + catch(e){ console.error("[DT2] replaceData:", e); } + break; + case "draw": table.draw(false); break; + case "order": { + var spec = (msg.args && msg.args[0]) ? msg.args[0] : []; + var arr = spec.map(function(x){ + var col = x[0], dir = x[1]; + if (typeof col === 'string') { + var idx = table.columns().indexes().toArray().find(function(i){ + var name = table.column(i).header().textContent.trim(); + return name === col; + }); + return [ (idx!=null?idx:0), dir ]; + } + return [ (parseInt(col,10)-1), dir ]; + }); + table.order(arr).draw(); + break; + } + case "search": table.search(msg.args[0], msg.args[1], msg.args[2], msg.args[3]).draw(); break; + case "page": + if (msg.args[0] === 'number') table.page(parseInt(msg.args[1],10)).draw(false); + else table.page(msg.args[0]).draw(false); + break; + case "selectRows": + try { + if (msg.args[1]) table.rows().deselect(); + var zero = (msg.args[0] || []).map(function(i){ return i-1; }); + table.rows(zero).select(); + } catch(e){} + break; + } + }); + } + + // --- delegated inputs (row-checkbox / row-button) + if (window.jQuery && window.Shiny) { + var $tbl = window.jQuery(tbl); + $tbl.off('.dt2inputs'); + $tbl.on('change.dt2inputs', 'input.dt2-row-checkbox', function(){ + var $tr = window.jQuery(this).closest('tr'); + var row = table.row($tr).index(); + Shiny.setInputValue(el.id + "_row_check", { row: row+1, value: this.checked }, {priority:"event"}); + }); + $tbl.on('click.dt2inputs', 'button.dt2-row-button', function(){ + var $tr = window.jQuery(this).closest('tr'); + var row = table.row($tr).index(); + Shiny.setInputValue(el.id + "_row_button", { row: row+1, id: this.id }, {priority:"event"}); + }); + } + } + + return { + renderValue: function (x) { + // support both names coming from R + x.serverSide = !!(x.server_side || x.serverSide); + waitForDeps(function(){ initTable(x); }); + }, + resize: function () { + if (table && table.columns && table.columns.adjust) { + try { table.columns.adjust(); } catch (e) {} + } + } + }; + } + }); +})(); diff --git a/docs/articles/getting-started.html b/docs/articles/getting-started.html index dc2f556..de472c6 100644 --- a/docs/articles/getting-started.html +++ b/docs/articles/getting-started.html @@ -12,8 +12,8 @@ - - + + @@ -74,10 +74,10 @@
- +

Responsive Tables @@ -112,7 +112,7 @@

Responsive Tables# Responsive is ON by default — table fills the container dt2(mtcars[1:10, ])

-

On wide screens all columns are visible. On narrow screens, columns +

On wide screens all columns are visible. On narrow screens, columns that overflow are hidden and accessible via a toggle (+) on each row — the user can expand any row to reveal the hidden columns in a child row.

@@ -122,7 +122,7 @@

Responsive Tables
 dt2(iris, responsive = FALSE)
- +

Styling @@ -140,7 +140,7 @@

Inline overrides
 dt2(iris, striped = FALSE, hover = FALSE, font_scale = 1.0)

- +

Theme presets @@ -185,7 +185,7 @@

Theme presets
 dt2(iris, theme = "minimal", options = list(pageLength = 5))

- + +#> button_class = btn btn-sm btn-outline-secondary +#> class = <none>
 dt2(iris[1:10, ], theme = my_theme)
- +

CSS class override @@ -271,7 +272,7 @@

Rearranging elements) ))

- +

Removing elements @@ -286,7 +287,7 @@

Removing elements) ))

- +

Multiple elements in one position @@ -302,7 +303,7 @@

Multiple elements in one position ) ))

- +

Search box placeholder @@ -315,7 +316,7 @@

Search box placeholder ) ))

- +
-

DT2 auto-detects that buttons are needed and loads the Buttons +

DT2 auto-detects that buttons are needed and loads the Buttons extension.

@@ -352,7 +353,7 @@

Using the helper) dt2(iris[1:20, ], options = opts)

- +

Buttons + search together @@ -369,7 +370,7 @@

Buttons + search together ) ))

- +

Grouped buttons with dropdown @@ -396,7 +397,7 @@

Grouped buttons with dropdown) ))

- +

Separated button groups with spacer @@ -418,7 +419,7 @@

Separated button groups with spacer ) ))

- +

Bottom buttons @@ -433,7 +434,7 @@

Bottom buttons ) ))

- +

Button styling @@ -450,7 +451,7 @@

Button styling layout = list(topEnd = "buttons") ))

-

Or per-table with the helper:

+

Or per-table with the helper:

 opts <- dt2_use_buttons(
   buttons = c("copy", "csv", "excel"),
@@ -458,7 +459,7 @@ 

Button styling) dt2(iris[1:10, ], options = opts)

-

You can also set it once in a reusable theme:

+

You can also set it once in a reusable theme:

 my_theme <- dt2_theme("default", button_class = "btn btn-sm btn-primary")
 dt2(iris, theme = my_theme, options = dt2_use_buttons())
@@ -509,7 +510,7 @@ 

Pagination styling# Default pagination — compact, themed by Bootstrap dt2(iris)

-

To remove pagination entirely (show all rows at once), set +

To remove pagination entirely (show all rows at once), set paging = FALSE at the root level of options. This is useful for small datasets where the user should see everything without navigating:

@@ -518,7 +519,7 @@

Pagination styling= FALSE ))
-

Simple — previous / next only (no page numbers). +

Simple — previous / next only (no page numbers). Useful for mobile-friendly interfaces or when exact page numbers are not meaningful:

-

Hide page numbers but keep first / last buttons. +

Hide page numbers but keep first / last buttons. Lets users jump to the beginning or end of large datasets without cluttering the interface with numbered buttons:

-

Limit how many page number buttons are shown. For +

Limit how many page number buttons are shown. For datasets with many pages this prevents the pagination bar from becoming too wide — DataTables inserts ellipsis () to indicate hidden pages:

@@ -556,7 +557,7 @@

Pagination styling) ))
-

Hide boundary numbers (first/last page) but keep +

Hide boundary numbers (first/last page) but keep arrows. The first and last page numbers are removed, leaving only the surrounding page numbers and navigation arrows:

-

Full — first / prev / numbers / next / last. Shows +

Full — first / prev / numbers / next / last. Shows every navigation element for maximum control. This is equivalent to the deprecated pagingType = "full_numbers":

-
+

Quick reference

@@ -643,7 +644,7 @@

Quick reference ) ))
- + @@ -664,7 +665,7 @@

Infinite Scrolling (Scroller)= TRUE # required for Scroller ))
-

DT2 auto-detects the Scroller extension when +

DT2 auto-detects the Scroller extension when scroller = TRUE is set.

With a larger dataset:

-

Combine with buttons:

+

Combine with buttons:

 dt2(big, options = list(
   scroller    = TRUE,
@@ -692,7 +693,7 @@ 

Infinite Scrolling (Scroller)) ))

-

For datasets over ~50k rows, consider server-side processing instead. +

For datasets over ~50k rows, consider server-side processing instead. See vignette("shiny-integration") for details.

@@ -703,13 +704,17 @@

Column Formatting
 opts <- list(columns = names(mtcars))
 opts <- dt2_format_number(opts, "hp", thousands = ",", digits = 0)
 opts <- dt2_format_number(opts, "wt", digits = 2, prefix_right = " tons")
 dt2(mtcars[1:10, ], options = opts)

-
+

Abbreviated numbers (k/M/B)

For large numbers (population, budgets, revenues), use abbreviated @@ -746,7 +751,7 @@

DataTables Options= list(search = "Filter:", info = "_TOTAL_ rows") ))

-

See vignette("js-config") for the complete translation +

See vignette("js-config") for the complete translation guide.

diff --git a/docs/articles/getting-started.md b/docs/articles/getting-started.md index 06d0f68..ef3c131 100644 --- a/docs/articles/getting-started.md +++ b/docs/articles/getting-started.md @@ -94,7 +94,8 @@ my_theme #> compact = TRUE #> font_scale = 0.8 #> style = bootstrap5 -#> button_class = btn btn-sm btn-outline-secondary +#> button_class = btn btn-sm btn-outline-secondary +#> class = ``` ``` r @@ -573,6 +574,11 @@ and suffixes. These modify your options list in-place and generate the correct JavaScript `render` functions behind the scenes, so you don’t need to write any JS: +Note the `opts <- list(columns = names(mtcars))` line: name-based +helpers resolve column names against `options$columns`, so set it once +before calling them (or pass 1-based indices). DT2 warns if it is +missing. + ``` r opts <- list(columns = names(mtcars)) diff --git a/docs/articles/getting-started_files/dt2-binding-0.1.1/dt2.js b/docs/articles/getting-started_files/dt2-binding-0.1.1/dt2.js new file mode 100644 index 0000000..1da0043 --- /dev/null +++ b/docs/articles/getting-started_files/dt2-binding-0.1.1/dt2.js @@ -0,0 +1,485 @@ + +/*! dt2.js — patched with hybrid accessors (arrays OR objects) + * Works for client-side (HTMLWidgets.dataframeToD3) & server-side (ajax) + * v0.2.0-aurora + */ +(function () { + // --- util: wait until jQuery & DataTables are ready + function waitForDeps(cb, needExts, tries, delay) { + tries = (typeof tries === "number" ? tries : 200); + delay = (typeof delay === "number" ? delay : 25); + (function loop(t) { + var jqOK = (typeof window.jQuery === "function"); + var dtOK = (typeof window.DataTable === "function"); + if (jqOK && dtOK) return cb(); + if (t <= 0) { + console.error("[DT2] Dependencies did not load in time.", + "jQuery:", typeof window.jQuery, "DataTable:", typeof window.DataTable); + return; + } + setTimeout(function(){ loop(t - 1); }, delay); + })(tries); + } + + // --- util: header builder (optional, cosmetic) + function buildHeader(tbl, columns) { + if (!columns || !columns.length) return; + const thead = document.createElement('thead'); + const tr = document.createElement('tr'); + columns.forEach(function (c) { + const th = document.createElement('th'); + th.textContent = c; + tr.appendChild(th); + }); + thead.appendChild(tr); + tbl.appendChild(thead); + } + + // --- util: guess names from a sample row + function inferNamesFromRow(row) { + if (!row) return null; + if (Array.isArray(row)) return row.map(function (_, i) { return "V" + (i + 1); }); + if (typeof row === "object") return Object.keys(row); + return null; + } + + // --- util: simple accessor by key (legacy; used only for dotted keys fallback) + function accessorForKey(key) { + return function (row) { return row ? row[key] : undefined; }; + } + + // --- PATCH: hybrid accessor & column factory (array OR object rows) + function hybridAccessor(name, idx) { + return function (row) { + if (row == null) return undefined; + if (Array.isArray(row)) return row[idx]; + if (typeof row === "object") return row[name]; + return undefined; + }; + } + + function columnsFromNamesHybrid(colNames, sampleRow) { + return (colNames || []).map(function (nm, i) { + var useAccessor = (typeof nm === "string" && nm.indexOf(".") >= 0); + var dataProp; + if (useAccessor) { + var flatAccessor = function (row) { + if (row == null) return undefined; + if (Array.isArray(row)) return row[i]; + return row[nm]; // keep shallow dotted behavior as before + }; + dataProp = flatAccessor; + } else { + dataProp = hybridAccessor(nm, i); + } + return { data: dataProp, title: nm, defaultContent: "" }; + }); + } + + // --- legacy helper (kept but now returns hybrid accessors when given strings) + function normalizeColumns(cols) { + if (Array.isArray(cols) && cols.length && typeof cols[0] === "string") { + return cols.map(function(nm, i){ return { data: hybridAccessor(nm, i), title: nm, defaultContent: "" }; }); + } + return cols; + } + + // --- if data comes as objects, keep previous behavior + function columnsForData(jsData, providedNames) { + const row0 = (jsData && jsData.length) ? jsData[0] : null; + const rowsAreObjects = row0 && !Array.isArray(row0) && typeof row0 === "object"; + let colNames = Array.isArray(providedNames) && providedNames.length + ? providedNames : (inferNamesFromRow(row0) || []); + if (!rowsAreObjects) { + // arrays: create by index with titles from colNames + return colNames.map(function (name, i) { + return { data: i, title: name, defaultContent: "" }; + }); + } + // objects: use hybrid so it still works if data later flips to arrays + return columnsFromNamesHybrid(colNames, row0); + } + + HTMLWidgets.widget({ + name: 'dt2', + type: 'output', + factory: function (el, width, height) { + let table; + + function initTable(x) { + if (table) { try { table.destroy(); } catch (e) {} table = null; } + el.innerHTML = ''; + + const tbl = document.createElement('table'); + const theme = (x.options && x.options.dt2_theme) || {}; + const isBS5 = (theme.bs === 'bootstrap5'); + + // Apply font_scale BEFORE DataTable init so the

+ tbl._dt2 = table; + + // 3) container do DataTables (wrapper) + var wrap = table.table().container(); + if (wrap) wrap._dt2 = table; + + // 4) registrar na ponte jQuery (para $('#id').DataTable() / .data('dt-api')) + if (window.jQuery && jQuery.fn) { + jQuery(tbl).data('DataTable', table).data('dt-api', table); + if (wrap) jQuery(wrap).data('DataTable', table).data('dt-api', table); + } +} catch(e) { /* noop */ } + + // Post-init: fix for page-length
@@ -491,7 +491,7 @@

Built-in DataTables Renderers) ))
- +

Custom Render Function @@ -520,7 +520,7 @@

Custom Render Function ) ))

- +
- +
diff --git a/docs/articles/js-config_files/dt2-binding-0.1.1/dt2.js b/docs/articles/js-config_files/dt2-binding-0.1.1/dt2.js new file mode 100644 index 0000000..1da0043 --- /dev/null +++ b/docs/articles/js-config_files/dt2-binding-0.1.1/dt2.js @@ -0,0 +1,485 @@ + +/*! dt2.js — patched with hybrid accessors (arrays OR objects) + * Works for client-side (HTMLWidgets.dataframeToD3) & server-side (ajax) + * v0.2.0-aurora + */ +(function () { + // --- util: wait until jQuery & DataTables are ready + function waitForDeps(cb, needExts, tries, delay) { + tries = (typeof tries === "number" ? tries : 200); + delay = (typeof delay === "number" ? delay : 25); + (function loop(t) { + var jqOK = (typeof window.jQuery === "function"); + var dtOK = (typeof window.DataTable === "function"); + if (jqOK && dtOK) return cb(); + if (t <= 0) { + console.error("[DT2] Dependencies did not load in time.", + "jQuery:", typeof window.jQuery, "DataTable:", typeof window.DataTable); + return; + } + setTimeout(function(){ loop(t - 1); }, delay); + })(tries); + } + + // --- util: header builder (optional, cosmetic) + function buildHeader(tbl, columns) { + if (!columns || !columns.length) return; + const thead = document.createElement('thead'); + const tr = document.createElement('tr'); + columns.forEach(function (c) { + const th = document.createElement('th'); + th.textContent = c; + tr.appendChild(th); + }); + thead.appendChild(tr); + tbl.appendChild(thead); + } + + // --- util: guess names from a sample row + function inferNamesFromRow(row) { + if (!row) return null; + if (Array.isArray(row)) return row.map(function (_, i) { return "V" + (i + 1); }); + if (typeof row === "object") return Object.keys(row); + return null; + } + + // --- util: simple accessor by key (legacy; used only for dotted keys fallback) + function accessorForKey(key) { + return function (row) { return row ? row[key] : undefined; }; + } + + // --- PATCH: hybrid accessor & column factory (array OR object rows) + function hybridAccessor(name, idx) { + return function (row) { + if (row == null) return undefined; + if (Array.isArray(row)) return row[idx]; + if (typeof row === "object") return row[name]; + return undefined; + }; + } + + function columnsFromNamesHybrid(colNames, sampleRow) { + return (colNames || []).map(function (nm, i) { + var useAccessor = (typeof nm === "string" && nm.indexOf(".") >= 0); + var dataProp; + if (useAccessor) { + var flatAccessor = function (row) { + if (row == null) return undefined; + if (Array.isArray(row)) return row[i]; + return row[nm]; // keep shallow dotted behavior as before + }; + dataProp = flatAccessor; + } else { + dataProp = hybridAccessor(nm, i); + } + return { data: dataProp, title: nm, defaultContent: "" }; + }); + } + + // --- legacy helper (kept but now returns hybrid accessors when given strings) + function normalizeColumns(cols) { + if (Array.isArray(cols) && cols.length && typeof cols[0] === "string") { + return cols.map(function(nm, i){ return { data: hybridAccessor(nm, i), title: nm, defaultContent: "" }; }); + } + return cols; + } + + // --- if data comes as objects, keep previous behavior + function columnsForData(jsData, providedNames) { + const row0 = (jsData && jsData.length) ? jsData[0] : null; + const rowsAreObjects = row0 && !Array.isArray(row0) && typeof row0 === "object"; + let colNames = Array.isArray(providedNames) && providedNames.length + ? providedNames : (inferNamesFromRow(row0) || []); + if (!rowsAreObjects) { + // arrays: create by index with titles from colNames + return colNames.map(function (name, i) { + return { data: i, title: name, defaultContent: "" }; + }); + } + // objects: use hybrid so it still works if data later flips to arrays + return columnsFromNamesHybrid(colNames, row0); + } + + HTMLWidgets.widget({ + name: 'dt2', + type: 'output', + factory: function (el, width, height) { + let table; + + function initTable(x) { + if (table) { try { table.destroy(); } catch (e) {} table = null; } + el.innerHTML = ''; + + const tbl = document.createElement('table'); + const theme = (x.options && x.options.dt2_theme) || {}; + const isBS5 = (theme.bs === 'bootstrap5'); + + // Apply font_scale BEFORE DataTable init so the

+ tbl._dt2 = table; + + // 3) container do DataTables (wrapper) + var wrap = table.table().container(); + if (wrap) wrap._dt2 = table; + + // 4) registrar na ponte jQuery (para $('#id').DataTable() / .data('dt-api')) + if (window.jQuery && jQuery.fn) { + jQuery(tbl).data('DataTable', table).data('dt-api', table); + if (wrap) jQuery(wrap).data('DataTable', table).data('dt-api', table); + } +} catch(e) { /* noop */ } + + // Post-init: fix for page-length for + // page length renders at the correct size from the start. + // (Changing font-size after init causes the select to show blank.) + if (theme.font_scale) { + el.style.fontSize = (theme.font_scale * 100) + '%'; + } + + // Build table classes based on styling mode + let classes = []; + if (theme.class) { + // Full CSS class override from R + classes = theme.class.split(/\s+/); + } else if (isBS5) { + // Bootstrap 5 classes + classes.push('table'); + if (theme.striped) classes.push('table-striped'); + if (theme.hover) classes.push('table-hover'); + if (theme.compact) classes.push('table-sm'); + } else { + // DataTables core classes + classes.push('display'); + if (theme.compact) classes.push('compact'); + } + tbl.className = classes.join(' '); + tbl.style.width = '100%'; + el.appendChild(tbl); + + const isServer = !!(x.server_side || x.serverSide); + + // data (client-side) + let jsData = null; + if (!isServer) { + jsData = HTMLWidgets.dataframeToD3(x.data || []); + } + + // header (optional) + let providedNames = Array.isArray(x.columns) && x.columns.length ? x.columns : null; + let headerNames = providedNames; + if (!headerNames && jsData && jsData.length) headerNames = inferNamesFromRow(jsData[0]); + if (isServer && providedNames) headerNames = providedNames; + if (headerNames) buildHeader(tbl, headerNames); + + // options + const opts = Object.assign({}, x.options || {}); + // wipe legacy aliases that can conflict + delete opts.aoColumns; delete opts.aoColumnDefs; delete opts.oLanguage; + + // Remove DT2-specific keys that DataTables doesn't understand + var buttonClass = (opts.dt2_theme && opts.dt2_theme.button_class) || null; + delete opts.dt2_theme; + delete opts.dt2_buttons_target; + + // Set compact button defaults for BS5 (btn-sm + outline) + if (typeof DataTable.Buttons !== 'undefined' && DataTable.Buttons.defaults) { + var btnCls = buttonClass || 'btn btn-sm btn-outline-secondary'; + try { + DataTable.Buttons.defaults.dom.button.className = btnCls; + } catch(e) {} + } + + // Default autoWidth to false — prevents DataTables from calculating + // fixed pixel widths on elements, which would prevent the + // table from stretching to fill its container. + // User can set autoWidth = TRUE in R options to override. + if (typeof opts.autoWidth === 'undefined') { + opts.autoWidth = false; + } + + // Ensure lengthMenu is always set — prevents empty "entries per page" + // select when pageLength is set to a non-standard value. + if (!opts.lengthMenu) { + var pl = opts.pageLength || 10; + var menu = [10, 25, 50, 100]; + if (menu.indexOf(pl) === -1) { + menu.push(pl); + menu.sort(function(a, b) { return a - b; }); + } + opts.lengthMenu = menu; + } + + // Convert legacy 2D array lengthMenu to DT 2.x format + // Old: [[10,25,50,-1],["10","25","50","All"]] + // New: [10, 25, 50, {label:"All", value:-1}] + if (Array.isArray(opts.lengthMenu) && opts.lengthMenu.length === 2 && + Array.isArray(opts.lengthMenu[0]) && Array.isArray(opts.lengthMenu[1])) { + var vals = opts.lengthMenu[0]; + var labs = opts.lengthMenu[1]; + var converted = []; + for (var mi = 0; mi < vals.length; mi++) { + if (String(vals[mi]) === String(labs[mi])) { + converted.push(vals[mi]); + } else { + converted.push({ label: labs[mi], value: vals[mi] }); + } + } + opts.lengthMenu = converted; + } + + // Convert legacy dom="Bfrtip" to layout (DT2.x modern API) + if (opts.dom && typeof opts.dom === 'string' && opts.dom.indexOf('B') >= 0) { + // If user used dom with B but no layout, create a layout equivalent + if (!opts.layout) { + opts.layout = { topEnd: 'buttons' }; + } + delete opts.dom; // remove deprecated dom + } + + if (x.options && typeof x.options.deferRender !== 'undefined') { + opts.deferRender = !!x.options.deferRender; + } + + if (x.options && typeof x.options.responsive !== 'undefined') { + // Keep as-is if object (e.g. {details: false}), coerce only booleans + opts.responsive = (typeof x.options.responsive === 'object') + ? x.options.responsive + : !!x.options.responsive; + } + + // global defaultContent fallback + opts.columnDefs = (opts.columnDefs || []); + opts.columnDefs.push({ targets: "_all", defaultContent: "", sDefaultContent: "" }); + + if (!isServer) { + // --- CLIENT-SIDE --- + if (Array.isArray(opts.columns) && opts.columns.length && typeof opts.columns[0] === "string") { + opts.columns = columnsFromNamesHybrid(opts.columns, (jsData && jsData[0])); + } else if (!opts.columns) { + var row0 = (jsData && jsData.length) ? jsData[0] : null; + var colNames = (Array.isArray(providedNames) && providedNames.length) + ? providedNames + : (inferNamesFromRow(row0) || []); + opts.columns = Array.isArray(row0) + ? colNames.map(function(nm, i){ return { data: i, title: nm, defaultContent: "" }; }) + : columnsFromNamesHybrid(colNames, row0); + } + opts.data = jsData || []; + } else { + // --- SERVER-SIDE --- + if (Array.isArray(opts.columns) && opts.columns.length && typeof opts.columns[0] === "string") { + opts.columns = columnsFromNamesHybrid(opts.columns, null); + } else if (!opts.columns && Array.isArray(providedNames) && providedNames.length) { + opts.columns = columnsFromNamesHybrid(providedNames, null); + } + opts.serverSide = true; + + // Shiny fallback for server-side processing (if no ajax provided) + if (!opts.ajax && typeof window.Shiny === "object") { + var respHandlerName = el.id + "_server_resp"; + var pending = null; // latest callback + if (!el._dt2_ssp_bound) { + el._dt2_ssp_bound = true; + Shiny.addCustomMessageHandler(respHandlerName, function(payload){ + try { + if (typeof pending === "function") pending(payload); + pending = null; + } catch(e){ console.error("[DT2] SSP resp handler:", e); } + }); + } + // DataTables expects a function signature (data, callback, settings) + opts.ajax = function (request, callback, settings) { + try { + // stash callback until server responds + pending = callback; + // encode request as queryString + var qs = Object.keys(request).map(function(k){ + var v = request[k]; + if (Array.isArray(v)) { + return v.map(function(vi){ return encodeURIComponent(k+'[]') + '=' + encodeURIComponent(vi); }).join('&'); + } else if (v && typeof v === 'object') { + // flatten 1-level objects + return Object.keys(v).map(function(sub){ + return encodeURIComponent(k+'['+sub+']') + '=' + encodeURIComponent(v[sub]); + }).join('&'); + } + return encodeURIComponent(k) + '=' + encodeURIComponent(v); + }).join('&'); + // trigger server request + Shiny.setInputValue(el.id + "_server_req", { queryString: qs }, {priority:"event"}); + } catch(e){ + console.error("[DT2] SSP ajax error:", e); + callback({ draw: 0, recordsTotal: 0, recordsFiltered: 0, data: [] }); + } + }; + } + + // only define ajax if R-side didn't provide a full opts.ajax already + if (!opts.ajax && x.server_ajax) { + // if R passed a URL string, wrap with default DataTables expectation {data:...} + if (typeof x.server_ajax === "string") { + opts.ajax = { + url: x.server_ajax, + type: "POST" + // default dataSrc is "data"; customize here if your API differs + }; + } else { + // assume it's already a valid object + opts.ajax = x.server_ajax; + } + } + } + + if (typeof window.DataTable !== "function") { + console.error("[DT2] DataTables unavailable; check jQuery + DataTables scripts."); + return; + } + + try { + // moment locale (optional) + if (x.options && x.options._momentLocale) { + if (window.moment && typeof moment.locale === 'function') { + moment.locale(x.options._momentLocale); + } + } + // createdRow passthrough (htmlwidgets::JS from R) + if (x.options && x.options.createdRow) { + opts.createdRow = x.options.createdRow; + } + + // debug sample (client) + if (!isServer && jsData && jsData.length) { + console.log("[DT2] sample row is", Array.isArray(jsData[0]) ? "Array" : typeof jsData[0], jsData[0]); + } + + table = new DataTable(tbl, opts); + + // --- expor a API por vários caminhos confiáveis +try { + // 1) container do htmlwidget + el._dt2 = table; + + // 2) própria
+ tbl._dt2 = table; + + // 3) container do DataTables (wrapper) + var wrap = table.table().container(); + if (wrap) wrap._dt2 = table; + + // 4) registrar na ponte jQuery (para $('#id').DataTable() / .data('dt-api')) + if (window.jQuery && jQuery.fn) { + jQuery(tbl).data('DataTable', table).data('dt-api', table); + if (wrap) jQuery(wrap).data('DataTable', table).data('dt-api', table); + } +} catch(e) { /* noop */ } + + // Post-init: fix for page-length