@xplortech/apollo-core 2.12.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.typings/apollo-components.html-data.json +61 -0
- package/AGENTS.md +4 -4
- package/README.md +30 -3
- package/build/components/modal.css +1 -1
- package/build/components/table-body.css +1 -0
- package/build/components/table-footer-cell.css +1 -0
- package/build/components/table-footer.css +1 -0
- package/build/components/table-row.css +1 -0
- package/build/components/top-nav.css +1 -1
- package/build/components-manifest.json +13 -1
- package/build/core.css +1 -1
- package/build/style.css +1 -1
- package/dist/apollo-core/apollo-core.css +1 -1
- package/dist/apollo-core/apollo-core.esm.js +1 -1
- package/dist/apollo-core/{p-d37488d4.entry.js → p-0368a1df.entry.js} +1 -1
- package/dist/apollo-core/p-056a99e4.entry.js +1 -0
- package/dist/apollo-core/p-068e3532.entry.js +1 -0
- package/dist/apollo-core/{p-121d1a4b.entry.js → p-06a9a27b.entry.js} +1 -1
- package/dist/apollo-core/{p-9747cf43.entry.js → p-0958c719.entry.js} +1 -1
- package/dist/apollo-core/p-0a0a6e43.entry.js +1 -0
- package/dist/apollo-core/{p-643c8038.entry.js → p-149ddd12.entry.js} +1 -1
- package/dist/apollo-core/p-1a94c2d9.entry.js +1 -0
- package/dist/apollo-core/{p-efa21ec0.entry.js → p-2139f9f6.entry.js} +1 -1
- package/dist/apollo-core/{p-76f64d65.entry.js → p-28bce81a.entry.js} +1 -1
- package/dist/apollo-core/{p-1a417191.entry.js → p-2938ab4f.entry.js} +1 -1
- package/dist/apollo-core/{p-4e61587f.entry.js → p-2c995d80.entry.js} +1 -1
- package/dist/apollo-core/p-2faa7b9c.entry.js +1 -0
- package/dist/apollo-core/p-30b1b700.entry.js +1 -0
- package/dist/apollo-core/p-32084caf.entry.js +1 -0
- package/dist/apollo-core/p-38586952.entry.js +1 -0
- package/dist/apollo-core/{p-707b1918.entry.js → p-47bda204.entry.js} +1 -1
- package/dist/apollo-core/{p-f199ad66.entry.js → p-4a2323b3.entry.js} +1 -1
- package/dist/apollo-core/{p-c25aebe5.entry.js → p-4ad79534.entry.js} +1 -1
- package/dist/apollo-core/{p-e4ae3f60.entry.js → p-4d4acd1f.entry.js} +1 -1
- package/dist/apollo-core/p-50fae269.entry.js +1 -0
- package/dist/apollo-core/{p-7f105d63.entry.js → p-54903322.entry.js} +1 -1
- package/dist/apollo-core/{p-8a81ef98.entry.js → p-5730d96c.entry.js} +1 -1
- package/dist/apollo-core/{p-46d21684.entry.js → p-581b702c.entry.js} +1 -1
- package/dist/apollo-core/{p-853418be.entry.js → p-5d9a593e.entry.js} +1 -1
- package/dist/apollo-core/{p-e00ed4f4.entry.js → p-60cb3cfb.entry.js} +1 -1
- package/dist/apollo-core/p-722b145a.entry.js +1 -0
- package/dist/apollo-core/p-75e5bfe0.entry.js +1 -0
- package/dist/apollo-core/p-77fe3cc1.entry.js +1 -0
- package/dist/apollo-core/{p-26861d09.entry.js → p-790709c0.entry.js} +1 -1
- package/dist/apollo-core/{p-7976cd3b.entry.js → p-82812126.entry.js} +1 -1
- package/dist/apollo-core/{p-c427a31d.entry.js → p-83bb7607.entry.js} +1 -1
- package/dist/apollo-core/p-8664d88b.entry.js +1 -0
- package/dist/apollo-core/{p-3d9c90ee.entry.js → p-9064badb.entry.js} +1 -1
- package/dist/apollo-core/{p-5ca18bc1.entry.js → p-91895c40.entry.js} +1 -1
- package/dist/apollo-core/p-969d5cca.entry.js +1 -0
- package/dist/apollo-core/p-99a79cf4.entry.js +1 -0
- package/dist/apollo-core/p-abdf199b.entry.js +1 -0
- package/dist/apollo-core/p-ae8a5f66.entry.js +1 -0
- package/dist/apollo-core/{p-9b0174b1.entry.js → p-af8ebf49.entry.js} +1 -1
- package/dist/apollo-core/p-b29025b2.entry.js +1 -0
- package/dist/apollo-core/{p-fd2756d8.entry.js → p-b45179fb.entry.js} +1 -1
- package/dist/apollo-core/p-b5a61076.entry.js +1 -0
- package/dist/apollo-core/p-bf7d8e18.entry.js +1 -0
- package/dist/apollo-core/p-c48e4884.entry.js +1 -0
- package/dist/apollo-core/{p-b537f72d.entry.js → p-ca4652b3.entry.js} +1 -1
- package/dist/apollo-core/{p-bb22ed2a.entry.js → p-cb5b15c2.entry.js} +1 -1
- package/dist/apollo-core/p-cc57f20d.entry.js +1 -0
- package/dist/apollo-core/{p-fef6c256.entry.js → p-cdacfcd4.entry.js} +1 -1
- package/dist/apollo-core/{p-616c5a32.entry.js → p-cdb5b5c4.entry.js} +1 -1
- package/dist/apollo-core/p-d0bc7c45.entry.js +1 -0
- package/dist/apollo-core/{p-ff8acf15.entry.js → p-d41b8f46.entry.js} +1 -1
- package/dist/apollo-core/{p-9bf2ff9f.entry.js → p-d443291f.entry.js} +1 -1
- package/dist/apollo-core/p-d724c419.entry.js +1 -0
- package/dist/apollo-core/p-d9070ae5.entry.js +1 -0
- package/dist/apollo-core/p-dca48977.entry.js +1 -0
- package/dist/apollo-core/p-e1833287.entry.js +1 -0
- package/dist/apollo-core/{p-601b3ab5.entry.js → p-e2890eb1.entry.js} +1 -1
- package/dist/apollo-core/p-e2b73b60.entry.js +1 -0
- package/dist/apollo-core/p-e7e445b0.entry.js +1 -0
- package/dist/apollo-core/p-f1c103ff.entry.js +1 -0
- package/dist/apollo-core/{p-0463c29f.entry.js → p-f3a2c79b.entry.js} +1 -1
- package/dist/apollo-core/p-ffc2f0cf.entry.js +1 -0
- package/dist/cjs/apollo-core.cjs.js +1 -1
- package/dist/cjs/index-3cBvw409.js +16 -0
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/xpl-accordion.cjs.entry.js +2 -2
- package/dist/cjs/xpl-application-shell.cjs.entry.js +1 -1
- package/dist/cjs/xpl-avatar_3.cjs.entry.js +5 -4
- package/dist/cjs/xpl-backdrop.cjs.entry.js +1 -1
- package/dist/cjs/xpl-badge.cjs.entry.js +1 -1
- package/dist/cjs/xpl-banner.cjs.entry.js +2 -2
- package/dist/cjs/xpl-breadcrumb-item.cjs.entry.js +1 -1
- package/dist/cjs/xpl-breadcrumbs.cjs.entry.js +1 -1
- package/dist/cjs/xpl-button-row.cjs.entry.js +1 -1
- package/dist/cjs/xpl-button.cjs.entry.js +1 -1
- package/dist/cjs/xpl-calendar.cjs.entry.js +1 -1
- package/dist/cjs/xpl-checkbox.cjs.entry.js +3 -3
- package/dist/cjs/xpl-choicelist.cjs.entry.js +1 -1
- package/dist/cjs/xpl-content-area.cjs.entry.js +1 -1
- package/dist/cjs/xpl-dashboard.cjs.entry.js +1 -1
- package/dist/cjs/xpl-data-card.cjs.entry.js +2 -2
- package/dist/cjs/xpl-dropdown_4.cjs.entry.js +14 -11
- package/dist/cjs/xpl-dynamic-table-cell.cjs.entry.js +2 -2
- package/dist/cjs/xpl-dynamic-table-row.cjs.entry.js +2 -2
- package/dist/cjs/xpl-dynamic-table.cjs.entry.js +2 -2
- package/dist/cjs/xpl-grid-item.cjs.entry.js +1 -1
- package/dist/cjs/xpl-grid.cjs.entry.js +1 -1
- package/dist/cjs/xpl-header-accordion.cjs.entry.js +1 -1
- package/dist/cjs/xpl-icon.cjs.entry.js +2 -2
- package/dist/cjs/xpl-input-color.cjs.entry.js +13 -13
- package/dist/cjs/xpl-input-phone.cjs.entry.js +5 -5
- package/dist/cjs/xpl-input-time.cjs.entry.js +2 -2
- package/dist/cjs/xpl-input_4.cjs.entry.js +15 -14
- package/dist/cjs/xpl-large-card.cjs.entry.js +1 -1
- package/dist/cjs/xpl-list.cjs.entry.js +2 -2
- package/dist/cjs/xpl-main-nav.cjs.entry.js +1 -1
- package/dist/cjs/xpl-modal.cjs.entry.js +50 -21
- package/dist/cjs/xpl-nav-header-menu.cjs.entry.js +2 -2
- package/dist/cjs/xpl-nav-item.cjs.entry.js +2 -2
- package/dist/cjs/xpl-pagination.cjs.entry.js +4 -4
- package/dist/cjs/xpl-panel.cjs.entry.js +2 -2
- package/dist/cjs/xpl-popover.cjs.entry.js +4 -4
- package/dist/cjs/xpl-progress-bar.cjs.entry.js +2 -2
- package/dist/cjs/xpl-progress-indicator.cjs.entry.js +1 -1
- package/dist/cjs/xpl-secondary-nav.cjs.entry.js +1 -1
- package/dist/cjs/xpl-select_2.cjs.entry.js +8 -8
- package/dist/cjs/xpl-side-nav-header-item.cjs.entry.js +2 -2
- package/dist/cjs/xpl-side-nav-item.cjs.entry.js +2 -2
- package/dist/cjs/xpl-side-nav-section.cjs.entry.js +5 -5
- package/dist/cjs/xpl-side-nav.cjs.entry.js +7 -3
- package/dist/cjs/xpl-skeleton.cjs.entry.js +1 -1
- package/dist/cjs/xpl-slideout.cjs.entry.js +1 -1
- package/dist/cjs/xpl-tab-panel.cjs.entry.js +2 -2
- package/dist/cjs/xpl-table-body.cjs.entry.js +14 -0
- package/dist/cjs/xpl-table-footer-cell.cjs.entry.js +18 -0
- package/dist/cjs/xpl-table-footer.cjs.entry.js +14 -0
- package/dist/cjs/xpl-table-header.cjs.entry.js +1 -1
- package/dist/cjs/xpl-table-row.cjs.entry.js +20 -0
- package/dist/cjs/xpl-table.cjs.entry.js +5 -5
- package/dist/cjs/xpl-tabs.cjs.entry.js +5 -5
- package/dist/cjs/xpl-toast.cjs.entry.js +2 -2
- package/dist/cjs/xpl-toggle.cjs.entry.js +3 -3
- package/dist/cjs/xpl-toolbar.cjs.entry.js +2 -2
- package/dist/cjs/xpl-tooltip.cjs.entry.js +1 -1
- package/dist/cjs/xpl-top-nav-item.cjs.entry.js +2 -2
- package/dist/cjs/xpl-top-nav-menu.cjs.entry.js +2 -2
- package/dist/cjs/xpl-top-nav.cjs.entry.js +5 -5
- package/dist/cjs/xpl-utility-bar.cjs.entry.js +1 -1
- package/dist/collection/collection-manifest.json +4 -0
- package/dist/collection/components/xpl-accordion/xpl-accordion.js +2 -2
- package/dist/collection/components/xpl-application-shell/xpl-application-shell.js +1 -1
- package/dist/collection/components/xpl-avatar/xpl-avatar.js +1 -0
- package/dist/collection/components/xpl-backdrop/xpl-backdrop.js +1 -1
- package/dist/collection/components/xpl-badge/xpl-badge.js +1 -1
- package/dist/collection/components/xpl-banner/xpl-banner.js +2 -2
- package/dist/collection/components/xpl-breadcrumbs/xpl-breadcrumb-item/xpl-breadcrumb-item.js +1 -1
- package/dist/collection/components/xpl-breadcrumbs/xpl-breadcrumbs/xpl-breadcrumbs.js +1 -1
- package/dist/collection/components/xpl-button/xpl-button.js +1 -1
- package/dist/collection/components/xpl-button-row/xpl-button-row.js +1 -1
- package/dist/collection/components/xpl-calendar/xpl-calendar.js +1 -1
- package/dist/collection/components/xpl-checkbox/xpl-checkbox.js +3 -3
- package/dist/collection/components/xpl-choicelist/xpl-choicelist.js +1 -1
- package/dist/collection/components/xpl-content-area/xpl-content-area.js +1 -1
- package/dist/collection/components/xpl-dashboard/xpl-dashboard.js +1 -1
- package/dist/collection/components/xpl-data-card/xpl-data-card.js +2 -2
- package/dist/collection/components/xpl-divider/xpl-divider.js +1 -1
- package/dist/collection/components/xpl-dropdown/xpl-dropdown-group/xpl-dropdown-group.js +1 -1
- package/dist/collection/components/xpl-dropdown/xpl-dropdown-heading/xpl-dropdown-heading.js +1 -1
- package/dist/collection/components/xpl-dropdown/xpl-dropdown-option/xpl-dropdown-option.js +2 -2
- package/dist/collection/components/xpl-dropdown/xpl-dropdown.js +10 -7
- package/dist/collection/components/xpl-dynamic-table/xpl-dynamic-table.js +2 -2
- package/dist/collection/components/xpl-dynamic-table-cell/xpl-dynamic-table-cell.js +2 -2
- package/dist/collection/components/xpl-dynamic-table-row/xpl-dynamic-table-row.js +2 -2
- package/dist/collection/components/xpl-grid/xpl-grid.js +1 -1
- package/dist/collection/components/xpl-grid-item/xpl-grid-item.js +1 -1
- package/dist/collection/components/xpl-header-accordion/xpl-header-accordion.js +1 -1
- package/dist/collection/components/xpl-icon/xpl-icon.js +2 -2
- package/dist/collection/components/xpl-input/xpl-input-color/color-utils.js +5 -5
- package/dist/collection/components/xpl-input/xpl-input-color/xpl-input-color.js +8 -8
- package/dist/collection/components/xpl-input/xpl-input-date/xpl-input-date.js +3 -3
- package/dist/collection/components/xpl-input/xpl-input-file/xpl-input-file.js +4 -4
- package/dist/collection/components/xpl-input/xpl-input-phone/xpl-input-phone.js +5 -5
- package/dist/collection/components/xpl-input/xpl-input-search/xpl-input-search.js +1 -1
- package/dist/collection/components/xpl-input/xpl-input-time/xpl-input-time.js +2 -2
- package/dist/collection/components/xpl-input/xpl-input.js +7 -6
- package/dist/collection/components/xpl-large-card/xpl-large-card.js +1 -1
- package/dist/collection/components/xpl-list/xpl-list.js +2 -2
- package/dist/collection/components/xpl-main-nav/xpl-main-nav.js +1 -1
- package/dist/collection/components/xpl-modal/xpl-modal.js +50 -21
- package/dist/collection/components/xpl-nav-item/xpl-nav-item.js +2 -2
- package/dist/collection/components/xpl-pagination/xpl-pagination.js +4 -4
- package/dist/collection/components/xpl-panel/xpl-panel.js +2 -2
- package/dist/collection/components/xpl-popover/xpl-popover.js +4 -4
- package/dist/collection/components/xpl-progress-bar/xpl-progress-bar.js +2 -2
- package/dist/collection/components/xpl-progress-indicator/xpl-progress-indicator.js +1 -1
- package/dist/collection/components/xpl-radio/xpl-radio.js +3 -3
- package/dist/collection/components/xpl-secondary-nav/xpl-secondary-nav.js +1 -1
- package/dist/collection/components/xpl-select/select.shared.js +82 -0
- package/dist/collection/components/xpl-select/xpl-select.js +6 -6
- package/dist/collection/components/xpl-side-nav/xpl-side-nav-header-item/xpl-side-nav-header-item.js +2 -2
- package/dist/collection/components/xpl-side-nav/xpl-side-nav-item/xpl-side-nav-item.js +2 -2
- package/dist/collection/components/xpl-side-nav/xpl-side-nav-section/xpl-side-nav-section.js +5 -5
- package/dist/collection/components/xpl-side-nav/xpl-side-nav.js +8 -4
- package/dist/collection/components/xpl-skeleton/xpl-skeleton.js +1 -1
- package/dist/collection/components/xpl-slideout/xpl-slideout.js +1 -1
- package/dist/collection/components/xpl-tab-panel/xpl-tab-panel.js +2 -2
- package/dist/collection/components/xpl-table/xpl-table-body/xpl-table-body.js +7 -0
- package/dist/collection/components/xpl-table/xpl-table-footer/xpl-table-footer.js +7 -0
- package/dist/collection/components/xpl-table/xpl-table-footer-cell/xpl-table-footer-cell.js +37 -0
- package/dist/collection/components/xpl-table/xpl-table-row/xpl-table-row.js +78 -0
- package/dist/collection/components/xpl-table/xpl-table.js +5 -5
- package/dist/collection/components/xpl-table-header/xpl-table-header.js +1 -1
- package/dist/collection/components/xpl-tabs/tabs.shared.js +0 -33
- package/dist/collection/components/xpl-tabs/xpl-tabs.js +5 -5
- package/dist/collection/components/xpl-tag/xpl-tag.js +2 -2
- package/dist/collection/components/xpl-toast/xpl-toast.js +2 -2
- package/dist/collection/components/xpl-toggle/xpl-toggle.js +3 -3
- package/dist/collection/components/xpl-toolbar/xpl-toolbar.js +2 -2
- package/dist/collection/components/xpl-tooltip/xpl-tooltip.js +1 -1
- package/dist/collection/components/xpl-top-nav/xpl-nav-header-menu/xpl-nav-header-menu.js +2 -2
- package/dist/collection/components/xpl-top-nav/xpl-top-nav-item/xpl-top-nav-item.js +2 -2
- package/dist/collection/components/xpl-top-nav/xpl-top-nav-menu/xpl-top-nav-menu.js +2 -2
- package/dist/collection/components/xpl-top-nav/xpl-top-nav.js +5 -5
- package/dist/collection/components/xpl-utility-bar/xpl-utility-bar.js +1 -1
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.js +1 -1
- package/dist/components/p-9VnxPQLs.js +1 -0
- package/dist/components/p-B2oLZUDD.js +1 -0
- package/dist/components/p-BYYFsuD3.js +1 -0
- package/dist/components/p-BZtxVB1R.js +1 -0
- package/dist/components/{p-BGqQbjLl.js → p-BdpZR4KO.js} +1 -1
- package/dist/components/{p-DywQ3S73.js → p-Chpgh5SL.js} +1 -1
- package/dist/components/{p-2jYZ7ACH.js → p-CiHTfk3E.js} +1 -1
- package/dist/components/p-CnVGKN63.js +1 -0
- package/dist/components/p-Cz7zDaI4.js +1 -0
- package/dist/components/{p-CjbPCnPP.js → p-D--kzomA.js} +1 -1
- package/dist/components/p-D4rv6CNJ.js +1 -0
- package/dist/components/{p-Dzp5p-eh.js → p-DAb-txW3.js} +1 -1
- package/dist/components/p-DYmvElhR.js +1 -0
- package/dist/components/{p-DsRsm61K.js → p-EfW0v54z.js} +1 -1
- package/dist/components/{p-DWUJ_jsx.js → p-JyNpXfDe.js} +1 -1
- package/dist/components/{p-DS2Kv5fl.js → p-U0JYwf4c.js} +1 -1
- package/dist/components/p-YG9Jza0y.js +1 -0
- package/dist/components/{p-imCMp2Nl.js → p-l3EZ-agL.js} +1 -1
- package/dist/components/p-oIn1krdu.js +1 -0
- package/dist/components/p-wIU7KUhA.js +1 -0
- package/dist/components/{p-BnTsRbko.js → p-xFsB212F.js} +1 -1
- package/dist/components/p-xtOHikY0.js +1 -0
- package/dist/components/xpl-accordion.js +1 -1
- package/dist/components/xpl-application-shell.js +1 -1
- package/dist/components/xpl-avatar.js +1 -1
- package/dist/components/xpl-backdrop.js +1 -1
- package/dist/components/xpl-badge.js +1 -1
- package/dist/components/xpl-banner.js +1 -1
- package/dist/components/xpl-breadcrumb-item.js +1 -1
- package/dist/components/xpl-breadcrumbs.js +1 -1
- package/dist/components/xpl-button-row.js +1 -1
- package/dist/components/xpl-button.js +1 -1
- package/dist/components/xpl-calendar.js +1 -1
- package/dist/components/xpl-checkbox.js +1 -1
- package/dist/components/xpl-choicelist.js +1 -1
- package/dist/components/xpl-content-area.js +1 -1
- package/dist/components/xpl-dashboard.js +1 -1
- package/dist/components/xpl-data-card.js +1 -1
- package/dist/components/xpl-divider.js +1 -1
- package/dist/components/xpl-dropdown-group.js +1 -1
- package/dist/components/xpl-dropdown-heading.js +1 -1
- package/dist/components/xpl-dropdown-option.js +1 -1
- package/dist/components/xpl-dropdown.js +1 -1
- package/dist/components/xpl-dynamic-table-cell.js +1 -1
- package/dist/components/xpl-dynamic-table-row.js +1 -1
- package/dist/components/xpl-dynamic-table.js +1 -1
- package/dist/components/xpl-grid-item.js +1 -1
- package/dist/components/xpl-grid.js +1 -1
- package/dist/components/xpl-header-accordion.js +1 -1
- package/dist/components/xpl-icon.js +1 -1
- package/dist/components/xpl-input-color.js +1 -1
- package/dist/components/xpl-input-date.js +1 -1
- package/dist/components/xpl-input-file.js +1 -1
- package/dist/components/xpl-input-phone.js +1 -1
- package/dist/components/xpl-input-search.js +1 -1
- package/dist/components/xpl-input-time.js +1 -1
- package/dist/components/xpl-input.js +1 -1
- package/dist/components/xpl-large-card.js +1 -1
- package/dist/components/xpl-list-item.js +1 -1
- package/dist/components/xpl-list.js +1 -1
- package/dist/components/xpl-main-nav.js +1 -1
- package/dist/components/xpl-modal.js +1 -1
- package/dist/components/xpl-nav-header-menu.js +1 -1
- package/dist/components/xpl-nav-item.js +1 -1
- package/dist/components/xpl-pagination.js +1 -1
- package/dist/components/xpl-panel.js +1 -1
- package/dist/components/xpl-popover.js +1 -1
- package/dist/components/xpl-progress-bar.js +1 -1
- package/dist/components/xpl-progress-indicator.js +1 -1
- package/dist/components/xpl-radio.js +1 -1
- package/dist/components/xpl-secondary-nav.js +1 -1
- package/dist/components/xpl-select.js +1 -1
- package/dist/components/xpl-side-nav-header-item.js +1 -1
- package/dist/components/xpl-side-nav-item.js +1 -1
- package/dist/components/xpl-side-nav-section.js +1 -1
- package/dist/components/xpl-side-nav.js +1 -1
- package/dist/components/xpl-skeleton.js +1 -1
- package/dist/components/xpl-slideout.js +1 -1
- package/dist/components/xpl-spotlight.js +1 -1
- package/dist/components/xpl-tab-panel.js +1 -1
- package/dist/components/xpl-tab.js +1 -1
- package/dist/components/xpl-table-body.d.ts +11 -0
- package/dist/components/xpl-table-body.js +1 -0
- package/dist/components/xpl-table-footer-cell.d.ts +11 -0
- package/dist/components/xpl-table-footer-cell.js +1 -0
- package/dist/components/xpl-table-footer.d.ts +11 -0
- package/dist/components/xpl-table-footer.js +1 -0
- package/dist/components/xpl-table-header-cell.js +1 -1
- package/dist/components/xpl-table-header.js +1 -1
- package/dist/components/xpl-table-row.d.ts +11 -0
- package/dist/components/xpl-table-row.js +1 -0
- package/dist/components/xpl-table.js +1 -1
- package/dist/components/xpl-tabs.js +1 -1
- package/dist/components/xpl-tag.js +1 -1
- package/dist/components/xpl-toast.js +1 -1
- package/dist/components/xpl-toggle.js +1 -1
- package/dist/components/xpl-toolbar.js +1 -1
- package/dist/components/xpl-tooltip.js +1 -1
- package/dist/components/xpl-top-nav-item.js +1 -1
- package/dist/components/xpl-top-nav-menu.js +1 -1
- package/dist/components/xpl-top-nav.js +1 -1
- package/dist/components/xpl-utility-bar.js +1 -1
- package/dist/docs/xpl-modal/readme.md +18 -2
- package/dist/docs/xpl-table/xpl-table-body/readme.md +16 -0
- package/dist/docs/xpl-table/xpl-table-footer/readme.md +16 -0
- package/dist/docs/xpl-table/xpl-table-footer-cell/readme.md +31 -0
- package/dist/docs/xpl-table/xpl-table-row/readme.md +34 -0
- package/dist/docs.json +207 -6
- package/dist/esm/apollo-core.js +1 -1
- package/dist/esm/index-ukZKsqqq.js +16 -0
- package/dist/esm/loader.js +1 -1
- package/dist/esm/xpl-accordion.entry.js +2 -2
- package/dist/esm/xpl-application-shell.entry.js +1 -1
- package/dist/esm/xpl-avatar_3.entry.js +5 -4
- package/dist/esm/xpl-backdrop.entry.js +1 -1
- package/dist/esm/xpl-badge.entry.js +1 -1
- package/dist/esm/xpl-banner.entry.js +2 -2
- package/dist/esm/xpl-breadcrumb-item.entry.js +1 -1
- package/dist/esm/xpl-breadcrumbs.entry.js +1 -1
- package/dist/esm/xpl-button-row.entry.js +1 -1
- package/dist/esm/xpl-button.entry.js +1 -1
- package/dist/esm/xpl-calendar.entry.js +1 -1
- package/dist/esm/xpl-checkbox.entry.js +3 -3
- package/dist/esm/xpl-choicelist.entry.js +1 -1
- package/dist/esm/xpl-content-area.entry.js +1 -1
- package/dist/esm/xpl-dashboard.entry.js +1 -1
- package/dist/esm/xpl-data-card.entry.js +2 -2
- package/dist/esm/xpl-dropdown_4.entry.js +14 -11
- package/dist/esm/xpl-dynamic-table-cell.entry.js +2 -2
- package/dist/esm/xpl-dynamic-table-row.entry.js +2 -2
- package/dist/esm/xpl-dynamic-table.entry.js +2 -2
- package/dist/esm/xpl-grid-item.entry.js +1 -1
- package/dist/esm/xpl-grid.entry.js +1 -1
- package/dist/esm/xpl-header-accordion.entry.js +1 -1
- package/dist/esm/xpl-icon.entry.js +2 -2
- package/dist/esm/xpl-input-color.entry.js +13 -13
- package/dist/esm/xpl-input-phone.entry.js +5 -5
- package/dist/esm/xpl-input-time.entry.js +2 -2
- package/dist/esm/xpl-input_4.entry.js +15 -14
- package/dist/esm/xpl-large-card.entry.js +1 -1
- package/dist/esm/xpl-list.entry.js +2 -2
- package/dist/esm/xpl-main-nav.entry.js +1 -1
- package/dist/esm/xpl-modal.entry.js +50 -21
- package/dist/esm/xpl-nav-header-menu.entry.js +2 -2
- package/dist/esm/xpl-nav-item.entry.js +2 -2
- package/dist/esm/xpl-pagination.entry.js +4 -4
- package/dist/esm/xpl-panel.entry.js +2 -2
- package/dist/esm/xpl-popover.entry.js +4 -4
- package/dist/esm/xpl-progress-bar.entry.js +2 -2
- package/dist/esm/xpl-progress-indicator.entry.js +1 -1
- package/dist/esm/xpl-secondary-nav.entry.js +1 -1
- package/dist/esm/xpl-select_2.entry.js +8 -8
- package/dist/esm/xpl-side-nav-header-item.entry.js +2 -2
- package/dist/esm/xpl-side-nav-item.entry.js +2 -2
- package/dist/esm/xpl-side-nav-section.entry.js +5 -5
- package/dist/esm/xpl-side-nav.entry.js +8 -4
- package/dist/esm/xpl-skeleton.entry.js +1 -1
- package/dist/esm/xpl-slideout.entry.js +1 -1
- package/dist/esm/xpl-tab-panel.entry.js +2 -2
- package/dist/esm/xpl-table-body.entry.js +12 -0
- package/dist/esm/xpl-table-footer-cell.entry.js +16 -0
- package/dist/esm/xpl-table-footer.entry.js +12 -0
- package/dist/esm/xpl-table-header.entry.js +1 -1
- package/dist/esm/xpl-table-row.entry.js +18 -0
- package/dist/esm/xpl-table.entry.js +5 -5
- package/dist/esm/xpl-tabs.entry.js +5 -5
- package/dist/esm/xpl-toast.entry.js +2 -2
- package/dist/esm/xpl-toggle.entry.js +3 -3
- package/dist/esm/xpl-toolbar.entry.js +2 -2
- package/dist/esm/xpl-tooltip.entry.js +1 -1
- package/dist/esm/xpl-top-nav-item.entry.js +2 -2
- package/dist/esm/xpl-top-nav-menu.entry.js +2 -2
- package/dist/esm/xpl-top-nav.entry.js +5 -5
- package/dist/esm/xpl-utility-bar.entry.js +1 -1
- package/dist/types/components/xpl-modal/xpl-modal.d.ts +7 -1
- package/dist/types/components/xpl-select/select.shared.d.ts +23 -0
- package/dist/types/components/xpl-table/xpl-table-body/xpl-table-body.d.ts +3 -0
- package/dist/types/components/xpl-table/xpl-table-footer/xpl-table-footer.d.ts +3 -0
- package/dist/types/components/xpl-table/xpl-table-footer-cell/xpl-table-footer-cell.d.ts +4 -0
- package/dist/types/components/xpl-table/xpl-table-row/xpl-table-row.d.ts +6 -0
- package/dist/types/components/xpl-tabs/tabs.shared.d.ts +0 -2
- package/dist/types/components.d.ts +98 -0
- package/hydrate/index.js +302 -176
- package/hydrate/index.mjs +302 -176
- package/package.json +42 -46
- package/dist/apollo-core/p-0095174c.entry.js +0 -1
- package/dist/apollo-core/p-020ecd66.entry.js +0 -1
- package/dist/apollo-core/p-091411e3.entry.js +0 -1
- package/dist/apollo-core/p-0be4dbb8.entry.js +0 -1
- package/dist/apollo-core/p-1139fac0.entry.js +0 -1
- package/dist/apollo-core/p-140a96c7.entry.js +0 -1
- package/dist/apollo-core/p-26b6a0ed.entry.js +0 -1
- package/dist/apollo-core/p-39e71d86.entry.js +0 -1
- package/dist/apollo-core/p-3dd1de49.entry.js +0 -1
- package/dist/apollo-core/p-4129d971.entry.js +0 -1
- package/dist/apollo-core/p-5afc9831.entry.js +0 -1
- package/dist/apollo-core/p-5d25a84a.entry.js +0 -1
- package/dist/apollo-core/p-5e5c5016.entry.js +0 -1
- package/dist/apollo-core/p-638fd9b1.entry.js +0 -1
- package/dist/apollo-core/p-724c5038.entry.js +0 -1
- package/dist/apollo-core/p-80a11cad.entry.js +0 -1
- package/dist/apollo-core/p-875e0eaa.entry.js +0 -1
- package/dist/apollo-core/p-8ddbf2e2.entry.js +0 -1
- package/dist/apollo-core/p-a33b0943.entry.js +0 -1
- package/dist/apollo-core/p-ba41bbd5.entry.js +0 -1
- package/dist/apollo-core/p-cde21f72.entry.js +0 -1
- package/dist/apollo-core/p-d288c1d1.entry.js +0 -1
- package/dist/apollo-core/p-d3f2b8b8.entry.js +0 -1
- package/dist/apollo-core/p-dfaba114.entry.js +0 -1
- package/dist/apollo-core/p-e2a16242.entry.js +0 -1
- package/dist/apollo-core/p-ec488f9c.entry.js +0 -1
- package/dist/apollo-core/p-f2bfe6a6.entry.js +0 -1
- package/dist/collection/components/xpl-accordion/accordion.stories.js +0 -84
- package/dist/collection/components/xpl-application-shell/application-shell.stories.js +0 -755
- package/dist/collection/components/xpl-avatar/avatar.stories.js +0 -157
- package/dist/collection/components/xpl-backdrop/backdrop.stories.js +0 -38
- package/dist/collection/components/xpl-badge/badge.stories.js +0 -104
- package/dist/collection/components/xpl-banner/banner.stories.js +0 -69
- package/dist/collection/components/xpl-breadcrumbs/breadcrumbs.stories.js +0 -139
- package/dist/collection/components/xpl-button/button.stories.js +0 -144
- package/dist/collection/components/xpl-button-row/button-row.stories.js +0 -68
- package/dist/collection/components/xpl-calendar/calendar.stories.js +0 -71
- package/dist/collection/components/xpl-checkbox/checkbox.stories.js +0 -92
- package/dist/collection/components/xpl-choicelist/choicelist.stories.js +0 -162
- package/dist/collection/components/xpl-content-area/content-area.stories.js +0 -44
- package/dist/collection/components/xpl-dashboard/dashboard.stories.js +0 -57
- package/dist/collection/components/xpl-data-card/data-card.stories.js +0 -170
- package/dist/collection/components/xpl-divider/divider.stories.js +0 -47
- package/dist/collection/components/xpl-dropdown/dropdown.stories.js +0 -395
- package/dist/collection/components/xpl-dynamic-table/dynamic-table.stories.js +0 -169
- package/dist/collection/components/xpl-grid/grid.stories.js +0 -85
- package/dist/collection/components/xpl-header-accordion/header-accordion.stories.js +0 -56
- package/dist/collection/components/xpl-icon/icons.stories.js +0 -161
- package/dist/collection/components/xpl-input/input.stories.js +0 -712
- package/dist/collection/components/xpl-large-card/large-card.stories.js +0 -155
- package/dist/collection/components/xpl-list/list.stories.js +0 -398
- package/dist/collection/components/xpl-main-nav/main-nav.stories.js +0 -312
- package/dist/collection/components/xpl-modal/modal.stories.js +0 -100
- package/dist/collection/components/xpl-pagination/pagination.stories.js +0 -65
- package/dist/collection/components/xpl-panel/panel.stories.js +0 -62
- package/dist/collection/components/xpl-popover/popover.stories.js +0 -174
- package/dist/collection/components/xpl-progress-bar/progress-bar.stories.js +0 -105
- package/dist/collection/components/xpl-progress-indicator/progress-indicator.stories.js +0 -126
- package/dist/collection/components/xpl-radio/radio.stories.js +0 -115
- package/dist/collection/components/xpl-secondary-nav/secondary-nav.stories.js +0 -83
- package/dist/collection/components/xpl-select/select.stories.js +0 -300
- package/dist/collection/components/xpl-side-nav/side-nav.stories.js +0 -1070
- package/dist/collection/components/xpl-skeleton/skeleton.stories.js +0 -80
- package/dist/collection/components/xpl-slideout/slideout.stories.js +0 -122
- package/dist/collection/components/xpl-spotlight/spotlight.stories.js +0 -392
- package/dist/collection/components/xpl-table/table.stories.js +0 -156
- package/dist/collection/components/xpl-table-header/table-header.stories.js +0 -134
- package/dist/collection/components/xpl-table-header-cell/table-header-cell.stories.js +0 -83
- package/dist/collection/components/xpl-tabs/segment-control.stories.js +0 -40
- package/dist/collection/components/xpl-tabs/tabs.stories.js +0 -43
- package/dist/collection/components/xpl-tag/tag.stories.js +0 -159
- package/dist/collection/components/xpl-toast/toast.stories.js +0 -112
- package/dist/collection/components/xpl-toggle/toggle.stories.js +0 -95
- package/dist/collection/components/xpl-toolbar/toolbar.stories.js +0 -39
- package/dist/collection/components/xpl-tooltip/tooltip.stories.js +0 -67
- package/dist/collection/components/xpl-top-nav/top-nav.stories.js +0 -764
- package/dist/collection/components/xpl-utility-bar/utility-bar.stories.js +0 -94
- package/dist/components/p-Bseq_BgD.js +0 -1
- package/dist/components/p-CCgZCY_A.js +0 -1
- package/dist/components/p-CJzsLWeV.js +0 -1
- package/dist/components/p-CRKY79vL.js +0 -1
- package/dist/components/p-Cjxw-qOg.js +0 -1
- package/dist/components/p-D6JUVA1x.js +0 -1
- package/dist/components/p-DFGw0APN.js +0 -1
- package/dist/components/p-DLLQBDCb.js +0 -1
- package/dist/components/p-Di1NDy0w.js +0 -1
- package/dist/components/p-DkM7jyQB.js +0 -1
- package/dist/components/p-Mehog36m.js +0 -1
- package/dist/components/p-RYnBuuDE.js +0 -1
- package/dist/css/typography.stories.js +0 -153
- package/dist/types/components/xpl-accordion/accordion.stories.d.ts +0 -46
- package/dist/types/components/xpl-application-shell/application-shell.stories.d.ts +0 -46
- package/dist/types/components/xpl-avatar/avatar.stories.d.ts +0 -39
- package/dist/types/components/xpl-backdrop/backdrop.stories.d.ts +0 -23
- package/dist/types/components/xpl-badge/badge.stories.d.ts +0 -87
- package/dist/types/components/xpl-banner/banner.stories.d.ts +0 -79
- package/dist/types/components/xpl-breadcrumbs/breadcrumbs.stories.d.ts +0 -40
- package/dist/types/components/xpl-button/button.stories.d.ts +0 -136
- package/dist/types/components/xpl-button-row/button-row.stories.d.ts +0 -34
- package/dist/types/components/xpl-calendar/calendar.stories.d.ts +0 -45
- package/dist/types/components/xpl-checkbox/checkbox.stories.d.ts +0 -51
- package/dist/types/components/xpl-choicelist/choicelist.stories.d.ts +0 -30
- package/dist/types/components/xpl-content-area/content-area.stories.d.ts +0 -19
- package/dist/types/components/xpl-dashboard/dashboard.stories.d.ts +0 -22
- package/dist/types/components/xpl-data-card/data-card.stories.d.ts +0 -113
- package/dist/types/components/xpl-divider/divider.stories.d.ts +0 -28
- package/dist/types/components/xpl-dropdown/dropdown.stories.d.ts +0 -177
- package/dist/types/components/xpl-dynamic-table/dynamic-table.stories.d.ts +0 -30
- package/dist/types/components/xpl-grid/grid.stories.d.ts +0 -109
- package/dist/types/components/xpl-header-accordion/header-accordion.stories.d.ts +0 -32
- package/dist/types/components/xpl-icon/icons.stories.d.ts +0 -31
- package/dist/types/components/xpl-input/input.stories.d.ts +0 -441
- package/dist/types/components/xpl-large-card/large-card.stories.d.ts +0 -57
- package/dist/types/components/xpl-list/list.stories.d.ts +0 -385
- package/dist/types/components/xpl-main-nav/main-nav.stories.d.ts +0 -19
- package/dist/types/components/xpl-modal/modal.stories.d.ts +0 -103
- package/dist/types/components/xpl-pagination/pagination.stories.d.ts +0 -31
- package/dist/types/components/xpl-panel/panel.stories.d.ts +0 -30
- package/dist/types/components/xpl-popover/popover.stories.d.ts +0 -21
- package/dist/types/components/xpl-progress-bar/progress-bar.stories.d.ts +0 -62
- package/dist/types/components/xpl-progress-indicator/progress-indicator.stories.d.ts +0 -64
- package/dist/types/components/xpl-radio/radio.stories.d.ts +0 -96
- package/dist/types/components/xpl-secondary-nav/secondary-nav.stories.d.ts +0 -8
- package/dist/types/components/xpl-select/select.stories.d.ts +0 -158
- package/dist/types/components/xpl-side-nav/side-nav.stories.d.ts +0 -173
- package/dist/types/components/xpl-skeleton/skeleton.stories.d.ts +0 -36
- package/dist/types/components/xpl-slideout/slideout.stories.d.ts +0 -124
- package/dist/types/components/xpl-spotlight/spotlight.stories.d.ts +0 -203
- package/dist/types/components/xpl-table/table.stories.d.ts +0 -67
- package/dist/types/components/xpl-table-header/table-header.stories.d.ts +0 -80
- package/dist/types/components/xpl-table-header-cell/table-header-cell.stories.d.ts +0 -36
- package/dist/types/components/xpl-tabs/segment-control.stories.d.ts +0 -134
- package/dist/types/components/xpl-tabs/tabs.stories.d.ts +0 -107
- package/dist/types/components/xpl-tag/tag.stories.d.ts +0 -68
- package/dist/types/components/xpl-toast/toast.stories.d.ts +0 -70
- package/dist/types/components/xpl-toggle/toggle.stories.d.ts +0 -53
- package/dist/types/components/xpl-toolbar/toolbar.stories.d.ts +0 -35
- package/dist/types/components/xpl-tooltip/tooltip.stories.d.ts +0 -29
- package/dist/types/components/xpl-top-nav/top-nav.stories.d.ts +0 -549
- package/dist/types/components/xpl-utility-bar/utility-bar.stories.d.ts +0 -27
- package/dist/types/home/runner/work/apollo/apollo/packages/apollo-core/.stencil/.storybook/utils/story-function.d.ts +0 -11
- package/dist/types/home/runner/work/apollo/apollo/packages/apollo-core/.stencil/.storybook/utils/wait-for-hydration.d.ts +0 -1
- package/dist/types/home/runner/work/apollo/apollo/packages/apollo-core/.stencil/src/css/typography.stories.d.ts +0 -76
- /package/dist/types/home/runner/work/apollo/apollo/packages/apollo-core/.stencil/{src/utils → utils}/form-bindings.d.ts +0 -0
- /package/dist/types/home/runner/work/apollo/apollo/packages/apollo-core/.stencil/{src/utils → utils}/story-vrt.d.ts +0 -0
|
@@ -1,1070 +0,0 @@
|
|
|
1
|
-
import { setAutoSnapshotOptions } from "vitest-plugin-vis";
|
|
2
|
-
import { waitForHydration } from "../../../../.storybook/utils/wait-for-hydration";
|
|
3
|
-
const escapeHtmlAttribute = (value) => value
|
|
4
|
-
.replace(/&/g, '&')
|
|
5
|
-
.replace(/"/g, '"')
|
|
6
|
-
.replace(/'/g, ''')
|
|
7
|
-
.replace(/</g, '<')
|
|
8
|
-
.replace(/>/g, '>');
|
|
9
|
-
const renderHeaderItemWebComponent = (headerItem) => {
|
|
10
|
-
const attrs = [
|
|
11
|
-
`type="${headerItem.type}"`,
|
|
12
|
-
headerItem.label ? `label="${escapeHtmlAttribute(headerItem.label)}"` : '',
|
|
13
|
-
headerItem.icon ? `icon="${escapeHtmlAttribute(headerItem.icon)}"` : '',
|
|
14
|
-
headerItem.type === 'sub-account' && headerItem.selected ? 'selected' : '',
|
|
15
|
-
]
|
|
16
|
-
.filter(Boolean)
|
|
17
|
-
.join(' ');
|
|
18
|
-
return `<xpl-side-nav-header-item ${attrs}></xpl-side-nav-header-item>`;
|
|
19
|
-
};
|
|
20
|
-
const renderHeaderItemsWebComponent = (headerItems) => {
|
|
21
|
-
if (!headerItems?.length)
|
|
22
|
-
return '';
|
|
23
|
-
const rows = headerItems.map(renderHeaderItemWebComponent).join('');
|
|
24
|
-
return `<div slot="nav-header">${rows}</div>`;
|
|
25
|
-
};
|
|
26
|
-
const renderHeaderItemHtml = (headerItem) => {
|
|
27
|
-
const isSubAccount = headerItem.type === 'sub-account';
|
|
28
|
-
const leading = headerItem.icon
|
|
29
|
-
? `<span class="xpl-side-nav-header-item__leading"><xpl-icon icon="${escapeHtmlAttribute(headerItem.icon)}" size="16"></xpl-icon></span>`
|
|
30
|
-
: '';
|
|
31
|
-
const trailing = isSubAccount
|
|
32
|
-
? `<span class="xpl-side-nav-header-item__trailing" aria-hidden="true"><xpl-icon icon="chevron-expand-y" size="16"></xpl-icon></span>`
|
|
33
|
-
: '';
|
|
34
|
-
const label = `<span class="xpl-side-nav-header-item__label">${escapeHtmlAttribute(headerItem.label)}</span>`;
|
|
35
|
-
const content = `<span class="xpl-side-nav-header-item__content">${leading}${label}${trailing}</span>`;
|
|
36
|
-
const inner = isSubAccount
|
|
37
|
-
? `<button type="button" class="xpl-side-nav-header-item__header">${content}</button>`
|
|
38
|
-
: `<div class="xpl-side-nav-header-item__header">${content}</div>`;
|
|
39
|
-
const modifiers = [
|
|
40
|
-
isSubAccount
|
|
41
|
-
? 'xpl-side-nav-header-item--sub-account'
|
|
42
|
-
: 'xpl-side-nav-header-item--product-label',
|
|
43
|
-
isSubAccount && headerItem.selected ? 'xpl-side-nav-header-item--selected' : '',
|
|
44
|
-
]
|
|
45
|
-
.filter(Boolean)
|
|
46
|
-
.join(' ');
|
|
47
|
-
return `<div class="xpl-side-nav-header-item ${modifiers}">${inner}</div>`;
|
|
48
|
-
};
|
|
49
|
-
const renderHeaderItemsHtml = (headerItems) => {
|
|
50
|
-
if (!headerItems?.length)
|
|
51
|
-
return '';
|
|
52
|
-
const rows = headerItems.map(renderHeaderItemHtml).join('\n ');
|
|
53
|
-
return `<div class="xpl-side-nav__header">
|
|
54
|
-
${rows}
|
|
55
|
-
</div>`;
|
|
56
|
-
};
|
|
57
|
-
const defaultItems = [
|
|
58
|
-
{ label: 'Dashboard', icon: 'house-4', selected: true },
|
|
59
|
-
{ label: 'Product', icon: 'bag-shopping-2' },
|
|
60
|
-
{ label: 'Reports', icon: 'chart-line' },
|
|
61
|
-
{ label: 'Disabled Item', icon: 'lock', disabled: true },
|
|
62
|
-
{ label: 'Hidden Item', icon: 'eye', hidden: true },
|
|
63
|
-
{
|
|
64
|
-
label: 'Settings',
|
|
65
|
-
icon: 'gear',
|
|
66
|
-
hasChildren: true,
|
|
67
|
-
expanded: true,
|
|
68
|
-
children: [{ label: 'Location' }, { label: 'Schedule', selected: true }],
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
label: 'Integrations',
|
|
72
|
-
icon: 'plug',
|
|
73
|
-
hasChildren: true,
|
|
74
|
-
children: [{ label: 'Webhooks' }, { label: 'API Keys' }],
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
label: 'Xplor Growth',
|
|
78
|
-
icon: 'chart-line-up',
|
|
79
|
-
trailingIcon: 'external-link',
|
|
80
|
-
},
|
|
81
|
-
{ kind: 'divider' },
|
|
82
|
-
{
|
|
83
|
-
kind: 'section',
|
|
84
|
-
label: 'Admin',
|
|
85
|
-
expanded: true,
|
|
86
|
-
badgeCount: '2',
|
|
87
|
-
children: [
|
|
88
|
-
{ label: 'Team Members', icon: 'user' },
|
|
89
|
-
{ label: 'Billing', icon: 'credit-card' },
|
|
90
|
-
],
|
|
91
|
-
},
|
|
92
|
-
{ kind: 'divider' },
|
|
93
|
-
];
|
|
94
|
-
const defaultFooterItems = [
|
|
95
|
-
{ label: 'Support', icon: 'headset' },
|
|
96
|
-
{ label: 'Logout', icon: 'open-rect-arrow-out' },
|
|
97
|
-
];
|
|
98
|
-
const defaultNavConfig = {
|
|
99
|
-
navLabel: 'Main navigation',
|
|
100
|
-
headerItems: [
|
|
101
|
-
{ type: 'product-label', label: 'Product Label' },
|
|
102
|
-
{ type: 'sub-account', label: 'Acme Inc', icon: 'office-3' },
|
|
103
|
-
],
|
|
104
|
-
items: defaultItems,
|
|
105
|
-
footerItems: defaultFooterItems,
|
|
106
|
-
};
|
|
107
|
-
const renderNavItem = (item) => {
|
|
108
|
-
if (item.kind === 'divider') {
|
|
109
|
-
return `\n <hr class="xpl-side-nav-divider" />`;
|
|
110
|
-
}
|
|
111
|
-
if (item.kind === 'section') {
|
|
112
|
-
const sectionAttrs = [
|
|
113
|
-
item.label ? `heading="${escapeHtmlAttribute(item.label)}"` : '',
|
|
114
|
-
item.collapsible === false ? 'collapsible="false"' : '',
|
|
115
|
-
item.expanded ? 'expanded' : '',
|
|
116
|
-
]
|
|
117
|
-
.filter(Boolean)
|
|
118
|
-
.join(' ');
|
|
119
|
-
const badgeSlot = item.badgeCount
|
|
120
|
-
? `\n <xpl-badge slot="badge" variant="purple" size="small">${escapeHtmlAttribute(item.badgeCount)}</xpl-badge>`
|
|
121
|
-
: '';
|
|
122
|
-
const sectionChildrenHtml = item.children?.map(renderNavItem).join('') ?? '';
|
|
123
|
-
return `
|
|
124
|
-
<xpl-side-nav-section ${sectionAttrs}>${badgeSlot}${sectionChildrenHtml}
|
|
125
|
-
</xpl-side-nav-section>`;
|
|
126
|
-
}
|
|
127
|
-
const attrs = [
|
|
128
|
-
item.label ? `label="${escapeHtmlAttribute(item.label)}"` : '',
|
|
129
|
-
item.icon ? `icon="${escapeHtmlAttribute(item.icon)}"` : '',
|
|
130
|
-
item.selected ? 'selected' : '',
|
|
131
|
-
item.disabled ? 'disabled' : '',
|
|
132
|
-
item.hidden ? 'hidden' : '',
|
|
133
|
-
item.expanded ? 'expanded' : '',
|
|
134
|
-
item.hasChildren ? 'has-children' : '',
|
|
135
|
-
item.link ? 'link' : '',
|
|
136
|
-
]
|
|
137
|
-
.filter(Boolean)
|
|
138
|
-
.join(' ');
|
|
139
|
-
if (item.link && item.href) {
|
|
140
|
-
const leadingIcon = item.icon
|
|
141
|
-
? `<xpl-icon icon="${escapeHtmlAttribute(item.icon)}" size="16"></xpl-icon>`
|
|
142
|
-
: '';
|
|
143
|
-
return `
|
|
144
|
-
<xpl-side-nav-item ${attrs}>
|
|
145
|
-
<a href="${escapeHtmlAttribute(item.href)}" class="xpl-side-nav-item__link"${item.selected ? ' aria-current="page"' : ''}><span class="xpl-side-nav-item__leading">${leadingIcon}</span><span class="xpl-side-nav-item__label">${escapeHtmlAttribute(item.label ?? '')}</span></a>
|
|
146
|
-
</xpl-side-nav-item>`;
|
|
147
|
-
}
|
|
148
|
-
const childrenHtml = item.children?.map(renderNavItem).join('') ?? '';
|
|
149
|
-
const trailingSlot = item.trailingIcon && !item.hasChildren
|
|
150
|
-
? `\n <xpl-icon slot="trailing" icon="${escapeHtmlAttribute(item.trailingIcon)}" size="16" aria-hidden="true"></xpl-icon>`
|
|
151
|
-
: '';
|
|
152
|
-
return `
|
|
153
|
-
<xpl-side-nav-item ${attrs}>${trailingSlot}${childrenHtml}
|
|
154
|
-
</xpl-side-nav-item>`;
|
|
155
|
-
};
|
|
156
|
-
let htmlSectionIdCounter = 0;
|
|
157
|
-
const renderHtmlNavItem = (item, depth = 0) => {
|
|
158
|
-
const indent = ' '.repeat(depth);
|
|
159
|
-
if (item.kind === 'divider') {
|
|
160
|
-
return `${indent}<hr class="xpl-side-nav-divider" />`;
|
|
161
|
-
}
|
|
162
|
-
if (item.kind === 'section') {
|
|
163
|
-
const collapsible = item.collapsible !== false;
|
|
164
|
-
const expanded = !collapsible || Boolean(item.expanded);
|
|
165
|
-
const childrenId = `side-nav-demo-section-children-${(htmlSectionIdCounter += 1)}`;
|
|
166
|
-
const sectionChildrenHtml = item.children?.map((child) => renderHtmlNavItem(child, depth + 2)).join('\n') ?? '';
|
|
167
|
-
const badgeHtml = item.badgeCount
|
|
168
|
-
? `${indent} <span class="xpl-side-nav-section__badge"><xpl-badge variant="purple" size="small">${item.badgeCount}</xpl-badge></span>\n`
|
|
169
|
-
: '';
|
|
170
|
-
const chevronHtml = collapsible
|
|
171
|
-
? `${indent} <span class="xpl-side-nav-section__chevron"><xpl-icon icon="${expanded ? 'chevron-down' : 'chevron-right'}" size="16" aria-hidden="true"></xpl-icon></span>\n`
|
|
172
|
-
: '';
|
|
173
|
-
const titleRowHtml = `${indent} <span class="xpl-side-nav-section__title">${item.label ?? ''}</span>\n${badgeHtml}${chevronHtml}`;
|
|
174
|
-
const headerHtml = collapsible
|
|
175
|
-
? `${indent} <button type="button" class="xpl-side-nav-section__header" aria-expanded="${expanded ? 'true' : 'false'}" aria-controls="${childrenId}">\n${titleRowHtml}${indent} </button>`
|
|
176
|
-
: `${indent} <div class="xpl-side-nav-section__header">\n${titleRowHtml}${indent} </div>`;
|
|
177
|
-
return `${indent}<div class="xpl-side-nav-section${collapsible ? '' : ' xpl-side-nav-section--static'}">
|
|
178
|
-
${headerHtml}
|
|
179
|
-
${indent} <div id="${childrenId}" class="xpl-side-nav-section__children${expanded ? ' expanded' : ''}">
|
|
180
|
-
${indent} <div class="xpl-side-nav-section__children-inner">
|
|
181
|
-
${sectionChildrenHtml ? `\n${sectionChildrenHtml}\n${indent} ` : ''}</div>
|
|
182
|
-
${indent} </div>
|
|
183
|
-
${indent}</div>`;
|
|
184
|
-
}
|
|
185
|
-
const linkClass = [
|
|
186
|
-
'xpl-side-nav-item__link',
|
|
187
|
-
item.selected ? 'selected' : '',
|
|
188
|
-
item.expanded ? 'expanded' : '',
|
|
189
|
-
]
|
|
190
|
-
.filter(Boolean)
|
|
191
|
-
.join(' ');
|
|
192
|
-
if (item.link) {
|
|
193
|
-
return `${indent}<div class="xpl-side-nav-item">
|
|
194
|
-
${indent} <a href="${item.href || '#'}" class="${linkClass}"${item.selected ? ' aria-current="page"' : ''}${item.disabled ? ' aria-disabled="true" tabindex="-1"' : ''}>
|
|
195
|
-
${indent} <span class="xpl-side-nav-item__leading">${item.icon ? `<xpl-icon icon="${item.icon}" size="16"></xpl-icon>` : ''}</span>
|
|
196
|
-
${indent} <span class="xpl-side-nav-item__label">${item.label}</span>
|
|
197
|
-
${indent} </a>
|
|
198
|
-
${indent}</div>`;
|
|
199
|
-
}
|
|
200
|
-
const hasChildren = item.hasChildren || (item.children && item.children.length > 0);
|
|
201
|
-
const childrenHtml = item.children?.map((child) => renderHtmlNavItem(child, depth + 2)).join('\n') ?? '';
|
|
202
|
-
const trailingHtml = hasChildren
|
|
203
|
-
? `<span class="xpl-side-nav-item__trailing xpl-side-nav-item__trailing--chevron${item.expanded ? ' expanded' : ''}"><xpl-icon icon="${item.expanded ? 'chevron-up' : 'chevron-down'}" size="16" aria-hidden="true"></xpl-icon></span>`
|
|
204
|
-
: item.trailingIcon
|
|
205
|
-
? `<span class="xpl-side-nav-item__trailing"><xpl-icon icon="${item.trailingIcon}" size="16" aria-hidden="true"></xpl-icon></span>`
|
|
206
|
-
: '';
|
|
207
|
-
return `${indent}<div class="xpl-side-nav-item">
|
|
208
|
-
${indent} <button type="button" class="${linkClass}"${item.selected ? ' aria-current="page"' : ''}${hasChildren ? ` aria-expanded="${item.expanded ? 'true' : 'false'}"` : ''}${item.disabled ? ' disabled' : ''}>
|
|
209
|
-
${indent} <span class="xpl-side-nav-item__leading">${item.icon ? `<xpl-icon icon="${item.icon}" size="16"></xpl-icon>` : ''}</span>
|
|
210
|
-
${indent} <span class="xpl-side-nav-item__label">${item.label}</span>
|
|
211
|
-
${indent} ${trailingHtml}
|
|
212
|
-
${indent} </button>${hasChildren && !item.link
|
|
213
|
-
? `
|
|
214
|
-
${indent} <div class="xpl-side-nav-item__children ${item.expanded ? 'expanded' : ''}">
|
|
215
|
-
${indent} <div class="xpl-side-nav-item__children-inner">
|
|
216
|
-
${childrenHtml ? `\n${childrenHtml}\n${indent} ` : ''}</div>
|
|
217
|
-
${indent} </div>`
|
|
218
|
-
: ''}
|
|
219
|
-
${indent}</div>`;
|
|
220
|
-
};
|
|
221
|
-
export default {
|
|
222
|
-
tags: ['vrt'],
|
|
223
|
-
beforeEach() {
|
|
224
|
-
setAutoSnapshotOptions({ enable: true });
|
|
225
|
-
},
|
|
226
|
-
async play({ canvasElement }) {
|
|
227
|
-
await waitForHydration(canvasElement);
|
|
228
|
-
},
|
|
229
|
-
title: 'Components/Navigation/Side Navigation',
|
|
230
|
-
component: 'xpl-side-nav',
|
|
231
|
-
parameters: {
|
|
232
|
-
layout: 'fullscreen',
|
|
233
|
-
},
|
|
234
|
-
};
|
|
235
|
-
const renderHtmlSideNav = (config) => {
|
|
236
|
-
const { navLabel, headerItems, items, footerItems } = config;
|
|
237
|
-
const headerHtml = renderHeaderItemsHtml(headerItems);
|
|
238
|
-
const itemsHtml = items.map((item) => renderHtmlNavItem(item, 4)).join('\n');
|
|
239
|
-
const footerHtml = footerItems.map((item) => renderHtmlNavItem(item, 4)).join('\n');
|
|
240
|
-
return `<div class="xpl-side-nav">
|
|
241
|
-
<div class="xpl-side-nav__wrapper">
|
|
242
|
-
<nav class="xpl-side-nav__content" aria-label="${escapeHtmlAttribute(navLabel)}">
|
|
243
|
-
<div class="xpl-side-nav__scroll-area">
|
|
244
|
-
${headerHtml}
|
|
245
|
-
<div class="xpl-side-nav__section">
|
|
246
|
-
${itemsHtml}
|
|
247
|
-
</div>
|
|
248
|
-
</div>
|
|
249
|
-
<div class="xpl-side-nav__footer">
|
|
250
|
-
${footerHtml}
|
|
251
|
-
</div>
|
|
252
|
-
</nav>
|
|
253
|
-
</div>
|
|
254
|
-
</div>`;
|
|
255
|
-
};
|
|
256
|
-
const SideNavigationWebComponent = (config) => {
|
|
257
|
-
const { navLabel, headerItems, items, footerItems } = config;
|
|
258
|
-
const headerHtml = renderHeaderItemsWebComponent(headerItems);
|
|
259
|
-
const itemsHtml = items.map(renderNavItem).join('');
|
|
260
|
-
const footerHtml = footerItems.map(renderNavItem).join('');
|
|
261
|
-
return `<xpl-side-nav label="${escapeHtmlAttribute(navLabel)}">${headerHtml}<div slot="section">${itemsHtml}</div><div slot="nav-footer">${footerHtml}</div></xpl-side-nav>`;
|
|
262
|
-
};
|
|
263
|
-
let sideNavClickController;
|
|
264
|
-
export const SideNavigation = {
|
|
265
|
-
args: {
|
|
266
|
-
navConfig: { ...defaultNavConfig },
|
|
267
|
-
},
|
|
268
|
-
argTypes: {
|
|
269
|
-
navConfig: {
|
|
270
|
-
control: 'object',
|
|
271
|
-
description: 'Full sidebar config (router-style): `navLabel`, `headerItems?[]`, `items[]`, `footerItems[]`. Each entry maps to `xpl-side-nav-item` markup by default; set `kind: \'section\'` for an `xpl-side-nav-section` accordion or `kind: \'divider\'` for a standalone `<hr class="xpl-side-nav-divider">` (no dedicated component). `headerItems` renders `slot="nav-header"` as one or more `xpl-side-nav-header-item` rows — omit or leave empty to hide the header.',
|
|
272
|
-
},
|
|
273
|
-
},
|
|
274
|
-
render: ({ navConfig }) => {
|
|
275
|
-
const { navLabel, headerItems, items, footerItems } = navConfig;
|
|
276
|
-
const headerHtml = renderHeaderItemsWebComponent(headerItems);
|
|
277
|
-
const itemsHtml = items.map(renderNavItem).join('');
|
|
278
|
-
const footerHtml = footerItems.map(renderNavItem).join('');
|
|
279
|
-
return `
|
|
280
|
-
<style>
|
|
281
|
-
.side-nav-demo-wrapper {
|
|
282
|
-
display: flex;
|
|
283
|
-
height: 600px;
|
|
284
|
-
background-color: var(--xpl-background-surface-subtle);
|
|
285
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
286
|
-
}
|
|
287
|
-
/* Above md: nav is a fixed-width column; main fills the rest of the row. */
|
|
288
|
-
@media (min-width: 768px) {
|
|
289
|
-
.side-nav-demo-wrapper {
|
|
290
|
-
flex-direction: row;
|
|
291
|
-
}
|
|
292
|
-
.side-nav-demo-main {
|
|
293
|
-
flex: 1;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
/* Below md: nav collapses to a top bar; main flows beneath it. */
|
|
297
|
-
@media (max-width: 767px) {
|
|
298
|
-
.side-nav-demo-wrapper {
|
|
299
|
-
flex-direction: column;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
.side-nav-demo-main {
|
|
303
|
-
padding: var(--xpl-space-32);
|
|
304
|
-
font-family: var(--xpl-font-family-default);
|
|
305
|
-
color: var(--xpl-text-default);
|
|
306
|
-
}
|
|
307
|
-
.side-nav-demo-main h1 { margin: 0; }
|
|
308
|
-
.side-nav-demo-note {
|
|
309
|
-
font-family: var(--xpl-font-family-default);
|
|
310
|
-
font-size: var(--xpl-font-size-callout);
|
|
311
|
-
color: var(--xpl-text-subdued);
|
|
312
|
-
margin: var(--xpl-space-8) 0 0;
|
|
313
|
-
line-height: 1.5;
|
|
314
|
-
}
|
|
315
|
-
.side-nav-demo-legend {
|
|
316
|
-
margin-top: var(--xpl-space-24);
|
|
317
|
-
padding: var(--xpl-space-16);
|
|
318
|
-
border-radius: var(--xpl-border-radius-default);
|
|
319
|
-
background: var(--xpl-background-surface-transparent-5);
|
|
320
|
-
font-family: var(--xpl-font-family-default);
|
|
321
|
-
font-size: var(--xpl-font-size-callout);
|
|
322
|
-
color: var(--xpl-text-subdued);
|
|
323
|
-
line-height: 1.8;
|
|
324
|
-
}
|
|
325
|
-
.side-nav-demo-legend code {
|
|
326
|
-
background: var(--xpl-background-surface-transparent-10);
|
|
327
|
-
padding: var(--xpl-space-2) var(--xpl-space-6);
|
|
328
|
-
border-radius: var(--xpl-border-radius-small);
|
|
329
|
-
font-size: var(--xpl-font-size-caption);
|
|
330
|
-
}
|
|
331
|
-
</style>
|
|
332
|
-
<div class="side-nav-demo-wrapper">
|
|
333
|
-
<xpl-side-nav label="${escapeHtmlAttribute(navLabel)}">
|
|
334
|
-
${headerHtml}
|
|
335
|
-
<div slot="section">${itemsHtml}
|
|
336
|
-
</div>
|
|
337
|
-
<div slot="nav-footer">${footerHtml}
|
|
338
|
-
</div>
|
|
339
|
-
</xpl-side-nav>
|
|
340
|
-
|
|
341
|
-
<div class="side-nav-demo-main">
|
|
342
|
-
<h1>Side Navigation Demo</h1>
|
|
343
|
-
<p class="side-nav-demo-note">Click any item in the nav to select it. Parent items expand and collapse on click.</p>
|
|
344
|
-
<div class="side-nav-demo-legend">
|
|
345
|
-
<strong>v2 anatomy per row:</strong><br/>
|
|
346
|
-
<code>slot="leading"</code> — leading icon (or <code>icon</code> prop)<br/>
|
|
347
|
-
label (flex-1)<br/>
|
|
348
|
-
<code>slot="trailing"</code> — trailing icon; auto chevron for parents (<code>chevron-down</code> collapsed, <code>chevron-up</code> expanded)
|
|
349
|
-
</div>
|
|
350
|
-
<div class="side-nav-demo-legend">
|
|
351
|
-
<strong>Sections & dividers</strong> (near the bottom of this demo's items): <code>kind: 'section'</code> renders an <code>xpl-side-nav-section</code> accordion — its <code>children</code> are NOT indented and keep their leading icon, unlike a <code>hasChildren</code> item. <code>kind: 'divider'</code> renders a standalone, full-bleed <code><hr class="xpl-side-nav-divider"></code> — no dedicated component. Sections don't render their own dividers — place them as siblings.
|
|
352
|
-
</div>
|
|
353
|
-
<div class="side-nav-demo-legend">
|
|
354
|
-
<strong><code>slot="nav-header"</code></strong> (top of the sidebar, above the section): renders one or more <code>xpl-side-nav-header-item</code> rows. Hidden entirely — no wrapper, no border — when <code>navConfig.headerItems</code> is omitted or empty. This demo stacks a <code>'product-label'</code> row (static) above a <code>'sub-account'</code> row (interactive; emits <code>navigate</code>, auto <code>chevron-expand-y</code> trailing icon), per the Figma spec.
|
|
355
|
-
</div>
|
|
356
|
-
<div class="side-nav-demo-legend">
|
|
357
|
-
<strong><code>NavItem</code></strong><br/>
|
|
358
|
-
<code>{ kind?, label?, icon?, trailingIcon?, selected?, disabled?, hidden?, hasChildren?, expanded?, link?, href?, children?, collapsible?, badgeCount? }</code><br/>
|
|
359
|
-
<code>kind</code> defaults to <code>'item'</code>; <code>collapsible</code> / <code>badgeCount</code> apply only to <code>kind: 'section'</code> entries.
|
|
360
|
-
</div>
|
|
361
|
-
<div class="side-nav-demo-legend">
|
|
362
|
-
<strong>Responsive (below <code>md</code> / 768 px):</strong><br/>
|
|
363
|
-
The sidebar collapses to a ~56 px top bar with a built-in toggle button.<br/>
|
|
364
|
-
Activating the toggle opens an 80 vw drawer (min 300 px) that slides in from the left — the remaining 20 vw shows a backdrop scrim.<br/>
|
|
365
|
-
<strong>Closing:</strong> toggle button, <code>Escape</code> key, or backdrop click — all return focus to the toggle.<br/>
|
|
366
|
-
<strong>Focus trap:</strong> <code>Tab</code> cycles within the open drawer.<br/>
|
|
367
|
-
<strong>API:</strong> <code>open</code> prop/attr (reflected) · <code>openChange</code> event · <code>toggle()</code> / <code>setOpen()</code> methods
|
|
368
|
-
</div>
|
|
369
|
-
</div>
|
|
370
|
-
</div>`;
|
|
371
|
-
},
|
|
372
|
-
play: async ({ canvasElement }) => {
|
|
373
|
-
await waitForHydration(canvasElement);
|
|
374
|
-
sideNavClickController?.abort();
|
|
375
|
-
sideNavClickController = new AbortController();
|
|
376
|
-
const nav = canvasElement.querySelector('xpl-side-nav');
|
|
377
|
-
if (!nav)
|
|
378
|
-
return;
|
|
379
|
-
nav.addEventListener('click', (e) => {
|
|
380
|
-
const item = e.target.closest('xpl-side-nav-item');
|
|
381
|
-
if (!item)
|
|
382
|
-
return;
|
|
383
|
-
if (item.hasAttribute('disabled'))
|
|
384
|
-
return;
|
|
385
|
-
if (item.hasAttribute('has-children'))
|
|
386
|
-
return;
|
|
387
|
-
nav.querySelectorAll('xpl-side-nav-item').forEach((el) => el.removeAttribute('selected'));
|
|
388
|
-
item.setAttribute('selected', '');
|
|
389
|
-
}, { signal: sideNavClickController.signal });
|
|
390
|
-
},
|
|
391
|
-
parameters: {
|
|
392
|
-
layout: 'fullscreen',
|
|
393
|
-
design: {
|
|
394
|
-
type: 'figma',
|
|
395
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=33873-23128&m=dev',
|
|
396
|
-
},
|
|
397
|
-
docs: {
|
|
398
|
-
description: {
|
|
399
|
-
story: 'Fully interactive navigation demo. Click leaf items to select them; click parent items to expand/collapse. Edit the `navConfig` control to add, remove, or reconfigure items — same data-driven pattern as mapping router config to nav in production.',
|
|
400
|
-
},
|
|
401
|
-
},
|
|
402
|
-
'web-component': {
|
|
403
|
-
render: SideNavigationWebComponent(defaultNavConfig),
|
|
404
|
-
},
|
|
405
|
-
html: {
|
|
406
|
-
render: renderHtmlSideNav(defaultNavConfig),
|
|
407
|
-
},
|
|
408
|
-
},
|
|
409
|
-
};
|
|
410
|
-
export const ItemPlayground = {
|
|
411
|
-
argTypes: {
|
|
412
|
-
label: {
|
|
413
|
-
control: 'text',
|
|
414
|
-
description: 'Display label for the navigation item',
|
|
415
|
-
},
|
|
416
|
-
icon: {
|
|
417
|
-
control: 'text',
|
|
418
|
-
description: 'Icon name — default content for `slot="leading"`. Applies to all item types including parents (`has-children`) in v2.',
|
|
419
|
-
},
|
|
420
|
-
trailingIcon: {
|
|
421
|
-
control: 'text',
|
|
422
|
-
description: 'Icon name for `slot="trailing"`. On parent items (`has-children`), providing this replaces the auto chevron (`chevron-down` collapsed / `chevron-up` expanded).',
|
|
423
|
-
},
|
|
424
|
-
selected: {
|
|
425
|
-
control: 'boolean',
|
|
426
|
-
description: 'Whether the item is in selected state',
|
|
427
|
-
},
|
|
428
|
-
disabled: {
|
|
429
|
-
control: 'boolean',
|
|
430
|
-
description: 'Whether the item is disabled',
|
|
431
|
-
},
|
|
432
|
-
hidden: {
|
|
433
|
-
control: 'boolean',
|
|
434
|
-
description: 'Whether the item is hidden',
|
|
435
|
-
},
|
|
436
|
-
expanded: {
|
|
437
|
-
control: 'boolean',
|
|
438
|
-
description: 'Whether expandable children are visible (requires hasChildren)',
|
|
439
|
-
},
|
|
440
|
-
hasChildren: {
|
|
441
|
-
control: 'boolean',
|
|
442
|
-
description: 'Whether the item can contain nested children',
|
|
443
|
-
},
|
|
444
|
-
link: {
|
|
445
|
-
control: 'boolean',
|
|
446
|
-
description: 'Whether the item is a link (slot-only mode)',
|
|
447
|
-
},
|
|
448
|
-
childLabel1: {
|
|
449
|
-
control: 'text',
|
|
450
|
-
description: 'Label for first child item (when hasChildren is true)',
|
|
451
|
-
},
|
|
452
|
-
childLabel2: {
|
|
453
|
-
control: 'text',
|
|
454
|
-
description: 'Label for second child item (when hasChildren is true)',
|
|
455
|
-
},
|
|
456
|
-
},
|
|
457
|
-
args: {
|
|
458
|
-
label: 'Playground Item',
|
|
459
|
-
icon: 'house-4',
|
|
460
|
-
trailingIcon: '',
|
|
461
|
-
selected: false,
|
|
462
|
-
disabled: false,
|
|
463
|
-
hidden: false,
|
|
464
|
-
expanded: false,
|
|
465
|
-
hasChildren: false,
|
|
466
|
-
link: false,
|
|
467
|
-
childLabel1: 'Child Item A',
|
|
468
|
-
childLabel2: 'Child Item B',
|
|
469
|
-
},
|
|
470
|
-
render: ({ label, icon, trailingIcon, selected, disabled, hidden, expanded, hasChildren, link, childLabel1, childLabel2, }) => {
|
|
471
|
-
const attrs = [
|
|
472
|
-
label ? `label="${label}"` : '',
|
|
473
|
-
icon ? `icon="${icon}"` : '',
|
|
474
|
-
selected ? 'selected' : '',
|
|
475
|
-
disabled ? 'disabled' : '',
|
|
476
|
-
hidden ? 'hidden' : '',
|
|
477
|
-
expanded ? 'expanded' : '',
|
|
478
|
-
!link && hasChildren ? 'has-children' : '',
|
|
479
|
-
link ? 'link' : '',
|
|
480
|
-
]
|
|
481
|
-
.filter(Boolean)
|
|
482
|
-
.join(' ');
|
|
483
|
-
let content = '';
|
|
484
|
-
const trailingSlot = trailingIcon && !link
|
|
485
|
-
? `\n <xpl-icon slot="trailing" icon="${trailingIcon}" size="16" aria-hidden="true"></xpl-icon>`
|
|
486
|
-
: '';
|
|
487
|
-
if (link) {
|
|
488
|
-
const leadingIcon = icon ? `<xpl-icon icon="${icon}" size="16"></xpl-icon>` : '';
|
|
489
|
-
content = `
|
|
490
|
-
<a href="#${label?.toLowerCase().replace(/\s+/g, '-') || 'item'}" class="xpl-side-nav-item__link"><span class="xpl-side-nav-item__leading">${leadingIcon}</span><span class="xpl-side-nav-item__label">${label}</span></a>`;
|
|
491
|
-
}
|
|
492
|
-
else if (hasChildren) {
|
|
493
|
-
content = `${trailingSlot}
|
|
494
|
-
<xpl-side-nav-item label="${childLabel1}" icon="circle-dot"></xpl-side-nav-item>
|
|
495
|
-
<xpl-side-nav-item label="${childLabel2}" icon="circle-dot"></xpl-side-nav-item>`;
|
|
496
|
-
}
|
|
497
|
-
else {
|
|
498
|
-
content = trailingSlot;
|
|
499
|
-
}
|
|
500
|
-
return `
|
|
501
|
-
<style>
|
|
502
|
-
.item-playground-wrapper {
|
|
503
|
-
padding: var(--xpl-space-16);
|
|
504
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
505
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
506
|
-
border-radius: var(--xpl-border-radius-default);
|
|
507
|
-
height: auto;
|
|
508
|
-
min-height: 0;
|
|
509
|
-
}
|
|
510
|
-
.item-playground-note {
|
|
511
|
-
font-family: var(--xpl-font-family-default);
|
|
512
|
-
font-size: var(--xpl-font-size-caption);
|
|
513
|
-
color: var(--xpl-text-subdued);
|
|
514
|
-
margin-top: var(--xpl-space-12);
|
|
515
|
-
line-height: 1.5;
|
|
516
|
-
}
|
|
517
|
-
</style>
|
|
518
|
-
<div class="xpl-side-nav item-playground-wrapper">
|
|
519
|
-
<xpl-side-nav-item ${attrs}>${content}
|
|
520
|
-
</xpl-side-nav-item>
|
|
521
|
-
</div>
|
|
522
|
-
<p class="item-playground-note">
|
|
523
|
-
Interactive playground for <code>xpl-side-nav-item</code>. Toggle props in the Controls panel.
|
|
524
|
-
</p>`;
|
|
525
|
-
},
|
|
526
|
-
parameters: {
|
|
527
|
-
layout: 'centered',
|
|
528
|
-
docs: {
|
|
529
|
-
description: {
|
|
530
|
-
story: 'Interactive playground for testing all `xpl-side-nav-item` props individually. Toggle boolean props, change text values, and observe the component behavior.',
|
|
531
|
-
},
|
|
532
|
-
},
|
|
533
|
-
},
|
|
534
|
-
};
|
|
535
|
-
export const ExternalLinkItem = () => `
|
|
536
|
-
<style>
|
|
537
|
-
.external-link-demo {
|
|
538
|
-
padding: var(--xpl-space-16);
|
|
539
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
540
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
541
|
-
border-radius: var(--xpl-border-radius-default);
|
|
542
|
-
height: auto;
|
|
543
|
-
min-height: 0;
|
|
544
|
-
}
|
|
545
|
-
.external-link-caption {
|
|
546
|
-
font-family: var(--xpl-font-family-default);
|
|
547
|
-
font-size: var(--xpl-font-size-caption);
|
|
548
|
-
color: var(--xpl-text-subdued);
|
|
549
|
-
margin-bottom: var(--xpl-space-8);
|
|
550
|
-
}
|
|
551
|
-
</style>
|
|
552
|
-
<p class="external-link-caption">Leaf item with leading icon + trailing external-link icon</p>
|
|
553
|
-
<div class="xpl-side-nav external-link-demo">
|
|
554
|
-
<xpl-side-nav-item label="Xplor Growth" icon="chart-line-up">
|
|
555
|
-
<xpl-icon slot="trailing" icon="external-link" size="16" aria-hidden="true"></xpl-icon>
|
|
556
|
-
</xpl-side-nav-item>
|
|
557
|
-
<xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
|
|
558
|
-
<xpl-side-nav-item label="Reports" icon="chart-line"></xpl-side-nav-item>
|
|
559
|
-
</div>`;
|
|
560
|
-
ExternalLinkItem.parameters = {
|
|
561
|
-
layout: 'centered',
|
|
562
|
-
docs: {
|
|
563
|
-
description: {
|
|
564
|
-
story: 'Leaf item with a leading icon (`icon` prop) and a trailing `slot="trailing"` icon (`external-link`). The trailing slot replaces the auto chevron on parents, or adds a trailing icon to leaf items. Note: trailing icons that convey meaning (e.g. external link) should be accompanied by accessible labeling in the surrounding context.',
|
|
565
|
-
},
|
|
566
|
-
},
|
|
567
|
-
};
|
|
568
|
-
export const Divider = () => `
|
|
569
|
-
<style>
|
|
570
|
-
.divider-demo {
|
|
571
|
-
padding: var(--xpl-space-16);
|
|
572
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
573
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
574
|
-
border-radius: var(--xpl-border-radius-default);
|
|
575
|
-
height: auto;
|
|
576
|
-
min-height: 0;
|
|
577
|
-
overflow: hidden;
|
|
578
|
-
}
|
|
579
|
-
.divider-caption {
|
|
580
|
-
font-family: var(--xpl-font-family-default);
|
|
581
|
-
font-size: var(--xpl-font-size-caption);
|
|
582
|
-
color: var(--xpl-text-subdued);
|
|
583
|
-
margin-bottom: var(--xpl-space-8);
|
|
584
|
-
}
|
|
585
|
-
</style>
|
|
586
|
-
<p class="divider-caption">1px full-bleed separator: a plain <code><hr class="xpl-side-nav-divider"></code>, no component. Place directly between items or sections inside <code>slot="section"</code>.</p>
|
|
587
|
-
<div class="xpl-side-nav divider-demo">
|
|
588
|
-
<div class="xpl-side-nav__section">
|
|
589
|
-
<xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
|
|
590
|
-
<xpl-side-nav-item label="Reports" icon="chart-line"></xpl-side-nav-item>
|
|
591
|
-
<hr class="xpl-side-nav-divider" />
|
|
592
|
-
<xpl-side-nav-item label="Settings" icon="gear"></xpl-side-nav-item>
|
|
593
|
-
<xpl-side-nav-item label="Integrations" icon="plug"></xpl-side-nav-item>
|
|
594
|
-
</div>
|
|
595
|
-
</div>`;
|
|
596
|
-
Divider.parameters = {
|
|
597
|
-
layout: 'centered',
|
|
598
|
-
design: {
|
|
599
|
-
type: 'figma',
|
|
600
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=25334-29185',
|
|
601
|
-
},
|
|
602
|
-
docs: {
|
|
603
|
-
description: {
|
|
604
|
-
story: 'A 1px full-bleed separator (`--xpl-border-default`) consumers place between `xpl-side-nav-item` / `xpl-side-nav-section` elements inside `slot="section"`. There is no dedicated component — it\'s a plain `<hr class="xpl-side-nav-divider">`, styled by `side-nav.css` (which leans on `reset.css`\'s default `<hr>` border rather than fighting it), giving it the native implicit `role="separator"` for free.',
|
|
605
|
-
},
|
|
606
|
-
},
|
|
607
|
-
};
|
|
608
|
-
export const SectionPlayground = {
|
|
609
|
-
argTypes: {
|
|
610
|
-
heading: {
|
|
611
|
-
control: 'text',
|
|
612
|
-
description: 'Section title text',
|
|
613
|
-
},
|
|
614
|
-
collapsible: {
|
|
615
|
-
control: 'boolean',
|
|
616
|
-
description: 'Whether the section can be collapsed/expanded. When false, renders a static title (no chevron) and children are always shown.',
|
|
617
|
-
},
|
|
618
|
-
expanded: {
|
|
619
|
-
control: 'boolean',
|
|
620
|
-
description: 'Whether the section is expanded (only meaningful when collapsible)',
|
|
621
|
-
},
|
|
622
|
-
badgeCount: {
|
|
623
|
-
control: 'text',
|
|
624
|
-
description: 'Optional badge text composed into slot="badge" via xpl-badge. Leave empty to hide the badge.',
|
|
625
|
-
},
|
|
626
|
-
},
|
|
627
|
-
args: {
|
|
628
|
-
heading: 'Settings',
|
|
629
|
-
collapsible: true,
|
|
630
|
-
expanded: false,
|
|
631
|
-
badgeCount: '',
|
|
632
|
-
},
|
|
633
|
-
render: ({ heading, collapsible, expanded, badgeCount }) => {
|
|
634
|
-
const attrs = [
|
|
635
|
-
heading ? `heading="${escapeHtmlAttribute(heading)}"` : '',
|
|
636
|
-
!collapsible ? 'collapsible="false"' : '',
|
|
637
|
-
collapsible && expanded ? 'expanded' : '',
|
|
638
|
-
]
|
|
639
|
-
.filter(Boolean)
|
|
640
|
-
.join(' ');
|
|
641
|
-
const badgeSlot = badgeCount
|
|
642
|
-
? `\n <xpl-badge slot="badge" variant="purple" size="small">${escapeHtmlAttribute(badgeCount)}</xpl-badge>`
|
|
643
|
-
: '';
|
|
644
|
-
return `
|
|
645
|
-
<style>
|
|
646
|
-
.section-playground-wrapper {
|
|
647
|
-
padding: var(--xpl-space-16);
|
|
648
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
649
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
650
|
-
border-radius: var(--xpl-border-radius-default);
|
|
651
|
-
height: auto;
|
|
652
|
-
min-height: 0;
|
|
653
|
-
width: 240px;
|
|
654
|
-
}
|
|
655
|
-
</style>
|
|
656
|
-
<div class="xpl-side-nav section-playground-wrapper">
|
|
657
|
-
<xpl-side-nav-section ${attrs}>${badgeSlot}
|
|
658
|
-
<xpl-side-nav-item label="Location" icon="pin"></xpl-side-nav-item>
|
|
659
|
-
<xpl-side-nav-item label="Schedule" icon="calendar"></xpl-side-nav-item>
|
|
660
|
-
</xpl-side-nav-section>
|
|
661
|
-
</div>`;
|
|
662
|
-
},
|
|
663
|
-
parameters: {
|
|
664
|
-
layout: 'centered',
|
|
665
|
-
design: {
|
|
666
|
-
type: 'figma',
|
|
667
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=25334-29188',
|
|
668
|
-
},
|
|
669
|
-
docs: {
|
|
670
|
-
description: {
|
|
671
|
-
story: 'Interactive playground for `xpl-side-nav-section`. Toggle `collapsible` to switch between the accordion header (with chevron, `chevron-right` collapsed / `chevron-down` expanded) and the static title variant (no chevron, children always shown). Set `badgeCount` to compose an `xpl-badge` into `slot="badge"` — the wrapper is suppressed when empty. Section children keep their leading icon and are NOT indented, unlike `xpl-side-nav-item[has-children]`.',
|
|
672
|
-
},
|
|
673
|
-
},
|
|
674
|
-
},
|
|
675
|
-
};
|
|
676
|
-
export const SectionsAndDividers = () => `
|
|
677
|
-
<style>
|
|
678
|
-
.sections-dividers-demo {
|
|
679
|
-
display: flex;
|
|
680
|
-
height: 600px;
|
|
681
|
-
background-color: var(--xpl-background-surface-subtle);
|
|
682
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
683
|
-
}
|
|
684
|
-
</style>
|
|
685
|
-
<div class="sections-dividers-demo">
|
|
686
|
-
<div class="xpl-side-nav">
|
|
687
|
-
<div class="xpl-side-nav__wrapper">
|
|
688
|
-
<nav class="xpl-side-nav__content" aria-label="Main navigation">
|
|
689
|
-
<div class="xpl-side-nav__scroll-area">
|
|
690
|
-
<div class="xpl-side-nav__section">
|
|
691
|
-
<xpl-side-nav-item label="Nav Item 1" icon="house-4" selected></xpl-side-nav-item>
|
|
692
|
-
<xpl-side-nav-item label="Nav Item 2" icon="bag-shopping-2"></xpl-side-nav-item>
|
|
693
|
-
|
|
694
|
-
<hr class="xpl-side-nav-divider" />
|
|
695
|
-
|
|
696
|
-
<xpl-side-nav-item has-children expanded label="Nav Item Parent Open" icon="gear">
|
|
697
|
-
<xpl-side-nav-item label="Child 1"></xpl-side-nav-item>
|
|
698
|
-
<xpl-side-nav-item label="Child 2"></xpl-side-nav-item>
|
|
699
|
-
</xpl-side-nav-item>
|
|
700
|
-
<xpl-side-nav-item label="Nav Item 4" icon="star"></xpl-side-nav-item>
|
|
701
|
-
|
|
702
|
-
<hr class="xpl-side-nav-divider" />
|
|
703
|
-
|
|
704
|
-
<xpl-side-nav-section heading="Section Closed">
|
|
705
|
-
<xpl-side-nav-item has-children label="Nav Item Parent">
|
|
706
|
-
<xpl-side-nav-item label="Child A"></xpl-side-nav-item>
|
|
707
|
-
</xpl-side-nav-item>
|
|
708
|
-
<xpl-side-nav-item has-children label="Nav Item Parent">
|
|
709
|
-
<xpl-side-nav-item label="Child B"></xpl-side-nav-item>
|
|
710
|
-
</xpl-side-nav-item>
|
|
711
|
-
</xpl-side-nav-section>
|
|
712
|
-
|
|
713
|
-
<hr class="xpl-side-nav-divider" />
|
|
714
|
-
|
|
715
|
-
<xpl-side-nav-section heading="Section Open" expanded>
|
|
716
|
-
<xpl-side-nav-item label="Nav Item 6" icon="chart-line"></xpl-side-nav-item>
|
|
717
|
-
<xpl-side-nav-item label="Nav Item 7" icon="plug"></xpl-side-nav-item>
|
|
718
|
-
</xpl-side-nav-section>
|
|
719
|
-
|
|
720
|
-
<hr class="xpl-side-nav-divider" />
|
|
721
|
-
|
|
722
|
-
<xpl-side-nav-section heading="Section Label Only" collapsible="false">
|
|
723
|
-
<xpl-side-nav-item label="Nav Item 8" icon="headset"></xpl-side-nav-item>
|
|
724
|
-
</xpl-side-nav-section>
|
|
725
|
-
</div>
|
|
726
|
-
</div>
|
|
727
|
-
<div class="xpl-side-nav__footer">
|
|
728
|
-
<xpl-side-nav-item label="Settings" icon="gear"></xpl-side-nav-item>
|
|
729
|
-
<xpl-side-nav-item label="Help" icon="headset"></xpl-side-nav-item>
|
|
730
|
-
</div>
|
|
731
|
-
</nav>
|
|
732
|
-
</div>
|
|
733
|
-
</div>
|
|
734
|
-
</div>`;
|
|
735
|
-
SectionsAndDividers.parameters = {
|
|
736
|
-
layout: 'fullscreen',
|
|
737
|
-
design: {
|
|
738
|
-
type: 'figma',
|
|
739
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=50573-8171',
|
|
740
|
-
},
|
|
741
|
-
docs: {
|
|
742
|
-
description: {
|
|
743
|
-
story: 'Composite example mirroring the Figma "Example with Sections and dividers" node (`50573-8171`): top-level items, a divider, an expanded `has-children` item, a divider, a closed `xpl-side-nav-section` with two parent items, a divider, an open section, a divider, a static label-only section, and a footer. Dividers (`<hr class="xpl-side-nav-divider">`, no dedicated component) are standalone and consumer-placed — sections do not render their own.',
|
|
744
|
-
},
|
|
745
|
-
},
|
|
746
|
-
};
|
|
747
|
-
export const HeaderItemPlayground = {
|
|
748
|
-
argTypes: {
|
|
749
|
-
type: {
|
|
750
|
-
control: 'select',
|
|
751
|
-
options: ['product-label', 'sub-account'],
|
|
752
|
-
description: '`product-label` is a static, non-interactive label. `sub-account` is an interactive button that emits `navigate`.',
|
|
753
|
-
},
|
|
754
|
-
label: {
|
|
755
|
-
control: 'text',
|
|
756
|
-
description: 'Display label for the header item',
|
|
757
|
-
},
|
|
758
|
-
icon: {
|
|
759
|
-
control: 'text',
|
|
760
|
-
description: 'Icon name — default content for `slot="leading"`. Leave empty to omit the leading column entirely (matches the Figma optional-icon variants).',
|
|
761
|
-
},
|
|
762
|
-
selected: {
|
|
763
|
-
control: 'boolean',
|
|
764
|
-
description: 'Selected state — only meaningful for `type="sub-account"`; applies the information-surface pill.',
|
|
765
|
-
},
|
|
766
|
-
},
|
|
767
|
-
args: {
|
|
768
|
-
type: 'product-label',
|
|
769
|
-
label: 'Product Label',
|
|
770
|
-
icon: '',
|
|
771
|
-
selected: false,
|
|
772
|
-
},
|
|
773
|
-
render: ({ type, label, icon, selected }) => {
|
|
774
|
-
const attrs = [
|
|
775
|
-
`type="${type}"`,
|
|
776
|
-
label ? `label="${escapeHtmlAttribute(label)}"` : '',
|
|
777
|
-
icon ? `icon="${escapeHtmlAttribute(icon)}"` : '',
|
|
778
|
-
type === 'sub-account' && selected ? 'selected' : '',
|
|
779
|
-
]
|
|
780
|
-
.filter(Boolean)
|
|
781
|
-
.join(' ');
|
|
782
|
-
return `
|
|
783
|
-
<style>
|
|
784
|
-
/*
|
|
785
|
-
* Standalone preview at sidebar width. Deliberately does NOT use the
|
|
786
|
-
* .xpl-side-nav host class: below the md breakpoint that class collapses to
|
|
787
|
-
* the mobile top-bar (fixed bar height, overflow, borders) and would clip /
|
|
788
|
-
* restyle this docs card. The header item's own CSS is self-contained.
|
|
789
|
-
*/
|
|
790
|
-
.header-item-playground-wrapper {
|
|
791
|
-
display: flex;
|
|
792
|
-
flex-direction: column;
|
|
793
|
-
padding: var(--xpl-space-16);
|
|
794
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
795
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
796
|
-
border-radius: var(--xpl-border-radius-default);
|
|
797
|
-
height: auto;
|
|
798
|
-
min-height: 0;
|
|
799
|
-
width: 240px;
|
|
800
|
-
}
|
|
801
|
-
</style>
|
|
802
|
-
<div class="header-item-playground-wrapper">
|
|
803
|
-
<xpl-side-nav-header-item ${attrs}></xpl-side-nav-header-item>
|
|
804
|
-
</div>`;
|
|
805
|
-
},
|
|
806
|
-
parameters: {
|
|
807
|
-
layout: 'centered',
|
|
808
|
-
design: {
|
|
809
|
-
type: 'figma',
|
|
810
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=51299-9007',
|
|
811
|
-
},
|
|
812
|
-
docs: {
|
|
813
|
-
description: {
|
|
814
|
-
story: 'Interactive playground for `xpl-side-nav-header-item` (Figma `<navHeaderItem>`). `product-label` renders a static, subdued label; `sub-account` renders an interactive button that emits `navigate` and auto-renders a `chevron-expand-y` trailing icon when no `slot="trailing"` content is provided. In context it slots into `xpl-side-nav`\'s `nav-header` slot — see the full **Side Navigation** story.',
|
|
815
|
-
},
|
|
816
|
-
},
|
|
817
|
-
},
|
|
818
|
-
};
|
|
819
|
-
export const HeaderItemAllVariants = () => `
|
|
820
|
-
<style>
|
|
821
|
-
.header-item-variants-demo {
|
|
822
|
-
display: flex;
|
|
823
|
-
flex-direction: column;
|
|
824
|
-
gap: var(--xpl-space-8);
|
|
825
|
-
padding: var(--xpl-space-16);
|
|
826
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
827
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
828
|
-
border-radius: var(--xpl-border-radius-default);
|
|
829
|
-
height: auto;
|
|
830
|
-
min-height: 0;
|
|
831
|
-
width: 240px;
|
|
832
|
-
}
|
|
833
|
-
.header-item-variants-caption {
|
|
834
|
-
font-family: var(--xpl-font-family-default);
|
|
835
|
-
font-size: var(--xpl-font-size-caption);
|
|
836
|
-
color: var(--xpl-text-subdued);
|
|
837
|
-
margin: 0 0 var(--xpl-space-4);
|
|
838
|
-
}
|
|
839
|
-
</style>
|
|
840
|
-
<div class="header-item-variants-demo">
|
|
841
|
-
<p class="header-item-variants-caption">product-label</p>
|
|
842
|
-
<xpl-side-nav-header-item label="My Product"></xpl-side-nav-header-item>
|
|
843
|
-
<xpl-side-nav-header-item label="My Product" icon="house-4"></xpl-side-nav-header-item>
|
|
844
|
-
|
|
845
|
-
<p class="header-item-variants-caption">sub-account (resting)</p>
|
|
846
|
-
<xpl-side-nav-header-item type="sub-account" label="Acme Inc"></xpl-side-nav-header-item>
|
|
847
|
-
<xpl-side-nav-header-item type="sub-account" label="Acme Inc" icon="pin"></xpl-side-nav-header-item>
|
|
848
|
-
<xpl-side-nav-header-item type="sub-account" label="Xplor Growth">
|
|
849
|
-
<xpl-icon slot="trailing" icon="external-link" size="16" aria-hidden="true"></xpl-icon>
|
|
850
|
-
</xpl-side-nav-header-item>
|
|
851
|
-
|
|
852
|
-
<p class="header-item-variants-caption">sub-account (selected)</p>
|
|
853
|
-
<xpl-side-nav-header-item type="sub-account" label="Acme Inc" selected></xpl-side-nav-header-item>
|
|
854
|
-
<xpl-side-nav-header-item type="sub-account" label="Acme Inc" icon="pin" selected></xpl-side-nav-header-item>
|
|
855
|
-
</div>`;
|
|
856
|
-
HeaderItemAllVariants.parameters = {
|
|
857
|
-
layout: 'centered',
|
|
858
|
-
design: {
|
|
859
|
-
type: 'figma',
|
|
860
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=51299-9007',
|
|
861
|
-
},
|
|
862
|
-
docs: {
|
|
863
|
-
description: {
|
|
864
|
-
story: 'All `xpl-side-nav-header-item` variants side by side: `product-label` with and without a leading icon, `sub-account` resting (default auto chevron, with a leading icon, and with a custom slotted trailing icon replacing the auto chevron), and `sub-account` selected (8px-radius information-surface pill around the whole row content — leading icon, label, and trailing chevron — matching the item rows).',
|
|
865
|
-
},
|
|
866
|
-
},
|
|
867
|
-
};
|
|
868
|
-
export const ParentWithLeadingIcon = () => `
|
|
869
|
-
<style>
|
|
870
|
-
.parent-leading-demo {
|
|
871
|
-
padding: var(--xpl-space-16);
|
|
872
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
873
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
874
|
-
border-radius: var(--xpl-border-radius-default);
|
|
875
|
-
height: auto;
|
|
876
|
-
min-height: 0;
|
|
877
|
-
}
|
|
878
|
-
.parent-leading-caption {
|
|
879
|
-
font-family: var(--xpl-font-family-default);
|
|
880
|
-
font-size: var(--xpl-font-size-caption);
|
|
881
|
-
color: var(--xpl-text-subdued);
|
|
882
|
-
margin-bottom: var(--xpl-space-8);
|
|
883
|
-
}
|
|
884
|
-
</style>
|
|
885
|
-
<p class="parent-leading-caption">Parents now show leading icon AND chevron (v2 behavior)</p>
|
|
886
|
-
<div class="xpl-side-nav parent-leading-demo">
|
|
887
|
-
<xpl-side-nav-item label="Settings" icon="gear" has-children expanded>
|
|
888
|
-
<xpl-side-nav-item label="Location"></xpl-side-nav-item>
|
|
889
|
-
<xpl-side-nav-item label="Schedule" selected></xpl-side-nav-item>
|
|
890
|
-
</xpl-side-nav-item>
|
|
891
|
-
<xpl-side-nav-item label="Integrations" icon="plug" has-children>
|
|
892
|
-
<xpl-side-nav-item label="Webhooks"></xpl-side-nav-item>
|
|
893
|
-
<xpl-side-nav-item label="API Keys"></xpl-side-nav-item>
|
|
894
|
-
</xpl-side-nav-item>
|
|
895
|
-
<xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
|
|
896
|
-
</div>`;
|
|
897
|
-
ParentWithLeadingIcon.parameters = {
|
|
898
|
-
layout: 'centered',
|
|
899
|
-
docs: {
|
|
900
|
-
description: {
|
|
901
|
-
story: '**v2 behavior change:** parent rows (`has-children`) now render the leading icon alongside the auto chevron in the trailing position (`chevron-down` when collapsed, `chevron-up` when expanded). In v1, parents showed chevron + label only (no leading icon). Pass `icon` prop or `slot="leading"` content to set the leading icon.',
|
|
902
|
-
},
|
|
903
|
-
},
|
|
904
|
-
};
|
|
905
|
-
export const FooterSlot = {
|
|
906
|
-
argTypes: {
|
|
907
|
-
footerItems: {
|
|
908
|
-
control: 'object',
|
|
909
|
-
description: 'Navigation items for the footer slot',
|
|
910
|
-
},
|
|
911
|
-
},
|
|
912
|
-
args: {
|
|
913
|
-
footerItems: [
|
|
914
|
-
{ label: 'Settings', icon: 'gear' },
|
|
915
|
-
{ label: 'Help', icon: 'headset' },
|
|
916
|
-
{ label: 'Logout', icon: 'open-rect-arrow-out' },
|
|
917
|
-
],
|
|
918
|
-
},
|
|
919
|
-
render: ({ footerItems }) => {
|
|
920
|
-
const footerHtml = footerItems.map(renderNavItem).join('');
|
|
921
|
-
return `
|
|
922
|
-
<style>
|
|
923
|
-
/*
|
|
924
|
-
* Focused preview of the nav-footer slot only. Renders the static
|
|
925
|
-
* .xpl-side-nav__footer markup at sidebar width so the footer styling
|
|
926
|
-
* (top divider, padding) is shown in isolation -- no host xpl-side-nav
|
|
927
|
-
* wrapper, so no mobile top-bar collapse intrudes on the docs view.
|
|
928
|
-
*/
|
|
929
|
-
/*
|
|
930
|
-
* Override the .xpl-side-nav host defaults (height: 100%, overflow: hidden)
|
|
931
|
-
* so the demo card shrink-wraps its content vertically and never crops.
|
|
932
|
-
*/
|
|
933
|
-
.footer-demo-container {
|
|
934
|
-
display: inline-flex;
|
|
935
|
-
flex-direction: column;
|
|
936
|
-
height: auto;
|
|
937
|
-
background: var(--xpl-background-surface-subtlest);
|
|
938
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
939
|
-
border-radius: var(--xpl-border-radius-default);
|
|
940
|
-
overflow: visible;
|
|
941
|
-
}
|
|
942
|
-
.footer-demo-caption {
|
|
943
|
-
font-family: var(--xpl-font-family-default);
|
|
944
|
-
font-size: var(--xpl-font-size-caption);
|
|
945
|
-
color: var(--xpl-text-subdued);
|
|
946
|
-
margin-bottom: var(--xpl-space-8);
|
|
947
|
-
}
|
|
948
|
-
</style>
|
|
949
|
-
<p class="footer-demo-caption">Nav Footer Slot</p>
|
|
950
|
-
<div class="xpl-side-nav footer-demo-container">
|
|
951
|
-
<div class="xpl-side-nav__footer">${footerHtml}
|
|
952
|
-
</div>
|
|
953
|
-
</div>`;
|
|
954
|
-
},
|
|
955
|
-
parameters: {
|
|
956
|
-
layout: 'centered',
|
|
957
|
-
design: {
|
|
958
|
-
type: 'figma',
|
|
959
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=24425-16384',
|
|
960
|
-
},
|
|
961
|
-
},
|
|
962
|
-
};
|
|
963
|
-
const FooterSlotWebComponent = (args) => {
|
|
964
|
-
const footerHtml = args.footerItems.map(renderNavItem).join('');
|
|
965
|
-
return `<xpl-side-nav>
|
|
966
|
-
<div slot="nav-footer">${footerHtml}</div>
|
|
967
|
-
</xpl-side-nav>`;
|
|
968
|
-
};
|
|
969
|
-
const FooterSlotHtml = (args) => {
|
|
970
|
-
const footerHtml = args.footerItems.map((item) => renderHtmlNavItem(item, 4)).join('\n');
|
|
971
|
-
return `<div class="xpl-side-nav">
|
|
972
|
-
<div class="xpl-side-nav__footer">
|
|
973
|
-
${footerHtml}
|
|
974
|
-
</div>
|
|
975
|
-
</div>`;
|
|
976
|
-
};
|
|
977
|
-
FooterSlot.parameters = {
|
|
978
|
-
...FooterSlot.parameters,
|
|
979
|
-
'web-component': {
|
|
980
|
-
render: FooterSlotWebComponent(FooterSlot.args),
|
|
981
|
-
},
|
|
982
|
-
html: {
|
|
983
|
-
render: FooterSlotHtml(FooterSlot.args),
|
|
984
|
-
},
|
|
985
|
-
};
|
|
986
|
-
const mobileItems = [
|
|
987
|
-
{ label: 'Dashboard', icon: 'house-4', selected: true },
|
|
988
|
-
{ label: 'Product', icon: 'bag-shopping-2' },
|
|
989
|
-
{
|
|
990
|
-
label: 'Settings',
|
|
991
|
-
icon: 'gear-3',
|
|
992
|
-
hasChildren: true,
|
|
993
|
-
children: [{ label: 'Location' }, { label: 'Schedule' }],
|
|
994
|
-
},
|
|
995
|
-
{ label: 'Xplor Growth', icon: 'chart-line-up', trailingIcon: 'external-link' },
|
|
996
|
-
];
|
|
997
|
-
const mobileFooterItems = [
|
|
998
|
-
{ label: 'Support', icon: 'headset' },
|
|
999
|
-
{ label: 'Logout', icon: 'open-rect-arrow-out' },
|
|
1000
|
-
];
|
|
1001
|
-
const renderMobileSideNav = (open) => {
|
|
1002
|
-
const itemsHtml = mobileItems.map(renderNavItem).join('');
|
|
1003
|
-
const footerHtml = mobileFooterItems.map(renderNavItem).join('');
|
|
1004
|
-
return `
|
|
1005
|
-
<style>
|
|
1006
|
-
.side-nav-mobile-root {
|
|
1007
|
-
position: relative;
|
|
1008
|
-
width: 100%;
|
|
1009
|
-
height: 100vh;
|
|
1010
|
-
overflow: hidden;
|
|
1011
|
-
background: var(--xpl-background-surface-subtle);
|
|
1012
|
-
}
|
|
1013
|
-
/* Force the mobile bar layout regardless of Storybook viewport width. */
|
|
1014
|
-
.side-nav-mobile-root .xpl-side-nav {
|
|
1015
|
-
width: 100%;
|
|
1016
|
-
height: var(--xpl-size-350);
|
|
1017
|
-
min-height: var(--xpl-size-350);
|
|
1018
|
-
padding: var(--xpl-space-8) var(--xpl-space-16);
|
|
1019
|
-
border-right: var(--xpl-border-none);
|
|
1020
|
-
border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
1021
|
-
}
|
|
1022
|
-
.side-nav-mobile-root .xpl-side-nav__toggle {
|
|
1023
|
-
display: flex;
|
|
1024
|
-
width: var(--xpl-size-250);
|
|
1025
|
-
height: var(--xpl-size-250);
|
|
1026
|
-
}
|
|
1027
|
-
/* Page content placeholder fills the remaining height behind the closed bar. */
|
|
1028
|
-
.side-nav-mobile-page {
|
|
1029
|
-
padding: var(--xpl-space-24) var(--xpl-space-16);
|
|
1030
|
-
font-family: var(--xpl-font-family-default);
|
|
1031
|
-
font-size: var(--xpl-font-size-body);
|
|
1032
|
-
color: var(--xpl-text-subdued);
|
|
1033
|
-
}
|
|
1034
|
-
</style>
|
|
1035
|
-
<div class="side-nav-mobile-root">
|
|
1036
|
-
<xpl-side-nav label="Main navigation"${open ? ' open' : ''}>
|
|
1037
|
-
<div slot="section">${itemsHtml}</div>
|
|
1038
|
-
<div slot="nav-footer">${footerHtml}</div>
|
|
1039
|
-
</xpl-side-nav>
|
|
1040
|
-
<div class="side-nav-mobile-page">
|
|
1041
|
-
${open ? 'Drawer open — the 80 vw drawer slides over this content; the 20 vw backdrop scrim is visible on the right. Press Escape or tap the backdrop to close.' : 'Tap the toggle in the bar above to open the drawer.'}
|
|
1042
|
-
</div>
|
|
1043
|
-
</div>`;
|
|
1044
|
-
};
|
|
1045
|
-
export const MobileClosed = () => renderMobileSideNav(false);
|
|
1046
|
-
MobileClosed.parameters = {
|
|
1047
|
-
layout: 'fullscreen',
|
|
1048
|
-
design: {
|
|
1049
|
-
type: 'figma',
|
|
1050
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=48928-8582',
|
|
1051
|
-
},
|
|
1052
|
-
docs: {
|
|
1053
|
-
description: {
|
|
1054
|
-
story: 'Mobile closed state (full viewport). Below the `md` breakpoint the sidebar collapses to a ~56 px top bar with a `sidebar-left-show` toggle. Resize the Storybook canvas below 768 px, or use the "Mobile" viewport preset, to see the responsive layout.',
|
|
1055
|
-
},
|
|
1056
|
-
},
|
|
1057
|
-
};
|
|
1058
|
-
export const MobileOpen = () => renderMobileSideNav(true);
|
|
1059
|
-
MobileOpen.parameters = {
|
|
1060
|
-
layout: 'fullscreen',
|
|
1061
|
-
design: {
|
|
1062
|
-
type: 'figma',
|
|
1063
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=48928-8581',
|
|
1064
|
-
},
|
|
1065
|
-
docs: {
|
|
1066
|
-
description: {
|
|
1067
|
-
story: 'Mobile open state (`open` attribute, full viewport). The 80 vw drawer slides in from the left; the remaining 20 vw shows the `xpl-backdrop` scrim. Escape or a backdrop click closes the drawer and returns focus to the toggle.',
|
|
1068
|
-
},
|
|
1069
|
-
},
|
|
1070
|
-
};
|