@xplortech/apollo-core 2.8.1 → 2.10.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 +20 -12
- package/build/style.css +2086 -1875
- package/dist/apollo-core/apollo-core.css +20 -18
- package/dist/apollo-core/apollo-core.esm.js +1 -1
- package/dist/apollo-core/p-0e45f332.entry.js +1 -0
- package/dist/apollo-core/p-0f251f98.entry.js +1 -0
- package/dist/apollo-core/p-1691c4f3.entry.js +1 -0
- package/dist/apollo-core/p-172ac720.entry.js +1 -0
- package/dist/apollo-core/p-23870463.entry.js +1 -0
- package/dist/apollo-core/{p-36ba29da.entry.js → p-3b8639b7.entry.js} +1 -1
- package/dist/apollo-core/p-44a16751.entry.js +1 -0
- package/dist/apollo-core/p-4efecab2.entry.js +1 -0
- package/dist/apollo-core/p-5094dd97.entry.js +1 -0
- package/dist/apollo-core/p-70e7facc.entry.js +1 -0
- package/dist/apollo-core/{p-6a15f1e0.entry.js → p-728341d2.entry.js} +1 -1
- package/dist/apollo-core/p-910be81f.entry.js +1 -0
- package/dist/apollo-core/{p-b61d7952.entry.js → p-9adf3694.entry.js} +1 -1
- package/dist/apollo-core/p-CK3_k8jD.js +1 -0
- package/dist/apollo-core/p-CXkZUm1c.js +2 -0
- package/dist/apollo-core/p-c17b6351.entry.js +1 -0
- package/dist/apollo-core/p-e08b434c.entry.js +1 -0
- package/dist/apollo-core/{p-ca127ee8.entry.js → p-e9e7577f.entry.js} +1 -1
- package/dist/cjs/apollo-core.cjs.js +3 -3
- package/dist/cjs/{index-BQ97-AWw.js → index-BaXVr8ux.js} +36 -9
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/v4-_2BfiRUa.js +52 -0
- package/dist/cjs/xpl-accordion.cjs.entry.js +3 -3
- package/dist/cjs/xpl-application-shell.cjs.entry.js +2 -2
- package/dist/cjs/xpl-avatar_54.cjs.entry.js +709 -177
- package/dist/cjs/xpl-button-row.cjs.entry.js +2 -2
- package/dist/cjs/xpl-calendar.cjs.entry.js +3 -3
- package/dist/cjs/xpl-dynamic-table-cell.cjs.entry.js +3 -3
- package/dist/cjs/xpl-dynamic-table-row.cjs.entry.js +3 -3
- package/dist/cjs/xpl-dynamic-table.cjs.entry.js +2 -2
- package/dist/cjs/xpl-grid-item.cjs.entry.js +2 -2
- package/dist/cjs/xpl-grid.cjs.entry.js +2 -2
- package/dist/cjs/xpl-large-card.cjs.entry.js +2 -2
- package/dist/cjs/xpl-main-nav.cjs.entry.js +2 -2
- package/dist/cjs/xpl-table-header-cell.cjs.entry.js +1 -1
- package/dist/cjs/xpl-table-header.cjs.entry.js +2 -2
- package/dist/cjs/xpl-toggle.cjs.entry.js +5 -5
- package/dist/cjs/xpl-toolbar.cjs.entry.js +3 -3
- package/dist/collection/collection-manifest.json +5 -5
- 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 +4 -4
- package/dist/collection/components/xpl-backdrop/xpl-backdrop.js +1 -1
- package/dist/collection/components/xpl-badge/xpl-badge.js +2 -2
- package/dist/collection/components/xpl-banner/banner.stories.js +5 -0
- 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/button.stories.js +5 -0
- package/dist/collection/components/xpl-button/xpl-button.js +16 -1
- package/dist/collection/components/xpl-button-row/button-row.stories.js +1 -11
- 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 +4 -4
- 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 +208 -31
- package/dist/collection/components/xpl-dynamic-table/xpl-dynamic-table.js +1 -1
- 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/input.stories.js +1 -1
- package/dist/collection/components/xpl-input/xpl-input-color/xpl-input-color.js +11 -9
- 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 +25 -6
- 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 +3 -3
- 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 +4 -1
- package/dist/collection/components/xpl-nav-item/xpl-nav-item.js +2 -2
- package/dist/collection/components/xpl-pagination/xpl-pagination.js +26 -8
- package/dist/collection/components/xpl-panel/xpl-panel.js +2 -2
- package/dist/collection/components/xpl-popover/popover.stories.js +3 -7
- package/dist/collection/components/xpl-popover/xpl-popover.js +5 -5
- 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/radio.stories.js +19 -17
- 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/xpl-select.js +16 -11
- package/dist/collection/components/xpl-side-nav/side-nav-constants.js +2 -0
- package/dist/collection/components/xpl-side-nav/side-nav.stories.js +301 -186
- package/dist/collection/components/xpl-side-nav/xpl-side-nav-item/xpl-side-nav-item.js +80 -14
- package/dist/collection/components/xpl-side-nav/xpl-side-nav.js +284 -3
- 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-spotlight/xpl-spotlight.js +16 -6
- package/dist/collection/components/xpl-tab-panel/xpl-tab-panel.js +2 -2
- package/dist/collection/components/xpl-table/xpl-table.js +13 -22
- package/dist/collection/components/xpl-table-header/xpl-table-header.js +1 -1
- package/dist/collection/components/xpl-tabs/xpl-tabs.js +5 -5
- package/dist/collection/components/xpl-tag/xpl-tag.js +4 -4
- 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/tooltip-arrow.js +1 -1
- package/dist/collection/components/xpl-tooltip/tooltip.stories.js +6 -37
- 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.js +5 -5
- package/dist/collection/components/xpl-utility-bar/xpl-utility-bar.js +1 -1
- package/dist/components/index.d.ts +141 -12
- package/dist/components/index.js +1 -1
- package/dist/components/p-3qMYyqTe.js +1 -0
- package/dist/components/p-B1PBAEzg.js +1 -0
- package/dist/components/p-BG0-6Xek.js +1 -0
- package/dist/components/p-BT_Lq3Vd.js +1 -0
- package/dist/components/p-BWyAzrwu.js +1 -0
- package/dist/components/p-B_Wi--Ov.js +1 -0
- package/dist/components/p-Bd6JweBt.js +1 -0
- package/dist/components/p-Bn-27-xj.js +1 -0
- package/dist/components/{xpl-top-nav-item2.js → p-Bs6vq0C6.js} +1 -1
- package/dist/components/{xpl-input-file2.js → p-C9BO2vL-.js} +1 -1
- package/dist/components/p-CFW_w5Wj.js +1 -0
- package/dist/components/{floating-ui.dom.js → p-CFpsSZyr.js} +1 -1
- package/dist/components/p-CGNq3DyC.js +1 -0
- package/dist/components/p-CK3_k8jD.js +1 -0
- package/dist/components/p-CVqbA9op.js +1 -0
- package/dist/components/p-CtIUusUL.js +1 -0
- package/dist/components/p-CzwViN3U.js +1 -0
- package/dist/components/p-D97c0GjM.js +1 -0
- package/dist/components/p-DBWV65V-.js +1 -0
- package/dist/components/{xpl-tag2.js → p-DEl4Rvzs.js} +1 -1
- package/dist/components/p-DPTHmitJ.js +1 -0
- package/dist/components/{xpl-input-search2.js → p-DllC7F-H.js} +1 -1
- package/dist/components/p-Ds28UyUR.js +1 -0
- package/dist/components/p-U5dPMCXE.js +1 -0
- package/dist/components/p-hPUzON4O.js +1 -0
- package/dist/components/p-kPHfCq1d.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-item.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-header-cell.js +1 -1
- package/dist/components/xpl-table-header.js +1 -1
- 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.js +1 -1
- package/dist/components/xpl-utility-bar.js +1 -1
- package/dist/docs/xpl-backdrop/readme.md +2 -0
- package/dist/docs/xpl-badge/readme.md +34 -0
- package/dist/docs/xpl-button/readme.md +2 -0
- package/dist/docs/xpl-button-row/readme.md +13 -0
- package/dist/docs/xpl-checkbox/readme.md +23 -1
- package/dist/docs/xpl-divider/readme.md +22 -4
- package/dist/docs/xpl-input/readme.md +51 -0
- package/dist/docs/xpl-input/xpl-input-date/readme.md +7 -0
- package/dist/docs/xpl-input/xpl-input-phone/readme.md +21 -0
- package/dist/docs/xpl-popover/readme.md +24 -0
- package/dist/docs/xpl-radio/readme.md +21 -4
- package/dist/docs/xpl-side-nav/readme.md +153 -5
- package/dist/docs/xpl-side-nav/xpl-side-nav-item/readme.md +165 -32
- package/dist/docs/xpl-table/readme.md +2 -0
- package/dist/docs/xpl-tooltip/readme.md +29 -1
- package/dist/esm/apollo-core.js +4 -4
- package/dist/esm/{index-C7bgJs6C.js → index-CXkZUm1c.js} +36 -9
- package/dist/esm/loader.js +3 -3
- package/dist/esm/v4-CK3_k8jD.js +50 -0
- package/dist/esm/xpl-accordion.entry.js +3 -3
- package/dist/esm/xpl-application-shell.entry.js +2 -2
- package/dist/esm/xpl-avatar_54.entry.js +709 -177
- package/dist/esm/xpl-button-row.entry.js +2 -2
- package/dist/esm/xpl-calendar.entry.js +3 -3
- package/dist/esm/xpl-dynamic-table-cell.entry.js +3 -3
- package/dist/esm/xpl-dynamic-table-row.entry.js +3 -3
- package/dist/esm/xpl-dynamic-table.entry.js +2 -2
- package/dist/esm/xpl-grid-item.entry.js +2 -2
- package/dist/esm/xpl-grid.entry.js +2 -2
- package/dist/esm/xpl-large-card.entry.js +2 -2
- package/dist/esm/xpl-main-nav.entry.js +2 -2
- package/dist/esm/xpl-table-header-cell.entry.js +1 -1
- package/dist/esm/xpl-table-header.entry.js +2 -2
- package/dist/esm/xpl-toggle.entry.js +5 -5
- package/dist/esm/xpl-toolbar.entry.js +3 -3
- package/dist/types/components/xpl-banner/banner.stories.d.ts +2 -0
- package/dist/types/components/xpl-button/button.stories.d.ts +2 -0
- package/dist/types/components/xpl-button/xpl-button.d.ts +1 -0
- package/dist/types/components/xpl-dropdown/xpl-dropdown.d.ts +16 -0
- package/dist/types/components/xpl-input/xpl-input-phone/xpl-input-phone.d.ts +1 -0
- package/dist/types/components/xpl-pagination/xpl-pagination.d.ts +4 -0
- package/dist/types/components/xpl-radio/radio.stories.d.ts +11 -10
- package/dist/types/components/xpl-side-nav/side-nav-constants.d.ts +2 -0
- package/dist/types/components/xpl-side-nav/side-nav.stories.d.ts +53 -32
- package/dist/types/components/xpl-side-nav/xpl-side-nav-item/xpl-side-nav-item.d.ts +10 -0
- package/dist/types/components/xpl-side-nav/xpl-side-nav.d.ts +31 -0
- package/dist/types/components/xpl-spotlight/xpl-spotlight.d.ts +1 -0
- package/dist/types/components.d.ts +223 -20
- package/dist/types/stencil-public-runtime.d.ts +1 -0
- package/package.json +39 -38
- package/dist/apollo-core/p-0bf50890.entry.js +0 -1
- package/dist/apollo-core/p-1947e7a8.entry.js +0 -1
- package/dist/apollo-core/p-27928cb0.entry.js +0 -1
- package/dist/apollo-core/p-34438721.entry.js +0 -1
- package/dist/apollo-core/p-35c2f72d.entry.js +0 -1
- package/dist/apollo-core/p-368c81f1.entry.js +0 -1
- package/dist/apollo-core/p-406b27a8.entry.js +0 -1
- package/dist/apollo-core/p-5d63b4ce.entry.js +0 -1
- package/dist/apollo-core/p-689f1dae.entry.js +0 -1
- package/dist/apollo-core/p-8d692d05.entry.js +0 -1
- package/dist/apollo-core/p-C7bgJs6C.js +0 -2
- package/dist/apollo-core/p-Cqlsd6nf.js +0 -1
- package/dist/apollo-core/p-cd56a3d5.entry.js +0 -1
- package/dist/apollo-core/p-dc205893.entry.js +0 -1
- package/dist/cjs/v4-D4KzFnn8.js +0 -67
- package/dist/components/index3.js +0 -1
- package/dist/components/v4.js +0 -1
- package/dist/components/xpl-avatar2.js +0 -1
- package/dist/components/xpl-backdrop2.js +0 -1
- package/dist/components/xpl-badge2.js +0 -1
- package/dist/components/xpl-button2.js +0 -1
- package/dist/components/xpl-checkbox2.js +0 -1
- package/dist/components/xpl-divider2.js +0 -1
- package/dist/components/xpl-dropdown-group2.js +0 -1
- package/dist/components/xpl-dropdown-heading2.js +0 -1
- package/dist/components/xpl-dropdown-option2.js +0 -1
- package/dist/components/xpl-dropdown2.js +0 -1
- package/dist/components/xpl-icon2.js +0 -1
- package/dist/components/xpl-input-date2.js +0 -1
- package/dist/components/xpl-input2.js +0 -1
- package/dist/components/xpl-list-item2.js +0 -1
- package/dist/components/xpl-popover2.js +0 -1
- package/dist/components/xpl-radio2.js +0 -1
- package/dist/components/xpl-select2.js +0 -1
- package/dist/components/xpl-tooltip2.js +0 -1
- package/dist/esm/v4-Cqlsd6nf.js +0 -65
- /package/dist/components/{_commonjsHelpers.js → p-BFTU3MAI.js} +0 -0
- /package/dist/components/{index2.js → p-CH4yJ6Qx.js} +0 -0
- /package/dist/components/{tab-a11y-ids.js → p-Yj_QFaRn.js} +0 -0
- /package/dist/{index.cjs.js → index.cjs} +0 -0
- /package/dist/types/{Users/roc/Sites → home/runner/work/apollo}/apollo/packages/apollo-core/.stencil/css/typography.stories.d.ts +0 -0
- /package/loader/{cdn.js → cdn.cjs} +0 -0
- /package/loader/{index.cjs.js → index.cjs} +0 -0
|
@@ -7,25 +7,26 @@ const escapeHtmlAttribute = (value) => value
|
|
|
7
7
|
const defaultItems = [
|
|
8
8
|
{ label: 'Dashboard', icon: 'house-4', selected: true },
|
|
9
9
|
{ label: 'Product', icon: 'bag-shopping-2' },
|
|
10
|
-
{ label: 'Reports', icon: 'chart-line'
|
|
10
|
+
{ label: 'Reports', icon: 'chart-line' },
|
|
11
11
|
{ label: 'Disabled Item', icon: 'lock', disabled: true },
|
|
12
12
|
{ label: 'Hidden Item', icon: 'eye', hidden: true },
|
|
13
13
|
{
|
|
14
14
|
label: 'Settings',
|
|
15
|
+
icon: 'gear',
|
|
15
16
|
hasChildren: true,
|
|
16
17
|
expanded: true,
|
|
17
18
|
children: [{ label: 'Location' }, { label: 'Schedule', selected: true }],
|
|
18
19
|
},
|
|
19
20
|
{
|
|
20
21
|
label: 'Integrations',
|
|
22
|
+
icon: 'plug',
|
|
21
23
|
hasChildren: true,
|
|
22
24
|
children: [{ label: 'Webhooks' }, { label: 'API Keys' }],
|
|
23
25
|
},
|
|
24
26
|
{
|
|
25
|
-
label: '
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
children: [{ label: 'Old Reports' }],
|
|
27
|
+
label: 'Xplor Growth',
|
|
28
|
+
icon: 'chart-line-up',
|
|
29
|
+
trailingIcon: 'external-link',
|
|
29
30
|
},
|
|
30
31
|
];
|
|
31
32
|
const defaultFooterItems = [
|
|
@@ -41,7 +42,7 @@ const renderNavItem = (item) => {
|
|
|
41
42
|
var _a, _b;
|
|
42
43
|
const attrs = [
|
|
43
44
|
item.label ? `label="${escapeHtmlAttribute(item.label)}"` : '',
|
|
44
|
-
item.icon
|
|
45
|
+
item.icon ? `icon="${escapeHtmlAttribute(item.icon)}"` : '',
|
|
45
46
|
item.selected ? 'selected' : '',
|
|
46
47
|
item.disabled ? 'disabled' : '',
|
|
47
48
|
item.hidden ? 'hidden' : '',
|
|
@@ -52,17 +53,20 @@ const renderNavItem = (item) => {
|
|
|
52
53
|
.filter(Boolean)
|
|
53
54
|
.join(' ');
|
|
54
55
|
if (item.link && item.href) {
|
|
56
|
+
const leadingIcon = item.icon
|
|
57
|
+
? `<xpl-icon icon="${escapeHtmlAttribute(item.icon)}" size="16"></xpl-icon>`
|
|
58
|
+
: '';
|
|
55
59
|
return `
|
|
56
60
|
<xpl-side-nav-item ${attrs}>
|
|
57
|
-
<a href="${escapeHtmlAttribute(item.href)}">
|
|
58
|
-
${item.icon ? `<xpl-icon icon="${escapeHtmlAttribute(item.icon)}" size="16"></xpl-icon>` : ''}
|
|
59
|
-
${escapeHtmlAttribute(item.label)}
|
|
60
|
-
</a>
|
|
61
|
+
<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>
|
|
61
62
|
</xpl-side-nav-item>`;
|
|
62
63
|
}
|
|
63
64
|
const childrenHtml = (_b = (_a = item.children) === null || _a === void 0 ? void 0 : _a.map(renderNavItem).join('')) !== null && _b !== void 0 ? _b : '';
|
|
65
|
+
const trailingSlot = item.trailingIcon && !item.hasChildren
|
|
66
|
+
? `\n <xpl-icon slot="trailing" icon="${escapeHtmlAttribute(item.trailingIcon)}" size="16" aria-hidden="true"></xpl-icon>`
|
|
67
|
+
: '';
|
|
64
68
|
return `
|
|
65
|
-
<xpl-side-nav-item ${attrs}>${childrenHtml}
|
|
69
|
+
<xpl-side-nav-item ${attrs}>${trailingSlot}${childrenHtml}
|
|
66
70
|
</xpl-side-nav-item>`;
|
|
67
71
|
};
|
|
68
72
|
const renderHtmlNavItem = (item, depth = 0) => {
|
|
@@ -78,17 +82,23 @@ const renderHtmlNavItem = (item, depth = 0) => {
|
|
|
78
82
|
if (item.link) {
|
|
79
83
|
return `${indent}<div class="xpl-side-nav-item">
|
|
80
84
|
${indent} <a href="${item.href || '#'}" class="${linkClass}"${item.selected ? ' aria-current="page"' : ''}${item.disabled ? ' aria-disabled="true" tabindex="-1"' : ''}>
|
|
81
|
-
${indent} <span class="xpl-side-nav-
|
|
85
|
+
${indent} <span class="xpl-side-nav-item__leading">${item.icon ? `<xpl-icon icon="${item.icon}" size="16"></xpl-icon>` : ''}</span>
|
|
82
86
|
${indent} <span class="xpl-side-nav-item__label">${item.label}</span>
|
|
83
87
|
${indent} </a>
|
|
84
88
|
${indent}</div>`;
|
|
85
89
|
}
|
|
86
90
|
const hasChildren = item.hasChildren || (item.children && item.children.length > 0);
|
|
87
91
|
const childrenHtml = (_b = (_a = item.children) === null || _a === void 0 ? void 0 : _a.map((child) => renderHtmlNavItem(child, depth + 2)).join('\n')) !== null && _b !== void 0 ? _b : '';
|
|
92
|
+
const trailingHtml = hasChildren
|
|
93
|
+
? `<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>`
|
|
94
|
+
: item.trailingIcon
|
|
95
|
+
? `<span class="xpl-side-nav-item__trailing"><xpl-icon icon="${item.trailingIcon}" size="16" aria-hidden="true"></xpl-icon></span>`
|
|
96
|
+
: '';
|
|
88
97
|
return `${indent}<div class="xpl-side-nav-item">
|
|
89
98
|
${indent} <button type="button" class="${linkClass}"${item.selected ? ' aria-current="page"' : ''}${hasChildren ? ` aria-expanded="${item.expanded ? 'true' : 'false'}"` : ''}${item.disabled ? ' disabled' : ''}>
|
|
90
|
-
${indent}
|
|
99
|
+
${indent} <span class="xpl-side-nav-item__leading">${item.icon ? `<xpl-icon icon="${item.icon}" size="16"></xpl-icon>` : ''}</span>
|
|
91
100
|
${indent} <span class="xpl-side-nav-item__label">${item.label}</span>
|
|
101
|
+
${indent} ${trailingHtml}
|
|
92
102
|
${indent} </button>${hasChildren && !item.link
|
|
93
103
|
? `
|
|
94
104
|
${indent} <div class="xpl-side-nav-item__children ${item.expanded ? 'expanded' : ''}">
|
|
@@ -128,30 +138,65 @@ const SideNavigationWebComponent = (config) => {
|
|
|
128
138
|
const footerHtml = footerItems.map(renderNavItem).join('');
|
|
129
139
|
return `<xpl-side-nav label="${escapeHtmlAttribute(navLabel)}"><div slot="section">${itemsHtml}</div><div slot="nav-footer">${footerHtml}</div></xpl-side-nav>`;
|
|
130
140
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
141
|
+
let sideNavClickController;
|
|
142
|
+
export const SideNavigation = {
|
|
143
|
+
args: {
|
|
144
|
+
navConfig: Object.assign({}, defaultNavConfig),
|
|
145
|
+
},
|
|
146
|
+
argTypes: {
|
|
147
|
+
navConfig: {
|
|
148
|
+
control: 'object',
|
|
149
|
+
description: 'Full sidebar config (router-style): `navLabel`, `items[]`, `footerItems[]`. Arrays map to `xpl-side-nav-item` markup.',
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
render: ({ navConfig }) => {
|
|
153
|
+
const { navLabel, items, footerItems } = navConfig;
|
|
154
|
+
const itemsHtml = items.map(renderNavItem).join('');
|
|
155
|
+
const footerHtml = footerItems.map(renderNavItem).join('');
|
|
156
|
+
return `
|
|
136
157
|
<style>
|
|
137
158
|
.side-nav-demo-wrapper {
|
|
138
|
-
height: 600px;
|
|
139
159
|
display: flex;
|
|
160
|
+
height: 600px;
|
|
140
161
|
background-color: var(--xpl-background-surface-subtle);
|
|
141
162
|
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
142
163
|
}
|
|
164
|
+
/* Above md: nav is a fixed-width column; main fills the rest of the row. */
|
|
165
|
+
@media (min-width: 768px) {
|
|
166
|
+
.side-nav-demo-wrapper {
|
|
167
|
+
flex-direction: row;
|
|
168
|
+
}
|
|
169
|
+
.side-nav-demo-main {
|
|
170
|
+
flex: 1;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/* Below md: nav collapses to a top bar; main flows beneath it. */
|
|
174
|
+
@media (max-width: 767px) {
|
|
175
|
+
.side-nav-demo-wrapper {
|
|
176
|
+
flex-direction: column;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
143
179
|
.side-nav-demo-main {
|
|
144
|
-
flex: 1;
|
|
145
180
|
padding: var(--xpl-space-32);
|
|
181
|
+
font-family: var(--xpl-font-family-default);
|
|
146
182
|
color: var(--xpl-text-default);
|
|
147
183
|
}
|
|
148
184
|
.side-nav-demo-main h1 { margin: 0; }
|
|
185
|
+
.side-nav-demo-note {
|
|
186
|
+
font-family: var(--xpl-font-family-default);
|
|
187
|
+
font-size: var(--xpl-font-size-callout);
|
|
188
|
+
color: var(--xpl-text-subdued);
|
|
189
|
+
margin: var(--xpl-space-8) 0 0;
|
|
190
|
+
line-height: 1.5;
|
|
191
|
+
}
|
|
149
192
|
.side-nav-demo-legend {
|
|
150
193
|
margin-top: var(--xpl-space-24);
|
|
151
194
|
padding: var(--xpl-space-16);
|
|
152
195
|
border-radius: var(--xpl-border-radius-default);
|
|
153
196
|
background: var(--xpl-background-surface-transparent-5);
|
|
197
|
+
font-family: var(--xpl-font-family-default);
|
|
154
198
|
font-size: var(--xpl-font-size-callout);
|
|
199
|
+
color: var(--xpl-text-subdued);
|
|
155
200
|
line-height: 1.8;
|
|
156
201
|
}
|
|
157
202
|
.side-nav-demo-legend code {
|
|
@@ -171,48 +216,63 @@ export const SideNavigation = ({ navConfig }) => {
|
|
|
171
216
|
|
|
172
217
|
<div class="side-nav-demo-main">
|
|
173
218
|
<h1>Side Navigation Demo</h1>
|
|
174
|
-
<p>
|
|
219
|
+
<p class="side-nav-demo-note">Click any item in the nav to select it. Parent items expand and collapse on click.</p>
|
|
175
220
|
<div class="side-nav-demo-legend">
|
|
176
|
-
<strong
|
|
177
|
-
<code>
|
|
221
|
+
<strong>v2 anatomy per row:</strong><br/>
|
|
222
|
+
<code>slot="leading"</code> — leading icon (or <code>icon</code> prop)<br/>
|
|
223
|
+
label (flex-1)<br/>
|
|
224
|
+
<code>slot="trailing"</code> — trailing icon; auto chevron for parents (<code>chevron-down</code> collapsed, <code>chevron-up</code> expanded)
|
|
178
225
|
</div>
|
|
179
226
|
<div class="side-nav-demo-legend">
|
|
180
227
|
<strong><code>NavItem</code></strong><br/>
|
|
181
|
-
<code>{ label, icon?, selected?, disabled?, hidden?, hasChildren?, expanded?, link?, href?, children? }</code>
|
|
228
|
+
<code>{ label, icon?, trailingIcon?, selected?, disabled?, hidden?, hasChildren?, expanded?, link?, href?, children? }</code>
|
|
182
229
|
</div>
|
|
183
230
|
<div class="side-nav-demo-legend">
|
|
184
|
-
<strong>
|
|
185
|
-
|
|
186
|
-
|
|
231
|
+
<strong>Responsive (below <code>md</code> / 768 px):</strong><br/>
|
|
232
|
+
The sidebar collapses to a ~56 px top bar with a built-in toggle button.<br/>
|
|
233
|
+
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/>
|
|
234
|
+
<strong>Closing:</strong> toggle button, <code>Escape</code> key, or backdrop click — all return focus to the toggle.<br/>
|
|
235
|
+
<strong>Focus trap:</strong> <code>Tab</code> cycles within the open drawer.<br/>
|
|
236
|
+
<strong>API:</strong> <code>open</code> prop/attr (reflected) · <code>openChange</code> event · <code>toggle()</code> / <code>setOpen()</code> methods
|
|
187
237
|
</div>
|
|
188
238
|
</div>
|
|
189
239
|
</div>`;
|
|
190
|
-
};
|
|
191
|
-
SideNavigation.args = {
|
|
192
|
-
navConfig: Object.assign({}, defaultNavConfig),
|
|
193
|
-
};
|
|
194
|
-
SideNavigation.argTypes = {
|
|
195
|
-
navConfig: {
|
|
196
|
-
control: 'object',
|
|
197
|
-
description: 'Full sidebar config (router-style): `navLabel`, `items[]`, `footerItems[]`. Arrays map to `xpl-side-nav-item` markup.',
|
|
198
240
|
},
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
241
|
+
play: async ({ canvasElement }) => {
|
|
242
|
+
sideNavClickController === null || sideNavClickController === void 0 ? void 0 : sideNavClickController.abort();
|
|
243
|
+
sideNavClickController = new AbortController();
|
|
244
|
+
const nav = canvasElement.querySelector('xpl-side-nav');
|
|
245
|
+
if (!nav)
|
|
246
|
+
return;
|
|
247
|
+
nav.addEventListener('click', (e) => {
|
|
248
|
+
const item = e.target.closest('xpl-side-nav-item');
|
|
249
|
+
if (!item)
|
|
250
|
+
return;
|
|
251
|
+
if (item.hasAttribute('disabled'))
|
|
252
|
+
return;
|
|
253
|
+
if (item.hasAttribute('has-children'))
|
|
254
|
+
return;
|
|
255
|
+
nav.querySelectorAll('xpl-side-nav-item').forEach((el) => el.removeAttribute('selected'));
|
|
256
|
+
item.setAttribute('selected', '');
|
|
257
|
+
}, { signal: sideNavClickController.signal });
|
|
205
258
|
},
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
259
|
+
parameters: {
|
|
260
|
+
layout: 'fullscreen',
|
|
261
|
+
design: {
|
|
262
|
+
type: 'figma',
|
|
263
|
+
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=33873-23128&m=dev',
|
|
264
|
+
},
|
|
265
|
+
docs: {
|
|
266
|
+
description: {
|
|
267
|
+
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.',
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
'web-component': {
|
|
271
|
+
render: SideNavigationWebComponent(defaultNavConfig),
|
|
272
|
+
},
|
|
273
|
+
html: {
|
|
274
|
+
render: renderHtmlSideNav(defaultNavConfig),
|
|
209
275
|
},
|
|
210
|
-
},
|
|
211
|
-
'web-component': {
|
|
212
|
-
render: SideNavigationWebComponent(SideNavigation.args.navConfig),
|
|
213
|
-
},
|
|
214
|
-
html: {
|
|
215
|
-
render: renderHtmlSideNav(SideNavigation.args.navConfig),
|
|
216
276
|
},
|
|
217
277
|
};
|
|
218
278
|
export const ItemPlayground = {
|
|
@@ -223,7 +283,11 @@ export const ItemPlayground = {
|
|
|
223
283
|
},
|
|
224
284
|
icon: {
|
|
225
285
|
control: 'text',
|
|
226
|
-
description: 'Icon name
|
|
286
|
+
description: 'Icon name — default content for `slot="leading"`. Applies to all item types including parents (`has-children`) in v2.',
|
|
287
|
+
},
|
|
288
|
+
trailingIcon: {
|
|
289
|
+
control: 'text',
|
|
290
|
+
description: 'Icon name for `slot="trailing"`. On parent items (`has-children`), providing this replaces the auto chevron (`chevron-down` collapsed / `chevron-up` expanded).',
|
|
227
291
|
},
|
|
228
292
|
selected: {
|
|
229
293
|
control: 'boolean',
|
|
@@ -261,6 +325,7 @@ export const ItemPlayground = {
|
|
|
261
325
|
args: {
|
|
262
326
|
label: 'Playground Item',
|
|
263
327
|
icon: 'house-4',
|
|
328
|
+
trailingIcon: '',
|
|
264
329
|
selected: false,
|
|
265
330
|
disabled: false,
|
|
266
331
|
hidden: false,
|
|
@@ -270,42 +335,48 @@ export const ItemPlayground = {
|
|
|
270
335
|
childLabel1: 'Child Item A',
|
|
271
336
|
childLabel2: 'Child Item B',
|
|
272
337
|
},
|
|
273
|
-
render: ({ label, icon, selected, disabled, hidden, expanded, hasChildren, link, childLabel1, childLabel2, }) => {
|
|
338
|
+
render: ({ label, icon, trailingIcon, selected, disabled, hidden, expanded, hasChildren, link, childLabel1, childLabel2, }) => {
|
|
274
339
|
const attrs = [
|
|
275
340
|
label ? `label="${label}"` : '',
|
|
276
|
-
icon
|
|
341
|
+
icon ? `icon="${icon}"` : '',
|
|
277
342
|
selected ? 'selected' : '',
|
|
278
343
|
disabled ? 'disabled' : '',
|
|
279
344
|
hidden ? 'hidden' : '',
|
|
280
345
|
expanded ? 'expanded' : '',
|
|
281
|
-
hasChildren ? 'has-children' : '',
|
|
346
|
+
!link && hasChildren ? 'has-children' : '',
|
|
282
347
|
link ? 'link' : '',
|
|
283
348
|
]
|
|
284
349
|
.filter(Boolean)
|
|
285
350
|
.join(' ');
|
|
286
351
|
let content = '';
|
|
352
|
+
const trailingSlot = trailingIcon && !link
|
|
353
|
+
? `\n <xpl-icon slot="trailing" icon="${trailingIcon}" size="16" aria-hidden="true"></xpl-icon>`
|
|
354
|
+
: '';
|
|
287
355
|
if (link) {
|
|
356
|
+
const leadingIcon = icon ? `<xpl-icon icon="${icon}" size="16"></xpl-icon>` : '';
|
|
288
357
|
content = `
|
|
289
|
-
<a href="#${(label === null || label === void 0 ? void 0 : label.toLowerCase().replace(/\s+/g, '-')) || 'item'}"
|
|
290
|
-
${icon ? `<xpl-icon icon="${icon}" size="16"></xpl-icon>` : ''}
|
|
291
|
-
${label}
|
|
292
|
-
</a>`;
|
|
358
|
+
<a href="#${(label === null || label === void 0 ? void 0 : 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>`;
|
|
293
359
|
}
|
|
294
360
|
else if (hasChildren) {
|
|
295
|
-
content =
|
|
296
|
-
<xpl-side-nav-item label="${childLabel1}" ></xpl-side-nav-item>
|
|
297
|
-
<xpl-side-nav-item label="${childLabel2}" ></xpl-side-nav-item>`;
|
|
361
|
+
content = `${trailingSlot}
|
|
362
|
+
<xpl-side-nav-item label="${childLabel1}" icon="circle-dot"></xpl-side-nav-item>
|
|
363
|
+
<xpl-side-nav-item label="${childLabel2}" icon="circle-dot"></xpl-side-nav-item>`;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
content = trailingSlot;
|
|
298
367
|
}
|
|
299
368
|
return `
|
|
300
369
|
<style>
|
|
301
370
|
.item-playground-wrapper {
|
|
302
|
-
width: 280px;
|
|
303
371
|
padding: var(--xpl-space-16);
|
|
304
372
|
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
305
373
|
background-color: var(--xpl-background-surface-subtlest);
|
|
306
374
|
border-radius: var(--xpl-border-radius-default);
|
|
375
|
+
height: auto;
|
|
376
|
+
min-height: 0;
|
|
307
377
|
}
|
|
308
378
|
.item-playground-note {
|
|
379
|
+
font-family: var(--xpl-font-family-default);
|
|
309
380
|
font-size: var(--xpl-font-size-caption);
|
|
310
381
|
color: var(--xpl-text-subdued);
|
|
311
382
|
margin-top: var(--xpl-space-12);
|
|
@@ -317,7 +388,7 @@ export const ItemPlayground = {
|
|
|
317
388
|
</xpl-side-nav-item>
|
|
318
389
|
</div>
|
|
319
390
|
<p class="item-playground-note">
|
|
320
|
-
Interactive playground for <code>xpl-side-nav-item</code>. Toggle props in the Controls panel
|
|
391
|
+
Interactive playground for <code>xpl-side-nav-item</code>. Toggle props in the Controls panel.
|
|
321
392
|
</p>`;
|
|
322
393
|
},
|
|
323
394
|
parameters: {
|
|
@@ -329,96 +400,76 @@ export const ItemPlayground = {
|
|
|
329
400
|
},
|
|
330
401
|
},
|
|
331
402
|
};
|
|
332
|
-
const
|
|
333
|
-
var _a;
|
|
334
|
-
const attrs = [
|
|
335
|
-
args.label ? `label="${args.label}"` : '',
|
|
336
|
-
args.icon && !args.hasChildren ? `icon="${args.icon}"` : '',
|
|
337
|
-
args.selected ? 'selected' : '',
|
|
338
|
-
args.disabled ? 'disabled' : '',
|
|
339
|
-
args.hidden ? 'hidden' : '',
|
|
340
|
-
args.expanded ? 'expanded' : '',
|
|
341
|
-
args.hasChildren ? 'has-children' : '',
|
|
342
|
-
args.link ? 'link' : '',
|
|
343
|
-
]
|
|
344
|
-
.filter(Boolean)
|
|
345
|
-
.join(' ');
|
|
346
|
-
let content = '';
|
|
347
|
-
if (args.link) {
|
|
348
|
-
content = `
|
|
349
|
-
<a href="#${((_a = args.label) === null || _a === void 0 ? void 0 : _a.toLowerCase().replace(/\s+/g, '-')) || 'item'}">
|
|
350
|
-
${args.icon ? `<xpl-icon icon="${args.icon}" size="16"></xpl-icon>` : ''}
|
|
351
|
-
${args.label}
|
|
352
|
-
</a>`;
|
|
353
|
-
}
|
|
354
|
-
else if (args.hasChildren) {
|
|
355
|
-
content = `
|
|
356
|
-
<xpl-side-nav-item label="${args.childLabel1}"></xpl-side-nav-item>
|
|
357
|
-
<xpl-side-nav-item label="${args.childLabel2}"></xpl-side-nav-item>`;
|
|
358
|
-
}
|
|
359
|
-
return `
|
|
403
|
+
export const ExternalLinkItem = () => `
|
|
360
404
|
<style>
|
|
361
|
-
.
|
|
362
|
-
width: 280px;
|
|
405
|
+
.external-link-demo {
|
|
363
406
|
padding: var(--xpl-space-16);
|
|
364
407
|
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
365
408
|
background-color: var(--xpl-background-surface-subtlest);
|
|
366
409
|
border-radius: var(--xpl-border-radius-default);
|
|
410
|
+
height: auto;
|
|
411
|
+
min-height: 0;
|
|
412
|
+
}
|
|
413
|
+
.external-link-caption {
|
|
414
|
+
font-family: var(--xpl-font-family-default);
|
|
415
|
+
font-size: var(--xpl-font-size-caption);
|
|
416
|
+
color: var(--xpl-text-subdued);
|
|
417
|
+
margin-bottom: var(--xpl-space-8);
|
|
367
418
|
}
|
|
368
419
|
</style>
|
|
369
|
-
<
|
|
370
|
-
|
|
420
|
+
<p class="external-link-caption">Leaf item with leading icon + trailing external-link icon</p>
|
|
421
|
+
<div class="xpl-side-nav external-link-demo">
|
|
422
|
+
<xpl-side-nav-item label="Xplor Growth" icon="chart-line-up">
|
|
423
|
+
<xpl-icon slot="trailing" icon="external-link" size="16" aria-hidden="true"></xpl-icon>
|
|
371
424
|
</xpl-side-nav-item>
|
|
425
|
+
<xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
|
|
426
|
+
<xpl-side-nav-item label="Reports" icon="chart-line"></xpl-side-nav-item>
|
|
372
427
|
</div>`;
|
|
428
|
+
ExternalLinkItem.parameters = {
|
|
429
|
+
layout: 'centered',
|
|
430
|
+
docs: {
|
|
431
|
+
description: {
|
|
432
|
+
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.',
|
|
433
|
+
},
|
|
434
|
+
},
|
|
373
435
|
};
|
|
374
|
-
const
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
if (link) {
|
|
384
|
-
return `<div class="xpl-side-nav-item">
|
|
385
|
-
<a href="#item" class="${linkClass}"${selected ? ' aria-current="page"' : ''}${disabled ? ' aria-disabled="true" tabindex="-1"' : ''}>
|
|
386
|
-
<span class="xpl-side-nav-item__icon"><!-- icon --></span>
|
|
387
|
-
<span class="xpl-side-nav-item__label">${label}</span>
|
|
388
|
-
</a>
|
|
389
|
-
</div>`;
|
|
436
|
+
export const ParentWithLeadingIcon = () => `
|
|
437
|
+
<style>
|
|
438
|
+
.parent-leading-demo {
|
|
439
|
+
padding: var(--xpl-space-16);
|
|
440
|
+
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
441
|
+
background-color: var(--xpl-background-surface-subtlest);
|
|
442
|
+
border-radius: var(--xpl-border-radius-default);
|
|
443
|
+
height: auto;
|
|
444
|
+
min-height: 0;
|
|
390
445
|
}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
<
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
</
|
|
408
|
-
|
|
409
|
-
: '';
|
|
410
|
-
return `<div class="xpl-side-nav-item">
|
|
411
|
-
<button type="button" class="${linkClass}"${selected ? ' aria-current="page"' : ''}${hasChildren ? ` aria-expanded="${expanded ? 'true' : 'false'}"` : ''}${disabled ? ' disabled' : ''}>
|
|
412
|
-
${hasChildren ? '<span class="xpl-side-nav-item__arrow"><!-- chevron --></span>' : '<span class="xpl-side-nav-item__icon"><!-- icon --></span>'}
|
|
413
|
-
<span class="xpl-side-nav-item__label">${label}</span>
|
|
414
|
-
</button>${childrenContent}
|
|
446
|
+
.parent-leading-caption {
|
|
447
|
+
font-family: var(--xpl-font-family-default);
|
|
448
|
+
font-size: var(--xpl-font-size-caption);
|
|
449
|
+
color: var(--xpl-text-subdued);
|
|
450
|
+
margin-bottom: var(--xpl-space-8);
|
|
451
|
+
}
|
|
452
|
+
</style>
|
|
453
|
+
<p class="parent-leading-caption">Parents now show leading icon AND chevron (v2 behavior)</p>
|
|
454
|
+
<div class="xpl-side-nav parent-leading-demo">
|
|
455
|
+
<xpl-side-nav-item label="Settings" icon="gear" has-children expanded>
|
|
456
|
+
<xpl-side-nav-item label="Location"></xpl-side-nav-item>
|
|
457
|
+
<xpl-side-nav-item label="Schedule" selected></xpl-side-nav-item>
|
|
458
|
+
</xpl-side-nav-item>
|
|
459
|
+
<xpl-side-nav-item label="Integrations" icon="plug" has-children>
|
|
460
|
+
<xpl-side-nav-item label="Webhooks"></xpl-side-nav-item>
|
|
461
|
+
<xpl-side-nav-item label="API Keys"></xpl-side-nav-item>
|
|
462
|
+
</xpl-side-nav-item>
|
|
463
|
+
<xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
|
|
415
464
|
</div>`;
|
|
465
|
+
ParentWithLeadingIcon.parameters = {
|
|
466
|
+
layout: 'centered',
|
|
467
|
+
docs: {
|
|
468
|
+
description: {
|
|
469
|
+
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.',
|
|
470
|
+
},
|
|
471
|
+
},
|
|
416
472
|
};
|
|
417
|
-
ItemPlayground.parameters = Object.assign(Object.assign({}, ItemPlayground.parameters), { 'web-component': {
|
|
418
|
-
render: ItemPlaygroundWebComponent(ItemPlayground.args),
|
|
419
|
-
}, html: {
|
|
420
|
-
render: renderHtmlItemPlayground(ItemPlayground.args),
|
|
421
|
-
} });
|
|
422
473
|
export const FooterSlot = {
|
|
423
474
|
argTypes: {
|
|
424
475
|
footerItems: {
|
|
@@ -430,85 +481,64 @@ export const FooterSlot = {
|
|
|
430
481
|
footerItems: [
|
|
431
482
|
{ label: 'Settings', icon: 'gear' },
|
|
432
483
|
{ label: 'Help', icon: 'headset' },
|
|
433
|
-
{ label: 'Logout', icon: 'open-rect-arrow-out'
|
|
484
|
+
{ label: 'Logout', icon: 'open-rect-arrow-out' },
|
|
434
485
|
],
|
|
435
486
|
},
|
|
436
487
|
render: ({ footerItems }) => {
|
|
437
488
|
const footerHtml = footerItems.map(renderNavItem).join('');
|
|
438
489
|
return `
|
|
439
490
|
<style>
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
491
|
+
/*
|
|
492
|
+
* Focused preview of the nav-footer slot only. Renders the static
|
|
493
|
+
* .xpl-side-nav__footer markup at sidebar width so the footer styling
|
|
494
|
+
* (top divider, padding) is shown in isolation -- no host xpl-side-nav
|
|
495
|
+
* wrapper, so no mobile top-bar collapse intrudes on the docs view.
|
|
496
|
+
*/
|
|
497
|
+
/*
|
|
498
|
+
* Override the .xpl-side-nav host defaults (height: 100%, overflow: hidden)
|
|
499
|
+
* so the demo card shrink-wraps its content vertically and never crops.
|
|
500
|
+
*/
|
|
501
|
+
.footer-demo-container {
|
|
502
|
+
display: inline-flex;
|
|
503
|
+
flex-direction: column;
|
|
504
|
+
height: auto;
|
|
505
|
+
background: var(--xpl-background-surface-subtlest);
|
|
443
506
|
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
444
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
445
507
|
border-radius: var(--xpl-border-radius-default);
|
|
508
|
+
overflow: visible;
|
|
446
509
|
}
|
|
447
510
|
.footer-demo-caption {
|
|
511
|
+
font-family: var(--xpl-font-family-default);
|
|
448
512
|
font-size: var(--xpl-font-size-caption);
|
|
449
513
|
color: var(--xpl-text-subdued);
|
|
450
514
|
margin-bottom: var(--xpl-space-8);
|
|
451
515
|
}
|
|
452
516
|
</style>
|
|
453
|
-
<
|
|
454
|
-
<xpl-side-nav
|
|
455
|
-
<div
|
|
456
|
-
<xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
|
|
517
|
+
<p class="footer-demo-caption">Nav Footer Slot</p>
|
|
518
|
+
<div class="xpl-side-nav footer-demo-container">
|
|
519
|
+
<div class="xpl-side-nav__footer">${footerHtml}
|
|
457
520
|
</div>
|
|
458
|
-
|
|
459
|
-
</div>
|
|
460
|
-
</xpl-side-nav>`;
|
|
521
|
+
</div>`;
|
|
461
522
|
},
|
|
462
523
|
parameters: {
|
|
463
524
|
layout: 'centered',
|
|
464
525
|
design: {
|
|
465
526
|
type: 'figma',
|
|
466
|
-
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web',
|
|
527
|
+
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=24425-16384',
|
|
467
528
|
},
|
|
468
529
|
},
|
|
469
530
|
};
|
|
470
531
|
const FooterSlotWebComponent = (args) => {
|
|
471
532
|
const footerHtml = args.footerItems.map(renderNavItem).join('');
|
|
472
|
-
return
|
|
473
|
-
<style>
|
|
474
|
-
.footer-demo-wrapper {
|
|
475
|
-
width: 280px;
|
|
476
|
-
padding: var(--xpl-space-16);
|
|
477
|
-
border: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
478
|
-
background-color: var(--xpl-background-surface-subtlest);
|
|
479
|
-
border-radius: var(--xpl-border-radius-default);
|
|
480
|
-
}
|
|
481
|
-
.footer-demo-caption {
|
|
482
|
-
font-size: var(--xpl-font-size-caption);
|
|
483
|
-
color: var(--xpl-text-subdued);
|
|
484
|
-
margin-bottom: var(--xpl-space-8);
|
|
485
|
-
}
|
|
486
|
-
</style>
|
|
487
|
-
<div class="footer-demo-caption">Nav Footer Slot</div>
|
|
488
|
-
<xpl-side-nav class="footer-demo-wrapper">
|
|
489
|
-
<div slot="section">
|
|
490
|
-
<xpl-side-nav-item label="Dashboard" icon="house-4" selected></xpl-side-nav-item>
|
|
491
|
-
</div>
|
|
533
|
+
return `<xpl-side-nav>
|
|
492
534
|
<div slot="nav-footer">${footerHtml}</div>
|
|
493
535
|
</xpl-side-nav>`;
|
|
494
536
|
};
|
|
495
537
|
const FooterSlotHtml = (args) => {
|
|
496
538
|
const footerHtml = args.footerItems.map((item) => renderHtmlNavItem(item, 4)).join('\n');
|
|
497
539
|
return `<div class="xpl-side-nav">
|
|
498
|
-
<div class="xpl-side-
|
|
499
|
-
<nav class="xpl-side-nav__content">
|
|
500
|
-
<div class="xpl-side-nav__section">
|
|
501
|
-
<div class="xpl-side-nav-item">
|
|
502
|
-
<button type="button" class="xpl-side-nav-item__link selected" aria-current="page">
|
|
503
|
-
<span class="xpl-side-nav-item__icon"><!-- icon --></span>
|
|
504
|
-
<span class="xpl-side-nav-item__label">Dashboard</span>
|
|
505
|
-
</button>
|
|
506
|
-
</div>
|
|
507
|
-
</div>
|
|
508
|
-
<div class="xpl-side-nav__footer">
|
|
540
|
+
<div class="xpl-side-nav__footer">
|
|
509
541
|
${footerHtml}
|
|
510
|
-
</div>
|
|
511
|
-
</nav>
|
|
512
542
|
</div>
|
|
513
543
|
</div>`;
|
|
514
544
|
};
|
|
@@ -517,3 +547,88 @@ FooterSlot.parameters = Object.assign(Object.assign({}, FooterSlot.parameters),
|
|
|
517
547
|
}, html: {
|
|
518
548
|
render: FooterSlotHtml(FooterSlot.args),
|
|
519
549
|
} });
|
|
550
|
+
const mobileItems = [
|
|
551
|
+
{ label: 'Dashboard', icon: 'house-4', selected: true },
|
|
552
|
+
{ label: 'Product', icon: 'bag-shopping-2' },
|
|
553
|
+
{
|
|
554
|
+
label: 'Settings',
|
|
555
|
+
icon: 'gear-3',
|
|
556
|
+
hasChildren: true,
|
|
557
|
+
children: [{ label: 'Location' }, { label: 'Schedule' }],
|
|
558
|
+
},
|
|
559
|
+
{ label: 'Xplor Growth', icon: 'chart-line-up', trailingIcon: 'external-link' },
|
|
560
|
+
];
|
|
561
|
+
const mobileFooterItems = [
|
|
562
|
+
{ label: 'Support', icon: 'headset' },
|
|
563
|
+
{ label: 'Logout', icon: 'open-rect-arrow-out' },
|
|
564
|
+
];
|
|
565
|
+
const renderMobileSideNav = (open) => {
|
|
566
|
+
const itemsHtml = mobileItems.map(renderNavItem).join('');
|
|
567
|
+
const footerHtml = mobileFooterItems.map(renderNavItem).join('');
|
|
568
|
+
return `
|
|
569
|
+
<style>
|
|
570
|
+
.side-nav-mobile-root {
|
|
571
|
+
position: relative;
|
|
572
|
+
width: 100%;
|
|
573
|
+
height: 100vh;
|
|
574
|
+
overflow: hidden;
|
|
575
|
+
background: var(--xpl-background-surface-subtle);
|
|
576
|
+
}
|
|
577
|
+
/* Force the mobile bar layout regardless of Storybook viewport width. */
|
|
578
|
+
.side-nav-mobile-root .xpl-side-nav {
|
|
579
|
+
width: 100%;
|
|
580
|
+
height: var(--xpl-size-350);
|
|
581
|
+
min-height: var(--xpl-size-350);
|
|
582
|
+
padding: var(--xpl-space-8) var(--xpl-space-16);
|
|
583
|
+
border-right: var(--xpl-border-none);
|
|
584
|
+
border-bottom: var(--xpl-border-small) solid var(--xpl-border-default);
|
|
585
|
+
}
|
|
586
|
+
.side-nav-mobile-root .xpl-side-nav__toggle {
|
|
587
|
+
display: flex;
|
|
588
|
+
width: var(--xpl-size-250);
|
|
589
|
+
height: var(--xpl-size-250);
|
|
590
|
+
}
|
|
591
|
+
/* Page content placeholder fills the remaining height behind the closed bar. */
|
|
592
|
+
.side-nav-mobile-page {
|
|
593
|
+
padding: var(--xpl-space-24) var(--xpl-space-16);
|
|
594
|
+
font-family: var(--xpl-font-family-default);
|
|
595
|
+
font-size: var(--xpl-font-size-body);
|
|
596
|
+
color: var(--xpl-text-subdued);
|
|
597
|
+
}
|
|
598
|
+
</style>
|
|
599
|
+
<div class="side-nav-mobile-root">
|
|
600
|
+
<xpl-side-nav label="Main navigation"${open ? ' open' : ''}>
|
|
601
|
+
<div slot="section">${itemsHtml}</div>
|
|
602
|
+
<div slot="nav-footer">${footerHtml}</div>
|
|
603
|
+
</xpl-side-nav>
|
|
604
|
+
<div class="side-nav-mobile-page">
|
|
605
|
+
${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.'}
|
|
606
|
+
</div>
|
|
607
|
+
</div>`;
|
|
608
|
+
};
|
|
609
|
+
export const MobileClosed = () => renderMobileSideNav(false);
|
|
610
|
+
MobileClosed.parameters = {
|
|
611
|
+
layout: 'fullscreen',
|
|
612
|
+
design: {
|
|
613
|
+
type: 'figma',
|
|
614
|
+
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=48928-8582',
|
|
615
|
+
},
|
|
616
|
+
docs: {
|
|
617
|
+
description: {
|
|
618
|
+
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.',
|
|
619
|
+
},
|
|
620
|
+
},
|
|
621
|
+
};
|
|
622
|
+
export const MobileOpen = () => renderMobileSideNav(true);
|
|
623
|
+
MobileOpen.parameters = {
|
|
624
|
+
layout: 'fullscreen',
|
|
625
|
+
design: {
|
|
626
|
+
type: 'figma',
|
|
627
|
+
url: 'https://www.figma.com/design/MjjYek73MFnHmVNdm45Sd1/Apollo-Web?node-id=48928-8581',
|
|
628
|
+
},
|
|
629
|
+
docs: {
|
|
630
|
+
description: {
|
|
631
|
+
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.',
|
|
632
|
+
},
|
|
633
|
+
},
|
|
634
|
+
};
|