@aquera/nile-elements 2.0.11 → 2.0.12

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.
Files changed (34) hide show
  1. package/README.md +3 -0
  2. package/demo/app-shell.html +21 -21
  3. package/dist/index.js +76 -66
  4. package/dist/nile-app-shell/nile-app-shell.cjs.js +1 -1
  5. package/dist/nile-app-shell/nile-app-shell.cjs.js.map +1 -1
  6. package/dist/nile-app-shell/nile-app-shell.css.cjs.js +1 -1
  7. package/dist/nile-app-shell/nile-app-shell.css.cjs.js.map +1 -1
  8. package/dist/nile-app-shell/nile-app-shell.css.esm.js +35 -32
  9. package/dist/nile-app-shell/nile-app-shell.esm.js +39 -34
  10. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.cjs.js +1 -1
  11. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.cjs.js.map +1 -1
  12. package/dist/nile-app-shell-panel/nile-app-shell-panel.css.esm.js +3 -1
  13. package/dist/src/nile-app-shell/nile-app-shell-regions.test.js +9 -5
  14. package/dist/src/nile-app-shell/nile-app-shell-regions.test.js.map +1 -1
  15. package/dist/src/nile-app-shell/nile-app-shell.css.js +33 -30
  16. package/dist/src/nile-app-shell/nile-app-shell.css.js.map +1 -1
  17. package/dist/src/nile-app-shell/nile-app-shell.d.ts +22 -22
  18. package/dist/src/nile-app-shell/nile-app-shell.js +86 -76
  19. package/dist/src/nile-app-shell/nile-app-shell.js.map +1 -1
  20. package/dist/src/nile-app-shell/nile-app-shell.test.d.ts +1 -0
  21. package/dist/src/nile-app-shell/nile-app-shell.test.js +307 -89
  22. package/dist/src/nile-app-shell/nile-app-shell.test.js.map +1 -1
  23. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.css.js +3 -1
  24. package/dist/src/nile-app-shell-panel/nile-app-shell-panel.css.js.map +1 -1
  25. package/dist/src/version.js +1 -1
  26. package/dist/src/version.js.map +1 -1
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +1 -1
  29. package/src/nile-app-shell/nile-app-shell-regions.test.ts +9 -5
  30. package/src/nile-app-shell/nile-app-shell.css.ts +33 -30
  31. package/src/nile-app-shell/nile-app-shell.test.ts +348 -105
  32. package/src/nile-app-shell/nile-app-shell.ts +89 -82
  33. package/src/nile-app-shell-panel/nile-app-shell-panel.css.ts +3 -1
  34. package/vscode-html-custom-data.json +27 -37
@@ -1 +1 @@
1
- {"version":3,"file":"nile-app-shell.test.js","sourceRoot":"","sources":["../../../src/nile-app-shell/nile-app-shell.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html, oneEvent, waitUntil } from '@open-wc/testing';\nimport { setViewport } from '@web/test-runner-commands';\nimport './nile-app-shell';\nimport '../nile-app-shell-nav-toggle/nile-app-shell-nav-toggle';\nimport '../nile-nav-tab-group/nile-nav-tab-group';\nimport '../nile-nav-tab/nile-nav-tab';\nimport '../nile-side-bar/nile-side-bar';\n// renderGlyph fails silently on an unknown name, so the glyph tests need the real element.\nimport '@aquera/nile-glyph/nile-glyph';\nimport type { NileAppShell } from './nile-app-shell';\nimport type { NileAppShellNavToggle } from '../nile-app-shell-nav-toggle/nile-app-shell-nav-toggle';\n\n// Sizes the host explicitly and waits for the ResizeObserver to land.\nconst sized = async (width: number) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: ${width}px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-panel'));\n return el;\n};\n\n/** The same shell with an overlay drawer opted into, which is not the default. */\nconst overlaying = async (width: number) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: ${width}px; height: 600px;\"\n overlay-breakpoint=\"1280\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-panel'));\n return el;\n};\n\n// Waits for two consecutive frames to agree before geometry is asserted.\nconst settled = async (el: NileAppShell) => {\n const section = el.shadowRoot!.querySelector('.content-section')!;\n let last = -1;\n await waitUntil(\n () => {\n const width = Math.round(section.getBoundingClientRect().width);\n const same = width === last;\n last = width;\n return same;\n },\n 'the shell never settled',\n { timeout: 3000, interval: 60 }\n );\n};\n\nconst part = (el: NileAppShell, name: string) =>\n el.shadowRoot!.querySelector(`[part~=\"${name}\"]`) as HTMLElement | null;\n\ndescribe('NileAppShell — regions', () => {\n it('1. defaults to an expanded nav, a closed docked panel and a fluid body', async () => {\n const el = await sized(1440);\n expect(el.navCollapsed).to.be.false;\n expect(el.panelOpen).to.be.false;\n expect(el.panelMode).to.equal('docked');\n expect(el.contentAlign).to.equal('fluid');\n expect(el.rail).to.be.false;\n });\n\n it('2. mounts only the regions that have slotted content', async () => {\n const el = await sized(1440);\n expect(el.hasAttribute('has-side-nav')).to.be.true;\n expect(el.hasAttribute('has-top-bar')).to.be.true;\n expect(el.hasAttribute('has-panel')).to.be.true;\n expect(el.hasAttribute('has-banner')).to.be.false;\n expect(el.hasAttribute('has-aside')).to.be.false;\n });\n\n it('3. reports no panel when the panel slot is empty', async () => {\n const el = await fixture<NileAppShell>(\n html`<nile-app-shell><p>page</p></nile-app-shell>`\n );\n expect(el.panelAvailable).to.be.false;\n expect(el.hasAttribute('has-panel')).to.be.false;\n });\n\n it('4. renders the top bar inside the container by default', async () => {\n const el = await sized(1440);\n expect(part(el, 'container')!.contains(part(el, 'top-bar'))).to.be.true;\n });\n\n it('5. spans the shell with the top bar when asked', async () => {\n const el = await sized(1440);\n el.topBarPlacement = 'shell';\n await el.updateComplete;\n const bar = part(el, 'top-bar')!;\n expect(bar.classList.contains('shell-top-bar')).to.be.true;\n expect(part(el, 'container')!.contains(bar)).to.be.false;\n });\n});\n\n/**\n * The name the control's glyph asks for, once nile-glyph has resolved it to\n * real path data. An unknown name leaves an empty <svg>, so this fails loudly\n * rather than letting a missing icon ship as a blank box.\n */\nconst drawnGlyph = async (control: Element) => {\n const glyph = control.querySelector('nile-glyph')!;\n expect(glyph, 'the control renders a nile-glyph').to.exist;\n await waitUntil(\n () => (glyph.shadowRoot?.querySelector('svg')?.childElementCount ?? 0) > 0,\n `${glyph.getAttribute('name')} draws no paths — is it in the nile-glyph set?`\n );\n return glyph.getAttribute('name');\n};\n\ndescribe('NileAppShell — nav', () => {\n it('6. collapseNav()/expandNav() drive the rail and reflect it', async () => {\n const el = await sized(1440);\n el.collapseNav();\n await el.updateComplete;\n expect(el.navCollapsed).to.be.true;\n expect(el.hasAttribute('rail')).to.be.true;\n\n el.expandNav();\n await el.updateComplete;\n expect(el.hasAttribute('rail')).to.be.false;\n });\n\n it('7. toggleNav() flips, and accepts a forced state', async () => {\n const el = await sized(1440);\n el.toggleNav();\n await el.updateComplete;\n expect(el.navCollapsed).to.be.true;\n el.toggleNav(true);\n await el.updateComplete;\n expect(el.navCollapsed).to.be.true;\n });\n\n it('8. emits nile-nav-toggle with the collapsed state', async () => {\n const el = await sized(1440);\n const toggled = oneEvent(el, 'nile-nav-toggle');\n el.collapseNav();\n const event = await toggled;\n expect(event.detail.collapsed).to.be.true;\n expect(event.detail.locked).to.be.false;\n });\n\n it('9. mirrors the effective rail onto a slotted nile-side-bar', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nile-side-bar slot=\"side-nav\"></nile-side-bar>\n <p>page</p>\n </nile-app-shell>\n `);\n const bar = el.querySelector('nile-side-bar')!;\n el.collapseNav();\n await el.updateComplete;\n expect(bar.hasAttribute('collapsed')).to.be.true;\n });\n\n it('10. the built-in toggle is disabled, not hidden, while the rail is forced', async () => {\n const el = await sized(1000);\n el.openPanel();\n await waitUntil(() => el.navLocked);\n const button = part(el, 'nav-toggle') as HTMLButtonElement;\n expect(button).to.exist;\n expect(button.disabled).to.be.true;\n expect(el.hasAttribute('rail')).to.be.true;\n });\n\n it('62. the built-in toggle draws a real glyph in both states', async () => {\n const el = await sized(1440);\n expect(await drawnGlyph(part(el, 'nav-toggle')!)).to.equal('ng-panel-left');\n\n el.collapseNav();\n await el.updateComplete;\n expect(await drawnGlyph(part(el, 'nav-toggle')!)).to.equal('ng-panel-right');\n });\n});\n\ndescribe('NileAppShell — Ask Aquera panel', () => {\n it('11. openPanel()/closePanel() drive panel-open', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n expect(el.panelOpen).to.be.true;\n expect(el.hasAttribute('panel-open')).to.be.true;\n\n el.closePanel();\n await el.updateComplete;\n expect(el.panelOpen).to.be.false;\n });\n\n it('12. openPanel() is a no-op when the route opts out', async () => {\n const el = await sized(1440);\n el.noPanel = true;\n await el.updateComplete;\n el.openPanel();\n await el.updateComplete;\n expect(el.panelOpen).to.be.false;\n expect(el.hasAttribute('has-panel')).to.be.false;\n });\n\n it('13. emits nile-panel-toggle with the open state and mode', async () => {\n const el = await sized(1440);\n const toggled = oneEvent(el, 'nile-panel-toggle');\n el.openPanel();\n const event = await toggled;\n expect(event.detail.open).to.be.true;\n expect(event.detail.mode).to.equal('docked');\n });\n\n it('14. pushes rather than overlays, however narrow the shell is', async () => {\n for (const width of [1000, 820]) {\n const el = await sized(width);\n el.openPanel();\n await el.updateComplete;\n await settled(el);\n expect(el.panelMode).to.equal('docked');\n expect(el.getAttribute('panel-mode')).to.equal('docked');\n const container = el.shadowRoot!.querySelector('.container')!;\n const panel = el.shadowRoot!.querySelector('.panel')!;\n // The page sits beside the panel, not under it.\n expect(container.getBoundingClientRect().right).to.be.at.most(\n Math.round(panel.getBoundingClientRect().left) + 1\n );\n }\n });\n\n it(\"14b. overlays below an author's breakpoint when one is set\", async () => {\n const el = await overlaying(1000);\n await waitUntil(() => el.panelMode === 'overlay');\n expect(el.getAttribute('panel-mode')).to.equal('overlay');\n });\n\n it('15. an open docked panel forces the rail below the docked breakpoint', async () => {\n const el = await sized(1360);\n await waitUntil(() => el.panelMode === 'docked');\n expect(el.navLocked).to.be.false;\n\n el.openPanel();\n await waitUntil(() => el.navLocked);\n expect(el.hasAttribute('rail')).to.be.true;\n\n el.closePanel();\n await waitUntil(() => !el.navLocked);\n expect(el.hasAttribute('rail')).to.be.false;\n });\n\n it('16. the panel close button closes it', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n (part(el, 'panel-close') as HTMLButtonElement).click();\n await el.updateComplete;\n expect(el.panelOpen).to.be.false;\n });\n\n it('17. labels the panel and its default heading from panel-label', async () => {\n const el = await sized(1440);\n el.panelLabel = 'Ask Aquera';\n await el.updateComplete;\n expect(part(el, 'panel')!.getAttribute('aria-label')).to.equal(\n 'Ask Aquera'\n );\n expect(part(el, 'panel-title')!.textContent!.trim()).to.equal('Ask Aquera');\n });\n\n it('18. Cmd/Ctrl+J toggles the panel', async () => {\n const el = await sized(1440);\n document.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'j', ctrlKey: true })\n );\n await el.updateComplete;\n expect(el.panelOpen).to.be.true;\n });\n\n it('19. Escape closes an overlay panel but leaves a docked one alone', async () => {\n const docked = await sized(1440);\n docked.openPanel();\n await docked.updateComplete;\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));\n await docked.updateComplete;\n expect(docked.panelOpen).to.be.true;\n\n const overlay = await overlaying(1000);\n await waitUntil(() => overlay.panelMode === 'overlay');\n overlay.openPanel();\n await overlay.updateComplete;\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));\n await overlay.updateComplete;\n expect(overlay.panelOpen).to.be.false;\n });\n\n it('20. no-panel-shortcut drops the keyboard handling', async () => {\n const el = await sized(1440);\n el.noPanelShortcut = true;\n await el.updateComplete;\n document.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'j', metaKey: true })\n );\n await el.updateComplete;\n expect(el.panelOpen).to.be.false;\n });\n});\n\ndescribe('NileAppShell — content container', () => {\n it('23. content-container makes the slotted page root a size container', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\" content-container>\n <div class=\"page\">page</div>\n </nile-app-shell>\n `);\n const page = el.querySelector('.page')!;\n expect(getComputedStyle(page).containerType).to.equal('inline-size');\n\n el.contentContainer = false;\n await el.updateComplete;\n expect(getComputedStyle(page).containerType).to.equal('normal');\n });\n});\n\ndescribe('NileAppShellNavToggle', () => {\n it('21. drives the nearest shell and mirrors its rail state', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\" no-nav-toggle>\n <nav slot=\"side-nav\">nav</nav>\n <nile-app-shell-nav-toggle slot=\"top-bar\"></nile-app-shell-nav-toggle>\n <p>page</p>\n </nile-app-shell>\n `);\n const toggle = el.querySelector<NileAppShellNavToggle>(\n 'nile-app-shell-nav-toggle'\n )!;\n await waitUntil(() => toggle.appShell === el);\n\n // The control is a nile-button; the part is the contract either way.\n const button = () =>\n toggle.shadowRoot!.querySelector<HTMLElement & { disabled: boolean }>(\n '[part~=\"button\"]'\n )!;\n button().click();\n await el.updateComplete;\n expect(el.navCollapsed).to.be.true;\n\n await toggle.updateComplete;\n expect(button().getAttribute('aria-expanded')).to.equal('false');\n });\n\n it('22. disables itself while the shell holds the rail', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1000px; height: 600px;\"\n no-nav-toggle\n panel-open\n >\n <nav slot=\"side-nav\">nav</nav>\n <nile-app-shell-nav-toggle slot=\"top-bar\"></nile-app-shell-nav-toggle>\n <div slot=\"panel\">assistant</div>\n <p>page</p>\n </nile-app-shell>\n `);\n const toggle = el.querySelector<NileAppShellNavToggle>(\n 'nile-app-shell-nav-toggle'\n )!;\n await waitUntil(() => el.navLocked);\n await toggle.updateComplete;\n expect(\n toggle.shadowRoot!.querySelector<HTMLElement & { disabled: boolean }>(\n '[part~=\"button\"]'\n )!.disabled\n ).to.be.true;\n });\n\n it('63. draws a real glyph in both states', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\" no-nav-toggle>\n <nav slot=\"side-nav\">nav</nav>\n <nile-app-shell-nav-toggle slot=\"top-bar\"></nile-app-shell-nav-toggle>\n <p>page</p>\n </nile-app-shell>\n `);\n const toggle = el.querySelector<NileAppShellNavToggle>(\n 'nile-app-shell-nav-toggle'\n )!;\n await waitUntil(() => toggle.appShell === el);\n const button = () => toggle.shadowRoot!.querySelector('[part~=\"button\"]')!;\n expect(await drawnGlyph(button())).to.equal('ng-panel-left');\n\n (button() as HTMLElement).click();\n await el.updateComplete;\n await toggle.updateComplete;\n expect(await drawnGlyph(button())).to.equal('ng-panel-right');\n });\n});\n\n// The nav track is theme-dependent, so tests load one token pair or the other explicitly.\nconst ENTERPRISE_NAV = '--nile-width-240px: 240px; --nile-width-70px: 70px;';\nconst NXTGEN_NAV = '--ng-spacing-296: 296px; --ng-spacing-68: 68px;';\n\ndescribe('NileAppShell — the content row never overflows', () => {\n const withAside = async (width: number) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: ${width}px; height: 600px;\" panel-open>\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n <div slot=\"aside\">aside</div>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-aside'));\n return el;\n };\n\n /** Overflow of the flex row past the box that clips it. */\n const overflow = (el: NileAppShell) => {\n const section = el.shadowRoot!.querySelector('.content-section')!;\n return (\n section.scrollWidth - Math.round(section.getBoundingClientRect().width)\n );\n };\n\n it('23. tightens the side columns rather than covering the page', async () => {\n // Short of what the row prefers, so the panel and aside give width back while the page stays beside the panel.\n const el = await withAside(1500);\n await waitUntil(() => el.navLocked);\n await settled(el);\n expect(el.panelMode).to.equal('docked');\n const panel = el.shadowRoot!.querySelector('.panel')!;\n const width = panel.getBoundingClientRect().width;\n expect(width).to.be.below(480);\n expect(width).to.be.at.least(360);\n expect(overflow(el)).to.equal(0);\n });\n\n it('24. rails the nav rather than clip the row', async () => {\n // 1600 fits the docked panel over a rail, not over the expanded track.\n const el = await withAside(1600);\n await waitUntil(() => el.navLocked);\n await settled(el);\n expect(el.panelMode).to.equal('docked');\n expect(overflow(el)).to.equal(0);\n });\n\n it('25. holds the container floor while the row has room for it', async () => {\n const el = await withAside(1800);\n await waitUntil(() => el.panelMode === 'docked');\n await settled(el);\n const container = el.shadowRoot!.querySelector('.container')!;\n expect(container.getBoundingClientRect().width).to.be.at.least(640);\n expect(el.navLocked).to.be.false;\n expect(overflow(el)).to.equal(0);\n });\n\n it('26. asks the page for room last, and only after the floors are met', async () => {\n const el = await withAside(820);\n await waitUntil(() => el.navLocked);\n await settled(el);\n const px = (sel: string) =>\n el.shadowRoot!.querySelector(sel)!.getBoundingClientRect().width;\n // Both side columns sit on their floors before the page gives anything.\n expect(Math.round(px('.panel'))).to.equal(360);\n expect(Math.round(px('.aside'))).to.equal(240);\n expect(px('.container')).to.be.below(640);\n expect(overflow(el)).to.equal(0);\n });\n\n it('27. keeps the page above its floor at ordinary widths', async () => {\n const el = await sized(1300);\n el.openPanel();\n await el.updateComplete;\n await settled(el);\n expect(el.panelMode).to.equal('docked');\n const container = el.shadowRoot!.querySelector('.container')!;\n expect(container.getBoundingClientRect().width).to.be.at.least(640);\n expect(overflow(el)).to.equal(0);\n });\n\n // Pins the stylesheet defaults to the JS geometry fallbacks so the two copies cannot drift apart.\n it('71. the stylesheet defaults still match the JS geometry fallbacks', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1440px; height: 600px; --nile-spacing-xs: 4px;\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n const value = (name: string) =>\n parseFloat(getComputedStyle(el).getPropertyValue(name));\n\n // No theme sheet here, so the nav track falls to its own enterprise-pair literals, which is what _geometry() carries too.\n expect(value('--nile-app-shell-side-nav-width')).to.equal(240);\n expect(value('--nile-app-shell-side-nav-rail-width')).to.equal(70);\n expect(value('--nile-app-shell-gutter')).to.equal(4);\n expect(value('--nile-app-shell-content-min-width')).to.equal(640);\n expect(value('--nile-app-shell-aside-width')).to.equal(320);\n expect(value('--nile-app-shell-panel-width')).to.equal(480);\n });\n\n // The nav track mirrors nile-side-bar's token expressions and resolves per theme.\n it('78. resolves the nav track per theme, as nile-side-bar does', async () => {\n const track = async (tokens: string) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px; ${tokens}\">\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n const read = (name: string) =>\n parseFloat(getComputedStyle(el).getPropertyValue(name));\n return [\n read('--nile-app-shell-side-nav-width'),\n read('--nile-app-shell-side-nav-rail-width'),\n ];\n };\n\n expect(\n await track('--nile-width-240px: 240px; --nile-width-70px: 70px;'),\n 'enterprise'\n ).to.deep.equal([240, 70]);\n\n expect(\n await track('--ng-spacing-296: 296px; --ng-spacing-68: 68px;'),\n 'nxtgen'\n ).to.deep.equal([296, 68]);\n });\n\n // The nav rails at the row's own theme-dependent width requirement (enterprise 1368, nxtgen 1424), with docked-rail-breakpoint at 0 so the measured value governs.\n it('72. rails the nav at the row’s own width requirement, not a gutter early', async () => {\n const at = async (width: number, tokens = ENTERPRISE_NAV) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: ${width}px; height: 600px; ${tokens}\"\n docked-rail-breakpoint=\"0\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-panel'));\n el.openPanel();\n await el.updateComplete;\n await settled(el);\n return el.navLocked;\n };\n\n // Exactly the requirement: the row fits, so the nav keeps its width.\n expect(await at(1368)).to.be.false;\n // One pixel under: the track is what the row cannot afford.\n expect(await at(1367)).to.be.true;\n expect(await at(1370)).to.be.false;\n\n // NxtGen's wider track moves the same boundary up by 56px, following whatever the side bar measures.\n expect(await at(1424, NXTGEN_NAV)).to.be.false;\n expect(await at(1423, NXTGEN_NAV)).to.be.true;\n // And the enterprise boundary is comfortably inside NxtGen's requirement.\n expect(await at(1368, NXTGEN_NAV)).to.be.true;\n });\n});\n\n// An empty flex item still takes the row's gap, pulling the bar's content short of its padding edge.\ndescribe('NileAppShell — the top bar reaches its padding edge', () => {\n it('28. an empty actions group reserves no gap', async () => {\n const el = await sized(1440);\n // The Ask button lives in that group, so drop it to leave it truly empty.\n el.noAsk = true;\n await settled(el);\n expect(el.hasAttribute('has-top-bar-actions')).to.be.false;\n expect(el.hasAttribute('has-ask')).to.be.false;\n const bar = el.shadowRoot!.querySelector('.top-bar') as HTMLElement;\n const content = el.shadowRoot!.querySelector('.top-bar-content')!;\n const padEnd = parseFloat(getComputedStyle(bar).paddingInlineEnd);\n const shortfall =\n bar.getBoundingClientRect().right - content.getBoundingClientRect().right;\n expect(Math.round(shortfall)).to.equal(Math.round(padEnd));\n });\n\n it('29. slotted actions mount the group', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <button slot=\"top-bar-actions\">Save</button>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-top-bar-actions'));\n const actions = el.shadowRoot!.querySelector('.top-bar-actions')!;\n expect(getComputedStyle(actions).display).to.not.equal('none');\n expect(actions.getBoundingClientRect().width).to.be.greaterThan(0);\n });\n\n // The rule that separates the nav toggle from the header's content follows both a filled slot and a title block.\n it('76. draws the toggle rule for a title block, not just a filled slot', async () => {\n const rule = (el: NileAppShell) => part(el, 'rule');\n\n const slotted = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => slotted.hasAttribute('has-top-bar'));\n expect(rule(slotted)).to.exist;\n\n // The same heading through pageTitle, top-bar slot empty.\n const titled = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1440px; height: 600px;\"\n pageTitle=\"Applications\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n await titled.updateComplete;\n expect(titled.hasAttribute('has-top-bar')).to.be.true;\n expect(rule(titled), 'a title block earns the rule too').to.exist;\n\n // Neither: the toggle stands alone, so there is nothing to separate.\n const bare = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n await bare.updateComplete;\n expect(rule(bare)).to.be.null;\n });\n});\n\n// The built-in Ask button turns on whether a panel is mounted for this route and calls openPanel().\ndescribe('NileAppShell — the built-in Ask button', () => {\n const ask = (el: NileAppShell) => part(el, 'ask') as HTMLButtonElement | null;\n\n it('30. opens the panel', async () => {\n const el = await sized(1440);\n expect(el.panelOpen).to.be.false;\n ask(el)!.click();\n await el.updateComplete;\n expect(el.panelOpen).to.be.true;\n });\n\n it('31. is absent when the route mounts no panel', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n expect(el.askVisible).to.be.false;\n expect(ask(el)).to.be.null;\n });\n\n it('32. no-ask drops it for a bar that renders its own', async () => {\n const el = await sized(1440);\n el.noAsk = true;\n await el.updateComplete;\n expect(el.askVisible).to.be.false;\n expect(ask(el)).to.be.null;\n });\n\n it('33. takes its label from ask-label', async () => {\n const el = await sized(1440);\n el.askLabel = 'Ask Aquera';\n await el.updateComplete;\n expect(ask(el)!.textContent!.trim()).to.equal('Ask Aquera');\n });\n\n it('34. keeps the actions group mounted on its own', async () => {\n const el = await sized(1440);\n await settled(el);\n // Nothing is slotted into top-bar-actions, but the Ask button lives there.\n expect(el.hasAttribute('has-top-bar-actions')).to.be.false;\n expect(el.hasAttribute('has-ask')).to.be.true;\n const actions = el.shadowRoot!.querySelector('.top-bar-actions')!;\n expect(getComputedStyle(actions).display).to.not.equal('none');\n expect(actions.getBoundingClientRect().width).to.be.greaterThan(0);\n });\n\n // The shell draws its icon controls as bare glyphs via ::part(base), overriding nile-button's circle and ghost surface.\n const utilityBase = (el: NileAppShell, name: string) =>\n part(el, name)!.shadowRoot!.querySelector('[part~=\"base\"]') as HTMLElement;\n\n it('35. draws its icon controls with no resting surface', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n\n for (const name of ['nav-toggle', 'panel-close']) {\n const base = utilityBase(el, name);\n expect(getComputedStyle(base).backgroundColor).to.equal(\n 'rgba(0, 0, 0, 0)'\n );\n }\n });\n\n it('36. sizes its icon controls to the utility box, not the button circle', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n\n for (const name of ['nav-toggle', 'panel-close']) {\n const box = utilityBase(el, name).getBoundingClientRect();\n expect(box.width).to.equal(32);\n expect(box.height).to.equal(32);\n }\n });\n\n it('37. holds the panel back control until panelBack asks for it', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n const mark = el.shadowRoot!.querySelector('.panel-mark')!;\n // Not rendered at all in the root view, so no stylesheet override can surface it.\n expect(part(el, 'panel-back')).to.not.exist;\n expect(getComputedStyle(mark).display).to.not.equal('none');\n\n el.panelBack = true;\n await el.updateComplete;\n const back = part(el, 'panel-back')!;\n expect(back).to.exist;\n expect(getComputedStyle(back).display).to.not.equal('none');\n // The back control stands where the brand mark stands in the root view.\n expect(getComputedStyle(mark).display).to.equal('none');\n });\n\n it('38. emits nile-panel-back and takes its label from panelBackLabel', async () => {\n const el = await sized(1440);\n el.panelBack = true;\n el.panelBackLabel = 'Back to chats';\n el.openPanel();\n await el.updateComplete;\n\n const back = part(el, 'panel-back')!;\n expect(back.getAttribute('aria-label')).to.equal('Back to chats');\n\n const went = oneEvent(el, 'nile-panel-back');\n (back as HTMLButtonElement).click();\n await went;\n // The shell keeps no view stack, so going back leaves the panel open.\n expect(el.panelOpen).to.be.true;\n });\n\n it('81. goBackPanel() emits nile-panel-back, and goBack() stays its alias', async () => {\n const el = await sized(1440);\n\n const named = oneEvent(el, 'nile-panel-back');\n el.goBackPanel();\n expect(await named).to.exist;\n\n // Deprecated, but still the same event: existing callers keep working.\n const aliased = oneEvent(el, 'nile-panel-back');\n el.goBack();\n expect(await aliased).to.exist;\n });\n});\n\ndescribe('NileAppShell — the tab strip', () => {\n /** The strip is slot-driven, so it needs something in the slot to exist. */\n const tabbed = async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px; ${HEADER_TOKENS}\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <nile-nav-tab-group slot=\"tabs\">\n <nile-nav-tab slot=\"nav\" panel=\"apps\" active>Connected</nile-nav-tab>\n <nile-nav-tab slot=\"nav\" panel=\"approvals\">Approvals</nile-nav-tab>\n </nile-nav-tab-group>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-tabs'));\n return el;\n };\n\n const strip = (el: NileAppShell) =>\n el.shadowRoot!.querySelector('.tabs') as HTMLElement;\n\n it('39. mounts the strip for a filled slot', async () => {\n const el = await tabbed();\n expect(el.tabsVisible).to.be.true;\n expect(getComputedStyle(strip(el)).display).to.not.equal('none');\n });\n\n it('40. noTabs hides the strip without emptying the slot', async () => {\n const el = await tabbed();\n el.noTabs = true;\n await el.updateComplete;\n\n expect(el.tabsVisible).to.be.false;\n expect(getComputedStyle(strip(el)).display).to.equal('none');\n // The slot is still filled — the strip is switched off, not unmounted — so the assigned element proves the content stays.\n expect(el.querySelector('nile-nav-tab-group')).to.exist;\n const slot = strip(el).querySelector('slot') as HTMLSlotElement;\n expect(slot.assignedElements()).to.have.lengthOf(1);\n\n el.noTabs = false;\n await el.updateComplete;\n expect(el.tabsVisible).to.be.true;\n expect(getComputedStyle(strip(el)).display).to.not.equal('none');\n });\n\n // has-tabs advertises the visible strip, not the filled slot, matching has-panel and has-ask.\n it('68. has-tabs follows the visible strip, not the filled slot', async () => {\n // Slotted, not switched off: the strip is up and the flag is on.\n const el = await tabbed();\n expect(el.tabsVisible).to.be.true;\n expect(el.hasAttribute('has-tabs')).to.be.true;\n\n // Slotted, switched off: the slot stays filled, the flag goes with the strip.\n el.noTabs = true;\n await el.updateComplete;\n expect(el.querySelector('nile-nav-tab-group')).to.exist;\n expect(el.hasAttribute('has-tabs')).to.be.false;\n expect(getComputedStyle(strip(el)).display).to.equal('none');\n\n // And back, so the flag is not a one-way latch.\n el.noTabs = false;\n await el.updateComplete;\n expect(el.hasAttribute('has-tabs')).to.be.true;\n\n // Nothing slotted: no strip, no flag, whatever noTabs says.\n const bare = await sized(1440);\n await settled(bare);\n expect(bare.hasAttribute('has-tabs')).to.be.false;\n bare.noTabs = true;\n await bare.updateComplete;\n expect(bare.hasAttribute('has-tabs')).to.be.false;\n });\n\n it('41. leaves the strip off when the slot is empty', async () => {\n const el = await sized(1440);\n await settled(el);\n expect(el.hasAttribute('has-tabs')).to.be.false;\n expect(el.tabsVisible).to.be.false;\n });\n\n it('77. sizes bare slotted tab controls to their labels, not the strip', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1176px; height: 600px; ${HEADER_TOKENS}\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <button slot=\"tabs\" id=\"short\">A</button>\n <button slot=\"tabs\" id=\"long\">A considerably longer tab label</button>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-tabs'));\n await settled(el);\n\n const short = el.querySelector('#short')!.getBoundingClientRect().width;\n const long = el.querySelector('#long')!.getBoundingClientRect().width;\n // Stretched, they would be equal; sized to content they are not close.\n expect(long).to.be.greaterThan(short * 2);\n });\n\n it('43. leaves the slotted strip one rule, edge to edge', async () => {\n const el = await tabbed();\n const group = el.querySelector('nile-nav-tab-group') as HTMLElement;\n const groupStyle = getComputedStyle(group);\n\n expect(groupStyle.getPropertyValue('--track-width').trim()).to.equal('0px');\n expect(groupStyle.alignSelf).to.equal('flex-end');\n\n // The region's rule is as wide as the container it closes, padding and all.\n const container = el.shadowRoot!.querySelector('.container') as HTMLElement;\n const stripWidth = strip(el).getBoundingClientRect().width;\n const inner =\n container.getBoundingClientRect().width -\n parseFloat(getComputedStyle(container).borderLeftWidth) -\n parseFloat(getComputedStyle(container).borderRightWidth);\n expect(Math.round(stripWidth)).to.equal(Math.round(inner));\n\n // The group is wholly inside the region, and ends where the rule is.\n const strippedBottom = strip(el).getBoundingClientRect().bottom;\n const groupBottom = group.getBoundingClientRect().bottom;\n expect(strippedBottom - groupBottom).to.be.lessThan(2);\n });\n\n // The Header Bar draws no rule of its own; the one divider belongs to the tab rail, so switching the strip off leaves the header with no rule.\n it('42. draws the header rule on the strip only, never on the bar', async () => {\n const el = await tabbed();\n const bar = el.shadowRoot!.querySelector(\n '.container > .top-bar'\n ) as HTMLElement;\n\n expect(parseFloat(getComputedStyle(bar).borderBottomWidth)).to.equal(0);\n expect(\n parseFloat(getComputedStyle(strip(el)).borderBottomWidth)\n ).to.be.greaterThan(0);\n expect(getComputedStyle(strip(el)).borderBottomColor).to.not.equal(\n 'rgba(0, 0, 0, 0)'\n );\n\n // No tabs, no rule anywhere in the header block.\n el.noTabs = true;\n await el.updateComplete;\n expect(parseFloat(getComputedStyle(bar).borderBottomWidth)).to.equal(0);\n });\n\n // The bar and the strip sit flush, with the stroke as the separation, not space.\n it('62. leaves no vertical gap between the bar and the strip', async () => {\n const el = await tabbed();\n const bar = el.shadowRoot!.querySelector(\n '.container > .top-bar'\n ) as HTMLElement;\n const gap =\n strip(el).getBoundingClientRect().top -\n bar.getBoundingClientRect().bottom;\n expect(Math.abs(gap)).to.be.lessThan(0.5);\n });\n});\n\n// The test page loads no theme sheet, so the header fixtures carry the nxtgen token values the title block and tab row read.\nconst HEADER_TOKENS = [\n '--ng-spacing-none: 0px',\n '--ng-border-width-1: 1px',\n '--ng-colors-border-secondary: #E9EAEB',\n '--ng-spacing-xxs: 2px',\n '--ng-spacing-xs: 4px',\n '--ng-spacing-md: 8px',\n '--ng-spacing-lg: 12px',\n '--ng-spacing-xl: 16px',\n '--ng-spacing-3xl: 24px',\n '--ng-font-size-text-xs: 12px',\n '--ng-line-height-text-xs: 18px',\n '--ng-font-size-text-sm: 14px',\n '--ng-line-height-text-sm: 20px',\n '--ng-font-size-text-md: 16px',\n '--ng-line-height-text-md: 24px',\n].join('; ');\n\ntype Leading = 'none' | 'back' | 'app-icon';\n\ninterface HeaderAxes {\n pageTitle?: string;\n description?: string;\n badge?: string;\n leading?: Leading;\n backLabel?: string;\n tabs?: boolean;\n}\n\n// A shell carrying whatever header axes a test asks for; an unset axis is the empty string, meaning \"absent\".\nconst header = async (axes: HeaderAxes = {}) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1176px; height: 800px; ${HEADER_TOKENS}\"\n .pageTitle=${axes.pageTitle ?? ''}\n .description=${axes.description ?? ''}\n .badge=${axes.badge ?? ''}\n leading=${axes.leading ?? 'none'}\n .backLabel=${axes.backLabel ?? 'Back'}\n >\n <nav slot=\"side-nav\">nav</nav>\n ${axes.leading === 'app-icon'\n ? html`<span slot=\"app-icon\" id=\"mark\">A</span>`\n : ''}\n ${axes.tabs\n ? html`<nile-nav-tab-group slot=\"tabs\">\n <nile-nav-tab slot=\"nav\" panel=\"apps\" active>Connected</nile-nav-tab>\n <nile-nav-tab slot=\"nav\" panel=\"approvals\">Approvals</nile-nav-tab>\n </nile-nav-tab-group>`\n : ''}\n <p>page</p>\n </nile-app-shell>\n `);\n if (axes.tabs) await waitUntil(() => el.hasAttribute('has-tabs'));\n await el.updateComplete;\n return el;\n};\n\n// The header title block: the shell's own heading, the Leading axis, the badge and the description line.\ndescribe('NileAppShell — the header title block', () => {\n it('44. draws no title block at all until an axis asks for one', async () => {\n const el = await header();\n expect(el.leading).to.equal('none');\n expect(part(el, 'title-area')).to.be.null;\n expect(part(el, 'page-title')).to.be.null;\n expect(part(el, 'description')).to.be.null;\n expect(part(el, 'badge')).to.be.null;\n expect(el.hasAttribute('has-description')).to.be.false;\n });\n\n // description and badge are modifiers on the page title, so neither mounts the title block by itself.\n it('73. does not mount a title block for a description or badge alone', async () => {\n for (const axes of [\n { description: 'Manage the apps connected to this tenant' },\n { badge: '94 apps' },\n { description: 'Manage the apps', badge: '94 apps' },\n ]) {\n const el = await header(axes);\n const label = JSON.stringify(axes);\n\n expect(part(el, 'title-area'), label).to.be.null;\n expect(part(el, 'description'), label).to.be.null;\n expect(part(el, 'badge'), label).to.be.null;\n // And no height is reserved for the line that cannot render.\n expect(el.hasAttribute('has-description'), label).to.be.false;\n }\n });\n\n it('74. brings both back as soon as there is a title to hang them on', async () => {\n const el = await header({\n description: 'Manage the apps connected to this tenant',\n badge: '94 apps',\n });\n expect(part(el, 'title-area')).to.be.null;\n\n el.pageTitle = 'Applications';\n await el.updateComplete;\n\n expect(part(el, 'title-area')).to.exist;\n expect(part(el, 'description')).to.exist;\n expect(part(el, 'badge')).to.exist;\n expect(el.hasAttribute('has-description')).to.be.true;\n });\n\n // Leading is the exception: a back control stands on its own but brings no empty title stack.\n it('75. mounts a leading control on its own, without an empty title stack', async () => {\n const el = await header({ leading: 'back' });\n\n expect(part(el, 'title-area')).to.exist;\n expect(part(el, 'back')).to.exist;\n expect(part(el, 'page-title')).to.be.null;\n expect(el.shadowRoot!.querySelector('.title-stack')).to.be.null;\n expect(el.shadowRoot!.querySelector('.title-row')).to.be.null;\n });\n\n it('45. renders pageTitle as the header’s own heading', async () => {\n const el = await header({ pageTitle: 'Applications' });\n const title = part(el, 'page-title')!;\n expect(title).to.exist;\n // A heading by role, not a hard-coded h1, so the page keeps control of its outline; level 1 by default.\n expect(title.getAttribute('role')).to.equal('heading');\n expect(el.headingLevel).to.equal(1);\n expect(title.getAttribute('aria-level')).to.equal('1');\n expect(title.textContent!.trim()).to.equal('Applications');\n expect(part(el, 'title-area')).to.exist;\n });\n\n // Birat's a11y review: a page with its own h1 needs the shell title one level down.\n it('79. takes its heading level from the headingLevel property and attribute', async () => {\n const el = await header({ pageTitle: 'Applications' });\n el.headingLevel = 2;\n await el.updateComplete;\n const title = part(el, 'page-title')!;\n expect(title.getAttribute('aria-level')).to.equal('2');\n expect(el.getAttribute('headinglevel')).to.equal('2');\n expect(title.textContent!.trim()).to.equal('Applications');\n\n const marked = await fixture<NileAppShell>(html`\n <nile-app-shell pageTitle=\"Applications\" headingLevel=\"3\">\n <p>page</p>\n </nile-app-shell>\n `);\n await marked.updateComplete;\n expect(marked.headingLevel).to.equal(3);\n expect(part(marked, 'page-title')!.getAttribute('aria-level')).to.equal('3');\n });\n\n it('80. clamps an invalid heading level to a safe aria-level', async () => {\n const el = await header({ pageTitle: 'Applications' });\n const cases: [unknown, string][] = [\n [0, '1'],\n [-3, '1'],\n [7, '6'],\n [2.7, '2'],\n [NaN, '1'],\n ['abc', '1'],\n [undefined, '1'],\n ];\n for (const [value, expected] of cases) {\n (el as unknown as { headingLevel: unknown }).headingLevel = value;\n await el.updateComplete;\n expect(\n part(el, 'page-title')!.getAttribute('aria-level'),\n String(value)\n ).to.equal(expected);\n }\n\n // From markup too: a non-numeric attribute still leaves a level-1 heading.\n const marked = await fixture<NileAppShell>(html`\n <nile-app-shell pageTitle=\"Applications\" headingLevel=\"nope\">\n <p>page</p>\n </nile-app-shell>\n `);\n await marked.updateComplete;\n expect(part(marked, 'page-title')!.getAttribute('aria-level')).to.equal('1');\n expect(part(marked, 'page-title')!.textContent!.trim()).to.equal(\n 'Applications'\n );\n });\n\n // The title block renders before the top-bar slot, so a page slotting its own title keeps its output.\n it('46. renders the block before whatever the page slots into top-bar', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1176px; height: 800px;\" pageTitle=\"Apps\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\" id=\"own\">the page’s own bar</span>\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n\n const area = part(el, 'title-area')!;\n const slot = el.shadowRoot!.querySelector(\n 'slot[name=\"top-bar\"]'\n ) as HTMLElement;\n expect(el.querySelector('#own')!.assignedSlot).to.equal(slot);\n /* eslint-disable-next-line no-bitwise */\n const areaIsFirst =\n area.compareDocumentPosition(slot) & Node.DOCUMENT_POSITION_FOLLOWING;\n expect(areaIsFirst).to.be.greaterThan(0);\n });\n\n it('47. mounts the top bar for a title block on its own', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1176px; height: 800px;\"\n pageTitle=\"Applications\"\n no-nav-toggle\n >\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n // Nothing is slotted anywhere, and there is no nav toggle to mount it.\n expect(el.hasAttribute('has-side-nav')).to.be.false;\n expect(el.hasAttribute('has-top-bar')).to.be.true;\n expect(part(el, 'page-title')).to.exist;\n });\n\n it('48. renders a badge after the title, and only when set', async () => {\n const plain = await header({ pageTitle: 'Applications' });\n expect(part(plain, 'badge')).to.be.null;\n\n const el = await header({ pageTitle: 'Applications', badge: '12 active' });\n const badge = part(el, 'badge')!;\n expect(badge).to.exist;\n expect(badge.textContent!.trim()).to.equal('12 active');\n /* eslint-disable-next-line no-bitwise */\n const titleIsFirst =\n part(el, 'page-title')!.compareDocumentPosition(badge) &\n Node.DOCUMENT_POSITION_FOLLOWING;\n expect(titleIsFirst).to.be.greaterThan(0);\n });\n\n // The badge's surface tokens must resolve on both the enterprise and nxtgen sheets, so each test pins one sheet on its own.\n const badged = (tokens: string) =>\n fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1176px; height: 800px; ${tokens}\"\n pageTitle=\"Applications\"\n badge=\"Beta\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n\n it('69. resolves the badge on the enterprise sheet alone', async () => {\n const el = await badged(\n [\n '--nile-border-width-1: 1px',\n '--nile-colors-neutral-100: #FAFAFA',\n '--nile-colors-neutral-400: #E6E9EB',\n '--nile-colors-dark-500: #636363',\n // The ink the badge must not fall back to by inheriting the title's.\n '--nile-colors-dark-900: #000000',\n ].join('; ')\n );\n const style = getComputedStyle(part(el, 'badge')!);\n\n expect(style.backgroundColor).to.equal('rgb(250, 250, 250)');\n expect(style.borderTopColor).to.equal('rgb(230, 233, 235)');\n expect(style.borderTopWidth).to.equal('1px');\n expect(style.color).to.equal('rgb(99, 99, 99)');\n });\n\n it('70. resolves the badge on the nxtgen sheet alone', async () => {\n const el = await badged(\n [\n '--ng-border-width-1: 1px',\n '--ng-componentcolors-utility-gray-50: #FAFAFAFF',\n '--ng-componentcolors-utility-gray-200: #E9EAEBFF',\n '--ng-componentcolors-utility-gray-700: #414651FF',\n '--ng-colors-text-primary-900: #181D27FF',\n ].join('; ')\n );\n const style = getComputedStyle(part(el, 'badge')!);\n\n expect(style.backgroundColor).to.equal('rgb(250, 250, 250)');\n expect(style.borderTopColor).to.equal('rgb(233, 234, 235)');\n expect(style.borderTopWidth).to.equal('1px');\n expect(style.color).to.equal('rgb(65, 70, 81)');\n });\n\n it('49. renders a description line, and reserves nothing without one', async () => {\n const off = await header({ pageTitle: 'Applications' });\n expect(off.hasAttribute('has-description')).to.be.false;\n expect(part(off, 'description')).to.be.null;\n\n const el = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected to this tenant',\n });\n const line = part(el, 'description')!;\n expect(el.hasAttribute('has-description')).to.be.true;\n expect(line).to.exist;\n expect(line.textContent!.trim()).to.equal(\n 'Manage the apps connected to this tenant'\n );\n\n // Clearing the string takes the axis back off.\n el.description = '';\n await el.updateComplete;\n expect(el.hasAttribute('has-description')).to.be.false;\n expect(part(el, 'description')).to.be.null;\n });\n\n it('50. leading defaults to none and draws neither control', async () => {\n const el = await header({ pageTitle: 'Applications' });\n expect(el.leading).to.equal('none');\n expect(part(el, 'back')).to.be.null;\n expect(part(el, 'app-icon')).to.be.null;\n expect(el.shadowRoot!.querySelector('.crumb-divider')).to.be.null;\n });\n\n // Leading=\"back\" draws a breadcrumb: glyph, previous-page label, slash, then the page title.\n it('51. leading=\"back\" draws glyph, label, divider, then the title', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'back' });\n const back = part(el, 'back')!;\n const divider = el.shadowRoot!.querySelector(\n '.crumb-divider'\n ) as HTMLElement;\n const title = part(el, 'page-title')!;\n\n expect(back).to.exist;\n expect(back.tagName).to.equal('BUTTON');\n expect(back.getAttribute('type')).to.equal('button');\n expect(divider).to.exist;\n expect(divider.getAttribute('aria-hidden')).to.equal('true');\n\n // The icons go through nile-glyph, so assert the glyph, not an <svg>.\n const chevron = back.querySelector('nile-glyph')!;\n expect(chevron).to.exist;\n expect(chevron.getAttribute('name')).to.equal('ng-chevron-left');\n expect(divider.querySelector('nile-glyph')!.getAttribute('name')).to.equal(\n 'ng-slash'\n );\n\n // glyph before label, inside the control.\n const label = back.querySelector('span')!;\n /* eslint-disable-next-line no-bitwise */\n const glyphIsFirst =\n chevron.compareDocumentPosition(label) & Node.DOCUMENT_POSITION_FOLLOWING;\n expect(glyphIsFirst).to.be.greaterThan(0);\n\n // control, then divider, then title.\n for (const [first, second] of [\n [back, divider],\n [divider, title],\n ]) {\n /* eslint-disable-next-line no-bitwise */\n const ordered =\n first.compareDocumentPosition(second) &\n Node.DOCUMENT_POSITION_FOLLOWING;\n expect(ordered).to.be.greaterThan(0);\n }\n\n // nile-glyph is not registered on this test page, so the divider has no box to measure; only that the leading axis has not switched it off.\n expect(back.getBoundingClientRect().width).to.be.greaterThan(0);\n expect(getComputedStyle(divider).display).to.not.equal('none');\n });\n\n // The slash separates the back control from the page title, so there is nothing to point at until a title is set.\n it('51b. leading=\"back\" without a title draws no divider', async () => {\n const el = await header({ leading: 'back' });\n expect(part(el, 'back')).to.exist;\n expect(el.shadowRoot!.querySelector('.crumb-divider')).to.be.null;\n\n el.pageTitle = 'Applications';\n await el.updateComplete;\n expect(el.shadowRoot!.querySelector('.crumb-divider')).to.exist;\n });\n\n it('52. takes the previous-page label from backLabel', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'back' });\n // The label is the control's accessible name, so it lives in the text.\n expect(part(el, 'back')!.textContent!.trim()).to.equal('Back');\n\n el.backLabel = 'Integrations';\n await el.updateComplete;\n expect(part(el, 'back')!.textContent!.trim()).to.equal('Integrations');\n });\n\n // The shell owns no history, so the control only announces the press; the page navigates itself.\n it('53. the back control emits nile-header-back, as do goBackHeader() and goBackPage()', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'back' });\n\n const clicked = oneEvent(el, 'nile-header-back');\n (part(el, 'back') as HTMLButtonElement).click();\n const fromClick = await clicked;\n expect(fromClick).to.exist;\n\n const called = oneEvent(el, 'nile-header-back');\n el.goBackHeader();\n expect(await called).to.exist;\n\n // goBackPage() is the deprecated alias of goBackHeader(): same event.\n const aliased = oneEvent(el, 'nile-header-back');\n el.goBackPage();\n expect(await aliased).to.exist;\n\n // It is the page's event, not the panel's: nothing about the panel moves.\n expect(el.panelOpen).to.be.false;\n });\n\n // The Description axis must not move when the Leading axis changes, so the description is always the stack's second line under the title.\n it('63. aligns the description to the page title in every leading mode', async () => {\n for (const leading of ['none', 'back', 'app-icon'] as const) {\n const el = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected to this tenant',\n leading,\n });\n\n const title = part(el, 'page-title')!.getBoundingClientRect();\n const description = part(el, 'description')!.getBoundingClientRect();\n expect(Math.round(description.left), leading).to.equal(\n Math.round(title.left)\n );\n }\n });\n\n // Neither leading control lives in the title row, so neither can displace the title away from the description.\n it('64. renders both leading modes beside the title stack, not in the row', async () => {\n const backShell = await header({ pageTitle: 'Applications', leading: 'back' });\n const iconShell = await header({\n pageTitle: 'Applications',\n leading: 'app-icon',\n });\n\n for (const [el, name] of [\n [backShell, 'back'],\n [iconShell, 'app-icon'],\n ] as const) {\n const control = part(el, name)!;\n const row = el.shadowRoot!.querySelector('.title-row') as HTMLElement;\n const area = part(el, 'title-area')!;\n expect(row.contains(control), name).to.be.false;\n expect(area.contains(control), name).to.be.true;\n }\n\n // The breadcrumb divider travels with the control it belongs to.\n const divider = backShell.shadowRoot!.querySelector(\n '.crumb-divider'\n ) as HTMLElement;\n const row = backShell.shadowRoot!.querySelector(\n '.title-row'\n ) as HTMLElement;\n expect(row.contains(divider)).to.be.false;\n });\n\n // The leading element sits on the title's row, and its offset does not move when a description appears.\n it('65. sits the leading element on the title row, description or not', async () => {\n for (const leading of ['back', 'app-icon'] as const) {\n for (const description of ['', 'Manage the apps connected here']) {\n const el = await header({\n pageTitle: 'Applications',\n leading,\n description,\n });\n\n const title = part(el, 'page-title')!.getBoundingClientRect();\n const box = el.shadowRoot!.querySelector(\n '.leading'\n ) as HTMLElement;\n const label = `${leading} description=${!!description}`;\n\n // The line box is the title's own, and it starts where the title does.\n expect(Math.round(box.getBoundingClientRect().top), label).to.equal(\n Math.round(title.top)\n );\n expect(Math.round(box.getBoundingClientRect().height), label).to.equal(\n 24\n );\n }\n }\n });\n\n it('66. centres a 20px app icon in the 24px title row, two pixels down', async () => {\n const el = await header({\n pageTitle: 'Applications',\n leading: 'app-icon',\n description: 'Manage the apps connected here',\n });\n\n const title = part(el, 'page-title')!.getBoundingClientRect();\n const icon = part(el, 'app-icon')!.getBoundingClientRect();\n // (24 - 20) / 2 — structural, not an offset written anywhere.\n expect(Math.round(icon.top - title.top)).to.equal(2);\n });\n\n // The app icon is sized apart from the utility controls, so retuning one cannot move the other.\n it('67. sizes the app icon independently of the utility controls', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'app-icon' });\n const host = getComputedStyle(el);\n\n expect(host.getPropertyValue('--nile-app-shell-app-icon-size').trim()).to.equal(\n '20px'\n );\n expect(host.getPropertyValue('--nile-app-shell-utility-size').trim()).to.equal(\n '32px'\n );\n\n el.style.setProperty('--nile-app-shell-app-icon-size', '28px');\n await el.updateComplete;\n expect(part(el, 'app-icon')!.getBoundingClientRect().width).to.equal(28);\n // The nav toggle is untouched by that.\n const toggle = part(el, 'nav-toggle')!;\n const base = toggle.shadowRoot!.querySelector(\n '[part~=\"base\"]'\n ) as HTMLElement;\n expect(base.getBoundingClientRect().width).to.equal(32);\n });\n\n it('54. leading=\"app-icon\" draws a 20px block around the slotted mark', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'app-icon' });\n const box = part(el, 'app-icon')!;\n expect(box).to.exist;\n expect(part(el, 'back')).to.be.null;\n\n const rect = box.getBoundingClientRect();\n // Its own size, not the 32px utility control box the nav toggle uses.\n expect(rect.width).to.equal(20);\n expect(rect.height).to.equal(20);\n\n // The page's mark is assigned into the shell's box.\n const slot = box.querySelector('slot[name=\"app-icon\"]') as HTMLSlotElement;\n expect(slot).to.exist;\n expect(slot.assignedElements()).to.deep.equal([\n el.querySelector('#mark') as Element,\n ]);\n\n // The block sits before the title, not after it.\n /* eslint-disable-next-line no-bitwise */\n const boxIsFirst =\n box.compareDocumentPosition(part(el, 'page-title')!) &\n Node.DOCUMENT_POSITION_FOLLOWING;\n expect(boxIsFirst).to.be.greaterThan(0);\n });\n});\n\n// The four header heights are viewport-height sensitive, so these tests set a viewport where the spec numbers apply.\ndescribe('NileAppShell — the four header heights', () => {\n const TALL = { width: 1400, height: 900 };\n const SHORT = { width: 800, height: 600 };\n\n before(async () => {\n await setViewport(TALL);\n });\n\n after(async () => {\n await setViewport(SHORT);\n });\n\n const bar = (el: NileAppShell) =>\n el.shadowRoot!.querySelector('.container > .top-bar') as HTMLElement;\n\n const strip = (el: NileAppShell) =>\n el.shadowRoot!.querySelector('.tabs') as HTMLElement;\n\n // The header block is the bar plus its strip, measured top-to-bottom so a gap between them is caught.\n const headerBlock = (el: NileAppShell) => {\n const top = bar(el).getBoundingClientRect().top;\n const bottom = el.tabsVisible\n ? strip(el).getBoundingClientRect().bottom\n : bar(el).getBoundingClientRect().bottom;\n return bottom - top;\n };\n\n it('55. is 68px with neither axis on, whatever the leading', async () => {\n for (const leading of ['none', 'back', 'app-icon'] as const) {\n const el = await header({ pageTitle: 'Applications', leading });\n expect(bar(el).getBoundingClientRect().height, leading).to.equal(68);\n // The leading axis changes what is in the bar, never how tall it is.\n const area = part(el, 'title-area')!.getBoundingClientRect().height;\n expect(area, leading).to.be.at.most(bar(el).clientHeight);\n }\n });\n\n // A description adds its own line (24 title + 2 gap + 18 description = 44) in a 76px bar; asserted as the lines' own boxes.\n it('56. is 76px with a description, and the second line fits it', async () => {\n const el = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected to this tenant',\n });\n\n expect(bar(el).getBoundingClientRect().height).to.equal(76);\n\n const stack = el.shadowRoot!.querySelector('.title-stack') as HTMLElement;\n expect(part(el, 'page-title')!.getBoundingClientRect().height).to.equal(24);\n expect(part(el, 'description')!.getBoundingClientRect().height).to.equal(\n 18\n );\n expect(stack.getBoundingClientRect().height).to.equal(44);\n\n // Nothing is clipped: the stack sits wholly inside the bar's box.\n const barBox = bar(el).getBoundingClientRect();\n const stackBox = stack.getBoundingClientRect();\n expect(stackBox.top).to.be.at.least(barBox.top);\n expect(stackBox.bottom).to.be.at.most(barBox.bottom);\n });\n\n it('57. adds a 33px strip for tabs: 101px, and 109px with a description', async () => {\n const tabbed = await header({ pageTitle: 'Applications', tabs: true });\n expect(strip(tabbed).getBoundingClientRect().height).to.equal(33);\n expect(headerBlock(tabbed)).to.equal(101);\n\n const described = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected to this tenant',\n tabs: true,\n });\n expect(strip(described).getBoundingClientRect().height).to.equal(33);\n expect(headerBlock(described)).to.equal(109);\n });\n\n // The three axes are independent, so all twelve combinations land on one of the four heights.\n it('58. resolves all twelve variants to exactly the four heights', async () => {\n for (const leading of ['none', 'back', 'app-icon'] as const) {\n for (const tabs of [false, true]) {\n for (const described of [false, true]) {\n /* eslint-disable-next-line no-nested-ternary */\n const expected = tabs ? (described ? 109 : 101) : described ? 76 : 68;\n const el = await header({\n pageTitle: 'Applications',\n description: described ? 'Manage connected apps' : '',\n leading,\n tabs,\n });\n const label = `leading=${leading} tabs=${tabs} description=${described}`;\n expect(headerBlock(el), label).to.equal(expected);\n }\n }\n }\n });\n\n // The strip is a control row plus its rule; the row shrinks to fit via the group's own padding hook, staying shorter than the standalone group.\n it('59. shrinks the slotted tab row to fit the strip, rather than crop it', async () => {\n const el = await header({ pageTitle: 'Applications', tabs: true });\n const standalone = await fixture<HTMLElement>(html`\n <nile-nav-tab-group style=\"${HEADER_TOKENS}\">\n <nile-nav-tab slot=\"nav\" panel=\"apps\" active>Connected</nile-nav-tab>\n <nile-nav-tab slot=\"nav\" panel=\"approvals\">Approvals</nile-nav-tab>\n </nile-nav-tab-group>\n `);\n\n const stripBox = strip(el).getBoundingClientRect();\n const slottedRow = (\n el.querySelector('nile-nav-tab-group') as HTMLElement\n ).getBoundingClientRect();\n const loneRow = standalone.getBoundingClientRect();\n\n // The design's row: 0 + 20px label + 12px = 32, in a 33px strip.\n expect(slottedRow.height).to.equal(32);\n expect(stripBox.height).to.equal(33);\n\n // The shell's hook is load-bearing: the same group is taller on its own.\n expect(loneRow.height).to.be.greaterThan(slottedRow.height);\n expect(loneRow.height).to.be.greaterThan(stripBox.height);\n\n // Nothing is cropped and there is no slack: the row fills the strip above the rule it sits on.\n expect(slottedRow.top).to.be.at.least(stripBox.top);\n expect(slottedRow.bottom).to.be.at.most(stripBox.bottom);\n expect(slottedRow.top - stripBox.top).to.equal(0);\n });\n\n it('60. drives the row through the group’s own padding hook', async () => {\n const el = await header({ pageTitle: 'Applications', tabs: true });\n const group = el.querySelector('nile-nav-tab-group') as HTMLElement;\n const padding = getComputedStyle(group)\n .getPropertyValue('--nile-nav-tab-padding')\n .split(/\\s+/)\n .filter(Boolean);\n\n // The tab node's padding is 0 / 4 / 12 / 4, the 12px bottom being the active indicator's band.\n expect(padding).to.deep.equal(['0px', '4px', '12px', '4px']);\n\n // The inter-tab gap is the group's own 12px and is deliberately untouched.\n expect(\n getComputedStyle(group).getPropertyValue('--tab-gap').trim()\n ).to.equal('12px');\n });\n\n // The compression under a short viewport is documented behaviour, asserted here to keep the resize honest.\n it('61. compresses to 56/64px under 600px of viewport height', async () => {\n await setViewport(SHORT);\n try {\n const plain = await header({ pageTitle: 'Applications' });\n expect(bar(plain).getBoundingClientRect().height).to.equal(56);\n\n const described = await header({\n pageTitle: 'Applications',\n description: 'Manage connected apps',\n });\n expect(bar(described).getBoundingClientRect().height).to.equal(64);\n } finally {\n await setViewport(TALL);\n }\n });\n});\n"]}
1
+ {"version":3,"file":"nile-app-shell.test.js","sourceRoot":"","sources":["../../../src/nile-app-shell/nile-app-shell.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html, oneEvent, waitUntil } from '@open-wc/testing';\nimport { setViewport } from '@web/test-runner-commands';\nimport './nile-app-shell';\nimport '../nile-app-shell-nav-toggle/nile-app-shell-nav-toggle';\nimport '../nile-app-shell-panel/nile-app-shell-panel';\nimport '../nile-nav-tab-group/nile-nav-tab-group';\nimport '../nile-nav-tab/nile-nav-tab';\nimport '../nile-side-bar/nile-side-bar';\n// renderGlyph fails silently on an unknown name, so the glyph tests need the real element.\nimport '@aquera/nile-glyph/nile-glyph';\nimport type { NileAppShell } from './nile-app-shell';\nimport type { NileAppShellNavToggle } from '../nile-app-shell-nav-toggle/nile-app-shell-nav-toggle';\n\n// Sizes the host explicitly and waits for the ResizeObserver to land.\nconst sized = async (width: number) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: ${width}px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-panel'));\n return el;\n};\n\n/** The same shell with an overlay drawer opted into, which is not the default. */\nconst overlaying = async (width: number) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: ${width}px; height: 600px;\"\n overlay-breakpoint=\"1280\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-panel'));\n return el;\n};\n\n// Waits for two consecutive frames to agree before geometry is asserted.\nconst settled = async (el: NileAppShell) => {\n const section = el.shadowRoot!.querySelector('.content-section')!;\n let last = -1;\n await waitUntil(\n () => {\n const width = Math.round(section.getBoundingClientRect().width);\n const same = width === last;\n last = width;\n return same;\n },\n 'the shell never settled',\n { timeout: 3000, interval: 60 }\n );\n};\n\nconst part = (el: NileAppShell, name: string) =>\n el.shadowRoot!.querySelector(`[part~=\"${name}\"]`) as HTMLElement | null;\n\ndescribe('NileAppShell — regions', () => {\n it('1. defaults to an expanded nav, a closed docked panel and a fluid body', async () => {\n const el = await sized(1440);\n expect(el.navCollapsed).to.be.false;\n expect(el.panelOpen).to.be.false;\n expect(el.panelMode).to.equal('docked');\n expect(el.contentAlign).to.equal('fluid');\n expect(el.rail).to.be.false;\n });\n\n it('2. mounts only the regions that have slotted content', async () => {\n const el = await sized(1440);\n expect(el.hasAttribute('has-side-nav')).to.be.true;\n expect(el.hasAttribute('has-top-bar')).to.be.true;\n expect(el.hasAttribute('has-panel')).to.be.true;\n expect(el.hasAttribute('has-banner')).to.be.false;\n expect(el.hasAttribute('has-aside')).to.be.false;\n });\n\n it('3. reports no panel when the panel slot is empty', async () => {\n const el = await fixture<NileAppShell>(\n html`<nile-app-shell><p>page</p></nile-app-shell>`\n );\n expect(el.panelAvailable).to.be.false;\n expect(el.hasAttribute('has-panel')).to.be.false;\n });\n\n it('4. renders the top bar inside the container by default', async () => {\n const el = await sized(1440);\n expect(part(el, 'container')!.contains(part(el, 'top-bar'))).to.be.true;\n });\n\n it('5. spans the shell with the top bar when asked', async () => {\n const el = await sized(1440);\n el.topBarPlacement = 'shell';\n await el.updateComplete;\n const bar = part(el, 'top-bar')!;\n expect(bar.classList.contains('shell-top-bar')).to.be.true;\n expect(part(el, 'container')!.contains(bar)).to.be.false;\n });\n});\n\n/**\n * The name the control's glyph asks for, once nile-glyph has resolved it to\n * real path data. An unknown name leaves an empty <svg>, so this fails loudly\n * rather than letting a missing icon ship as a blank box.\n */\nconst drawnGlyph = async (control: Element) => {\n const glyph = control.querySelector('nile-glyph')!;\n expect(glyph, 'the control renders a nile-glyph').to.exist;\n await waitUntil(\n () => (glyph.shadowRoot?.querySelector('svg')?.childElementCount ?? 0) > 0,\n `${glyph.getAttribute('name')} draws no paths — is it in the nile-glyph set?`\n );\n return glyph.getAttribute('name');\n};\n\ndescribe('NileAppShell — nav', () => {\n it('6. collapseNav()/expandNav() drive the rail and reflect it', async () => {\n const el = await sized(1440);\n el.collapseNav();\n await el.updateComplete;\n expect(el.navCollapsed).to.be.true;\n expect(el.hasAttribute('rail')).to.be.true;\n\n el.expandNav();\n await el.updateComplete;\n expect(el.hasAttribute('rail')).to.be.false;\n });\n\n it('7. toggleNav() flips, and accepts a forced state', async () => {\n const el = await sized(1440);\n el.toggleNav();\n await el.updateComplete;\n expect(el.navCollapsed).to.be.true;\n el.toggleNav(true);\n await el.updateComplete;\n expect(el.navCollapsed).to.be.true;\n });\n\n it('8. emits nile-nav-toggle with the collapsed state', async () => {\n const el = await sized(1440);\n const toggled = oneEvent(el, 'nile-nav-toggle');\n el.collapseNav();\n const event = await toggled;\n expect(event.detail.collapsed).to.be.true;\n expect(event.detail.locked).to.be.false;\n });\n\n it('9. mirrors the effective rail onto a slotted nile-side-bar', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nile-side-bar slot=\"side-nav\"></nile-side-bar>\n <p>page</p>\n </nile-app-shell>\n `);\n const bar = el.querySelector('nile-side-bar')!;\n el.collapseNav();\n await el.updateComplete;\n expect(bar.hasAttribute('collapsed')).to.be.true;\n });\n\n it('10. the built-in toggle is disabled, not hidden, while the rail is forced', async () => {\n const el = await sized(1000);\n el.openPanel();\n await waitUntil(() => el.navLocked);\n const button = part(el, 'nav-toggle') as HTMLButtonElement;\n expect(button).to.exist;\n expect(button.disabled).to.be.true;\n expect(el.hasAttribute('rail')).to.be.true;\n });\n\n it('62. the built-in toggle draws a real glyph in both states', async () => {\n const el = await sized(1440);\n expect(await drawnGlyph(part(el, 'nav-toggle')!)).to.equal('ng-panel-left');\n\n el.collapseNav();\n await el.updateComplete;\n expect(await drawnGlyph(part(el, 'nav-toggle')!)).to.equal('ng-panel-right');\n });\n});\n\ndescribe('NileAppShell — Ask Aquera panel', () => {\n it('11. openPanel()/closePanel() drive panel-open', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n expect(el.panelOpen).to.be.true;\n expect(el.hasAttribute('panel-open')).to.be.true;\n\n el.closePanel();\n await el.updateComplete;\n expect(el.panelOpen).to.be.false;\n });\n\n it('12. openPanel() is a no-op when the route opts out', async () => {\n const el = await sized(1440);\n el.noPanel = true;\n await el.updateComplete;\n el.openPanel();\n await el.updateComplete;\n expect(el.panelOpen).to.be.false;\n expect(el.hasAttribute('has-panel')).to.be.false;\n });\n\n it('13. emits nile-panel-toggle with the open state and mode', async () => {\n const el = await sized(1440);\n const toggled = oneEvent(el, 'nile-panel-toggle');\n el.openPanel();\n const event = await toggled;\n expect(event.detail.open).to.be.true;\n expect(event.detail.mode).to.equal('docked');\n });\n\n it('14. pushes rather than overlays, however narrow the shell is', async () => {\n for (const width of [1000, 820]) {\n const el = await sized(width);\n el.openPanel();\n await el.updateComplete;\n await settled(el);\n expect(el.panelMode).to.equal('docked');\n expect(el.getAttribute('panel-mode')).to.equal('docked');\n const container = el.shadowRoot!.querySelector('.container')!;\n const panel = el.shadowRoot!.querySelector('.panel')!;\n // The page sits beside the panel, not under it.\n expect(container.getBoundingClientRect().right).to.be.at.most(\n Math.round(panel.getBoundingClientRect().left) + 1\n );\n }\n });\n\n it(\"14b. overlays below an author's breakpoint when one is set\", async () => {\n const el = await overlaying(1000);\n await waitUntil(() => el.panelMode === 'overlay');\n expect(el.getAttribute('panel-mode')).to.equal('overlay');\n });\n\n it('15. an open docked panel forces the rail below the docked breakpoint', async () => {\n const el = await sized(1360);\n await waitUntil(() => el.panelMode === 'docked');\n expect(el.navLocked).to.be.false;\n\n el.openPanel();\n await waitUntil(() => el.navLocked);\n expect(el.hasAttribute('rail')).to.be.true;\n\n el.closePanel();\n await waitUntil(() => !el.navLocked);\n expect(el.hasAttribute('rail')).to.be.false;\n });\n\n it('16. the panel close button closes it', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n (part(el, 'panel-close') as HTMLButtonElement).click();\n await el.updateComplete;\n expect(el.panelOpen).to.be.false;\n });\n\n it('17. labels the panel and its default heading from panel-label', async () => {\n const el = await sized(1440);\n el.panelLabel = 'Ask Aquera';\n await el.updateComplete;\n expect(part(el, 'panel')!.getAttribute('aria-label')).to.equal(\n 'Ask Aquera'\n );\n expect(part(el, 'panel-title')!.textContent!.trim()).to.equal('Ask Aquera');\n });\n\n // Amendment A (A-8): Figma's Assistant Title is Text lg/Semibold, 18/28; the shell sets it on the title it renders itself.\n it('17b. sets its own panel title at 18/28 in text-primary-900', async () => {\n const tokens =\n '--ng-font-size-text-lg: 18px; --ng-line-height-text-lg: 28px; --ng-font-weight-semibold: 600; --ng-colors-text-primary-900: rgb(24, 29, 39)';\n const el = await sized(1440);\n el.setAttribute('style', `${el.getAttribute('style')}; ${tokens}`);\n el.openPanel();\n await el.updateComplete;\n const own = getComputedStyle(part(el, 'panel-title')!);\n expect(own.fontSize).to.equal('18px');\n expect(own.lineHeight).to.equal('28px');\n expect(own.fontWeight).to.equal('600');\n expect(own.color).to.equal('rgb(24, 29, 39)');\n });\n\n // A-8: a slotted nile-app-shell-panel (part of App Shell) draws the same Figma title: 18/28 SemiBold, text-primary-900.\n it('17c. sets the nile-app-shell-panel title at 18/28 in text-primary-900', async () => {\n const tokens =\n '--ng-font-size-text-sm: 14px; --ng-font-size-text-lg: 18px; --ng-line-height-text-lg: 28px; --ng-font-weight-semibold: 600; --ng-colors-text-primary-900: rgb(24, 29, 39)';\n const slotted = await fixture<HTMLElement>(html`\n <nile-app-shell-panel label=\"Ask Aquera\" style=\"${tokens}\"></nile-app-shell-panel>\n `);\n await (slotted as unknown as { updateComplete: Promise<unknown> }).updateComplete;\n const style = getComputedStyle(slotted.shadowRoot!.querySelector('.title') as HTMLElement);\n expect(style.fontSize).to.equal('18px');\n expect(style.lineHeight).to.equal('28px');\n expect(style.fontWeight).to.equal('600');\n expect(style.color).to.equal('rgb(24, 29, 39)');\n });\n\n // The enterprise sheet keeps its own panel title: --nile-type-scale-3 and an inherited line height, exactly as before.\n // Enterprise defines no --ng-* tokens, so the NxtGen line height does not apply there.\n it('17d. leaves the enterprise nile-app-shell-panel title as it was', async () => {\n const slotted = await fixture<HTMLElement>(html`\n <nile-app-shell-panel\n label=\"Ask Aquera\"\n style=\"--nile-type-scale-3: 14px; line-height: 20px\"\n ></nile-app-shell-panel>\n `);\n await (slotted as unknown as { updateComplete: Promise<unknown> }).updateComplete;\n const style = getComputedStyle(slotted.shadowRoot!.querySelector('.title') as HTMLElement);\n expect(style.fontSize).to.equal('14px');\n expect(style.lineHeight).to.equal('20px');\n });\n\n it('18. Cmd/Ctrl+J toggles the panel', async () => {\n const el = await sized(1440);\n document.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'j', ctrlKey: true })\n );\n await el.updateComplete;\n expect(el.panelOpen).to.be.true;\n });\n\n it('19. Escape closes an overlay panel but leaves a docked one alone', async () => {\n const docked = await sized(1440);\n docked.openPanel();\n await docked.updateComplete;\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));\n await docked.updateComplete;\n expect(docked.panelOpen).to.be.true;\n\n const overlay = await overlaying(1000);\n await waitUntil(() => overlay.panelMode === 'overlay');\n overlay.openPanel();\n await overlay.updateComplete;\n document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));\n await overlay.updateComplete;\n expect(overlay.panelOpen).to.be.false;\n });\n\n it('20. no-panel-shortcut drops the keyboard handling', async () => {\n const el = await sized(1440);\n el.noPanelShortcut = true;\n await el.updateComplete;\n document.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'j', metaKey: true })\n );\n await el.updateComplete;\n expect(el.panelOpen).to.be.false;\n });\n});\n\ndescribe('NileAppShell — content container', () => {\n it('23. content-container makes the slotted page root a size container', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\" content-container>\n <div class=\"page\">page</div>\n </nile-app-shell>\n `);\n const page = el.querySelector('.page')!;\n expect(getComputedStyle(page).containerType).to.equal('inline-size');\n\n el.contentContainer = false;\n await el.updateComplete;\n expect(getComputedStyle(page).containerType).to.equal('normal');\n });\n});\n\ndescribe('NileAppShellNavToggle', () => {\n it('21. drives the nearest shell and mirrors its rail state', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\" no-nav-toggle>\n <nav slot=\"side-nav\">nav</nav>\n <nile-app-shell-nav-toggle slot=\"top-bar\"></nile-app-shell-nav-toggle>\n <p>page</p>\n </nile-app-shell>\n `);\n const toggle = el.querySelector<NileAppShellNavToggle>(\n 'nile-app-shell-nav-toggle'\n )!;\n await waitUntil(() => toggle.appShell === el);\n\n // The control is a nile-button; the part is the contract either way.\n const button = () =>\n toggle.shadowRoot!.querySelector<HTMLElement & { disabled: boolean }>(\n '[part~=\"button\"]'\n )!;\n button().click();\n await el.updateComplete;\n expect(el.navCollapsed).to.be.true;\n\n await toggle.updateComplete;\n expect(button().getAttribute('aria-expanded')).to.equal('false');\n });\n\n it('22. disables itself while the shell holds the rail', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1000px; height: 600px;\"\n no-nav-toggle\n panel-open\n >\n <nav slot=\"side-nav\">nav</nav>\n <nile-app-shell-nav-toggle slot=\"top-bar\"></nile-app-shell-nav-toggle>\n <div slot=\"panel\">assistant</div>\n <p>page</p>\n </nile-app-shell>\n `);\n const toggle = el.querySelector<NileAppShellNavToggle>(\n 'nile-app-shell-nav-toggle'\n )!;\n await waitUntil(() => el.navLocked);\n await toggle.updateComplete;\n expect(\n toggle.shadowRoot!.querySelector<HTMLElement & { disabled: boolean }>(\n '[part~=\"button\"]'\n )!.disabled\n ).to.be.true;\n });\n\n it('63. draws a real glyph in both states', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\" no-nav-toggle>\n <nav slot=\"side-nav\">nav</nav>\n <nile-app-shell-nav-toggle slot=\"top-bar\"></nile-app-shell-nav-toggle>\n <p>page</p>\n </nile-app-shell>\n `);\n const toggle = el.querySelector<NileAppShellNavToggle>(\n 'nile-app-shell-nav-toggle'\n )!;\n await waitUntil(() => toggle.appShell === el);\n const button = () => toggle.shadowRoot!.querySelector('[part~=\"button\"]')!;\n expect(await drawnGlyph(button())).to.equal('ng-panel-left');\n\n (button() as HTMLElement).click();\n await el.updateComplete;\n await toggle.updateComplete;\n expect(await drawnGlyph(button())).to.equal('ng-panel-right');\n });\n});\n\n// The nav track is theme-dependent, so tests load one token pair or the other explicitly.\nconst ENTERPRISE_NAV = '--nile-width-240px: 240px; --nile-width-70px: 70px;';\nconst NXTGEN_NAV = '--ng-spacing-296: 296px; --ng-spacing-68: 68px;';\n\ndescribe('NileAppShell — the content row never overflows', () => {\n const withAside = async (width: number) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: ${width}px; height: 600px;\" panel-open>\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n <div slot=\"aside\">aside</div>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-aside'));\n return el;\n };\n\n /** Overflow of the flex row past the box that clips it. */\n const overflow = (el: NileAppShell) => {\n const section = el.shadowRoot!.querySelector('.content-section')!;\n return (\n section.scrollWidth - Math.round(section.getBoundingClientRect().width)\n );\n };\n\n it('23. tightens the side columns rather than covering the page', async () => {\n // Short of what the row prefers, so the panel and aside give width back while the page stays beside the panel.\n const el = await withAside(1500);\n await waitUntil(() => el.navLocked);\n await settled(el);\n expect(el.panelMode).to.equal('docked');\n const panel = el.shadowRoot!.querySelector('.panel')!;\n const width = panel.getBoundingClientRect().width;\n expect(width).to.be.below(480);\n expect(width).to.be.at.least(360);\n expect(overflow(el)).to.equal(0);\n });\n\n it('24. rails the nav rather than clip the row', async () => {\n // 1600 fits the docked panel over a rail, not over the expanded track.\n const el = await withAside(1600);\n await waitUntil(() => el.navLocked);\n await settled(el);\n expect(el.panelMode).to.equal('docked');\n expect(overflow(el)).to.equal(0);\n });\n\n it('25. holds the container floor while the row has room for it', async () => {\n const el = await withAside(1800);\n await waitUntil(() => el.panelMode === 'docked');\n await settled(el);\n const container = el.shadowRoot!.querySelector('.container')!;\n expect(container.getBoundingClientRect().width).to.be.at.least(640);\n expect(el.navLocked).to.be.false;\n expect(overflow(el)).to.equal(0);\n });\n\n it('26. asks the page for room last, and only after the floors are met', async () => {\n const el = await withAside(820);\n await waitUntil(() => el.navLocked);\n await settled(el);\n const px = (sel: string) =>\n el.shadowRoot!.querySelector(sel)!.getBoundingClientRect().width;\n // Both side columns sit on their floors before the page gives anything.\n expect(Math.round(px('.panel'))).to.equal(360);\n expect(Math.round(px('.aside'))).to.equal(240);\n expect(px('.container')).to.be.below(640);\n expect(overflow(el)).to.equal(0);\n });\n\n it('27. keeps the page above its floor at ordinary widths', async () => {\n const el = await sized(1300);\n el.openPanel();\n await el.updateComplete;\n await settled(el);\n expect(el.panelMode).to.equal('docked');\n const container = el.shadowRoot!.querySelector('.container')!;\n expect(container.getBoundingClientRect().width).to.be.at.least(640);\n expect(overflow(el)).to.equal(0);\n });\n\n // Pins the stylesheet defaults to the JS geometry fallbacks so the two copies cannot drift apart.\n it('71. the stylesheet defaults still match the JS geometry fallbacks', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1440px; height: 600px; --nile-spacing-xs: 4px;\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n const value = (name: string) =>\n parseFloat(getComputedStyle(el).getPropertyValue(name));\n\n // No theme sheet here, so the nav track falls to its own enterprise-pair literals, which is what _geometry() carries too.\n expect(value('--nile-app-shell-side-nav-width')).to.equal(240);\n expect(value('--nile-app-shell-side-nav-rail-width')).to.equal(70);\n expect(value('--nile-app-shell-gutter')).to.equal(4);\n expect(value('--nile-app-shell-content-min-width')).to.equal(640);\n expect(value('--nile-app-shell-aside-width')).to.equal(320);\n expect(value('--nile-app-shell-panel-width')).to.equal(480);\n });\n\n // The nav track mirrors nile-side-bar's token expressions and resolves per theme.\n it('78. resolves the nav track per theme, as nile-side-bar does', async () => {\n const track = async (tokens: string) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px; ${tokens}\">\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n const read = (name: string) =>\n parseFloat(getComputedStyle(el).getPropertyValue(name));\n return [\n read('--nile-app-shell-side-nav-width'),\n read('--nile-app-shell-side-nav-rail-width'),\n ];\n };\n\n expect(\n await track('--nile-width-240px: 240px; --nile-width-70px: 70px;'),\n 'enterprise'\n ).to.deep.equal([240, 70]);\n\n expect(\n await track('--ng-spacing-296: 296px; --ng-spacing-68: 68px;'),\n 'nxtgen'\n ).to.deep.equal([296, 68]);\n });\n\n // The nav rails at the row's own theme-dependent width requirement (enterprise 1368, nxtgen 1424), with docked-rail-breakpoint at 0 so the measured value governs.\n it('72. rails the nav at the row’s own width requirement, not a gutter early', async () => {\n const at = async (width: number, tokens = ENTERPRISE_NAV) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: ${width}px; height: 600px; ${tokens}\"\n docked-rail-breakpoint=\"0\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-panel'));\n el.openPanel();\n await el.updateComplete;\n await settled(el);\n return el.navLocked;\n };\n\n // Exactly the requirement: the row fits, so the nav keeps its width.\n expect(await at(1368)).to.be.false;\n // One pixel under: the track is what the row cannot afford.\n expect(await at(1367)).to.be.true;\n expect(await at(1370)).to.be.false;\n\n // NxtGen's wider track moves the same boundary up by 56px, following whatever the side bar measures.\n expect(await at(1424, NXTGEN_NAV)).to.be.false;\n expect(await at(1423, NXTGEN_NAV)).to.be.true;\n // And the enterprise boundary is comfortably inside NxtGen's requirement.\n expect(await at(1368, NXTGEN_NAV)).to.be.true;\n });\n});\n\n// An empty flex item still takes the row's gap, pulling the bar's content short of its padding edge.\ndescribe('NileAppShell — the top bar reaches its padding edge', () => {\n it('28. an empty actions group reserves no gap', async () => {\n const el = await sized(1440);\n // The Ask button lives in that group, so drop it to leave it truly empty.\n el.noAsk = true;\n await settled(el);\n expect(el.hasAttribute('has-top-bar-actions')).to.be.false;\n expect(el.hasAttribute('has-ask')).to.be.false;\n const bar = el.shadowRoot!.querySelector('.top-bar') as HTMLElement;\n const content = el.shadowRoot!.querySelector('.top-bar-content')!;\n const padEnd = parseFloat(getComputedStyle(bar).paddingInlineEnd);\n const shortfall =\n bar.getBoundingClientRect().right - content.getBoundingClientRect().right;\n expect(Math.round(shortfall)).to.equal(Math.round(padEnd));\n });\n\n it('29. slotted actions mount the group', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <button slot=\"top-bar-actions\">Save</button>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-top-bar-actions'));\n const actions = el.shadowRoot!.querySelector('.top-bar-actions')!;\n expect(getComputedStyle(actions).display).to.not.equal('none');\n expect(actions.getBoundingClientRect().width).to.be.greaterThan(0);\n });\n\n // The rule that separates the nav toggle from the header's content follows both a filled slot and a title block.\n it('76. draws the toggle rule for a title block, not just a filled slot', async () => {\n const rule = (el: NileAppShell) => part(el, 'rule');\n\n const slotted = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => slotted.hasAttribute('has-top-bar'));\n expect(rule(slotted)).to.exist;\n\n // The same heading through pageTitle, top-bar slot empty.\n const titled = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1440px; height: 600px;\"\n pageTitle=\"Applications\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n await titled.updateComplete;\n expect(titled.hasAttribute('has-top-bar')).to.be.true;\n expect(rule(titled), 'a title block earns the rule too').to.exist;\n\n // Neither: the toggle stands alone, so there is nothing to separate.\n const bare = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n await bare.updateComplete;\n expect(rule(bare)).to.be.null;\n });\n});\n\n// The built-in Ask button turns on whether a panel is mounted for this route and calls openPanel().\ndescribe('NileAppShell — the built-in Ask button', () => {\n const ask = (el: NileAppShell) => part(el, 'ask') as HTMLButtonElement | null;\n\n it('30. opens the panel', async () => {\n const el = await sized(1440);\n expect(el.panelOpen).to.be.false;\n ask(el)!.click();\n await el.updateComplete;\n expect(el.panelOpen).to.be.true;\n });\n\n it('31. is absent when the route mounts no panel', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n expect(el.askVisible).to.be.false;\n expect(ask(el)).to.be.null;\n });\n\n it('32. no-ask drops it for a bar that renders its own', async () => {\n const el = await sized(1440);\n el.noAsk = true;\n await el.updateComplete;\n expect(el.askVisible).to.be.false;\n expect(ask(el)).to.be.null;\n });\n\n it('33. takes its label from ask-label', async () => {\n const el = await sized(1440);\n el.askLabel = 'Ask Aquera';\n await el.updateComplete;\n expect(ask(el)!.textContent!.trim()).to.equal('Ask Aquera');\n });\n\n it('34. keeps the actions group mounted on its own', async () => {\n const el = await sized(1440);\n await settled(el);\n // Nothing is slotted into top-bar-actions, but the Ask button lives there.\n expect(el.hasAttribute('has-top-bar-actions')).to.be.false;\n expect(el.hasAttribute('has-ask')).to.be.true;\n const actions = el.shadowRoot!.querySelector('.top-bar-actions')!;\n expect(getComputedStyle(actions).display).to.not.equal('none');\n expect(actions.getBoundingClientRect().width).to.be.greaterThan(0);\n });\n\n // Amendment A (M8): the design's Ask is the secondary button, not the filled primary.\n it('34b. renders Ask as the secondary variant', async () => {\n const el = await sized(1440);\n expect(ask(el)!.getAttribute('variant')).to.equal('secondary');\n });\n\n // Amendment A (M9, M10): app actions, a 16px divider, then Ask, 16px apart; with no app actions, no divider.\n it('34c. draws a divider before Ask only when the page slots actions, 16px from both', async () => {\n const alone = await sized(1440);\n await settled(alone);\n expect(part(alone, 'ask-rule')).to.be.null;\n\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px; --ng-spacing-xl: 16px;\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <button slot=\"top-bar-actions\" id=\"one\">One</button>\n <button slot=\"top-bar-actions\" id=\"two\">Two</button>\n <p>page</p>\n <div slot=\"panel\">assistant</div>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-top-bar-actions'));\n await el.updateComplete;\n\n const rule = part(el, 'ask-rule')!;\n expect(rule).to.exist;\n const one = el.querySelector('#one')!.getBoundingClientRect();\n const two = el.querySelector('#two')!.getBoundingClientRect();\n const ruleBox = rule.getBoundingClientRect();\n const askBox = ask(el)!.getBoundingClientRect();\n\n expect(Math.round(ruleBox.height)).to.equal(16);\n expect(Math.round(two.left - one.right)).to.equal(16);\n expect(Math.round(ruleBox.left - two.right)).to.equal(16);\n expect(Math.round(askBox.left - ruleBox.left)).to.equal(16);\n\n // Order: the page's actions, the divider, then Ask.\n /* eslint-disable-next-line no-bitwise */\n const ruleBeforeAsk = rule.compareDocumentPosition(ask(el)!) & Node.DOCUMENT_POSITION_FOLLOWING;\n expect(ruleBeforeAsk).to.be.greaterThan(0);\n\n el.noAsk = true;\n await el.updateComplete;\n expect(part(el, 'ask-rule'), 'no Ask, no divider').to.be.null;\n });\n\n // The shell draws its icon controls as bare glyphs via ::part(base), overriding nile-button's circle and ghost surface.\n const utilityBase = (el: NileAppShell, name: string) =>\n part(el, name)!.shadowRoot!.querySelector('[part~=\"base\"]') as HTMLElement;\n\n it('35. draws its icon controls with no resting surface', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n\n for (const name of ['nav-toggle', 'panel-close']) {\n const base = utilityBase(el, name);\n expect(getComputedStyle(base).backgroundColor).to.equal(\n 'rgba(0, 0, 0, 0)'\n );\n }\n });\n\n it('36. sizes its icon controls to the utility box, not the button circle', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n\n for (const name of ['nav-toggle', 'panel-close']) {\n const box = utilityBase(el, name).getBoundingClientRect();\n expect(box.width).to.equal(32);\n expect(box.height).to.equal(32);\n }\n });\n\n it('37. holds the panel back control until panelBack asks for it', async () => {\n const el = await sized(1440);\n el.openPanel();\n await el.updateComplete;\n const mark = el.shadowRoot!.querySelector('.panel-mark')!;\n // Not rendered at all in the root view, so no stylesheet override can surface it.\n expect(part(el, 'panel-back')).to.not.exist;\n expect(getComputedStyle(mark).display).to.not.equal('none');\n\n el.panelBack = true;\n await el.updateComplete;\n const back = part(el, 'panel-back')!;\n expect(back).to.exist;\n expect(getComputedStyle(back).display).to.not.equal('none');\n // The back control stands where the brand mark stands in the root view.\n expect(getComputedStyle(mark).display).to.equal('none');\n });\n\n it('38. emits nile-panel-back and takes its label from panelBackLabel', async () => {\n const el = await sized(1440);\n el.panelBack = true;\n el.panelBackLabel = 'Back to chats';\n el.openPanel();\n await el.updateComplete;\n\n const back = part(el, 'panel-back')!;\n expect(back.getAttribute('aria-label')).to.equal('Back to chats');\n\n const went = oneEvent(el, 'nile-panel-back');\n (back as HTMLButtonElement).click();\n await went;\n // The shell keeps no view stack, so going back leaves the panel open.\n expect(el.panelOpen).to.be.true;\n });\n\n it('81. goBackPanel() emits nile-panel-back, and goBack() stays its alias', async () => {\n const el = await sized(1440);\n\n const named = oneEvent(el, 'nile-panel-back');\n el.goBackPanel();\n expect(await named).to.exist;\n\n // Deprecated, but still the same event: existing callers keep working.\n const aliased = oneEvent(el, 'nile-panel-back');\n el.goBack();\n expect(await aliased).to.exist;\n });\n});\n\ndescribe('NileAppShell — the tab strip', () => {\n /** The strip is slot-driven, so it needs something in the slot to exist. */\n const tabbed = async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1440px; height: 600px; ${HEADER_TOKENS}\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <nile-nav-tab-group slot=\"tabs\">\n <nile-nav-tab slot=\"nav\" panel=\"apps\" active>Connected</nile-nav-tab>\n <nile-nav-tab slot=\"nav\" panel=\"approvals\">Approvals</nile-nav-tab>\n </nile-nav-tab-group>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-tabs'));\n return el;\n };\n\n const strip = (el: NileAppShell) =>\n el.shadowRoot!.querySelector('.tabs') as HTMLElement;\n\n it('39. mounts the strip for a filled slot', async () => {\n const el = await tabbed();\n expect(el.tabsVisible).to.be.true;\n expect(getComputedStyle(strip(el)).display).to.not.equal('none');\n });\n\n it('40. noTabs hides the strip without emptying the slot', async () => {\n const el = await tabbed();\n el.noTabs = true;\n await el.updateComplete;\n\n expect(el.tabsVisible).to.be.false;\n expect(getComputedStyle(strip(el)).display).to.equal('none');\n // The slot is still filled — the strip is switched off, not unmounted — so the assigned element proves the content stays.\n expect(el.querySelector('nile-nav-tab-group')).to.exist;\n const slot = strip(el).querySelector('slot') as HTMLSlotElement;\n expect(slot.assignedElements()).to.have.lengthOf(1);\n\n el.noTabs = false;\n await el.updateComplete;\n expect(el.tabsVisible).to.be.true;\n expect(getComputedStyle(strip(el)).display).to.not.equal('none');\n });\n\n // has-tabs advertises the visible strip, not the filled slot, matching has-panel and has-ask.\n it('68. has-tabs follows the visible strip, not the filled slot', async () => {\n // Slotted, not switched off: the strip is up and the flag is on.\n const el = await tabbed();\n expect(el.tabsVisible).to.be.true;\n expect(el.hasAttribute('has-tabs')).to.be.true;\n\n // Slotted, switched off: the slot stays filled, the flag goes with the strip.\n el.noTabs = true;\n await el.updateComplete;\n expect(el.querySelector('nile-nav-tab-group')).to.exist;\n expect(el.hasAttribute('has-tabs')).to.be.false;\n expect(getComputedStyle(strip(el)).display).to.equal('none');\n\n // And back, so the flag is not a one-way latch.\n el.noTabs = false;\n await el.updateComplete;\n expect(el.hasAttribute('has-tabs')).to.be.true;\n\n // Nothing slotted: no strip, no flag, whatever noTabs says.\n const bare = await sized(1440);\n await settled(bare);\n expect(bare.hasAttribute('has-tabs')).to.be.false;\n bare.noTabs = true;\n await bare.updateComplete;\n expect(bare.hasAttribute('has-tabs')).to.be.false;\n });\n\n it('41. leaves the strip off when the slot is empty', async () => {\n const el = await sized(1440);\n await settled(el);\n expect(el.hasAttribute('has-tabs')).to.be.false;\n expect(el.tabsVisible).to.be.false;\n });\n\n it('77. sizes bare slotted tab controls to their labels, not the strip', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1176px; height: 600px; ${HEADER_TOKENS}\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\">Title</span>\n <button slot=\"tabs\" id=\"short\">A</button>\n <button slot=\"tabs\" id=\"long\">A considerably longer tab label</button>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => el.hasAttribute('has-tabs'));\n await settled(el);\n\n const short = el.querySelector('#short')!.getBoundingClientRect().width;\n const long = el.querySelector('#long')!.getBoundingClientRect().width;\n // Stretched, they would be equal; sized to content they are not close.\n expect(long).to.be.greaterThan(short * 2);\n });\n\n it('43. leaves the slotted strip one rule, edge to edge', async () => {\n const el = await tabbed();\n const group = el.querySelector('nile-nav-tab-group') as HTMLElement;\n const groupStyle = getComputedStyle(group);\n\n expect(groupStyle.getPropertyValue('--track-width').trim()).to.equal('0px');\n expect(groupStyle.alignSelf).to.equal('flex-end');\n\n // The region's rule is as wide as the container it closes, padding and all.\n const container = el.shadowRoot!.querySelector('.container') as HTMLElement;\n const stripWidth = strip(el).getBoundingClientRect().width;\n const inner =\n container.getBoundingClientRect().width -\n parseFloat(getComputedStyle(container).borderLeftWidth) -\n parseFloat(getComputedStyle(container).borderRightWidth);\n expect(Math.round(stripWidth)).to.equal(Math.round(inner));\n\n // The group is wholly inside the region, and ends where the rule is.\n const strippedBottom = strip(el).getBoundingClientRect().bottom;\n const groupBottom = group.getBoundingClientRect().bottom;\n expect(strippedBottom - groupBottom).to.be.lessThan(2);\n });\n\n // The Header Bar draws no rule of its own; the one divider belongs to the tab rail, so switching the strip off leaves the header with no rule.\n it('42. draws the header rule on the strip only, never on the bar', async () => {\n const el = await tabbed();\n const bar = el.shadowRoot!.querySelector(\n '.container > .top-bar'\n ) as HTMLElement;\n\n expect(parseFloat(getComputedStyle(bar).borderBottomWidth)).to.equal(0);\n expect(\n parseFloat(getComputedStyle(strip(el)).borderBottomWidth)\n ).to.be.greaterThan(0);\n expect(getComputedStyle(strip(el)).borderBottomColor).to.not.equal(\n 'rgba(0, 0, 0, 0)'\n );\n\n // No tabs, no rule anywhere in the header block.\n el.noTabs = true;\n await el.updateComplete;\n expect(parseFloat(getComputedStyle(bar).borderBottomWidth)).to.equal(0);\n });\n\n // The bar and the strip sit flush, with the stroke as the separation, not space.\n it('62. leaves no vertical gap between the bar and the strip', async () => {\n const el = await tabbed();\n const bar = el.shadowRoot!.querySelector(\n '.container > .top-bar'\n ) as HTMLElement;\n const gap =\n strip(el).getBoundingClientRect().top -\n bar.getBoundingClientRect().bottom;\n expect(Math.abs(gap)).to.be.lessThan(0.5);\n });\n});\n\n// The test page loads no theme sheet, so the header fixtures carry the nxtgen token values the title block and tab row read.\nconst HEADER_TOKENS = [\n '--ng-spacing-none: 0px',\n '--ng-border-width-1: 1px',\n '--ng-colors-border-secondary: #E9EAEB',\n '--ng-spacing-xxs: 2px',\n '--ng-spacing-xs: 4px',\n '--ng-spacing-md: 8px',\n '--ng-spacing-md-alt: 10px',\n '--ng-spacing-lg: 12px',\n '--ng-spacing-xl: 16px',\n '--ng-spacing-3xl: 24px',\n '--ng-font-size-text-xs: 12px',\n '--ng-line-height-text-xs: 18px',\n '--ng-font-size-text-sm: 14px',\n '--ng-line-height-text-sm: 20px',\n '--ng-font-size-text-md: 16px',\n '--ng-line-height-text-md: 24px',\n].join('; ');\n\n// What sits before the title: `headerBack` and the `app-icon` slot are independent, so the four combinations are named here for looping.\ntype Leading = 'none' | 'back' | 'app-icon' | 'back+app-icon';\n\nconst LEADINGS: readonly Leading[] = ['none', 'back', 'app-icon', 'back+app-icon'];\n\nconst hasBack = (leading?: Leading) => leading === 'back' || leading === 'back+app-icon';\nconst hasIcon = (leading?: Leading) =>\n leading === 'app-icon' || leading === 'back+app-icon';\n\ninterface HeaderAxes {\n pageTitle?: string;\n description?: string;\n badge?: string;\n leading?: Leading;\n headerBackLabel?: string;\n tabs?: boolean;\n actions?: boolean;\n}\n\n// A shell carrying whatever header axes a test asks for; an unset axis is the empty string, meaning \"absent\".\nconst header = async (axes: HeaderAxes = {}) => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1176px; height: 800px; ${HEADER_TOKENS}\"\n .pageTitle=${axes.pageTitle ?? ''}\n .description=${axes.description ?? ''}\n .badge=${axes.badge ?? ''}\n .headerBack=${hasBack(axes.leading)}\n .headerBackLabel=${axes.headerBackLabel ?? 'Back'}\n >\n <nav slot=\"side-nav\">nav</nav>\n ${hasIcon(axes.leading)\n ? html`<span slot=\"app-icon\" id=\"mark\">A</span>`\n : ''}\n ${axes.actions\n ? html`<button slot=\"top-bar-actions\" id=\"cta\">Button CTA</button>`\n : ''}\n ${axes.tabs\n ? html`<nile-nav-tab-group slot=\"tabs\">\n <nile-nav-tab slot=\"nav\" panel=\"apps\" active>Connected</nile-nav-tab>\n <nile-nav-tab slot=\"nav\" panel=\"approvals\">Approvals</nile-nav-tab>\n </nile-nav-tab-group>`\n : ''}\n <p>page</p>\n </nile-app-shell>\n `);\n if (axes.tabs) await waitUntil(() => el.hasAttribute('has-tabs'));\n if (hasIcon(axes.leading)) await waitUntil(() => el.hasAttribute('has-app-icon'));\n if (axes.actions) await waitUntil(() => el.hasAttribute('has-top-bar-actions'));\n await el.updateComplete;\n return el;\n};\n\n// The header title block: the shell's own heading, the Leading axis, the badge and the description line.\ndescribe('NileAppShell — the header title block', () => {\n it('44. draws no title block at all until an axis asks for one', async () => {\n const el = await header();\n expect(el.headerBack).to.be.false;\n expect(el.hasAttribute('has-app-icon')).to.be.false;\n expect(part(el, 'title-area')).to.be.null;\n expect(part(el, 'page-title')).to.be.null;\n expect(part(el, 'description')).to.be.null;\n expect(part(el, 'badge')).to.be.null;\n expect(el.hasAttribute('has-description')).to.be.false;\n });\n\n // description and badge are modifiers on the page title, so neither mounts the title block by itself.\n it('73. does not mount a title block for a description or badge alone', async () => {\n for (const axes of [\n { description: 'Manage the apps connected to this tenant' },\n { badge: '94 apps' },\n { description: 'Manage the apps', badge: '94 apps' },\n ]) {\n const el = await header(axes);\n const label = JSON.stringify(axes);\n\n expect(part(el, 'title-area'), label).to.be.null;\n expect(part(el, 'description'), label).to.be.null;\n expect(part(el, 'badge'), label).to.be.null;\n // And no height is reserved for the line that cannot render.\n expect(el.hasAttribute('has-description'), label).to.be.false;\n }\n });\n\n it('74. brings both back as soon as there is a title to hang them on', async () => {\n const el = await header({\n description: 'Manage the apps connected to this tenant',\n badge: '94 apps',\n });\n expect(part(el, 'title-area')).to.be.null;\n\n el.pageTitle = 'Applications';\n await el.updateComplete;\n\n expect(part(el, 'title-area')).to.exist;\n expect(part(el, 'description')).to.exist;\n expect(part(el, 'badge')).to.exist;\n expect(el.hasAttribute('has-description')).to.be.true;\n });\n\n // The back arrow is the exception: it stands on its own but brings no empty title stack.\n it('75. mounts the back arrow on its own, without an empty title stack', async () => {\n const el = await header({ leading: 'back' });\n\n expect(part(el, 'title-area')).to.exist;\n expect(part(el, 'back')).to.exist;\n expect(part(el, 'page-title')).to.be.null;\n expect(el.shadowRoot!.querySelector('.title-stack')).to.be.null;\n expect(el.shadowRoot!.querySelector('.title-row')).to.be.null;\n });\n\n it('45. renders pageTitle as the header’s own heading', async () => {\n const el = await header({ pageTitle: 'Applications' });\n const title = part(el, 'page-title')!;\n expect(title).to.exist;\n // A heading by role, not a hard-coded h1, so the page keeps control of its outline; level 1 by default.\n expect(title.getAttribute('role')).to.equal('heading');\n expect(el.headingLevel).to.equal(1);\n expect(title.getAttribute('aria-level')).to.equal('1');\n expect(title.textContent!.trim()).to.equal('Applications');\n expect(part(el, 'title-area')).to.exist;\n });\n\n // Birat's a11y review: a page with its own h1 needs the shell title one level down.\n it('79. takes its heading level from the headingLevel property and attribute', async () => {\n const el = await header({ pageTitle: 'Applications' });\n el.headingLevel = 2;\n await el.updateComplete;\n const title = part(el, 'page-title')!;\n expect(title.getAttribute('aria-level')).to.equal('2');\n expect(el.getAttribute('headinglevel')).to.equal('2');\n expect(title.textContent!.trim()).to.equal('Applications');\n\n const marked = await fixture<NileAppShell>(html`\n <nile-app-shell pageTitle=\"Applications\" headingLevel=\"3\">\n <p>page</p>\n </nile-app-shell>\n `);\n await marked.updateComplete;\n expect(marked.headingLevel).to.equal(3);\n expect(part(marked, 'page-title')!.getAttribute('aria-level')).to.equal('3');\n });\n\n it('80. clamps an invalid heading level to a safe aria-level', async () => {\n const el = await header({ pageTitle: 'Applications' });\n const cases: [unknown, string][] = [\n [0, '1'],\n [-3, '1'],\n [7, '6'],\n [2.7, '2'],\n [NaN, '1'],\n ['abc', '1'],\n [undefined, '1'],\n ];\n for (const [value, expected] of cases) {\n (el as unknown as { headingLevel: unknown }).headingLevel = value;\n await el.updateComplete;\n expect(\n part(el, 'page-title')!.getAttribute('aria-level'),\n String(value)\n ).to.equal(expected);\n }\n\n // From markup too: a non-numeric attribute still leaves a level-1 heading.\n const marked = await fixture<NileAppShell>(html`\n <nile-app-shell pageTitle=\"Applications\" headingLevel=\"nope\">\n <p>page</p>\n </nile-app-shell>\n `);\n await marked.updateComplete;\n expect(part(marked, 'page-title')!.getAttribute('aria-level')).to.equal('1');\n expect(part(marked, 'page-title')!.textContent!.trim()).to.equal(\n 'Applications'\n );\n });\n\n // The title block renders before the top-bar slot, so a page slotting its own title keeps its output.\n it('46. renders the block before whatever the page slots into top-bar', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1176px; height: 800px;\" pageTitle=\"Apps\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"top-bar\" id=\"own\">the page’s own bar</span>\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n\n const area = part(el, 'title-area')!;\n const slot = el.shadowRoot!.querySelector(\n 'slot[name=\"top-bar\"]'\n ) as HTMLElement;\n expect(el.querySelector('#own')!.assignedSlot).to.equal(slot);\n /* eslint-disable-next-line no-bitwise */\n const areaIsFirst =\n area.compareDocumentPosition(slot) & Node.DOCUMENT_POSITION_FOLLOWING;\n expect(areaIsFirst).to.be.greaterThan(0);\n });\n\n it('47. mounts the top bar for a title block on its own', async () => {\n const el = await fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1176px; height: 800px;\"\n pageTitle=\"Applications\"\n no-nav-toggle\n >\n <p>page</p>\n </nile-app-shell>\n `);\n await el.updateComplete;\n // Nothing is slotted anywhere, and there is no nav toggle to mount it.\n expect(el.hasAttribute('has-side-nav')).to.be.false;\n expect(el.hasAttribute('has-top-bar')).to.be.true;\n expect(part(el, 'page-title')).to.exist;\n });\n\n it('48. renders a badge after the title, and only when set', async () => {\n const plain = await header({ pageTitle: 'Applications' });\n expect(part(plain, 'badge')).to.be.null;\n\n const el = await header({ pageTitle: 'Applications', badge: '12 active' });\n const badge = part(el, 'badge')!;\n expect(badge).to.exist;\n expect(badge.textContent!.trim()).to.equal('12 active');\n /* eslint-disable-next-line no-bitwise */\n const titleIsFirst =\n part(el, 'page-title')!.compareDocumentPosition(badge) &\n Node.DOCUMENT_POSITION_FOLLOWING;\n expect(titleIsFirst).to.be.greaterThan(0);\n });\n\n // The badge's surface tokens must resolve on both the enterprise and nxtgen sheets, so each test pins one sheet on its own.\n const badged = (tokens: string) =>\n fixture<NileAppShell>(html`\n <nile-app-shell\n style=\"width: 1176px; height: 800px; ${tokens}\"\n pageTitle=\"Applications\"\n badge=\"Beta\"\n >\n <nav slot=\"side-nav\">nav</nav>\n <p>page</p>\n </nile-app-shell>\n `);\n\n it('69. resolves the badge on the enterprise sheet alone', async () => {\n const el = await badged(\n [\n '--nile-border-width-1: 1px',\n '--nile-colors-neutral-100: #FAFAFA',\n '--nile-colors-neutral-400: #E6E9EB',\n '--nile-colors-dark-500: #636363',\n // The ink the badge must not fall back to by inheriting the title's.\n '--nile-colors-dark-900: #000000',\n ].join('; ')\n );\n const style = getComputedStyle(part(el, 'badge')!);\n\n expect(style.backgroundColor).to.equal('rgb(250, 250, 250)');\n expect(style.borderTopColor).to.equal('rgb(230, 233, 235)');\n expect(style.borderTopWidth).to.equal('1px');\n expect(style.color).to.equal('rgb(99, 99, 99)');\n });\n\n it('70. resolves the badge on the nxtgen sheet alone', async () => {\n const el = await badged(\n [\n '--ng-border-width-1: 1px',\n '--ng-componentcolors-utility-gray-50: #FAFAFAFF',\n '--ng-componentcolors-utility-gray-200: #E9EAEBFF',\n '--ng-componentcolors-utility-gray-700: #414651FF',\n '--ng-colors-text-primary-900: #181D27FF',\n ].join('; ')\n );\n const style = getComputedStyle(part(el, 'badge')!);\n\n expect(style.backgroundColor).to.equal('rgb(250, 250, 250)');\n expect(style.borderTopColor).to.equal('rgb(233, 234, 235)');\n expect(style.borderTopWidth).to.equal('1px');\n expect(style.color).to.equal('rgb(65, 70, 81)');\n });\n\n it('49. renders a description line, and reserves nothing without one', async () => {\n const off = await header({ pageTitle: 'Applications' });\n expect(off.hasAttribute('has-description')).to.be.false;\n expect(part(off, 'description')).to.be.null;\n\n const el = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected to this tenant',\n });\n const line = part(el, 'description')!;\n expect(el.hasAttribute('has-description')).to.be.true;\n expect(line).to.exist;\n expect(line.textContent!.trim()).to.equal(\n 'Manage the apps connected to this tenant'\n );\n\n // Clearing the string takes the axis back off.\n el.description = '';\n await el.updateComplete;\n expect(el.hasAttribute('has-description')).to.be.false;\n expect(part(el, 'description')).to.be.null;\n });\n\n it('50. headerBack defaults to false and draws no arrow, and no slotted icon draws no icon', async () => {\n const el = await header({ pageTitle: 'Applications' });\n expect(el.headerBack).to.be.false;\n expect(el.hasAttribute('headerback')).to.be.false;\n expect(part(el, 'back')).to.be.null;\n expect(el.hasAttribute('has-app-icon')).to.be.false;\n expect(getComputedStyle(part(el, 'app-icon')!).display).to.equal('none');\n expect(el.shadowRoot!.querySelector('.crumb-divider')).to.be.null;\n });\n\n // Amendment A: the back control is the arrow alone, with no previous-page label and no slash.\n it('51. headerBack draws the narrow-left arrow only, then the title', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'back' });\n const back = part(el, 'back')!;\n const title = part(el, 'page-title')!;\n\n expect(back).to.exist;\n expect(back.tagName).to.equal('BUTTON');\n expect(back.getAttribute('type')).to.equal('button');\n\n // The icons go through nile-glyph, so assert the glyph, not an <svg>.\n const glyphs = back.querySelectorAll('nile-glyph');\n expect(glyphs.length).to.equal(1);\n expect(glyphs[0].getAttribute('name')).to.equal('ng-arrow-narrow-left');\n\n // No label, no divider, no slash anywhere in the header.\n expect(back.textContent!.trim()).to.equal('');\n expect(back.querySelector('span')).to.be.null;\n expect(el.shadowRoot!.querySelector('.crumb-divider')).to.be.null;\n expect(el.shadowRoot!.querySelector('nile-glyph[name=\"ng-slash\"]')).to.be.null;\n\n /* eslint-disable-next-line no-bitwise */\n const backIsFirst =\n back.compareDocumentPosition(title) & Node.DOCUMENT_POSITION_FOLLOWING;\n expect(backIsFirst).to.be.greaterThan(0);\n expect(back.getBoundingClientRect().width).to.be.greaterThan(0);\n });\n\n // camelCase property, attribute: true + reflect: true — the title-block pattern.\n it('51b. headerBack and headerBackLabel work from markup and reflect to their attributes', async () => {\n const marked = await fixture<NileAppShell>(html`\n <nile-app-shell pageTitle=\"Applications\" headerBack headerBackLabel=\"Retour\">\n <p>page</p>\n </nile-app-shell>\n `);\n await marked.updateComplete;\n expect(marked.headerBack).to.be.true;\n expect(marked.headerBackLabel).to.equal('Retour');\n expect(part(marked, 'back')).to.exist;\n\n const el = await header({ pageTitle: 'Applications' });\n el.headerBack = true;\n el.headerBackLabel = 'Go back';\n await el.updateComplete;\n expect(el.hasAttribute('headerback')).to.be.true;\n expect(el.getAttribute('headerbacklabel')).to.equal('Go back');\n expect(part(el, 'back')).to.exist;\n\n el.headerBack = false;\n await el.updateComplete;\n expect(el.hasAttribute('headerback')).to.be.false;\n expect(part(el, 'back')).to.be.null;\n });\n\n // headerBackLabel names the control for assistive tech and is never drawn as text.\n it('52. headerBackLabel is the accessible name only, never visible text', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'back' });\n const back = part(el, 'back')!;\n expect(back.getAttribute('aria-label')).to.equal('Back');\n expect(back.getAttribute('title')).to.equal('Back');\n expect(back.querySelector('nile-glyph')!.getAttribute('aria-hidden')).to.not.equal('false');\n\n el.headerBackLabel = 'Integrations';\n await el.updateComplete;\n expect(back.getAttribute('aria-label')).to.equal('Integrations');\n // Not rendered anywhere in the header as text.\n expect(back.textContent!.trim()).to.equal('');\n expect(part(el, 'title-area')!.textContent!.includes('Integrations')).to.be.false;\n expect(part(el, 'top-bar')!.textContent!.includes('Integrations')).to.be.false;\n });\n\n // The shell owns no history, so the control only announces the press, as the standard nile-click; the page navigates itself.\n it('53. the back control and goBackHeader() emit nile-click { value: \"back\" } from the shell', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'back' });\n let retired = 0;\n el.addEventListener('nile-header-back', () => {\n retired += 1;\n });\n\n const clicked = oneEvent(el, 'nile-click');\n (part(el, 'back') as HTMLButtonElement).click();\n const fromClick = (await clicked) as CustomEvent;\n expect(fromClick.detail).to.deep.equal({ value: 'back' });\n expect(fromClick.target).to.equal(el);\n expect(fromClick.bubbles).to.be.true;\n expect(fromClick.composed).to.be.true;\n\n const called = oneEvent(el, 'nile-click');\n el.goBackHeader();\n const fromCall = (await called) as CustomEvent;\n expect(fromCall.detail).to.deep.equal({ value: 'back' });\n expect(fromCall.target).to.equal(el);\n\n // nile-header-back and goBackPage() are gone in 2.0.12 (Amendment A, A-12).\n expect(retired).to.equal(0);\n expect((el as unknown as { goBackPage?: unknown }).goBackPage).to.be.undefined;\n\n // It is the page's event, not the panel's: nothing about the panel moves.\n expect(el.panelOpen).to.be.false;\n });\n\n // A nile-click bubbling up from page content must not read as the header back press.\n it('53b. a nile-click from slotted content is distinguishable by its target', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'back' });\n const page = el.querySelector('p')!;\n const seen: EventTarget[] = [];\n el.addEventListener('nile-click', e => seen.push(e.target!));\n page.dispatchEvent(\n new CustomEvent('nile-click', {\n bubbles: true,\n composed: true,\n detail: { value: 'back' },\n })\n );\n (part(el, 'back') as HTMLButtonElement).click();\n expect(seen).to.deep.equal([page, el]);\n });\n\n // The four combinations are independent; with an app icon the description sits under the icon, otherwise under the title.\n it('63. aligns the description under the app icon when there is one, else the title', async () => {\n for (const leading of LEADINGS) {\n const el = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected to this tenant',\n leading,\n });\n\n const anchor = hasIcon(leading) ? part(el, 'app-icon')! : part(el, 'page-title')!;\n const description = part(el, 'description')!.getBoundingClientRect();\n expect(Math.round(description.left), leading).to.equal(\n Math.round(anchor.getBoundingClientRect().left)\n );\n }\n });\n\n // The arrow sits beside the stack; the app icon is the first thing in the title row.\n it('64. renders the arrow beside the title stack and the app icon inside the title row', async () => {\n for (const leading of LEADINGS) {\n const el = await header({ pageTitle: 'Applications', leading });\n const row = el.shadowRoot!.querySelector('.title-row') as HTMLElement;\n const area = part(el, 'title-area')!;\n const back = part(el, 'back');\n const icon = part(el, 'app-icon')!;\n\n expect(!!back, `${leading} back`).to.equal(hasBack(leading));\n expect(el.hasAttribute('has-app-icon'), `${leading} icon`).to.equal(hasIcon(leading));\n if (back) {\n expect(row.contains(back), leading).to.be.false;\n expect(area.contains(back), leading).to.be.true;\n }\n expect(row.contains(icon), leading).to.be.true;\n if (hasIcon(leading)) {\n expect(row.firstElementChild, leading).to.equal(icon);\n }\n }\n });\n\n // The arrow sits on the title's row, and its offset does not move when a description appears.\n it('65. sits the back arrow on the title row, description or not', async () => {\n for (const leading of ['back', 'back+app-icon'] as const) {\n for (const description of ['', 'Manage the apps connected here']) {\n const el = await header({\n pageTitle: 'Applications',\n leading,\n description,\n });\n\n const title = part(el, 'page-title')!.getBoundingClientRect();\n const box = el.shadowRoot!.querySelector('.back-line') as HTMLElement;\n const label = `${leading} description=${!!description}`;\n\n // The line box is the title's own, and it starts where the title does.\n expect(Math.round(box.getBoundingClientRect().top), label).to.equal(\n Math.round(title.top)\n );\n expect(Math.round(box.getBoundingClientRect().height), label).to.equal(\n 24\n );\n }\n }\n });\n\n // Figma Title Area: arrow → 16px → [icon → 8px → title]; Breadcrumb / 01: toggle glyph → 16px → divider (16px tall) → 16px.\n it('65b. spaces the toggle, divider, arrow, icon and title as the design does', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'back+app-icon' });\n const toggle = part(el, 'nav-toggle')!;\n const glyph = toggle.querySelector('nile-glyph') ?? toggle;\n const rule = part(el, 'rule')!.getBoundingClientRect();\n const backGlyph = part(el, 'back')!.querySelector('nile-glyph')!.getBoundingClientRect();\n const icon = part(el, 'app-icon')!.getBoundingClientRect();\n const title = part(el, 'page-title')!.getBoundingClientRect();\n const toggleGlyph = glyph.getBoundingClientRect();\n\n expect(Math.round(rule.height)).to.equal(16);\n expect(Math.round(rule.left - toggleGlyph.right)).to.equal(16);\n expect(Math.round(backGlyph.left - rule.left)).to.equal(16);\n expect(Math.round(backGlyph.width)).to.equal(20);\n expect(Math.round(icon.left - backGlyph.right)).to.equal(16);\n expect(Math.round(title.left - icon.right)).to.equal(8);\n\n // Without an icon the title takes the icon's place, 16px after the arrow.\n const plain = await header({ pageTitle: 'Applications', leading: 'back' });\n const plainArrow = part(plain, 'back')!.querySelector('nile-glyph')!.getBoundingClientRect();\n const plainTitle = part(plain, 'page-title')!.getBoundingClientRect();\n expect(Math.round(plainTitle.left - plainArrow.right)).to.equal(16);\n });\n\n // The app-icon slot works with or without headerBack, and with or without a title.\n it('65c. shows a slotted app icon independently of headerBack', async () => {\n const iconOnly = await header({ pageTitle: 'Applications', leading: 'app-icon' });\n expect(part(iconOnly, 'back')).to.be.null;\n expect(part(iconOnly, 'app-icon')!.getBoundingClientRect().width).to.equal(20);\n\n // An icon on its own still mounts the title block.\n const bare = await fixture<NileAppShell>(html`\n <nile-app-shell style=\"width: 1176px; height: 800px; ${HEADER_TOKENS}\">\n <nav slot=\"side-nav\">nav</nav>\n <span slot=\"app-icon\" id=\"mark\">A</span>\n <p>page</p>\n </nile-app-shell>\n `);\n await waitUntil(() => bare.hasAttribute('has-app-icon'));\n await bare.updateComplete;\n expect(part(bare, 'title-area')).to.exist;\n expect(part(bare, 'app-icon')!.getBoundingClientRect().width).to.equal(20);\n\n // Removing the mark takes the icon (and the block it alone mounted) away again.\n bare.querySelector('#mark')!.remove();\n await waitUntil(() => !bare.hasAttribute('has-app-icon'));\n await bare.updateComplete;\n expect(part(bare, 'title-area')).to.be.null;\n });\n\n // Amendment A (M11): the inactive tab colour is scoped to the shell's strip; a standalone group keeps its defaults.\n it('65e. colours the inactive header tabs through the shell only', async () => {\n const colours = [\n '--ng-colors-fg-brand-primary-alt: rgb(21, 94, 239)',\n '--ng-colors-text-brand-secondary-700: rgb(0, 78, 235)',\n '--ng-colors-text-quaternary-500: rgb(113, 118, 128)',\n '--ng-colors-text-secondary-700: rgb(65, 70, 81)',\n ].join('; ');\n const el = await header({ pageTitle: 'Applications', tabs: true });\n el.setAttribute('style', `${el.getAttribute('style')}; ${colours}`);\n await el.updateComplete;\n\n const group = el.querySelector('nile-nav-tab-group') as HTMLElement;\n const inactive = el.querySelectorAll('nile-nav-tab')[1] as HTMLElement;\n // Known limitation (M12, A-7): the shell sets no indicator colour, because nile-nav-tab-group's top indicator\n // hard-codes its token in its own shadow tree; the indicator keeps the group's default.\n const indicatorOf = (g: HTMLElement) =>\n getComputedStyle(g.shadowRoot!.querySelector('.nav-tab-group__indicator') as HTMLElement)\n .borderBottomColor;\n expect(indicatorOf(group)).to.equal('rgb(0, 78, 235)');\n // The inactive label is remapped inside the shell only: nile-nav-tab itself is unchanged and still paints\n // var(--nile-colors-dark-500, var(--ng-colors-text-secondary-700)); the shell points that fallback token at quaternary-500.\n // (The painted ink sits inside nile-link, which this runner does not render; it is checked in the browser instead.)\n const secondaryOf = (node: HTMLElement) =>\n getComputedStyle(node).getPropertyValue('--ng-colors-text-secondary-700').trim();\n expect(secondaryOf(inactive)).to.equal('rgb(113, 118, 128)');\n type Sheets = { cssText: string } | { cssText: string }[];\n const sheets = (customElements.get('nile-nav-tab') as unknown as { styles: Sheets }).styles;\n const tabStyles = ([] as { cssText: string }[]).concat(sheets).map(sheet => sheet.cssText).join('\\n');\n expect(tabStyles).to.include(\n 'color: var(--nile-colors-dark-500, var(--ng-colors-text-secondary-700));'\n );\n expect(tabStyles, 'no new hook on the shared component').to.not.include('--nile-nav-tab-text-color:');\n // Nothing else in the shell's tree is remapped.\n expect(secondaryOf(el)).to.equal('rgb(65, 70, 81)');\n\n // Outside the shell nothing changes.\n const standalone = await fixture<HTMLElement>(html`\n <nile-nav-tab-group style=\"${colours}\">\n <nile-nav-tab slot=\"nav\" panel=\"apps\" active>Connected</nile-nav-tab>\n <nile-nav-tab slot=\"nav\" panel=\"approvals\">Approvals</nile-nav-tab>\n </nile-nav-tab-group>\n `);\n const loneTab = standalone.querySelectorAll('nile-nav-tab')[1] as HTMLElement;\n expect(secondaryOf(loneTab), 'the global default is untouched').to.equal('rgb(65, 70, 81)');\n await (standalone as unknown as { updateComplete: Promise<unknown> }).updateComplete;\n expect(indicatorOf(standalone), 'a standalone group paints its own default').to.equal(\n 'rgb(0, 78, 235)'\n );\n });\n\n it('65d. colours the description text-quaternary-500', async () => {\n const el = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected here',\n });\n el.style.setProperty('--ng-colors-text-quaternary-500', 'rgb(113, 118, 128)');\n el.style.setProperty('--ng-colors-text-tertiary-600', 'rgb(1, 2, 3)');\n expect(getComputedStyle(part(el, 'description')!).color).to.equal(\n 'rgb(113, 118, 128)'\n );\n });\n\n it('66. centres a 20px app icon in the 24px title row, two pixels down', async () => {\n const el = await header({\n pageTitle: 'Applications',\n leading: 'app-icon',\n description: 'Manage the apps connected here',\n });\n\n const title = part(el, 'page-title')!.getBoundingClientRect();\n const icon = part(el, 'app-icon')!.getBoundingClientRect();\n // (24 - 20) / 2 — structural, not an offset written anywhere.\n expect(Math.round(icon.top - title.top)).to.equal(2);\n });\n\n // The app icon is sized apart from the utility controls, so retuning one cannot move the other.\n it('67. sizes the app icon independently of the utility controls', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'app-icon' });\n const host = getComputedStyle(el);\n\n expect(host.getPropertyValue('--nile-app-shell-app-icon-size').trim()).to.equal(\n '20px'\n );\n expect(host.getPropertyValue('--nile-app-shell-utility-size').trim()).to.equal(\n '32px'\n );\n\n el.style.setProperty('--nile-app-shell-app-icon-size', '28px');\n await el.updateComplete;\n expect(part(el, 'app-icon')!.getBoundingClientRect().width).to.equal(28);\n // The nav toggle is untouched by that.\n const toggle = part(el, 'nav-toggle')!;\n const base = toggle.shadowRoot!.querySelector(\n '[part~=\"base\"]'\n ) as HTMLElement;\n expect(base.getBoundingClientRect().width).to.equal(32);\n });\n\n it('54. a slotted app icon draws a 20px block around the mark', async () => {\n const el = await header({ pageTitle: 'Applications', leading: 'app-icon' });\n const box = part(el, 'app-icon')!;\n expect(box).to.exist;\n expect(part(el, 'back')).to.be.null;\n\n const rect = box.getBoundingClientRect();\n // Its own size, not the 32px utility control box the nav toggle uses.\n expect(rect.width).to.equal(20);\n expect(rect.height).to.equal(20);\n\n // The page's mark is assigned into the shell's box.\n const slot = box.querySelector('slot[name=\"app-icon\"]') as HTMLSlotElement;\n expect(slot).to.exist;\n expect(slot.assignedElements()).to.deep.equal([\n el.querySelector('#mark') as Element,\n ]);\n\n // The block sits before the title, not after it.\n /* eslint-disable-next-line no-bitwise */\n const boxIsFirst =\n box.compareDocumentPosition(part(el, 'page-title')!) &\n Node.DOCUMENT_POSITION_FOLLOWING;\n expect(boxIsFirst).to.be.greaterThan(0);\n });\n});\n\n// The four header heights are viewport-height sensitive, so these tests set a viewport where the spec numbers apply.\ndescribe('NileAppShell — the four header heights', () => {\n const TALL = { width: 1400, height: 900 };\n const SHORT = { width: 800, height: 600 };\n\n before(async () => {\n await setViewport(TALL);\n });\n\n after(async () => {\n await setViewport(SHORT);\n });\n\n const bar = (el: NileAppShell) =>\n el.shadowRoot!.querySelector('.container > .top-bar') as HTMLElement;\n\n const strip = (el: NileAppShell) =>\n el.shadowRoot!.querySelector('.tabs') as HTMLElement;\n\n // The header block is the bar plus its strip, measured top-to-bottom so a gap between them is caught.\n const headerBlock = (el: NileAppShell) => {\n const top = bar(el).getBoundingClientRect().top;\n const bottom = el.tabsVisible\n ? strip(el).getBoundingClientRect().bottom\n : bar(el).getBoundingClientRect().bottom;\n return bottom - top;\n };\n\n it('55. is 68px with neither axis on, whatever the leading', async () => {\n for (const leading of LEADINGS) {\n const el = await header({ pageTitle: 'Applications', leading });\n expect(bar(el).getBoundingClientRect().height, leading).to.equal(68);\n // The leading axis changes what is in the bar, never how tall it is.\n const area = part(el, 'title-area')!.getBoundingClientRect().height;\n expect(area, leading).to.be.at.most(bar(el).clientHeight);\n }\n });\n\n // A description adds its own line (24 title + 2 gap + 18 description = 44) in a 76px bar; asserted as the lines' own boxes.\n it('56. is 76px with a description, and the second line fits it', async () => {\n const el = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected to this tenant',\n });\n\n expect(bar(el).getBoundingClientRect().height).to.equal(76);\n\n const stack = el.shadowRoot!.querySelector('.title-stack') as HTMLElement;\n expect(part(el, 'page-title')!.getBoundingClientRect().height).to.equal(24);\n expect(part(el, 'description')!.getBoundingClientRect().height).to.equal(\n 18\n );\n expect(stack.getBoundingClientRect().height).to.equal(44);\n\n // Nothing is clipped: the stack sits wholly inside the bar's box.\n const barBox = bar(el).getBoundingClientRect();\n const stackBox = stack.getBoundingClientRect();\n expect(stackBox.top).to.be.at.least(barBox.top);\n expect(stackBox.bottom).to.be.at.most(barBox.bottom);\n });\n\n it('57. adds a 33px strip for tabs: 101px, and 109px with a description', async () => {\n const tabbed = await header({ pageTitle: 'Applications', tabs: true });\n expect(strip(tabbed).getBoundingClientRect().height).to.equal(33);\n expect(headerBlock(tabbed)).to.equal(101);\n\n const described = await header({\n pageTitle: 'Applications',\n description: 'Manage the apps connected to this tenant',\n tabs: true,\n });\n expect(strip(described).getBoundingClientRect().height).to.equal(33);\n expect(headerBlock(described)).to.equal(109);\n });\n\n // The three axes are independent, so all twelve combinations land on one of the four heights.\n it('58. resolves every variant to exactly the four heights', async () => {\n for (const leading of LEADINGS) {\n for (const tabs of [false, true]) {\n for (const described of [false, true]) {\n /* eslint-disable-next-line no-nested-ternary */\n const expected = tabs ? (described ? 109 : 101) : described ? 76 : 68;\n const el = await header({\n pageTitle: 'Applications',\n description: described ? 'Manage connected apps' : '',\n leading,\n tabs,\n });\n const label = `leading=${leading} tabs=${tabs} description=${described}`;\n expect(headerBlock(el), label).to.equal(expected);\n }\n }\n }\n });\n\n // The strip is a control row plus its rule; the row shrinks to fit via the group's own padding hook, staying shorter than the standalone group.\n it('59. shrinks the slotted tab row to fit the strip, rather than crop it', async () => {\n const el = await header({ pageTitle: 'Applications', tabs: true });\n const standalone = await fixture<HTMLElement>(html`\n <nile-nav-tab-group style=\"${HEADER_TOKENS}\">\n <nile-nav-tab slot=\"nav\" panel=\"apps\" active>Connected</nile-nav-tab>\n <nile-nav-tab slot=\"nav\" panel=\"approvals\">Approvals</nile-nav-tab>\n </nile-nav-tab-group>\n `);\n\n const stripBox = strip(el).getBoundingClientRect();\n const slottedRow = (\n el.querySelector('nile-nav-tab-group') as HTMLElement\n ).getBoundingClientRect();\n const loneRow = standalone.getBoundingClientRect();\n\n // The design's row: 0 + 20px label + 12px = 32, in a 33px strip.\n expect(slottedRow.height).to.equal(32);\n expect(stripBox.height).to.equal(33);\n\n // The shell's hook is load-bearing: the same group is taller on its own.\n expect(loneRow.height).to.be.greaterThan(slottedRow.height);\n expect(loneRow.height).to.be.greaterThan(stripBox.height);\n\n // Nothing is cropped and there is no slack: the row fills the strip above the rule it sits on.\n expect(slottedRow.top).to.be.at.least(stripBox.top);\n expect(slottedRow.bottom).to.be.at.most(stripBox.bottom);\n expect(slottedRow.top - stripBox.top).to.equal(0);\n });\n\n it('60. drives the row through the group’s own padding hook', async () => {\n const el = await header({ pageTitle: 'Applications', tabs: true });\n const group = el.querySelector('nile-nav-tab-group') as HTMLElement;\n const padding = getComputedStyle(group)\n .getPropertyValue('--nile-nav-tab-padding')\n .split(/\\s+/)\n .filter(Boolean);\n\n // The tab node's padding is 0 / 4 / 12 / 4, the 12px bottom being the active indicator's band.\n expect(padding).to.deep.equal(['0px', '4px', '12px', '4px']);\n\n // The inter-tab gap is the group's own 12px and is deliberately untouched.\n expect(\n getComputedStyle(group).getPropertyValue('--tab-gap').trim()\n ).to.equal('12px');\n });\n\n // The compression under a short viewport is documented behaviour, asserted here to keep the resize honest.\n it('61. compresses to 56/64px under 600px of viewport height', async () => {\n await setViewport(SHORT);\n try {\n const plain = await header({ pageTitle: 'Applications' });\n expect(bar(plain).getBoundingClientRect().height).to.equal(56);\n\n const described = await header({\n pageTitle: 'Applications',\n description: 'Manage connected apps',\n });\n expect(bar(described).getBoundingClientRect().height).to.equal(64);\n } finally {\n await setViewport(TALL);\n }\n });\n});\n"]}