@nexterajs/ui 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +279 -34
  2. package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
  3. package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
  4. package/fesm2022/nexterajs-ui-core.mjs +835 -11
  5. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  6. package/fesm2022/nexterajs-ui-display.mjs +1142 -0
  7. package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +621 -69
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  10. package/fesm2022/nexterajs-ui-file-uploader.mjs +576 -11
  11. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  12. package/fesm2022/nexterajs-ui-forms.mjs +2702 -452
  13. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  14. package/fesm2022/nexterajs-ui-grid.mjs +2350 -336
  15. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  16. package/fesm2022/nexterajs-ui-intl.mjs +117 -15
  17. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  18. package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
  19. package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-notify.mjs +353 -0
  21. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -0
  22. package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
  23. package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-pivot.mjs +191 -136
  25. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  26. package/fesm2022/nexterajs-ui-shell.mjs +542 -0
  27. package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui-styling.mjs +568 -3
  29. package/fesm2022/nexterajs-ui-styling.mjs.map +1 -1
  30. package/fesm2022/nexterajs-ui-tree-view.mjs +150 -18
  31. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  32. package/fesm2022/nexterajs-ui-validation.mjs +283 -97
  33. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  34. package/fesm2022/nexterajs-ui.mjs +6 -0
  35. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  36. package/package.json +37 -2
  37. package/styles/_dropdown.scss +150 -1
  38. package/styles/_editor.scss +75 -21
  39. package/styles/_icons.scss +92 -0
  40. package/styles/_mixins.scss +104 -1
  41. package/styles/_scrollbar.scss +134 -0
  42. package/styles/_status.scss +21 -0
  43. package/styles/_toast.scss +243 -0
  44. package/styles/_tokens.scss +467 -2
  45. package/styles/_widget.scss +14 -3
  46. package/styles/index.scss +10 -4
  47. package/types/nexterajs-ui-charts.d.ts +446 -0
  48. package/types/nexterajs-ui-core.d.ts +515 -30
  49. package/types/nexterajs-ui-display.d.ts +720 -0
  50. package/types/nexterajs-ui-dropdowns.d.ts +318 -57
  51. package/types/nexterajs-ui-file-uploader.d.ts +240 -8
  52. package/types/nexterajs-ui-forms.d.ts +772 -43
  53. package/types/nexterajs-ui-grid.d.ts +878 -135
  54. package/types/nexterajs-ui-intl.d.ts +39 -4
  55. package/types/nexterajs-ui-navigation.d.ts +531 -0
  56. package/types/nexterajs-ui-notify.d.ts +149 -0
  57. package/types/nexterajs-ui-overlay.d.ts +703 -0
  58. package/types/nexterajs-ui-pivot.d.ts +91 -70
  59. package/types/nexterajs-ui-shell.d.ts +294 -0
  60. package/types/nexterajs-ui-styling.d.ts +163 -3
  61. package/types/nexterajs-ui-tree-view.d.ts +56 -4
  62. package/types/nexterajs-ui-validation.d.ts +110 -22
  63. package/types/nexterajs-ui.d.ts +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexterajs-ui-shell.mjs","sources":["../../../projects/nextera-ui/shell/src/lib/nxe-shell.types.ts","../../../projects/nextera-ui/shell/src/lib/sidenav/nxe-sidenav.component.ts","../../../projects/nextera-ui/shell/src/lib/sidenav/nxe-sidenav.component.html","../../../projects/nextera-ui/shell/src/lib/shell/nxe-shell.component.ts","../../../projects/nextera-ui/shell/src/lib/shell/nxe-shell.component.html","../../../projects/nextera-ui/shell/src/lib/topbar/nxe-topbar.component.ts","../../../projects/nextera-ui/shell/src/lib/topbar/nxe-topbar.component.html","../../../projects/nextera-ui/shell/src/public-api.ts","../../../projects/nextera-ui/shell/src/nexterajs-ui-shell.ts"],"sourcesContent":["import { Directive, InjectionToken, Signal } from '@angular/core';\nimport type { Params } from '@angular/router';\nimport type { NxeStatusFamily } from '@nexterajs/ui/display';\n\n/**\n * One entry of the side navigation.\n *\n * - A **link** has `route` (router) or `href` (plain anchor).\n * - A **parent** has `children`: it is a disclosure button, not a link. Its children appear under it\n * when it is open, and it opens by itself when one of them is the current page.\n * - A **group** has `heading: true` and `children`: a non-interactive heading, with its items in a\n * labelled list under it. Groups sit at the top level; items inside them nest as deep as needed.\n * - An entry with none of those is a plain button; `itemClick` reports it.\n */\nexport interface NxeNavItem {\n /** Unique within the tree. Keys the open state and the DOM ids. */\n readonly id: string;\n /** What the entry says. Translate it. */\n readonly label: string;\n /**\n * The icon, named for `<i class=\"nxe-icon nxe-icon-NAME\">`, or, when the app supplies an\n * `ng-template[nxeSidenavIcon]`, any key that template maps to an icon. An entry without one\n * shows the first letter of its label so a collapsed rail is still usable.\n */\n readonly icon?: string;\n /** Router link: a URL (`'/buyer/inbox'`) or commands (`['/buyer/price-lists', id]`). */\n readonly route?: string | unknown[];\n /** Query parameters for `route`. When set they take part in the active match. */\n readonly queryParams?: Params;\n /** A plain `href`, for a link that leaves the app. Never shown as the current page. */\n readonly href?: string;\n /** A count, or a signal of one (read in the template, so it updates without a new tree). */\n readonly badge?: number | Signal<number | null | undefined>;\n /** Colour of the badge; `danger` by default. */\n readonly badgeFamily?: NxeStatusFamily;\n /** Spoken name of the badge (\"5 items need action\"); defaults to the number. */\n readonly badgeLabel?: string;\n /** Children of a parent entry, or the items of a group. */\n readonly children?: readonly NxeNavItem[];\n /** Make this a group heading; its `children` are the group's items. */\n readonly heading?: boolean;\n /** Not interactive, not focusable, announced as disabled. */\n readonly disabled?: boolean;\n /**\n * Match the URL exactly. Without it an entry is the current page for its URL and everything\n * below it (`/buyer/purchase-orders` for `/buyer/purchase-orders/42`). Give the home entry\n * (`/buyer`) `exact: true`, or it is current everywhere.\n */\n readonly exact?: boolean;\n}\n\n/** `docked`: beside the content, expanded or a rail. `drawer`: off-canvas, over the content. */\nexport type NxeShellMode = 'docked' | 'drawer';\n\n/**\n * What `nxe-topbar` and `nxe-sidenav` need from the `nxe-shell` around them, through\n * {@link NXE_SHELL}. Both also work without a shell; they then do not toggle anything.\n */\nexport interface NxeShellState {\n readonly mode: Signal<NxeShellMode>;\n /** The sidenav is a narrow icon rail (docked and collapsed). */\n readonly rail: Signal<boolean>;\n /** Docked: the user's collapsed choice. */\n readonly collapsed: Signal<boolean>;\n /** The drawer is on screen (drawer mode and open). */\n readonly drawerShown: Signal<boolean>;\n /** DOM id of the projected `nxe-sidenav`, for `aria-controls`. */\n readonly sidenavId: Signal<string | null>;\n setCollapsed(collapsed: boolean): void;\n /** Hamburger: open or close the drawer, or collapse or expand the dock. */\n toggleNavigation(): void;\n closeDrawer(): void;\n}\n\n/** Provided by `nxe-shell` to the topbar and sidenav projected into it. */\nexport const NXE_SHELL = new InjectionToken<NxeShellState>('NXE_SHELL');\n\n/**\n * `<ng-template nxeSidenavIcon let-item>` inside `nxe-sidenav` draws the icon of every entry that\n * has an `icon`, given the entry. Use it to map `icon` keys to your own SVGs:\n *\n * ```html\n * <nxe-sidenav [items]=\"items\">\n * <ng-template nxeSidenavIcon let-item>\n * <svg viewBox=\"0 0 24 24\"><path [attr.d]=\"paths[item.icon]\" /></svg>\n * </ng-template>\n * </nxe-sidenav>\n * ```\n */\n@Directive({ selector: 'ng-template[nxeSidenavIcon]' })\nexport class NxeSidenavIconDirective {}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n output,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, PRIMARY_OUTLET, Router, RouterLink, UrlTree } from '@angular/router';\nimport { NxeMessageKey, NxeMessageService } from '@nexterajs/ui/core';\nimport { NxeBadgeAnchorDirective, NxeBadgeComponent } from '@nexterajs/ui/display';\nimport { NxeButtonComponent } from '@nexterajs/ui/forms';\nimport { filter, map } from 'rxjs';\nimport { NXE_SHELL, NxeNavItem, NxeSidenavIconDirective } from '../nxe-shell.types';\n\n/** An item with the place it holds in the tree. */\ninterface NavNode {\n readonly item: NxeNavItem;\n /** Nearest ancestor that is an item (a group heading is not one); null at the top. */\n readonly parentId: string | null;\n /** What the router would match for this entry; null for a parent, group or plain button. */\n readonly tree: UrlTree | null;\n}\n\nlet nextSidenavId = 0;\n\n/**\n * `nxe-sidenav` is the application's primary navigation, drawn from a tree of {@link NxeNavItem}.\n *\n * ```html\n * <nxe-sidenav [items]=\"items\" (itemClick)=\"track($event)\">\n * <img nxeSidenavHeader src=\"logo.svg\" alt=\"Nextera\" />\n * </nxe-sidenav>\n * ```\n *\n * **Structure and ARIA.** A `<nav>` landmark holding nested lists, in the pattern the ARIA Authoring\n * Practices call a *disclosure navigation menu*: a link is `<a aria-current=\"page\">` when it is the\n * current page; a parent is a `<button aria-expanded aria-controls>` that shows or hides the list\n * under it; a group heading labels its list (`aria-labelledby`). It is deliberately not\n * `role=\"tree\"`: a tree makes one node focusable and needs the full tree keyboard contract, where\n * every link here is an ordinary tab stop and the arrow keys are a shortcut on top of Tab.\n *\n * **Keyboard.** Tab and Shift+Tab visit every link and parent. On a link or parent, Arrow Down/Up\n * move to the next/previous visible entry, Home/End to the first/last. Arrow Right opens a closed\n * parent, or moves into an open one's first child; Arrow Left closes an open parent, or moves from\n * a child to its parent (Right and Left swap in a right-to-left document). Enter and Space activate.\n *\n * **Current page.** From the router: an entry is current when its URL matches (a prefix, or the\n * whole URL with `exact`), and when several do, the most specific one alone is `aria-current`\n * (`/payments/aging` over `/payments`). The parents of the current page open themselves on\n * navigation; what the user opened or closed by hand holds until the next navigation into it.\n *\n * **Collapsed rail.** With the sidenav collapsed (through `nxe-shell` or the `collapsed` model) only\n * the icons show, each with its label as a native `title` and as visually-hidden text, and a badge\n * pins to the icon. There is no flyout for children (that waits for the menu): activating a parent\n * in the rail expands the rail with that parent open.\n *\n * Inside an `nxe-shell` the shell owns the collapsed state and the off-canvas drawer; on its own the\n * sidenav is a plain docked column.\n */\n@Component({\n selector: 'nxe-sidenav',\n imports: [NgTemplateOutlet, RouterLink, NxeBadgeComponent, NxeBadgeAnchorDirective, NxeButtonComponent],\n templateUrl: './nxe-sidenav.component.html',\n styleUrl: './nxe-sidenav.component.scss',\n host: {\n class: 'nxe-sidenav',\n '[id]': 'id',\n '[class.nxe-sidenav-rail]': 'rail()',\n '[class.nxe-sidenav-drawer]': 'drawer()',\n '[class.nxe-sidenav-open]': 'drawerOpen()',\n '[attr.inert]': \"drawer() && !drawerOpen() ? '' : null\",\n '[attr.role]': \"drawerOpen() ? 'dialog' : null\",\n '[attr.aria-modal]': \"drawerOpen() ? 'true' : null\",\n '[attr.aria-label]': 'drawerOpen() ? navLabel() : null',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeSidenavComponent {\n private readonly router = inject(Router);\n private readonly messages = inject(NxeMessageService);\n private readonly shell = inject(NXE_SHELL, { optional: true });\n /** The sidenav's own element; `nxe-shell` traps focus in it while the drawer is open. */\n readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly navElement = viewChild.required<ElementRef<HTMLElement>>('nav');\n\n /** DOM id, which the topbar's toggle button names in `aria-controls`. */\n readonly id = `nxe-sidenav-${nextSidenavId++}`;\n\n /** The navigation tree. */\n readonly items = input<readonly NxeNavItem[]>([]);\n /** Accessible name of the `<nav>` landmark; \"Main navigation\" in the active language by default. */\n readonly label = input<string>('');\n /**\n * Collapsed to the icon rail. Inside an `nxe-shell` the shell's `collapsed` wins and this is\n * left alone; the sidenav writes the user's choice through the shell instead.\n */\n readonly collapsed = model(false);\n /** Show the collapse/expand button at the foot of a docked sidenav. Default true. */\n readonly collapsible = input(true, { transform: booleanAttribute });\n /** An entry was activated: a link followed, a plain button pressed. Parents do not emit. */\n readonly itemClick = output<NxeNavItem>();\n\n /** Draws the icon of every entry that has an `icon`. */\n protected readonly iconTemplate = contentChild(NxeSidenavIconDirective, { read: TemplateRef });\n\n protected readonly navLabel = computed(() => this.label() || this.messages.t('shell.mainNavigation'));\n\n protected readonly rail = computed(() => (this.shell ? this.shell.rail() : this.collapsed()));\n protected readonly drawer = computed(() => !!this.shell && this.shell.mode() === 'drawer');\n protected readonly drawerOpen = computed(() => !!this.shell && this.shell.drawerShown());\n\n /** Every entry by id, with its place in the tree and the URL it points at. */\n private readonly nodes = computed(() => {\n const nodes = new Map<string, NavNode>();\n const walk = (items: readonly NxeNavItem[], parentId: string | null) => {\n for (const item of items) {\n const heading = !!item.heading;\n nodes.set(item.id, {\n item,\n parentId,\n tree: !heading && !item.disabled && !item.children?.length ? this.treeOf(item) : null,\n });\n walk(item.children ?? [], heading ? parentId : item.id);\n }\n };\n walk(this.items(), null);\n return nodes;\n });\n\n /** The router's URL, re-read at every navigation so what is current is a signal. */\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((event) => event instanceof NavigationEnd),\n map(() => this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n /** Id of the one entry that is the current page. */\n private readonly currentId = computed<string | null>(() => {\n this.url();\n let best: string | null = null;\n let bestScore = -1;\n for (const [id, node] of this.nodes()) {\n if (!node.tree) {\n continue;\n }\n const exact = !!node.item.exact;\n const active = this.router.isActive(node.tree, {\n paths: exact ? 'exact' : 'subset',\n queryParams: exact ? 'exact' : node.item.queryParams ? 'subset' : 'ignored',\n fragment: 'ignored',\n matrixParams: 'ignored',\n });\n if (!active) {\n continue;\n }\n const score =\n (node.tree.root.children[PRIMARY_OUTLET]?.segments.length ?? 0) * 100 +\n Object.keys(node.item.queryParams ?? {}).length;\n if (score > bestScore) {\n best = id;\n bestScore = score;\n }\n }\n return best;\n });\n\n /** Ids of the parents above the current page. They open by themselves. */\n private readonly currentAncestors = computed(\n () => {\n const ancestors = new Set<string>();\n const nodes = this.nodes();\n const current = this.currentId();\n let id = current ? (nodes.get(current)?.parentId ?? null) : null;\n while (id) {\n ancestors.add(id);\n id = nodes.get(id)?.parentId ?? null;\n }\n return ancestors as ReadonlySet<string>;\n },\n { equal: (a, b) => a.size === b.size && [...a].every((id) => b.has(id)) },\n );\n\n /**\n * What the user opened or closed by hand. Navigating to a new page forgets the choices about\n * its ancestors, so they open for it, and keeps the rest.\n */\n private readonly manual = linkedSignal<\n { url: string; ancestors: ReadonlySet<string> },\n ReadonlyMap<string, boolean>\n >({\n source: () => ({ url: this.url(), ancestors: this.currentAncestors() }),\n computation: ({ ancestors }, previous) => {\n const next = new Map(previous?.value);\n ancestors.forEach((id) => next.delete(id));\n return next;\n },\n });\n\n protected t(key: NxeMessageKey): string {\n return this.messages.t(key);\n }\n\n protected isCurrent(id: string): boolean {\n return this.currentId() === id;\n }\n\n /** The current page is somewhere under this parent. */\n protected holdsCurrent(id: string): boolean {\n return this.currentAncestors().has(id);\n }\n\n protected isOpen(id: string): boolean {\n return this.manual().get(id) ?? this.currentAncestors().has(id);\n }\n\n protected hasChildren(item: NxeNavItem): boolean {\n return !item.heading && !!item.children?.length;\n }\n\n protected badgeValue(item: NxeNavItem): number | null | undefined {\n const badge = item.badge;\n return typeof badge === 'function' ? badge() : badge;\n }\n\n protected badgeName(item: NxeNavItem): string {\n const value = this.badgeValue(item);\n return item.badgeLabel && value ? `${value} ${item.badgeLabel}` : '';\n }\n\n protected initial(item: NxeNavItem): string {\n return item.label.trim().charAt(0).toUpperCase();\n }\n\n /** Toggle a parent; in the rail, expand the rail with the parent open instead. */\n protected onParent(item: NxeNavItem): void {\n if (this.rail()) {\n this.setCollapsed(false);\n this.setOpen(item.id, true);\n } else {\n this.setOpen(item.id, !this.isOpen(item.id));\n }\n }\n\n protected onActivate(item: NxeNavItem): void {\n this.itemClick.emit(item);\n }\n\n protected toggleCollapsed(): void {\n this.setCollapsed(!this.rail());\n }\n\n protected closeDrawer(): void {\n this.shell?.closeDrawer();\n }\n\n protected onKeydown(event: KeyboardEvent, item: NxeNavItem): void {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n const current = event.currentTarget as HTMLElement;\n const links = this.focusables();\n const at = links.indexOf(current);\n const rtl = getComputedStyle(current).direction === 'rtl';\n const key =\n event.key === 'ArrowRight' ? (rtl ? 'ArrowLeft' : 'ArrowRight') : event.key === 'ArrowLeft' ? (rtl ? 'ArrowRight' : 'ArrowLeft') : event.key;\n const parent = this.hasChildren(item) && !this.rail();\n\n let target: HTMLElement | undefined;\n switch (key) {\n case 'ArrowDown':\n target = links[at + 1];\n break;\n case 'ArrowUp':\n target = links[at - 1];\n break;\n case 'Home':\n target = links[0];\n break;\n case 'End':\n target = links[links.length - 1];\n break;\n case 'ArrowRight':\n if (!parent) {\n return;\n }\n if (!this.isOpen(item.id)) {\n this.setOpen(item.id, true);\n } else {\n target = links[at + 1];\n }\n break;\n case 'ArrowLeft': {\n if (parent && this.isOpen(item.id)) {\n this.setOpen(item.id, false);\n break;\n }\n const parentId = this.nodes().get(item.id)?.parentId;\n target = parentId ? links.find((link) => link.dataset['nxeNav'] === parentId) : undefined;\n if (!target) {\n return;\n }\n break;\n }\n default:\n return;\n }\n event.preventDefault();\n target?.focus();\n }\n\n /** Links and parent buttons in document order; the ones inside a closed parent are not rendered. */\n private focusables(): HTMLElement[] {\n return Array.from(this.navElement().nativeElement.querySelectorAll<HTMLElement>('a.nxe-nav-link, button.nxe-nav-link'));\n }\n\n private setOpen(id: string, open: boolean): void {\n this.manual.update((current) => new Map(current).set(id, open));\n }\n\n private setCollapsed(collapsed: boolean): void {\n if (this.shell) {\n this.shell.setCollapsed(collapsed);\n } else {\n this.collapsed.set(collapsed);\n }\n }\n\n private treeOf(item: NxeNavItem): UrlTree | null {\n if (item.route === undefined) {\n return null;\n }\n if (typeof item.route === 'string') {\n const tree = this.router.parseUrl(item.route);\n tree.queryParams = { ...tree.queryParams, ...item.queryParams };\n return tree;\n }\n return this.router.createUrlTree(item.route, { queryParams: item.queryParams });\n }\n}\n","<div class=\"nxe-sidenav-header\">\n <ng-content select=\"[nxeSidenavHeader]\" />\n @if (drawer()) {\n <nxe-button class=\"nxe-sidenav-close\" stylingMode=\"text\" size=\"sm\" [attr.aria-label]=\"t('shell.closeNavigation')\" (onClick)=\"closeDrawer()\">\n <svg nxeButtonIcon viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3.7 2.3 8 6.6l4.3-4.3 1.4 1.4L9.4 8l4.3 4.3-1.4 1.4L8 9.4l-4.3 4.3-1.4-1.4L6.6 8 2.3 3.7z\" />\n </svg>\n </nxe-button>\n }\n</div>\n\n<nav #nav class=\"nxe-sidenav-nav\" [attr.aria-label]=\"navLabel()\">\n <ul class=\"nxe-nav-list nxe-nav-root\">\n @for (item of items(); track item.id) {\n <ng-container *ngTemplateOutlet=\"node; context: { $implicit: item, depth: 0 }\" />\n }\n </ul>\n</nav>\n\n<div class=\"nxe-sidenav-footer\">\n <ng-content select=\"[nxeSidenavFooter]\" />\n @if (!drawer() && collapsible()) {\n <nxe-button\n class=\"nxe-sidenav-collapse\"\n stylingMode=\"text\"\n size=\"sm\"\n [attr.aria-label]=\"rail() ? t('shell.expandSidebar') : t('shell.collapseSidebar')\"\n [attr.title]=\"rail() ? t('shell.expandSidebar') : t('shell.collapseSidebar')\"\n (onClick)=\"toggleCollapsed()\">\n <svg nxeButtonIcon class=\"nxe-sidenav-collapse-icon\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M9.7 3.3 5 8l4.7 4.7 1.1-1.1L7.2 8l3.6-3.6zM3 3h1.5v10H3z\" />\n </svg>\n </nxe-button>\n }\n</div>\n\n<!-- One entry's icon, label and badge; shared by every kind of entry. -->\n<ng-template #body let-item>\n <span class=\"nxe-nav-lead\" nxeBadgeAnchor>\n <span class=\"nxe-nav-icon\" aria-hidden=\"true\">\n @if (item.icon && iconTemplate(); as icon) {\n <ng-container *ngTemplateOutlet=\"icon; context: { $implicit: item }\" />\n } @else if (item.icon) {\n <i class=\"nxe-icon nxe-icon-{{ item.icon }}\"></i>\n } @else {\n <span class=\"nxe-nav-glyph\">{{ initial(item) }}</span>\n }\n </span>\n @if (rail()) {\n <nxe-badge overlay [value]=\"badgeValue(item)\" [family]=\"item.badgeFamily ?? 'danger'\" [label]=\"badgeName(item)\" />\n }\n </span>\n <span class=\"nxe-nav-label\">{{ item.label }}</span>\n @if (!rail()) {\n <nxe-badge class=\"nxe-nav-badge\" [value]=\"badgeValue(item)\" [family]=\"item.badgeFamily ?? 'danger'\" [label]=\"badgeName(item)\" />\n }\n</ng-template>\n\n<ng-template #node let-item let-depth=\"depth\">\n @if (item.heading) {\n <li class=\"nxe-nav-group\">\n <div class=\"nxe-nav-heading\" [id]=\"id + '-' + item.id\" [class.nxe-nav-heading-rail]=\"rail()\">{{ item.label }}</div>\n <ul class=\"nxe-nav-list\" [attr.aria-labelledby]=\"id + '-' + item.id\">\n @for (child of item.children; track child.id) {\n <ng-container *ngTemplateOutlet=\"node; context: { $implicit: child, depth: depth }\" />\n }\n </ul>\n </li>\n } @else {\n <li\n class=\"nxe-nav-item\"\n [class.nxe-nav-current]=\"isCurrent(item.id)\"\n [class.nxe-nav-holds-current]=\"holdsCurrent(item.id)\"\n [style.--nxe-nav-depth]=\"depth\">\n @if (item.disabled) {\n <span class=\"nxe-nav-link nxe-nav-link-disabled\" aria-disabled=\"true\" [attr.title]=\"rail() ? item.label : null\">\n <ng-container *ngTemplateOutlet=\"body; context: { $implicit: item }\" />\n </span>\n } @else if (hasChildren(item)) {\n <button\n type=\"button\"\n class=\"nxe-nav-link nxe-nav-parent\"\n [attr.data-nxe-nav]=\"item.id\"\n [attr.aria-expanded]=\"!rail() && isOpen(item.id)\"\n [attr.aria-controls]=\"!rail() && isOpen(item.id) ? id + '-' + item.id + '-list' : null\"\n [attr.title]=\"rail() ? item.label : null\"\n (click)=\"onParent(item)\"\n (keydown)=\"onKeydown($event, item)\">\n <ng-container *ngTemplateOutlet=\"body; context: { $implicit: item }\" />\n @if (!rail()) {\n <svg class=\"nxe-nav-chevron\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"m4.2 5.8 3.8 3.8 3.8-3.8 1 1L8 11.6 3.2 6.8z\" />\n </svg>\n }\n </button>\n @if (!rail() && isOpen(item.id)) {\n <ul class=\"nxe-nav-list nxe-nav-sub\" [id]=\"id + '-' + item.id + '-list'\">\n @for (child of item.children; track child.id) {\n <ng-container *ngTemplateOutlet=\"node; context: { $implicit: child, depth: depth + 1 }\" />\n }\n </ul>\n }\n } @else if (item.route !== undefined) {\n <a\n class=\"nxe-nav-link\"\n [attr.data-nxe-nav]=\"item.id\"\n [routerLink]=\"item.route\"\n [queryParams]=\"item.queryParams\"\n [attr.aria-current]=\"isCurrent(item.id) ? 'page' : null\"\n [attr.title]=\"rail() ? item.label : null\"\n (click)=\"onActivate(item)\"\n (keydown)=\"onKeydown($event, item)\">\n <ng-container *ngTemplateOutlet=\"body; context: { $implicit: item }\" />\n </a>\n } @else if (item.href !== undefined) {\n <a\n class=\"nxe-nav-link\"\n [attr.data-nxe-nav]=\"item.id\"\n [attr.href]=\"item.href\"\n [attr.title]=\"rail() ? item.label : null\"\n (click)=\"onActivate(item)\"\n (keydown)=\"onKeydown($event, item)\">\n <ng-container *ngTemplateOutlet=\"body; context: { $implicit: item }\" />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"nxe-nav-link\"\n [attr.data-nxe-nav]=\"item.id\"\n [attr.title]=\"rail() ? item.label : null\"\n (click)=\"onActivate(item)\"\n (keydown)=\"onKeydown($event, item)\">\n <ng-container *ngTemplateOutlet=\"body; context: { $implicit: item }\" />\n </button>\n }\n </li>\n }\n</ng-template>\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n Injector,\n input,\n model,\n numberAttribute,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { NxeMessageService } from '@nexterajs/ui/core';\nimport { filter } from 'rxjs';\nimport { NxeSidenavComponent } from '../sidenav/nxe-sidenav.component';\nimport { NXE_SHELL, NxeShellMode, NxeShellState } from '../nxe-shell.types';\n\nlet nextShellId = 0;\n\n/**\n * `nxe-shell` is the page frame of an application: an optional banner, the topbar, the sidenav and\n * the main content.\n *\n * ```html\n * <nxe-shell [(collapsed)]=\"collapsed\">\n * <sb-impersonation-banner nxeShellBanner />\n * <nxe-topbar>...</nxe-topbar>\n * <nxe-sidenav [items]=\"items\" />\n * <router-outlet />\n * </nxe-shell>\n * ```\n *\n * **Slots.** `[nxeShellBanner]` (full width above the topbar, for a banner that must stay on screen),\n * an `nxe-topbar`, an `nxe-sidenav`, and everything else, which goes in the `<main>` landmark. A\n * \"Skip to content\" link, the first tab stop, jumps to that `<main>`.\n *\n * **Responsive.** The shell measures its own width. At or above `breakpoint` (960px by default, the\n * design system's `md`) the sidenav is docked beside the content, expanded or, when `collapsed`, an\n * icon rail. Below it the sidenav is an off-canvas drawer over the content with a scrim: the\n * topbar's toggle button opens it, focus is trapped inside while it is open, Esc and a click on the\n * scrim close it, a navigation closes it, and focus returns to the control that opened it.\n * Widening the shell past the breakpoint closes the drawer.\n *\n * The shell is as tall as `--nxe-shell-height` (default `100dvh`): give it the height of the space\n * it fills, and the content scrolls inside `<main>`.\n */\n@Component({\n selector: 'nxe-shell',\n templateUrl: './nxe-shell.component.html',\n styleUrl: './nxe-shell.component.scss',\n providers: [{ provide: NXE_SHELL, useExisting: forwardRef(() => NxeShellComponent) }],\n host: {\n class: 'nxe-shell',\n '[class.nxe-shell-docked]': \"mode() === 'docked'\",\n '[class.nxe-shell-drawer]': \"mode() === 'drawer'\",\n '[class.nxe-shell-rail]': 'rail()',\n '[class.nxe-shell-drawer-open]': 'drawerShown()',\n '(keydown.escape)': 'onEscape($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeShellComponent implements NxeShellState {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly messages = inject(NxeMessageService);\n private readonly router = inject(Router);\n private readonly injector = inject(Injector);\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n\n /** Docked sidenav shows only icons. Two-way: `[(collapsed)]`. */\n readonly collapsed = model(false);\n /** The off-canvas drawer is open (only meaningful below the breakpoint). Two-way: `[(drawerOpen)]`. */\n readonly drawerOpen = model(false);\n /** Shell width, in CSS px, from which the sidenav is docked rather than a drawer. */\n readonly breakpoint = input(960, { transform: (v: unknown) => numberAttribute(v, 960) });\n\n /** Skip-link target id; unique per shell. */\n protected readonly mainId = `nxe-shell-main-${nextShellId++}`;\n\n private readonly sidenav = contentChild(NxeSidenavComponent);\n\n /** Own width, kept by a ResizeObserver; the window's until the first measurement. */\n private readonly width = signal(typeof window === 'undefined' ? Number.POSITIVE_INFINITY : window.innerWidth);\n\n readonly mode = computed<NxeShellMode>(() => (this.width() >= this.breakpoint() ? 'docked' : 'drawer'));\n readonly rail = computed(() => this.mode() === 'docked' && this.collapsed());\n readonly drawerShown = computed(() => this.mode() === 'drawer' && this.drawerOpen());\n readonly sidenavId = computed(() => this.sidenav()?.id ?? null);\n\n private trap: FocusTrap | null = null;\n private returnFocusTo: HTMLElement | null = null;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n const observer = new ResizeObserver(([entry]) => this.width.set(entry.contentRect.width));\n observer.observe(this.host);\n destroyRef.onDestroy(() => observer.disconnect());\n });\n\n // Widening the shell past the breakpoint is the end of the drawer; do not reopen on narrowing.\n toObservable(this.mode)\n .pipe(takeUntilDestroyed())\n .subscribe((mode) => {\n if (mode === 'docked') {\n this.drawerOpen.set(false);\n }\n });\n\n // Going to another page closes the drawer.\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(),\n )\n .subscribe(() => this.drawerOpen.set(false));\n\n // The trap and the focus return follow the drawer however it was opened or closed.\n toObservable(this.drawerShown)\n .pipe(takeUntilDestroyed())\n .subscribe((shown) => (shown ? this.onDrawerShown() : this.onDrawerHidden()));\n\n destroyRef.onDestroy(() => this.trap?.destroy());\n }\n\n setCollapsed(collapsed: boolean): void {\n this.collapsed.set(collapsed);\n }\n\n /** The hamburger: the drawer below the breakpoint, the dock's collapsed state above it. */\n toggleNavigation(): void {\n if (this.mode() === 'drawer') {\n if (!this.drawerOpen()) {\n this.returnFocusTo = document.activeElement as HTMLElement | null;\n }\n this.drawerOpen.update((open) => !open);\n } else {\n this.collapsed.update((collapsed) => !collapsed);\n }\n }\n\n closeDrawer(): void {\n this.drawerOpen.set(false);\n }\n\n protected t(key: 'shell.skipToContent'): string {\n return this.messages.t(key);\n }\n\n protected skipToContent(event: Event): void {\n event.preventDefault();\n const main = this.host.querySelector<HTMLElement>(`#${this.mainId}`);\n main?.focus();\n main?.scrollIntoView?.({ block: 'start' });\n }\n\n protected onEscape(event: Event): void {\n if (this.drawerShown() && !event.defaultPrevented) {\n event.preventDefault();\n this.closeDrawer();\n }\n }\n\n private onDrawerShown(): void {\n this.returnFocusTo ??= document.activeElement as HTMLElement | null;\n const element = this.sidenav()?.element;\n if (!element) {\n return;\n }\n this.trap?.destroy();\n this.trap = this.focusTrapFactory.create(element);\n // The drawer is still `inert` until this change detection ends; focus after the render.\n afterNextRender(\n () => {\n const current = element.querySelector<HTMLElement>('[aria-current=\"page\"]');\n if (current) {\n current.focus();\n } else {\n this.trap?.focusInitialElement();\n }\n },\n { injector: this.injector },\n );\n }\n\n private onDrawerHidden(): void {\n this.trap?.destroy();\n this.trap = null;\n const target = this.returnFocusTo;\n this.returnFocusTo = null;\n if (target?.isConnected) {\n target.focus();\n }\n }\n}\n","<a class=\"nxe-shell-skip\" [attr.href]=\"'#' + mainId\" (click)=\"skipToContent($event)\">{{ t('shell.skipToContent') }}</a>\n<div class=\"nxe-shell-banner\"><ng-content select=\"[nxeShellBanner]\" /></div>\n<div class=\"nxe-shell-topbar\"><ng-content select=\"nxe-topbar\" /></div>\n<div class=\"nxe-shell-body\">\n <ng-content select=\"nxe-sidenav\" />\n <main class=\"nxe-shell-main\" [id]=\"mainId\" tabindex=\"-1\"><ng-content /></main>\n @if (drawerShown()) {\n <div class=\"nxe-shell-scrim\" aria-hidden=\"true\" (click)=\"closeDrawer()\"></div>\n }\n</div>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, output, ViewEncapsulation } from '@angular/core';\nimport { NxeMessageService } from '@nexterajs/ui/core';\nimport { NxeButtonComponent } from '@nexterajs/ui/forms';\nimport { NXE_SHELL } from '../nxe-shell.types';\n\n/**\n * `nxe-topbar` is the bar across the top of an `nxe-shell`: a start, a centre and an end slot.\n *\n * ```html\n * <nxe-topbar>\n * <img nxeTopbarStart src=\"logo.svg\" alt=\"Nextera\" />\n * <sb-search nxeTopbarCenter />\n * <ng-container nxeTopbarEnd>\n * <sb-company-switcher />\n * <sb-notifications />\n * </ng-container>\n * </nxe-topbar>\n * ```\n *\n * The start slot is preceded by a hamburger button: an icon-only `nxe-button` named \"Toggle\n * navigation\" with `aria-controls` the sidenav and `aria-expanded` the sidenav's state. Inside an\n * `nxe-shell` it opens and closes the drawer below the breakpoint and collapses and expands the dock\n * above it. `menuToggle` also fires, so a topbar used without a shell can drive its own sidenav.\n * `[nxeTopbarEnd]` elements sit at the inline end of the bar, where a company switcher, language\n * toggle, notification bell and user menu go.\n */\n@Component({\n selector: 'nxe-topbar',\n imports: [NxeButtonComponent],\n templateUrl: './nxe-topbar.component.html',\n styleUrl: './nxe-topbar.component.scss',\n host: { class: 'nxe-topbar' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeTopbarComponent {\n private readonly messages = inject(NxeMessageService);\n private readonly shell = inject(NXE_SHELL, { optional: true });\n\n /** Show the hamburger button. Default true. */\n readonly menuButton = input(true, { transform: booleanAttribute });\n /** The hamburger was pressed. */\n readonly menuToggle = output<void>();\n\n protected readonly label = computed(() => this.messages.t('shell.toggleNavigation'));\n protected readonly controls = computed(() => this.shell?.sidenavId() ?? null);\n /** Drawer: open. Dock: not collapsed. Without a shell the button says nothing about it. */\n protected readonly expanded = computed(() => {\n if (!this.shell) {\n return null;\n }\n return this.shell.mode() === 'drawer' ? this.shell.drawerShown() : !this.shell.rail();\n });\n\n protected toggle(): void {\n this.shell?.toggleNavigation();\n this.menuToggle.emit();\n }\n}\n","<div class=\"nxe-topbar-start\">\n @if (menuButton()) {\n <nxe-button\n class=\"nxe-topbar-menu\"\n stylingMode=\"text\"\n [attr.aria-label]=\"label()\"\n [attr.aria-controls]=\"controls()\"\n [attr.aria-expanded]=\"expanded()\"\n (onClick)=\"toggle()\">\n <svg nxeButtonIcon viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M2 3.5h12V5H2zm0 3.75h12v1.5H2zM2 11h12v1.5H2z\" />\n </svg>\n </nxe-button>\n }\n <ng-content select=\"[nxeTopbarStart]\" />\n</div>\n<div class=\"nxe-topbar-center\"><ng-content select=\"[nxeTopbarCenter]\" /></div>\n<div class=\"nxe-topbar-end\"><ng-content select=\"[nxeTopbarEnd]\" /></div>\n","// @nexterajs/ui/shell — public API.\nexport * from './lib/nxe-shell.types';\nexport * from './lib/shell/nxe-shell.component';\nexport * from './lib/sidenav/nxe-sidenav.component';\nexport * from './lib/topbar/nxe-topbar.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}