@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
@@ -13,8 +13,10 @@ export type NileAppShellPanelMode = 'docked' | 'overlay';
13
13
  export type NileAppShellTopBarPlacement = 'content' | 'shell';
14
14
  /** How the main region lays its content out. */
15
15
  export type NileAppShellContentAlign = 'fluid' | 'centered';
16
- /** What sits before the page title in the top bar. */
17
- export type NileAppShellLeading = 'none' | 'back' | 'app-icon';
16
+ /** The `detail` of the `nile-click` the header back control emits. */
17
+ export interface NileAppShellClickDetail {
18
+ value: 'back';
19
+ }
18
20
  /**
19
21
  * @summary The application frame every route inherits: a side nav, a content container, an optional aside and an AI assistant panel.
20
22
  *
@@ -31,7 +33,7 @@ export type NileAppShellLeading = 'none' | 'back' | 'app-icon';
31
33
  * @slot top-bar - The page-title bar, mounted inside the container by default or spanning the shell when `top-bar-placement="shell"`.
32
34
  * @slot top-bar-actions - Controls pinned to the end of the top bar.
33
35
  * @slot tabs - A hoisted second-level tab strip, flush under the top bar and outside `<main>`'s scroller.
34
- * @slot app-icon - The mark shown when `leading="app-icon"`, clipped to the shell's box.
36
+ * @slot app-icon - The mark shown before the page title whenever this slot has content, clipped to the shell's box.
35
37
  * @slot side-nav - The navigation track. Works best with `<nile-side-bar>`.
36
38
  * @slot aside - A secondary column between the content container and the panel.
37
39
  * @slot panel - The AI panel's body. When empty the panel is unmounted and `openPanel()` is a no-op.
@@ -42,7 +44,7 @@ export type NileAppShellLeading = 'none' | 'back' | 'app-icon';
42
44
  * @event nile-nav-toggle - Emitted after the nav's collapsed state or forced-rail lock changes. `detail: { collapsed, locked }`.
43
45
  * @event nile-panel-toggle - Emitted after the panel opens or closes. `detail: { open, mode }`.
44
46
  * @event nile-panel-mode-change - Emitted when the panel flips between docked and overlay. `detail: { mode }`.
45
- * @event nile-header-back - Emitted when the header's back control is pressed.
47
+ * @event nile-click - Emitted when the header's back control is pressed, or `goBackHeader()` is called. `detail: { value: 'back' }`. Emitted on the shell itself, so check `event.target === shell` as well as the value: a `nile-click` from page content bubbles through the shell too.
46
48
  * @event nile-panel-back - Emitted when the panel's back control is pressed, whether the shell's built-in panel chrome or a slotted `nile-app-shell-panel` draws it.
47
49
  *
48
50
  * @csspart skip-link - The skip-to-content link.
@@ -51,15 +53,15 @@ export type NileAppShellLeading = 'none' | 'back' | 'app-icon';
51
53
  * @csspart top-bar - The top bar, in either placement.
52
54
  * @csspart nav-toggle - The built-in nav toggle button.
53
55
  * @csspart rule - The vertical rule after the nav toggle.
56
+ * @csspart ask-rule - The vertical rule before the Ask button, drawn when `top-bar-actions` has content.
54
57
  * @csspart top-bar-actions - The end-aligned top bar action group.
55
58
  * @csspart ask - The built-in Ask button, the shell's single door to the panel.
56
- * @csspart title-area - The header's own title block: leading, title, badge and description.
59
+ * @csspart title-area - The header's own title block: back control, app icon, title, badge and description.
57
60
  * @csspart page-title - The title text, exposed as a heading whose level `headingLevel` sets.
58
61
  * @csspart description - The second line under the title.
59
62
  * @csspart badge - The pill after the title.
60
- * @csspart leading - The line box holding the leading control.
61
- * @csspart back - The back control shown by `leading="back"`.
62
- * @csspart app-icon - The block shown by `leading="app-icon"`, sized by `--nile-app-shell-app-icon-size`.
63
+ * @csspart back - The header back control, shown by `headerBack`.
64
+ * @csspart app-icon - The block holding the `app-icon` slot, shown when the slot has content and sized by `--nile-app-shell-app-icon-size`.
63
65
  * @csspart tabs - The hoisted tab-strip region, under the top bar.
64
66
  * @csspart side-nav - The navigation track.
65
67
  * @csspart content-section - The flex row holding container, aside and panel.
@@ -91,7 +93,7 @@ export type NileAppShellLeading = 'none' | 'back' | 'app-icon';
91
93
  * @cssproperty [--nile-app-shell-content-min-width=640px] - Container floor.
92
94
  * @cssproperty [--nile-app-shell-min-width=768px] - Below this the window scrolls rather than the shell compressing.
93
95
  * @cssproperty [--nile-app-shell-centered-width=824px] - Column width under `content-align="centered"`.
94
- * @cssproperty [--nile-app-shell-app-icon-size=20px] - The leading app icon's box.
96
+ * @cssproperty [--nile-app-shell-app-icon-size=20px] - The app icon's box.
95
97
  * @cssproperty [--nile-app-shell-utility-size=32px] - Box the shell's own icon controls sit in.
96
98
  * @cssproperty [--nile-app-shell-radius=16px] - Container, aside and panel radius.
97
99
  * @cssproperty [--nile-app-shell-duration=250ms] - Track and panel motion.
@@ -103,9 +105,8 @@ export type NileAppShellLeading = 'none' | 'back' | 'app-icon';
103
105
  * @method expandNav() - Expand the side nav.
104
106
  * @method collapseNav() - Collapse the side nav to a rail.
105
107
  * @method toggleNav(force?) - Toggle, or force a specific collapsed state.
106
- * @method goBackHeader() - Emit `nile-header-back`, as the header's back control does.
108
+ * @method goBackHeader() - Emit `nile-click` with `{ value: 'back' }`, as the header's back control does.
107
109
  * @method goBackPanel() - Emit `nile-panel-back`, as the panel's back control does.
108
- * @method goBackPage() - Deprecated alias of `goBackHeader()`.
109
110
  * @method goBack() - Deprecated alias of `goBackPanel()`.
110
111
  */
111
112
  export declare class NileAppShell extends NileElement {
@@ -126,10 +127,10 @@ export declare class NileAppShell extends NileElement {
126
127
  description?: string;
127
128
  /** A pill after the page title; a modifier on `pageTitle` like `description`, so with no title there is no badge. */
128
129
  badge?: string;
129
- /** What sits before the page title: `back` draws a breadcrumb and emits `nile-header-back`; `app-icon` draws a 20px block for the `app-icon` slot. */
130
- leading: NileAppShellLeading;
131
- /** The previous-page label drawn by `leading="back"`. */
132
- backLabel: string;
130
+ /** Shows the back arrow before the page title; pressing it emits `nile-click` with `{ value: 'back' }`. Independent of the `app-icon` slot. */
131
+ headerBack: boolean;
132
+ /** Accessible name of the header back control. Never rendered as visible text. */
133
+ headerBackLabel: string;
133
134
  /** Hides the built-in nav toggle. Mount `nile-app-shell-nav-toggle` yourself. */
134
135
  noNavToggle: boolean;
135
136
  /** Drops the Cmd/Ctrl+J and Escape panel shortcuts. */
@@ -175,6 +176,7 @@ export declare class NileAppShell extends NileElement {
175
176
  private _hasTopBar;
176
177
  private _hasTopBarActions;
177
178
  private _hasTabs;
179
+ private _hasAppIcon;
178
180
  private _hasPanel;
179
181
  private _hasPanelFooter;
180
182
  /** True when a `nile-app-shell-panel` is slotted, owning the panel's own chrome so the shell renders a bare region. */
@@ -206,12 +208,10 @@ export declare class NileAppShell extends NileElement {
206
208
  closePanel(): void;
207
209
  /** Toggle the panel, or force a state. */
208
210
  togglePanel(force?: boolean): void;
209
- /** Emit `nile-header-back`, as the header's back control does; the page owns the history. */
211
+ /** Emit `nile-click` with `{ value: 'back' }`, as the header's back control does; the page owns the history. */
210
212
  goBackHeader(): void;
211
213
  /** Emit `nile-panel-back`, as the panel's back control does; the page owns the view stack. */
212
214
  goBackPanel(): void;
213
- /** @deprecated Use `goBackHeader()`; kept as an alias that emits `nile-header-back`. */
214
- goBackPage(): void;
215
215
  /** @deprecated Use `goBackPanel()`; kept as an alias that emits `nile-panel-back`. */
216
216
  goBack(): void;
217
217
  /** Expand the side nav. */
@@ -241,13 +241,13 @@ export declare class NileAppShell extends NileElement {
241
241
  private _persist;
242
242
  private _onSlotChange;
243
243
  private _renderNavToggle;
244
- /** Whether the header has a title block of its own to draw: only a title or a leading control mounts it. */
244
+ /** Whether the header has a title block of its own to draw: a title, the back arrow or a slotted app icon mounts it. */
245
245
  private get _hasTitleBlock();
246
- /** Whether `leading` names a control that renders; an empty or unknown value draws nothing, like `none`. */
247
- private get _hasLeading();
248
246
  /** `headingLevel` as a safe `aria-level`: a whole number clamped to 1–6, and 1 for anything non-numeric. */
249
247
  private get _headingLevel();
250
- private _renderLeading;
248
+ private _renderBack;
249
+ private _renderAppIconSlot;
250
+ private _renderAppIconProbe;
251
251
  private _renderTitleBlock;
252
252
  private _renderTopBar;
253
253
  render(): TemplateResult;
@@ -28,7 +28,7 @@ import '../nile-button/nile-button';
28
28
  * @slot top-bar - The page-title bar, mounted inside the container by default or spanning the shell when `top-bar-placement="shell"`.
29
29
  * @slot top-bar-actions - Controls pinned to the end of the top bar.
30
30
  * @slot tabs - A hoisted second-level tab strip, flush under the top bar and outside `<main>`'s scroller.
31
- * @slot app-icon - The mark shown when `leading="app-icon"`, clipped to the shell's box.
31
+ * @slot app-icon - The mark shown before the page title whenever this slot has content, clipped to the shell's box.
32
32
  * @slot side-nav - The navigation track. Works best with `<nile-side-bar>`.
33
33
  * @slot aside - A secondary column between the content container and the panel.
34
34
  * @slot panel - The AI panel's body. When empty the panel is unmounted and `openPanel()` is a no-op.
@@ -39,7 +39,7 @@ import '../nile-button/nile-button';
39
39
  * @event nile-nav-toggle - Emitted after the nav's collapsed state or forced-rail lock changes. `detail: { collapsed, locked }`.
40
40
  * @event nile-panel-toggle - Emitted after the panel opens or closes. `detail: { open, mode }`.
41
41
  * @event nile-panel-mode-change - Emitted when the panel flips between docked and overlay. `detail: { mode }`.
42
- * @event nile-header-back - Emitted when the header's back control is pressed.
42
+ * @event nile-click - Emitted when the header's back control is pressed, or `goBackHeader()` is called. `detail: { value: 'back' }`. Emitted on the shell itself, so check `event.target === shell` as well as the value: a `nile-click` from page content bubbles through the shell too.
43
43
  * @event nile-panel-back - Emitted when the panel's back control is pressed, whether the shell's built-in panel chrome or a slotted `nile-app-shell-panel` draws it.
44
44
  *
45
45
  * @csspart skip-link - The skip-to-content link.
@@ -48,15 +48,15 @@ import '../nile-button/nile-button';
48
48
  * @csspart top-bar - The top bar, in either placement.
49
49
  * @csspart nav-toggle - The built-in nav toggle button.
50
50
  * @csspart rule - The vertical rule after the nav toggle.
51
+ * @csspart ask-rule - The vertical rule before the Ask button, drawn when `top-bar-actions` has content.
51
52
  * @csspart top-bar-actions - The end-aligned top bar action group.
52
53
  * @csspart ask - The built-in Ask button, the shell's single door to the panel.
53
- * @csspart title-area - The header's own title block: leading, title, badge and description.
54
+ * @csspart title-area - The header's own title block: back control, app icon, title, badge and description.
54
55
  * @csspart page-title - The title text, exposed as a heading whose level `headingLevel` sets.
55
56
  * @csspart description - The second line under the title.
56
57
  * @csspart badge - The pill after the title.
57
- * @csspart leading - The line box holding the leading control.
58
- * @csspart back - The back control shown by `leading="back"`.
59
- * @csspart app-icon - The block shown by `leading="app-icon"`, sized by `--nile-app-shell-app-icon-size`.
58
+ * @csspart back - The header back control, shown by `headerBack`.
59
+ * @csspart app-icon - The block holding the `app-icon` slot, shown when the slot has content and sized by `--nile-app-shell-app-icon-size`.
60
60
  * @csspart tabs - The hoisted tab-strip region, under the top bar.
61
61
  * @csspart side-nav - The navigation track.
62
62
  * @csspart content-section - The flex row holding container, aside and panel.
@@ -88,7 +88,7 @@ import '../nile-button/nile-button';
88
88
  * @cssproperty [--nile-app-shell-content-min-width=640px] - Container floor.
89
89
  * @cssproperty [--nile-app-shell-min-width=768px] - Below this the window scrolls rather than the shell compressing.
90
90
  * @cssproperty [--nile-app-shell-centered-width=824px] - Column width under `content-align="centered"`.
91
- * @cssproperty [--nile-app-shell-app-icon-size=20px] - The leading app icon's box.
91
+ * @cssproperty [--nile-app-shell-app-icon-size=20px] - The app icon's box.
92
92
  * @cssproperty [--nile-app-shell-utility-size=32px] - Box the shell's own icon controls sit in.
93
93
  * @cssproperty [--nile-app-shell-radius=16px] - Container, aside and panel radius.
94
94
  * @cssproperty [--nile-app-shell-duration=250ms] - Track and panel motion.
@@ -100,9 +100,8 @@ import '../nile-button/nile-button';
100
100
  * @method expandNav() - Expand the side nav.
101
101
  * @method collapseNav() - Collapse the side nav to a rail.
102
102
  * @method toggleNav(force?) - Toggle, or force a specific collapsed state.
103
- * @method goBackHeader() - Emit `nile-header-back`, as the header's back control does.
103
+ * @method goBackHeader() - Emit `nile-click` with `{ value: 'back' }`, as the header's back control does.
104
104
  * @method goBackPanel() - Emit `nile-panel-back`, as the panel's back control does.
105
- * @method goBackPage() - Deprecated alias of `goBackHeader()`.
106
105
  * @method goBack() - Deprecated alias of `goBackPanel()`.
107
106
  */
108
107
  let NileAppShell = class NileAppShell extends NileElement {
@@ -118,10 +117,10 @@ let NileAppShell = class NileAppShell extends NileElement {
118
117
  this.panelLabel = 'Ask Aquera';
119
118
  /** The `aria-level` of the `pageTitle` heading, 1–6, so the title can fit the page's own heading outline; e.g. 2 when the page body or banner already has its h1. Out-of-range values clamp to 1–6 and non-numbers fall back to 1. */
120
119
  this.headingLevel = 1;
121
- /** What sits before the page title: `back` draws a breadcrumb and emits `nile-header-back`; `app-icon` draws a 20px block for the `app-icon` slot. */
122
- this.leading = 'none';
123
- /** The previous-page label drawn by `leading="back"`. */
124
- this.backLabel = 'Back';
120
+ /** Shows the back arrow before the page title; pressing it emits `nile-click` with `{ value: 'back' }`. Independent of the `app-icon` slot. */
121
+ this.headerBack = false;
122
+ /** Accessible name of the header back control. Never rendered as visible text. */
123
+ this.headerBackLabel = 'Back';
125
124
  /** Hides the built-in nav toggle. Mount `nile-app-shell-nav-toggle` yourself. */
126
125
  this.noNavToggle = false;
127
126
  /** Drops the Cmd/Ctrl+J and Escape panel shortcuts. */
@@ -165,6 +164,7 @@ let NileAppShell = class NileAppShell extends NileElement {
165
164
  this._hasTopBar = false;
166
165
  this._hasTopBarActions = false;
167
166
  this._hasTabs = false;
167
+ this._hasAppIcon = false;
168
168
  this._hasPanel = false;
169
169
  this._hasPanelFooter = false;
170
170
  /** True when a `nile-app-shell-panel` is slotted, owning the panel's own chrome so the shell renders a bare region. */
@@ -261,6 +261,7 @@ let NileAppShell = class NileAppShell extends NileElement {
261
261
  // Only with a title to sit under: see _hasTitleBlock.
262
262
  this.toggleAttribute('has-description', !!this.description && !!this.pageTitle);
263
263
  this.toggleAttribute('has-top-bar-actions', this._hasTopBarActions);
264
+ this.toggleAttribute('has-app-icon', this._hasAppIcon);
264
265
  this.toggleAttribute('has-ask', this.askVisible);
265
266
  this.toggleAttribute('has-tabs', this.tabsVisible);
266
267
  this.toggleAttribute('has-aside', this._hasAside);
@@ -288,18 +289,15 @@ let NileAppShell = class NileAppShell extends NileElement {
288
289
  else
289
290
  this.closePanel();
290
291
  }
291
- /** Emit `nile-header-back`, as the header's back control does; the page owns the history. */
292
+ /** Emit `nile-click` with `{ value: 'back' }`, as the header's back control does; the page owns the history. */
292
293
  goBackHeader() {
293
- this.emit('nile-header-back');
294
+ const detail = { value: 'back' };
295
+ this.emit('nile-click', detail);
294
296
  }
295
297
  /** Emit `nile-panel-back`, as the panel's back control does; the page owns the view stack. */
296
298
  goBackPanel() {
297
299
  this.emit('nile-panel-back');
298
300
  }
299
- /** @deprecated Use `goBackHeader()`; kept as an alias that emits `nile-header-back`. */
300
- goBackPage() {
301
- this.goBackHeader();
302
- }
303
301
  /** @deprecated Use `goBackPanel()`; kept as an alias that emits `nile-panel-back`. */
304
302
  goBack() {
305
303
  this.goBackPanel();
@@ -464,6 +462,9 @@ let NileAppShell = class NileAppShell extends NileElement {
464
462
  case 'tabs':
465
463
  this._hasTabs = filled;
466
464
  break;
465
+ case 'app-icon':
466
+ this._hasAppIcon = filled;
467
+ break;
467
468
  case 'aside':
468
469
  this._hasAside = filled;
469
470
  break;
@@ -510,80 +511,83 @@ let NileAppShell = class NileAppShell extends NileElement {
510
511
  </div>
511
512
  `;
512
513
  }
513
- /** Whether the header has a title block of its own to draw: only a title or a leading control mounts it. */
514
+ /** Whether the header has a title block of its own to draw: a title, the back arrow or a slotted app icon mounts it. */
514
515
  get _hasTitleBlock() {
515
- return !!this.pageTitle || this._hasLeading;
516
- }
517
- /** Whether `leading` names a control that renders; an empty or unknown value draws nothing, like `none`. */
518
- get _hasLeading() {
519
- return this.leading === 'back' || this.leading === 'app-icon';
516
+ return !!this.pageTitle || this.headerBack || this._hasAppIcon;
520
517
  }
521
518
  /** `headingLevel` as a safe `aria-level`: a whole number clamped to 1–6, and 1 for anything non-numeric. */
522
519
  get _headingLevel() {
523
520
  const level = Math.trunc(Number(this.headingLevel));
524
521
  return Number.isFinite(level) ? Math.min(6, Math.max(1, level)) : 1;
525
522
  }
526
- _renderLeading() {
527
- if (this.leading === 'app-icon') {
528
- return html `
529
- <span class="app-icon" part="app-icon">
530
- <slot name="app-icon"></slot>
531
- </span>
532
- `;
533
- }
534
- if (this.leading === 'back') {
535
- return html `
523
+ _renderBack() {
524
+ if (!this.headerBack)
525
+ return '';
526
+ return html `
527
+ <span class="back-line">
536
528
  <button
537
529
  class="back"
538
530
  part="back"
539
531
  type="button"
532
+ aria-label=${this.headerBackLabel}
533
+ title=${this.headerBackLabel}
540
534
  @click=${() => this.goBackHeader()}
541
535
  >
542
- ${renderGlyph('ng-chevron-left', 20, 'currentColor')}
543
- <span>${this.backLabel}</span>
536
+ ${renderGlyph('ng-arrow-narrow-left', 20, 'currentColor')}
544
537
  </button>
545
- ${this.pageTitle
546
- ? html `<span class="crumb-divider" aria-hidden="true">
547
- ${renderGlyph('ng-slash', 16, 'currentColor')}
548
- </span>`
549
- : ''}
550
- `;
551
- }
552
- return '';
538
+ </span>
539
+ `;
540
+ }
541
+ _renderAppIconSlot() {
542
+ return html `<slot
543
+ name="app-icon"
544
+ @slotchange=${(e) => this._onSlotChange('app-icon', e)}
545
+ ></slot>`;
546
+ }
547
+ /* The app-icon slot has to exist whenever the stack does not, or a slotted icon could never mount it: park it, hidden. */
548
+ _renderAppIconProbe() {
549
+ return html `<span class="app-icon-probe" hidden
550
+ >${this._renderAppIconSlot()}</span
551
+ >`;
553
552
  }
554
553
  _renderTitleBlock() {
555
554
  if (!this._hasTitleBlock)
556
- return '';
557
- /* Both leading modes render beside the title stack, never inside the title row, so the description stays under the page title in every leading mode. */
555
+ return this._renderAppIconProbe();
556
+ /* The stack is the title and/or the app icon; a back arrow on its own brings no empty stack. */
557
+ if (!this.pageTitle && !this._hasAppIcon) {
558
+ return html `
559
+ <div class="title-area" part="title-area">
560
+ ${this._renderBack()} ${this._renderAppIconProbe()}
561
+ </div>
562
+ `;
563
+ }
564
+ /* The back arrow sits beside the stack; the app icon starts the stack's first row, so the description lines up under the icon when there is one and under the title when not. */
558
565
  return html `
559
566
  <div class="title-area" part="title-area">
560
- ${this._hasLeading
561
- ? html `<span class="leading" part="leading"
562
- >${this._renderLeading()}</span
563
- >`
567
+ ${this._renderBack()}
568
+ <div class="title-stack">
569
+ <div class="title-row">
570
+ <span class="app-icon" part="app-icon"
571
+ >${this._renderAppIconSlot()}</span
572
+ >
573
+ ${this.pageTitle
574
+ ? html `<div
575
+ class="page-title"
576
+ part="page-title"
577
+ role="heading"
578
+ aria-level=${this._headingLevel}
579
+ >${this.pageTitle}</div>`
564
580
  : ''}
565
- ${this.pageTitle
566
- ? html `
567
- <div class="title-stack">
568
- <div class="title-row">
569
- <div
570
- class="page-title"
571
- part="page-title"
572
- role="heading"
573
- aria-level=${this._headingLevel}
574
- >${this.pageTitle}</div>
575
- ${this.badge
576
- ? html `<span class="badge" part="badge">${this.badge}</span>`
577
- : ''}
578
- </div>
579
- ${this.description
580
- ? html `<p class="description" part="description">
581
- ${this.description}
582
- </p>`
583
- : ''}
584
- </div>
585
- `
581
+ ${this.pageTitle && this.badge
582
+ ? html `<span class="badge" part="badge">${this.badge}</span>`
586
583
  : ''}
584
+ </div>
585
+ ${this.pageTitle && this.description
586
+ ? html `<p class="description" part="description">
587
+ ${this.description}
588
+ </p>`
589
+ : ''}
590
+ </div>
587
591
  </div>
588
592
  `;
589
593
  }
@@ -606,13 +610,16 @@ let NileAppShell = class NileAppShell extends NileElement {
606
610
  name="top-bar-actions"
607
611
  @slotchange=${(e) => this._onSlotChange('top-bar-actions', e)}
608
612
  ></slot>
613
+ ${this.askVisible && this._hasTopBarActions
614
+ ? html `<span class="rule ask-rule" part="ask-rule"></span>`
615
+ : ''}
609
616
  ${this.askVisible
610
617
  ? html `
611
618
  <nile-button
612
619
  class="ask"
613
620
  part="ask"
614
621
  exportparts="base: ask__base, label: ask__label"
615
- variant="primary"
622
+ variant="secondary"
616
623
  @click=${() => this.openPanel()}
617
624
  >
618
625
  <span slot="prefix" class="ask-mark">
@@ -774,11 +781,11 @@ __decorate([
774
781
  property({ type: String, attribute: true, reflect: true })
775
782
  ], NileAppShell.prototype, "badge", void 0);
776
783
  __decorate([
777
- property({ type: String, attribute: true, reflect: true })
778
- ], NileAppShell.prototype, "leading", void 0);
784
+ property({ type: Boolean, attribute: true, reflect: true })
785
+ ], NileAppShell.prototype, "headerBack", void 0);
779
786
  __decorate([
780
787
  property({ type: String, attribute: true, reflect: true })
781
- ], NileAppShell.prototype, "backLabel", void 0);
788
+ ], NileAppShell.prototype, "headerBackLabel", void 0);
782
789
  __decorate([
783
790
  property({ type: Boolean, reflect: true, attribute: 'no-nav-toggle' })
784
791
  ], NileAppShell.prototype, "noNavToggle", void 0);
@@ -854,6 +861,9 @@ __decorate([
854
861
  __decorate([
855
862
  state()
856
863
  ], NileAppShell.prototype, "_hasTabs", void 0);
864
+ __decorate([
865
+ state()
866
+ ], NileAppShell.prototype, "_hasAppIcon", void 0);
857
867
  __decorate([
858
868
  state()
859
869
  ], NileAppShell.prototype, "_hasPanel", void 0);