@frame-kit/ui-ng 0.0.1

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 (220) hide show
  1. package/COMPONENTS.md +683 -0
  2. package/DEVELOPMENT_GUIDE.md +1102 -0
  3. package/LICENSE +21 -0
  4. package/README.md +69 -0
  5. package/THEMING.md +130 -0
  6. package/core/headline/README.md +121 -0
  7. package/core/icon/README.md +173 -0
  8. package/core/image/README.md +210 -0
  9. package/core/link/README.md +297 -0
  10. package/core/separator/README.md +145 -0
  11. package/core/text/README.md +240 -0
  12. package/directives/infinite-scroll/README.md +102 -0
  13. package/directives/spotlight/README.md +154 -0
  14. package/directives/tooltip/README.md +147 -0
  15. package/docs/endpoint-link/README.md +142 -0
  16. package/docs/method-badge/README.md +154 -0
  17. package/fesm2022/frame-kit-ui-ng-core-headline.mjs +122 -0
  18. package/fesm2022/frame-kit-ui-ng-core-headline.mjs.map +1 -0
  19. package/fesm2022/frame-kit-ui-ng-core-icon.mjs +189 -0
  20. package/fesm2022/frame-kit-ui-ng-core-icon.mjs.map +1 -0
  21. package/fesm2022/frame-kit-ui-ng-core-image.mjs +123 -0
  22. package/fesm2022/frame-kit-ui-ng-core-image.mjs.map +1 -0
  23. package/fesm2022/frame-kit-ui-ng-core-link.mjs +369 -0
  24. package/fesm2022/frame-kit-ui-ng-core-link.mjs.map +1 -0
  25. package/fesm2022/frame-kit-ui-ng-core-separator.mjs +59 -0
  26. package/fesm2022/frame-kit-ui-ng-core-separator.mjs.map +1 -0
  27. package/fesm2022/frame-kit-ui-ng-core-text.mjs +204 -0
  28. package/fesm2022/frame-kit-ui-ng-core-text.mjs.map +1 -0
  29. package/fesm2022/frame-kit-ui-ng-directives-infinite-scroll.mjs +74 -0
  30. package/fesm2022/frame-kit-ui-ng-directives-infinite-scroll.mjs.map +1 -0
  31. package/fesm2022/frame-kit-ui-ng-directives-spotlight.mjs +76 -0
  32. package/fesm2022/frame-kit-ui-ng-directives-spotlight.mjs.map +1 -0
  33. package/fesm2022/frame-kit-ui-ng-directives-tooltip.mjs +425 -0
  34. package/fesm2022/frame-kit-ui-ng-directives-tooltip.mjs.map +1 -0
  35. package/fesm2022/frame-kit-ui-ng-docs-endpoint-link.mjs +63 -0
  36. package/fesm2022/frame-kit-ui-ng-docs-endpoint-link.mjs.map +1 -0
  37. package/fesm2022/frame-kit-ui-ng-docs-method-badge.mjs +43 -0
  38. package/fesm2022/frame-kit-ui-ng-docs-method-badge.mjs.map +1 -0
  39. package/fesm2022/frame-kit-ui-ng-forms.mjs +3632 -0
  40. package/fesm2022/frame-kit-ui-ng-forms.mjs.map +1 -0
  41. package/fesm2022/frame-kit-ui-ng-layouts-app-shell.mjs +239 -0
  42. package/fesm2022/frame-kit-ui-ng-layouts-app-shell.mjs.map +1 -0
  43. package/fesm2022/frame-kit-ui-ng-layouts-content-split.mjs +132 -0
  44. package/fesm2022/frame-kit-ui-ng-layouts-content-split.mjs.map +1 -0
  45. package/fesm2022/frame-kit-ui-ng-services-overlay-orchestrator.mjs +133 -0
  46. package/fesm2022/frame-kit-ui-ng-services-overlay-orchestrator.mjs.map +1 -0
  47. package/fesm2022/frame-kit-ui-ng-services-spotlight.mjs +60 -0
  48. package/fesm2022/frame-kit-ui-ng-services-spotlight.mjs.map +1 -0
  49. package/fesm2022/frame-kit-ui-ng-services-toast.mjs +166 -0
  50. package/fesm2022/frame-kit-ui-ng-services-toast.mjs.map +1 -0
  51. package/fesm2022/frame-kit-ui-ng-ui-accordion.mjs +214 -0
  52. package/fesm2022/frame-kit-ui-ng-ui-accordion.mjs.map +1 -0
  53. package/fesm2022/frame-kit-ui-ng-ui-alert.mjs +82 -0
  54. package/fesm2022/frame-kit-ui-ng-ui-alert.mjs.map +1 -0
  55. package/fesm2022/frame-kit-ui-ng-ui-avatar-stack.mjs +76 -0
  56. package/fesm2022/frame-kit-ui-ng-ui-avatar-stack.mjs.map +1 -0
  57. package/fesm2022/frame-kit-ui-ng-ui-avatar.mjs +81 -0
  58. package/fesm2022/frame-kit-ui-ng-ui-avatar.mjs.map +1 -0
  59. package/fesm2022/frame-kit-ui-ng-ui-badge.mjs +81 -0
  60. package/fesm2022/frame-kit-ui-ng-ui-badge.mjs.map +1 -0
  61. package/fesm2022/frame-kit-ui-ng-ui-breadcrumb.mjs +68 -0
  62. package/fesm2022/frame-kit-ui-ng-ui-breadcrumb.mjs.map +1 -0
  63. package/fesm2022/frame-kit-ui-ng-ui-button.mjs +108 -0
  64. package/fesm2022/frame-kit-ui-ng-ui-button.mjs.map +1 -0
  65. package/fesm2022/frame-kit-ui-ng-ui-callout.mjs +58 -0
  66. package/fesm2022/frame-kit-ui-ng-ui-callout.mjs.map +1 -0
  67. package/fesm2022/frame-kit-ui-ng-ui-card.mjs +70 -0
  68. package/fesm2022/frame-kit-ui-ng-ui-card.mjs.map +1 -0
  69. package/fesm2022/frame-kit-ui-ng-ui-copyable-field.mjs +113 -0
  70. package/fesm2022/frame-kit-ui-ng-ui-copyable-field.mjs.map +1 -0
  71. package/fesm2022/frame-kit-ui-ng-ui-data-table.mjs +1288 -0
  72. package/fesm2022/frame-kit-ui-ng-ui-data-table.mjs.map +1 -0
  73. package/fesm2022/frame-kit-ui-ng-ui-dialog.mjs +456 -0
  74. package/fesm2022/frame-kit-ui-ng-ui-dialog.mjs.map +1 -0
  75. package/fesm2022/frame-kit-ui-ng-ui-drawer.mjs +398 -0
  76. package/fesm2022/frame-kit-ui-ng-ui-drawer.mjs.map +1 -0
  77. package/fesm2022/frame-kit-ui-ng-ui-dropdown-menu.mjs +398 -0
  78. package/fesm2022/frame-kit-ui-ng-ui-dropdown-menu.mjs.map +1 -0
  79. package/fesm2022/frame-kit-ui-ng-ui-editable-field.mjs +125 -0
  80. package/fesm2022/frame-kit-ui-ng-ui-editable-field.mjs.map +1 -0
  81. package/fesm2022/frame-kit-ui-ng-ui-icon-badge.mjs +113 -0
  82. package/fesm2022/frame-kit-ui-ng-ui-icon-badge.mjs.map +1 -0
  83. package/fesm2022/frame-kit-ui-ng-ui-icon-list.mjs +111 -0
  84. package/fesm2022/frame-kit-ui-ng-ui-icon-list.mjs.map +1 -0
  85. package/fesm2022/frame-kit-ui-ng-ui-inline-edit.mjs +103 -0
  86. package/fesm2022/frame-kit-ui-ng-ui-inline-edit.mjs.map +1 -0
  87. package/fesm2022/frame-kit-ui-ng-ui-list-editor.mjs +135 -0
  88. package/fesm2022/frame-kit-ui-ng-ui-list-editor.mjs.map +1 -0
  89. package/fesm2022/frame-kit-ui-ng-ui-loader.mjs +81 -0
  90. package/fesm2022/frame-kit-ui-ng-ui-loader.mjs.map +1 -0
  91. package/fesm2022/frame-kit-ui-ng-ui-menu-item.mjs +79 -0
  92. package/fesm2022/frame-kit-ui-ng-ui-menu-item.mjs.map +1 -0
  93. package/fesm2022/frame-kit-ui-ng-ui-nav-brand.mjs +40 -0
  94. package/fesm2022/frame-kit-ui-ng-ui-nav-brand.mjs.map +1 -0
  95. package/fesm2022/frame-kit-ui-ng-ui-nav-group.mjs +110 -0
  96. package/fesm2022/frame-kit-ui-ng-ui-nav-group.mjs.map +1 -0
  97. package/fesm2022/frame-kit-ui-ng-ui-nav-separator.mjs +91 -0
  98. package/fesm2022/frame-kit-ui-ng-ui-nav-separator.mjs.map +1 -0
  99. package/fesm2022/frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs +86 -0
  100. package/fesm2022/frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs.map +1 -0
  101. package/fesm2022/frame-kit-ui-ng-ui-node-tree.mjs +443 -0
  102. package/fesm2022/frame-kit-ui-ng-ui-node-tree.mjs.map +1 -0
  103. package/fesm2022/frame-kit-ui-ng-ui-note.mjs +56 -0
  104. package/fesm2022/frame-kit-ui-ng-ui-note.mjs.map +1 -0
  105. package/fesm2022/frame-kit-ui-ng-ui-numbered-list.mjs +105 -0
  106. package/fesm2022/frame-kit-ui-ng-ui-numbered-list.mjs.map +1 -0
  107. package/fesm2022/frame-kit-ui-ng-ui-pagination.mjs +110 -0
  108. package/fesm2022/frame-kit-ui-ng-ui-pagination.mjs.map +1 -0
  109. package/fesm2022/frame-kit-ui-ng-ui-progress-bar.mjs +129 -0
  110. package/fesm2022/frame-kit-ui-ng-ui-progress-bar.mjs.map +1 -0
  111. package/fesm2022/frame-kit-ui-ng-ui-sidenav-link.mjs +42 -0
  112. package/fesm2022/frame-kit-ui-ng-ui-sidenav-link.mjs.map +1 -0
  113. package/fesm2022/frame-kit-ui-ng-ui-tabs.mjs +894 -0
  114. package/fesm2022/frame-kit-ui-ng-ui-tabs.mjs.map +1 -0
  115. package/fesm2022/frame-kit-ui-ng-ui-timeline.mjs +81 -0
  116. package/fesm2022/frame-kit-ui-ng-ui-timeline.mjs.map +1 -0
  117. package/fesm2022/frame-kit-ui-ng-ui-toast.mjs +179 -0
  118. package/fesm2022/frame-kit-ui-ng-ui-toast.mjs.map +1 -0
  119. package/fesm2022/frame-kit-ui-ng-ui-user-menu.mjs +143 -0
  120. package/fesm2022/frame-kit-ui-ng-ui-user-menu.mjs.map +1 -0
  121. package/fesm2022/frame-kit-ui-ng-ui-wizard-dialog.mjs +191 -0
  122. package/fesm2022/frame-kit-ui-ng-ui-wizard-dialog.mjs.map +1 -0
  123. package/fesm2022/frame-kit-ui-ng.mjs +58 -0
  124. package/fesm2022/frame-kit-ui-ng.mjs.map +1 -0
  125. package/layouts/app-shell/README.md +357 -0
  126. package/layouts/content-split/README.md +180 -0
  127. package/package.json +253 -0
  128. package/services/overlay-orchestrator/README.md +184 -0
  129. package/services/spotlight/README.md +61 -0
  130. package/services/toast/README.md +118 -0
  131. package/types/frame-kit-ui-ng-core-headline.d.ts +38 -0
  132. package/types/frame-kit-ui-ng-core-icon.d.ts +74 -0
  133. package/types/frame-kit-ui-ng-core-image.d.ts +93 -0
  134. package/types/frame-kit-ui-ng-core-link.d.ts +251 -0
  135. package/types/frame-kit-ui-ng-core-separator.d.ts +28 -0
  136. package/types/frame-kit-ui-ng-core-text.d.ts +186 -0
  137. package/types/frame-kit-ui-ng-directives-infinite-scroll.d.ts +42 -0
  138. package/types/frame-kit-ui-ng-directives-spotlight.d.ts +51 -0
  139. package/types/frame-kit-ui-ng-directives-tooltip.d.ts +70 -0
  140. package/types/frame-kit-ui-ng-docs-endpoint-link.d.ts +43 -0
  141. package/types/frame-kit-ui-ng-docs-method-badge.d.ts +30 -0
  142. package/types/frame-kit-ui-ng-forms.d.ts +1674 -0
  143. package/types/frame-kit-ui-ng-layouts-app-shell.d.ts +75 -0
  144. package/types/frame-kit-ui-ng-layouts-content-split.d.ts +43 -0
  145. package/types/frame-kit-ui-ng-services-overlay-orchestrator.d.ts +96 -0
  146. package/types/frame-kit-ui-ng-services-spotlight.d.ts +32 -0
  147. package/types/frame-kit-ui-ng-services-toast.d.ts +100 -0
  148. package/types/frame-kit-ui-ng-ui-accordion.d.ts +86 -0
  149. package/types/frame-kit-ui-ng-ui-alert.d.ts +34 -0
  150. package/types/frame-kit-ui-ng-ui-avatar-stack.d.ts +38 -0
  151. package/types/frame-kit-ui-ng-ui-avatar.d.ts +36 -0
  152. package/types/frame-kit-ui-ng-ui-badge.d.ts +33 -0
  153. package/types/frame-kit-ui-ng-ui-breadcrumb.d.ts +45 -0
  154. package/types/frame-kit-ui-ng-ui-button.d.ts +48 -0
  155. package/types/frame-kit-ui-ng-ui-callout.d.ts +26 -0
  156. package/types/frame-kit-ui-ng-ui-card.d.ts +30 -0
  157. package/types/frame-kit-ui-ng-ui-copyable-field.d.ts +62 -0
  158. package/types/frame-kit-ui-ng-ui-data-table.d.ts +482 -0
  159. package/types/frame-kit-ui-ng-ui-dialog.d.ts +166 -0
  160. package/types/frame-kit-ui-ng-ui-drawer.d.ts +130 -0
  161. package/types/frame-kit-ui-ng-ui-dropdown-menu.d.ts +77 -0
  162. package/types/frame-kit-ui-ng-ui-editable-field.d.ts +65 -0
  163. package/types/frame-kit-ui-ng-ui-icon-badge.d.ts +45 -0
  164. package/types/frame-kit-ui-ng-ui-icon-list.d.ts +67 -0
  165. package/types/frame-kit-ui-ng-ui-inline-edit.d.ts +44 -0
  166. package/types/frame-kit-ui-ng-ui-list-editor.d.ts +56 -0
  167. package/types/frame-kit-ui-ng-ui-loader.d.ts +32 -0
  168. package/types/frame-kit-ui-ng-ui-menu-item.d.ts +27 -0
  169. package/types/frame-kit-ui-ng-ui-nav-brand.d.ts +25 -0
  170. package/types/frame-kit-ui-ng-ui-nav-group.d.ts +60 -0
  171. package/types/frame-kit-ui-ng-ui-nav-separator.d.ts +33 -0
  172. package/types/frame-kit-ui-ng-ui-node-tree-breadcrumb.d.ts +35 -0
  173. package/types/frame-kit-ui-ng-ui-node-tree.d.ts +135 -0
  174. package/types/frame-kit-ui-ng-ui-note.d.ts +22 -0
  175. package/types/frame-kit-ui-ng-ui-numbered-list.d.ts +52 -0
  176. package/types/frame-kit-ui-ng-ui-pagination.d.ts +49 -0
  177. package/types/frame-kit-ui-ng-ui-progress-bar.d.ts +50 -0
  178. package/types/frame-kit-ui-ng-ui-sidenav-link.d.ts +24 -0
  179. package/types/frame-kit-ui-ng-ui-tabs.d.ts +266 -0
  180. package/types/frame-kit-ui-ng-ui-timeline.d.ts +42 -0
  181. package/types/frame-kit-ui-ng-ui-toast.d.ts +56 -0
  182. package/types/frame-kit-ui-ng-ui-user-menu.d.ts +87 -0
  183. package/types/frame-kit-ui-ng-ui-wizard-dialog.d.ts +116 -0
  184. package/types/frame-kit-ui-ng.d.ts +53 -0
  185. package/ui/accordion/README.md +261 -0
  186. package/ui/alert/README.md +211 -0
  187. package/ui/avatar/README.md +167 -0
  188. package/ui/avatar-stack/README.md +164 -0
  189. package/ui/badge/README.md +162 -0
  190. package/ui/breadcrumb/README.md +240 -0
  191. package/ui/button/README.md +184 -0
  192. package/ui/callout/README.md +159 -0
  193. package/ui/card/README.md +174 -0
  194. package/ui/copyable-field/README.md +235 -0
  195. package/ui/data-table/README.md +408 -0
  196. package/ui/dialog/README.md +222 -0
  197. package/ui/drawer/README.md +274 -0
  198. package/ui/dropdown-menu/README.md +336 -0
  199. package/ui/editable-field/README.md +171 -0
  200. package/ui/icon-badge/README.md +131 -0
  201. package/ui/icon-list/README.md +205 -0
  202. package/ui/inline-edit/README.md +135 -0
  203. package/ui/list-editor/README.md +162 -0
  204. package/ui/loader/README.md +160 -0
  205. package/ui/menu-item/README.md +204 -0
  206. package/ui/nav-brand/README.md +111 -0
  207. package/ui/nav-group/README.md +145 -0
  208. package/ui/nav-separator/README.md +44 -0
  209. package/ui/node-tree/README.md +278 -0
  210. package/ui/node-tree-breadcrumb/README.md +164 -0
  211. package/ui/note/README.md +146 -0
  212. package/ui/numbered-list/README.md +187 -0
  213. package/ui/pagination/README.md +174 -0
  214. package/ui/progress-bar/README.md +223 -0
  215. package/ui/sidenav-link/README.md +214 -0
  216. package/ui/tabs/README.md +204 -0
  217. package/ui/timeline/README.md +285 -0
  218. package/ui/toast/README.md +243 -0
  219. package/ui/user-menu/README.md +260 -0
  220. package/ui/wizard-dialog/README.md +283 -0
@@ -0,0 +1,110 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, model, output, computed, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import * as i1 from '@angular/router';
4
+ import { RouterModule } from '@angular/router';
5
+ import { SidenavLinkComponent } from '@frame-kit/ui-ng/ui/sidenav-link';
6
+
7
+ /**
8
+ * Expandable nav group — renders a trigger row (icon + label, optionally
9
+ * linked) and reveals projected children when `expanded` is true. Designed
10
+ * to sit inside a collapsible sidenav: when the outer shell is collapsed,
11
+ * clicking the row emits `requestOpen` so the host can pop the sidenav
12
+ * open, and the group auto-expands once it's visible.
13
+ */
14
+ class NavGroupComponent {
15
+ // ===== INPUTS =====
16
+ /** Primary label text shown in the group trigger row. */
17
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
18
+ /** Optional icon name shown to the leading side of the label. */
19
+ icon = input(null, ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
20
+ /** Size of the leading icon. */
21
+ iconSize = input('sm', ...(ngDevMode ? [{ debugName: "iconSize" }] : /* istanbul ignore next */ []));
22
+ /** Optional router path; when set, the trigger navigates on click in expanded sidenav mode. */
23
+ routerLink = input(null, ...(ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []));
24
+ /**
25
+ * True when the containing sidenav is in its collapsed rail state.
26
+ * In that mode, clicking the trigger BOTH navigates via
27
+ * `routerLink` AND emits `requestOpen` so the host can expand the
28
+ * outer shell — the user lands on the group's route with the
29
+ * sidenav already open. The trigger never expands its own children
30
+ * inside the rail (no horizontal room); the rail-to-expanded
31
+ * transition is what reveals them.
32
+ */
33
+ collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
34
+ /**
35
+ * When true and the sidenav is in its expanded state, clicking the
36
+ * trigger row does NOT fold the group — children stay visible.
37
+ * Useful when the group's children are permanent navigation rather
38
+ * than a collapsible disclosure (e.g. a parent nav item that should
39
+ * always show its sub-pages while the sidenav is open). Clicks on
40
+ * the trigger still navigate via `routerLink`.
41
+ *
42
+ * Has no effect in collapsed (rail) mode — clicks there still
43
+ * navigate via `routerLink` and emit `requestOpen`, and `expanded`
44
+ * stays untouched regardless of this input.
45
+ */
46
+ lockedOpen = input(false, ...(ngDevMode ? [{ debugName: "lockedOpen" }] : /* istanbul ignore next */ []));
47
+ // ===== MODELS =====
48
+ /** Whether the group is currently expanded, showing projected child links. */
49
+ expanded = model(false, ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
50
+ // ===== OUTPUTS =====
51
+ /**
52
+ * Emitted when the group is clicked while the outer sidenav is
53
+ * collapsed. Hosts typically listen to open their collapsible shell
54
+ * so the projected children become visible.
55
+ */
56
+ requestOpen = output();
57
+ // ===== BASE PROPS =====
58
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
59
+ // ===== COMPUTED =====
60
+ classes = computed(() => {
61
+ return [
62
+ 'fk-nav-group',
63
+ this.expanded() ? 'fk-nav-group--expanded' : '',
64
+ this.collapsed() ? 'fk-nav-group--collapsed' : '',
65
+ this.className(),
66
+ ]
67
+ .filter(Boolean)
68
+ .join(' ');
69
+ }, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
70
+ get hostClass() {
71
+ return this.classes();
72
+ }
73
+ toggle() {
74
+ if (this.collapsed()) {
75
+ // In rail mode the children must not render inside the rail —
76
+ // there's no horizontal room and the visual hierarchy collapses.
77
+ // Just ask the host to expand the sidenav; once it does and
78
+ // `collapsed` flips to false, the consumer's `[expanded]`
79
+ // binding can push true and the children render in the now-open
80
+ // sidenav. We DO NOT set `expanded` here, so a click in rail
81
+ // mode never reveals children inside the rail itself.
82
+ this.requestOpen.emit();
83
+ return;
84
+ }
85
+ // Locked-open: in expanded sidenav mode, the trigger no longer
86
+ // folds the group on click. Navigation via `routerLink` still
87
+ // fires from the inner sidenav-link; this branch just suppresses
88
+ // the toggle behavior so children stay visible.
89
+ if (this.lockedOpen()) {
90
+ return;
91
+ }
92
+ this.expanded.update((v) => !v);
93
+ }
94
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
95
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NavGroupComponent, isStandalone: true, selector: "fk-nav-group", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconSize: { classPropertyName: "iconSize", publicName: "iconSize", isSignal: true, isRequired: false, transformFunction: null }, routerLink: { classPropertyName: "routerLink", publicName: "routerLink", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, lockedOpen: { classPropertyName: "lockedOpen", publicName: "lockedOpen", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expanded: "expandedChange", requestOpen: "requestOpen" }, host: { properties: { "class": "this.hostClass" } }, ngImport: i0, template: "<div class=\"fk-nav-group__row\" role=\"presentation\" (click)=\"toggle()\">\n <fk-sidenav-link\n class=\"fk-nav-group__link\"\n [icon]=\"icon() ?? ''\"\n [iconSize]=\"iconSize()\"\n [label]=\"label()\"\n [routerLink]=\"routerLink()\"\n />\n</div>\n\n@if (expanded()) {\n <!--\n Stop child clicks from bubbling to the fk-nav-group host. When a\n consumer binds [routerLink] on <fk-nav-group>, Angular attaches the\n RouterLink directive to the host element in addition to our input \u2014\n so an un-stopped child click would re-navigate to the parent URL\n after the child's own RouterLink fires. This is an event absorber,\n not an interactive element; keyboard activation fires click events\n that bubble through the same path, so the a11y rules don't apply.\n -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div class=\"fk-nav-group__children\" (click)=\"$event.stopPropagation()\">\n <ng-content />\n </div>\n}\n", styles: [":host{display:block}.fk-nav-group__row{display:flex;align-items:center;gap:var(--fk-nav-group-row-gap, var(--fk-rhythm-1, .25rem))}.fk-nav-group__link{flex:1;min-width:0}.fk-nav-group__children{display:flex;flex-direction:column;gap:var(--fk-nav-group-children-gap, var(--fk-rhythm-1, .25rem));padding-left:var(--fk-nav-group-children-indent, var(--fk-rhythm-6, 1.5rem));margin-top:var(--fk-nav-group-children-offset, var(--fk-rhythm-1, .25rem))}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: SidenavLinkComponent, selector: "fk-sidenav-link", inputs: ["icon", "iconSize", "label", "routerLink", "exact"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
96
+ }
97
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavGroupComponent, decorators: [{
98
+ type: Component,
99
+ args: [{ selector: 'fk-nav-group', standalone: true, imports: [RouterModule, SidenavLinkComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"fk-nav-group__row\" role=\"presentation\" (click)=\"toggle()\">\n <fk-sidenav-link\n class=\"fk-nav-group__link\"\n [icon]=\"icon() ?? ''\"\n [iconSize]=\"iconSize()\"\n [label]=\"label()\"\n [routerLink]=\"routerLink()\"\n />\n</div>\n\n@if (expanded()) {\n <!--\n Stop child clicks from bubbling to the fk-nav-group host. When a\n consumer binds [routerLink] on <fk-nav-group>, Angular attaches the\n RouterLink directive to the host element in addition to our input \u2014\n so an un-stopped child click would re-navigate to the parent URL\n after the child's own RouterLink fires. This is an event absorber,\n not an interactive element; keyboard activation fires click events\n that bubble through the same path, so the a11y rules don't apply.\n -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div class=\"fk-nav-group__children\" (click)=\"$event.stopPropagation()\">\n <ng-content />\n </div>\n}\n", styles: [":host{display:block}.fk-nav-group__row{display:flex;align-items:center;gap:var(--fk-nav-group-row-gap, var(--fk-rhythm-1, .25rem))}.fk-nav-group__link{flex:1;min-width:0}.fk-nav-group__children{display:flex;flex-direction:column;gap:var(--fk-nav-group-children-gap, var(--fk-rhythm-1, .25rem));padding-left:var(--fk-nav-group-children-indent, var(--fk-rhythm-6, 1.5rem));margin-top:var(--fk-nav-group-children-offset, var(--fk-rhythm-1, .25rem))}\n"] }]
100
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconSize", required: false }] }], routerLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLink", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], lockedOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "lockedOpen", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }], requestOpen: [{ type: i0.Output, args: ["requestOpen"] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], hostClass: [{
101
+ type: HostBinding,
102
+ args: ['class']
103
+ }] } });
104
+
105
+ /**
106
+ * Generated bundle index. Do not edit.
107
+ */
108
+
109
+ export { NavGroupComponent };
110
+ //# sourceMappingURL=frame-kit-ui-ng-ui-nav-group.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-kit-ui-ng-ui-nav-group.mjs","sources":["../../../../packages/ui-ng/ui/nav-group/nav-group.component.ts","../../../../packages/ui-ng/ui/nav-group/nav-group.component.html","../../../../packages/ui-ng/ui/nav-group/frame-kit-ui-ng-ui-nav-group.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n model,\n output,\n} from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\nimport type { IconSize } from '@frame-kit/ui-ng/core/icon';\nimport { SidenavLinkComponent } from '@frame-kit/ui-ng/ui/sidenav-link';\n\n/**\n * Expandable nav group — renders a trigger row (icon + label, optionally\n * linked) and reveals projected children when `expanded` is true. Designed\n * to sit inside a collapsible sidenav: when the outer shell is collapsed,\n * clicking the row emits `requestOpen` so the host can pop the sidenav\n * open, and the group auto-expands once it's visible.\n */\n@Component({\n selector: 'fk-nav-group',\n standalone: true,\n imports: [RouterModule, SidenavLinkComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './nav-group.component.html',\n styleUrl: './nav-group.component.scss',\n})\nexport class NavGroupComponent {\n // ===== INPUTS =====\n /** Primary label text shown in the group trigger row. */\n readonly label = input.required<string>();\n /** Optional icon name shown to the leading side of the label. */\n readonly icon = input<string | null>(null);\n /** Size of the leading icon. */\n readonly iconSize = input<IconSize>('sm');\n /** Optional router path; when set, the trigger navigates on click in expanded sidenav mode. */\n readonly routerLink = input<string | string[] | null>(null);\n\n /**\n * True when the containing sidenav is in its collapsed rail state.\n * In that mode, clicking the trigger BOTH navigates via\n * `routerLink` AND emits `requestOpen` so the host can expand the\n * outer shell — the user lands on the group's route with the\n * sidenav already open. The trigger never expands its own children\n * inside the rail (no horizontal room); the rail-to-expanded\n * transition is what reveals them.\n */\n readonly collapsed = input<boolean>(false);\n\n /**\n * When true and the sidenav is in its expanded state, clicking the\n * trigger row does NOT fold the group — children stay visible.\n * Useful when the group's children are permanent navigation rather\n * than a collapsible disclosure (e.g. a parent nav item that should\n * always show its sub-pages while the sidenav is open). Clicks on\n * the trigger still navigate via `routerLink`.\n *\n * Has no effect in collapsed (rail) mode — clicks there still\n * navigate via `routerLink` and emit `requestOpen`, and `expanded`\n * stays untouched regardless of this input.\n */\n readonly lockedOpen = input<boolean>(false);\n\n // ===== MODELS =====\n /** Whether the group is currently expanded, showing projected child links. */\n readonly expanded = model<boolean>(false);\n\n // ===== OUTPUTS =====\n /**\n * Emitted when the group is clicked while the outer sidenav is\n * collapsed. Hosts typically listen to open their collapsible shell\n * so the projected children become visible.\n */\n readonly requestOpen = output<void>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return [\n 'fk-nav-group',\n this.expanded() ? 'fk-nav-group--expanded' : '',\n this.collapsed() ? 'fk-nav-group--collapsed' : '',\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n protected toggle(): void {\n if (this.collapsed()) {\n // In rail mode the children must not render inside the rail —\n // there's no horizontal room and the visual hierarchy collapses.\n // Just ask the host to expand the sidenav; once it does and\n // `collapsed` flips to false, the consumer's `[expanded]`\n // binding can push true and the children render in the now-open\n // sidenav. We DO NOT set `expanded` here, so a click in rail\n // mode never reveals children inside the rail itself.\n this.requestOpen.emit();\n\n return;\n }\n\n // Locked-open: in expanded sidenav mode, the trigger no longer\n // folds the group on click. Navigation via `routerLink` still\n // fires from the inner sidenav-link; this branch just suppresses\n // the toggle behavior so children stay visible.\n if (this.lockedOpen()) {\n return;\n }\n\n this.expanded.update((v) => !v);\n }\n}\n","<div class=\"fk-nav-group__row\" role=\"presentation\" (click)=\"toggle()\">\n <fk-sidenav-link\n class=\"fk-nav-group__link\"\n [icon]=\"icon() ?? ''\"\n [iconSize]=\"iconSize()\"\n [label]=\"label()\"\n [routerLink]=\"routerLink()\"\n />\n</div>\n\n@if (expanded()) {\n <!--\n Stop child clicks from bubbling to the fk-nav-group host. When a\n consumer binds [routerLink] on <fk-nav-group>, Angular attaches the\n RouterLink directive to the host element in addition to our input —\n so an un-stopped child click would re-navigate to the parent URL\n after the child's own RouterLink fires. This is an event absorber,\n not an interactive element; keyboard activation fires click events\n that bubble through the same path, so the a11y rules don't apply.\n -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div class=\"fk-nav-group__children\" (click)=\"$event.stopPropagation()\">\n <ng-content />\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
3
+
4
+ class NavSeparatorComponent {
5
+ // ===== INPUTS =====
6
+ /** Direction the separator line runs — vertical fills block height, horizontal fills inline width. */
7
+ orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
8
+ /** Custom length of the separator line as any CSS size value. */
9
+ length = input(null, ...(ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []));
10
+ /** Custom thickness of the separator line as any CSS size value. */
11
+ thickness = input(null, ...(ngDevMode ? [{ debugName: "thickness" }] : /* istanbul ignore next */ []));
12
+ /** Custom margin around the separator as any CSS margin value. */
13
+ margin = input(null, ...(ngDevMode ? [{ debugName: "margin" }] : /* istanbul ignore next */ []));
14
+ /** Custom color of the separator line as any CSS color value. */
15
+ color = input(null, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
16
+ /** When true, the separator is hidden from assistive technology; when false it carries `role="separator"`. */
17
+ decorative = input(true, ...(ngDevMode ? [{ debugName: "decorative" }] : /* istanbul ignore next */ []));
18
+ // ===== BASE PROPS =====
19
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
20
+ // ===== COMPUTED =====
21
+ classes = computed(() => {
22
+ return [
23
+ 'fk-nav-separator',
24
+ `fk-nav-separator--${this.orientation()}`,
25
+ this.className(),
26
+ ]
27
+ .filter(Boolean)
28
+ .join(' ');
29
+ }, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
30
+ get hostClass() {
31
+ return this.classes();
32
+ }
33
+ get hostLength() {
34
+ return this.length();
35
+ }
36
+ get hostThickness() {
37
+ return this.thickness();
38
+ }
39
+ get hostMargin() {
40
+ return this.margin();
41
+ }
42
+ get hostColor() {
43
+ return this.color();
44
+ }
45
+ get hostAriaHidden() {
46
+ return this.decorative() ? 'true' : null;
47
+ }
48
+ get hostRole() {
49
+ return this.decorative() ? null : 'separator';
50
+ }
51
+ get hostAriaOrientation() {
52
+ return this.decorative() ? null : this.orientation();
53
+ }
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: NavSeparatorComponent, isStandalone: true, selector: "fk-nav-separator", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: false, transformFunction: null }, thickness: { classPropertyName: "thickness", publicName: "thickness", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, decorative: { classPropertyName: "decorative", publicName: "decorative", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.hostClass", "style.--fk-nav-separator-length": "this.hostLength", "style.--fk-nav-separator-thickness": "this.hostThickness", "style.--fk-nav-separator-margin": "this.hostMargin", "style.--fk-nav-separator-color": "this.hostColor", "attr.aria-hidden": "this.hostAriaHidden", "attr.role": "this.hostRole", "attr.aria-orientation": "this.hostAriaOrientation" } }, ngImport: i0, template: '', isInline: true, styles: [":host{flex-shrink:0;background-color:var(--fk-nav-separator-color, var(--fk-color-border, #d9e2ee))}:host(.fk-nav-separator--vertical){display:inline-block;align-self:center;width:var(--fk-nav-separator-thickness, 1px);height:var(--fk-nav-separator-length, 1.5rem);margin:var(--fk-nav-separator-margin, 0 .75rem)}:host(.fk-nav-separator--horizontal){display:block;align-self:stretch;width:var(--fk-nav-separator-length, auto);height:var(--fk-nav-separator-thickness, 1px);margin:var(--fk-nav-separator-margin, .5rem 0)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NavSeparatorComponent, decorators: [{
58
+ type: Component,
59
+ args: [{ selector: 'fk-nav-separator', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: '', styles: [":host{flex-shrink:0;background-color:var(--fk-nav-separator-color, var(--fk-color-border, #d9e2ee))}:host(.fk-nav-separator--vertical){display:inline-block;align-self:center;width:var(--fk-nav-separator-thickness, 1px);height:var(--fk-nav-separator-length, 1.5rem);margin:var(--fk-nav-separator-margin, 0 .75rem)}:host(.fk-nav-separator--horizontal){display:block;align-self:stretch;width:var(--fk-nav-separator-length, auto);height:var(--fk-nav-separator-thickness, 1px);margin:var(--fk-nav-separator-margin, .5rem 0)}\n"] }]
60
+ }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], length: [{ type: i0.Input, args: [{ isSignal: true, alias: "length", required: false }] }], thickness: [{ type: i0.Input, args: [{ isSignal: true, alias: "thickness", required: false }] }], margin: [{ type: i0.Input, args: [{ isSignal: true, alias: "margin", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], decorative: [{ type: i0.Input, args: [{ isSignal: true, alias: "decorative", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], hostClass: [{
61
+ type: HostBinding,
62
+ args: ['class']
63
+ }], hostLength: [{
64
+ type: HostBinding,
65
+ args: ['style.--fk-nav-separator-length']
66
+ }], hostThickness: [{
67
+ type: HostBinding,
68
+ args: ['style.--fk-nav-separator-thickness']
69
+ }], hostMargin: [{
70
+ type: HostBinding,
71
+ args: ['style.--fk-nav-separator-margin']
72
+ }], hostColor: [{
73
+ type: HostBinding,
74
+ args: ['style.--fk-nav-separator-color']
75
+ }], hostAriaHidden: [{
76
+ type: HostBinding,
77
+ args: ['attr.aria-hidden']
78
+ }], hostRole: [{
79
+ type: HostBinding,
80
+ args: ['attr.role']
81
+ }], hostAriaOrientation: [{
82
+ type: HostBinding,
83
+ args: ['attr.aria-orientation']
84
+ }] } });
85
+
86
+ /**
87
+ * Generated bundle index. Do not edit.
88
+ */
89
+
90
+ export { NavSeparatorComponent };
91
+ //# sourceMappingURL=frame-kit-ui-ng-ui-nav-separator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-kit-ui-ng-ui-nav-separator.mjs","sources":["../../../../packages/ui-ng/ui/nav-separator/nav-separator.component.ts","../../../../packages/ui-ng/ui/nav-separator/frame-kit-ui-ng-ui-nav-separator.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n} from '@angular/core';\n\nimport type { NavSeparatorOrientation } from './nav-separator.types';\n\n@Component({\n selector: 'fk-nav-separator',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: '',\n styleUrl: './nav-separator.component.scss',\n})\nexport class NavSeparatorComponent {\n // ===== INPUTS =====\n /** Direction the separator line runs — vertical fills block height, horizontal fills inline width. */\n readonly orientation = input<NavSeparatorOrientation>('vertical');\n /** Custom length of the separator line as any CSS size value. */\n readonly length = input<string | null>(null);\n /** Custom thickness of the separator line as any CSS size value. */\n readonly thickness = input<string | null>(null);\n /** Custom margin around the separator as any CSS margin value. */\n readonly margin = input<string | null>(null);\n /** Custom color of the separator line as any CSS color value. */\n readonly color = input<string | null>(null);\n /** When true, the separator is hidden from assistive technology; when false it carries `role=\"separator\"`. */\n readonly decorative = input<boolean>(true);\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== COMPUTED =====\n readonly classes = computed(() => {\n return [\n 'fk-nav-separator',\n `fk-nav-separator--${this.orientation()}`,\n this.className(),\n ]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('style.--fk-nav-separator-length')\n get hostLength() {\n return this.length();\n }\n\n @HostBinding('style.--fk-nav-separator-thickness')\n get hostThickness() {\n return this.thickness();\n }\n\n @HostBinding('style.--fk-nav-separator-margin')\n get hostMargin() {\n return this.margin();\n }\n\n @HostBinding('style.--fk-nav-separator-color')\n get hostColor() {\n return this.color();\n }\n\n @HostBinding('attr.aria-hidden')\n get hostAriaHidden() {\n return this.decorative() ? 'true' : null;\n }\n\n @HostBinding('attr.role')\n get hostRole() {\n return this.decorative() ? null : 'separator';\n }\n\n @HostBinding('attr.aria-orientation')\n get hostAriaOrientation() {\n return this.decorative() ? null : this.orientation();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MAiBa,qBAAqB,CAAA;;;AAGvB,IAAA,WAAW,GAAG,KAAK,CAA0B,UAAU,kFAAC;;AAExD,IAAA,MAAM,GAAG,KAAK,CAAgB,IAAI,6EAAC;;AAEnC,IAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,gFAAC;;AAEtC,IAAA,MAAM,GAAG,KAAK,CAAgB,IAAI,6EAAC;;AAEnC,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,4EAAC;;AAElC,IAAA,UAAU,GAAG,KAAK,CAAU,IAAI,iFAAC;;AAGjC,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;;AAG7B,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;YACL,kBAAkB;AAClB,YAAA,CAAA,kBAAA,EAAqB,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE;YACzC,IAAI,CAAC,SAAS,EAAE;AACjB;aACE,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;AACd,IAAA,CAAC,8EAAC;AAEF,IAAA,IACI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;IACvB;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACtB;AAEA,IAAA,IACI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;IACzB;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACtB;AAEA,IAAA,IACI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACrB;AAEA,IAAA,IACI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI;IAC1C;AAEA,IAAA,IACI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,GAAG,WAAW;IAC/C;AAEA,IAAA,IACI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;IACtD;uGAnEW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,82CAHtB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2gBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGD,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,YACrC,EAAE,EAAA,MAAA,EAAA,CAAA,2gBAAA,CAAA,EAAA;;sBAgCX,WAAW;uBAAC,OAAO;;sBAKnB,WAAW;uBAAC,iCAAiC;;sBAK7C,WAAW;uBAAC,oCAAoC;;sBAKhD,WAAW;uBAAC,iCAAiC;;sBAK7C,WAAW;uBAAC,gCAAgC;;sBAK5C,WAAW;uBAAC,kBAAkB;;sBAK9B,WAAW;uBAAC,WAAW;;sBAKvB,WAAW;uBAAC,uBAAuB;;;ACjFtC;;AAEG;;;;"}
@@ -0,0 +1,86 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, computed, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
3
+
4
+ /**
5
+ * Builds an ancestry path from the root to the given node.
6
+ * Returns an array ordered root-first, selected-node-last.
7
+ */
8
+ function buildAncestryPath(nodeId, nodes) {
9
+ const nodeMap = new Map();
10
+ for (const node of nodes) {
11
+ nodeMap.set(node.id, node);
12
+ }
13
+ const path = [];
14
+ let current = nodeMap.get(nodeId);
15
+ while (current) {
16
+ path.push({
17
+ id: current.id,
18
+ label: current.label,
19
+ icon: current.icon,
20
+ });
21
+ if (current.parentId) {
22
+ current = nodeMap.get(current.parentId);
23
+ }
24
+ else {
25
+ current = undefined;
26
+ }
27
+ }
28
+ path.reverse();
29
+ return path;
30
+ }
31
+
32
+ class NodeTreeBreadcrumbComponent {
33
+ // ===== INPUTS =====
34
+ /** Flat array of `TreeNode` objects used to compute the ancestry path. */
35
+ nodes = input.required(...(ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []));
36
+ /** ID of the node whose full ancestor path is displayed as breadcrumbs. */
37
+ selectedNodeId = input(...(ngDevMode ? [undefined, { debugName: "selectedNodeId" }] : /* istanbul ignore next */ []));
38
+ // ===== BASE PROPS =====
39
+ className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
40
+ // ===== OUTPUTS =====
41
+ /** Fires when the user clicks a breadcrumb, emitting that crumb's node data. */
42
+ nodeSelect = output();
43
+ // ===== COMPUTED =====
44
+ crumbs = computed(() => {
45
+ const id = this.selectedNodeId();
46
+ if (!id) {
47
+ return [];
48
+ }
49
+ return buildAncestryPath(id, this.nodes());
50
+ }, ...(ngDevMode ? [{ debugName: "crumbs" }] : /* istanbul ignore next */ []));
51
+ classes = computed(() => {
52
+ return ['fk-node-tree-breadcrumb', this.className()]
53
+ .filter(Boolean)
54
+ .join(' ');
55
+ }, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
56
+ get hostClass() {
57
+ return this.classes();
58
+ }
59
+ role = 'navigation';
60
+ ariaLabel = 'Breadcrumb';
61
+ onCrumbClick(crumb) {
62
+ this.nodeSelect.emit(crumb);
63
+ }
64
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NodeTreeBreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
65
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NodeTreeBreadcrumbComponent, isStandalone: true, selector: "fk-node-tree-breadcrumb", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: true, transformFunction: null }, selectedNodeId: { classPropertyName: "selectedNodeId", publicName: "selectedNodeId", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeSelect: "nodeSelect" }, host: { properties: { "class": "this.hostClass", "attr.role": "this.role", "attr.aria-label": "this.ariaLabel" } }, ngImport: i0, template: "<ol class=\"fk-node-tree-breadcrumb__list\">\n @for (crumb of crumbs(); track crumb.id; let last = $last) {\n <li class=\"fk-node-tree-breadcrumb__item\">\n @if (last) {\n <span class=\"fk-node-tree-breadcrumb__current\" aria-current=\"location\">\n {{ crumb.label }}\n </span>\n } @else {\n <button\n type=\"button\"\n class=\"fk-node-tree-breadcrumb__link\"\n (click)=\"onCrumbClick(crumb)\"\n >\n {{ crumb.label }}\n </button>\n\n <svg\n class=\"fk-node-tree-breadcrumb__separator\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n }\n </li>\n }\n</ol>\n", styles: [".fk-node-tree-breadcrumb__list{display:flex;align-items:center;flex-wrap:wrap;gap:var(--fk-node-tree-breadcrumb-gap, var(--fk-rhythm-1, .25rem));margin:0;padding:0;list-style:none;font-size:var(--fk-node-tree-breadcrumb-font-size, var(--fk-typography-caption-font-size, .75rem));line-height:1.5}.fk-node-tree-breadcrumb__item{display:flex;align-items:center;gap:var(--fk-node-tree-breadcrumb-gap, var(--fk-rhythm-1, .25rem))}.fk-node-tree-breadcrumb__link{display:inline-flex;align-items:center;padding:0;border:none;background:none;color:var(--fk-node-tree-breadcrumb-link-color, var(--fk-color-muted, #64748b));font:inherit;text-transform:inherit;cursor:pointer}.fk-node-tree-breadcrumb__link:hover{color:var(--fk-node-tree-breadcrumb-link-color-hover, var(--fk-color-text, #1f2d3d));text-decoration:underline}.fk-node-tree-breadcrumb__link:focus-visible{outline:var(--fk-focus-ring, 0 0 0 3px rgba(59, 130, 246, .5));outline-offset:2px;border-radius:var(--fk-radius-sm, .25rem)}.fk-node-tree-breadcrumb__current{display:inline-flex;align-items:center;color:var(--fk-node-tree-breadcrumb-current-color, var(--fk-color-primary, #0a84ff));font-weight:var(--fk-node-tree-breadcrumb-current-font-weight, var(--fk-font-weight-medium, 500))}.fk-node-tree-breadcrumb__separator{display:flex;align-items:center;color:var(--fk-node-tree-breadcrumb-separator-color, var(--fk-color-muted, #64748b));-webkit-user-select:none;user-select:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
66
+ }
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NodeTreeBreadcrumbComponent, decorators: [{
68
+ type: Component,
69
+ args: [{ selector: 'fk-node-tree-breadcrumb', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ol class=\"fk-node-tree-breadcrumb__list\">\n @for (crumb of crumbs(); track crumb.id; let last = $last) {\n <li class=\"fk-node-tree-breadcrumb__item\">\n @if (last) {\n <span class=\"fk-node-tree-breadcrumb__current\" aria-current=\"location\">\n {{ crumb.label }}\n </span>\n } @else {\n <button\n type=\"button\"\n class=\"fk-node-tree-breadcrumb__link\"\n (click)=\"onCrumbClick(crumb)\"\n >\n {{ crumb.label }}\n </button>\n\n <svg\n class=\"fk-node-tree-breadcrumb__separator\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n }\n </li>\n }\n</ol>\n", styles: [".fk-node-tree-breadcrumb__list{display:flex;align-items:center;flex-wrap:wrap;gap:var(--fk-node-tree-breadcrumb-gap, var(--fk-rhythm-1, .25rem));margin:0;padding:0;list-style:none;font-size:var(--fk-node-tree-breadcrumb-font-size, var(--fk-typography-caption-font-size, .75rem));line-height:1.5}.fk-node-tree-breadcrumb__item{display:flex;align-items:center;gap:var(--fk-node-tree-breadcrumb-gap, var(--fk-rhythm-1, .25rem))}.fk-node-tree-breadcrumb__link{display:inline-flex;align-items:center;padding:0;border:none;background:none;color:var(--fk-node-tree-breadcrumb-link-color, var(--fk-color-muted, #64748b));font:inherit;text-transform:inherit;cursor:pointer}.fk-node-tree-breadcrumb__link:hover{color:var(--fk-node-tree-breadcrumb-link-color-hover, var(--fk-color-text, #1f2d3d));text-decoration:underline}.fk-node-tree-breadcrumb__link:focus-visible{outline:var(--fk-focus-ring, 0 0 0 3px rgba(59, 130, 246, .5));outline-offset:2px;border-radius:var(--fk-radius-sm, .25rem)}.fk-node-tree-breadcrumb__current{display:inline-flex;align-items:center;color:var(--fk-node-tree-breadcrumb-current-color, var(--fk-color-primary, #0a84ff));font-weight:var(--fk-node-tree-breadcrumb-current-font-weight, var(--fk-font-weight-medium, 500))}.fk-node-tree-breadcrumb__separator{display:flex;align-items:center;color:var(--fk-node-tree-breadcrumb-separator-color, var(--fk-color-muted, #64748b));-webkit-user-select:none;user-select:none}\n"] }]
70
+ }], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: true }] }], selectedNodeId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedNodeId", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], nodeSelect: [{ type: i0.Output, args: ["nodeSelect"] }], hostClass: [{
71
+ type: HostBinding,
72
+ args: ['class']
73
+ }], role: [{
74
+ type: HostBinding,
75
+ args: ['attr.role']
76
+ }], ariaLabel: [{
77
+ type: HostBinding,
78
+ args: ['attr.aria-label']
79
+ }] } });
80
+
81
+ /**
82
+ * Generated bundle index. Do not edit.
83
+ */
84
+
85
+ export { NodeTreeBreadcrumbComponent, buildAncestryPath };
86
+ //# sourceMappingURL=frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs","sources":["../../../../packages/ui-ng/ui/node-tree-breadcrumb/node-tree-breadcrumb.utils.ts","../../../../packages/ui-ng/ui/node-tree-breadcrumb/node-tree-breadcrumb.component.ts","../../../../packages/ui-ng/ui/node-tree-breadcrumb/node-tree-breadcrumb.component.html","../../../../packages/ui-ng/ui/node-tree-breadcrumb/frame-kit-ui-ng-ui-node-tree-breadcrumb.ts"],"sourcesContent":["import type { TreeNode } from '@frame-kit/ui-ng/ui/node-tree';\nimport type { NodeTreeBreadcrumbItem } from './node-tree-breadcrumb.types';\n\n/**\n * Builds an ancestry path from the root to the given node.\n * Returns an array ordered root-first, selected-node-last.\n */\nexport function buildAncestryPath(\n nodeId: string,\n nodes: TreeNode[],\n): NodeTreeBreadcrumbItem[] {\n const nodeMap = new Map<string, TreeNode>();\n\n for (const node of nodes) {\n nodeMap.set(node.id, node);\n }\n\n const path: NodeTreeBreadcrumbItem[] = [];\n\n let current = nodeMap.get(nodeId);\n\n while (current) {\n path.push({\n id: current.id,\n label: current.label,\n icon: current.icon,\n });\n\n if (current.parentId) {\n current = nodeMap.get(current.parentId);\n } else {\n current = undefined;\n }\n }\n\n path.reverse();\n\n return path;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n input,\n output,\n} from '@angular/core';\n\nimport type { TreeNode } from '@frame-kit/ui-ng/ui/node-tree';\nimport type { NodeTreeBreadcrumbItem } from './node-tree-breadcrumb.types';\nimport { buildAncestryPath } from './node-tree-breadcrumb.utils';\n\n@Component({\n selector: 'fk-node-tree-breadcrumb',\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './node-tree-breadcrumb.component.html',\n styleUrl: './node-tree-breadcrumb.component.scss',\n})\nexport class NodeTreeBreadcrumbComponent {\n // ===== INPUTS =====\n /** Flat array of `TreeNode` objects used to compute the ancestry path. */\n readonly nodes = input.required<TreeNode[]>();\n /** ID of the node whose full ancestor path is displayed as breadcrumbs. */\n readonly selectedNodeId = input<string | undefined>();\n\n // ===== BASE PROPS =====\n readonly className = input<string>('');\n\n // ===== OUTPUTS =====\n /** Fires when the user clicks a breadcrumb, emitting that crumb's node data. */\n readonly nodeSelect = output<NodeTreeBreadcrumbItem>();\n\n // ===== COMPUTED =====\n readonly crumbs = computed<NodeTreeBreadcrumbItem[]>(() => {\n const id = this.selectedNodeId();\n\n if (!id) {\n return [];\n }\n\n return buildAncestryPath(id, this.nodes());\n });\n\n readonly classes = computed(() => {\n return ['fk-node-tree-breadcrumb', this.className()]\n .filter(Boolean)\n .join(' ');\n });\n\n @HostBinding('class')\n get hostClass() {\n return this.classes();\n }\n\n @HostBinding('attr.role')\n readonly role = 'navigation';\n\n @HostBinding('attr.aria-label')\n readonly ariaLabel = 'Breadcrumb';\n\n onCrumbClick(crumb: NodeTreeBreadcrumbItem): void {\n this.nodeSelect.emit(crumb);\n }\n}\n","<ol class=\"fk-node-tree-breadcrumb__list\">\n @for (crumb of crumbs(); track crumb.id; let last = $last) {\n <li class=\"fk-node-tree-breadcrumb__item\">\n @if (last) {\n <span class=\"fk-node-tree-breadcrumb__current\" aria-current=\"location\">\n {{ crumb.label }}\n </span>\n } @else {\n <button\n type=\"button\"\n class=\"fk-node-tree-breadcrumb__link\"\n (click)=\"onCrumbClick(crumb)\"\n >\n {{ crumb.label }}\n </button>\n\n <svg\n class=\"fk-node-tree-breadcrumb__separator\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n }\n </li>\n }\n</ol>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}