ngwr 14.4.0 → 14.5.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 (149) hide show
  1. package/README.md +3 -3
  2. package/fesm2022/ngwr-breadcrumbs.mjs +2 -2
  3. package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
  4. package/fesm2022/ngwr-cascader.mjs +15 -3
  5. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  6. package/fesm2022/ngwr-color-picker.mjs +18 -2
  7. package/fesm2022/ngwr-color-picker.mjs.map +1 -1
  8. package/fesm2022/ngwr-context-menu.mjs +35 -3
  9. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  10. package/fesm2022/ngwr-date-picker.mjs +30 -2
  11. package/fesm2022/ngwr-date-picker.mjs.map +1 -1
  12. package/fesm2022/ngwr-dialog.mjs +12 -1
  13. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  14. package/fesm2022/ngwr-drag-drop.mjs +2 -2
  15. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  16. package/fesm2022/ngwr-drawer.mjs +48 -2
  17. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  18. package/fesm2022/ngwr-dropdown.mjs +22 -2
  19. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  20. package/fesm2022/ngwr-graph-testing.mjs +243 -0
  21. package/fesm2022/ngwr-graph-testing.mjs.map +1 -0
  22. package/fesm2022/ngwr-graph.mjs +1112 -0
  23. package/fesm2022/ngwr-graph.mjs.map +1 -0
  24. package/fesm2022/ngwr-i18n-ar.mjs +5 -0
  25. package/fesm2022/ngwr-i18n-ar.mjs.map +1 -1
  26. package/fesm2022/ngwr-i18n-cs.mjs +5 -0
  27. package/fesm2022/ngwr-i18n-cs.mjs.map +1 -1
  28. package/fesm2022/ngwr-i18n-de.mjs +5 -0
  29. package/fesm2022/ngwr-i18n-de.mjs.map +1 -1
  30. package/fesm2022/ngwr-i18n-en.mjs +9 -0
  31. package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
  32. package/fesm2022/ngwr-i18n-es.mjs +5 -0
  33. package/fesm2022/ngwr-i18n-es.mjs.map +1 -1
  34. package/fesm2022/ngwr-i18n-fr.mjs +5 -0
  35. package/fesm2022/ngwr-i18n-fr.mjs.map +1 -1
  36. package/fesm2022/ngwr-i18n-he.mjs +5 -0
  37. package/fesm2022/ngwr-i18n-he.mjs.map +1 -1
  38. package/fesm2022/ngwr-i18n-hi.mjs +5 -0
  39. package/fesm2022/ngwr-i18n-hi.mjs.map +1 -1
  40. package/fesm2022/ngwr-i18n-id.mjs +5 -0
  41. package/fesm2022/ngwr-i18n-id.mjs.map +1 -1
  42. package/fesm2022/ngwr-i18n-it.mjs +5 -0
  43. package/fesm2022/ngwr-i18n-it.mjs.map +1 -1
  44. package/fesm2022/ngwr-i18n-ja.mjs +5 -0
  45. package/fesm2022/ngwr-i18n-ja.mjs.map +1 -1
  46. package/fesm2022/ngwr-i18n-ko.mjs +5 -0
  47. package/fesm2022/ngwr-i18n-ko.mjs.map +1 -1
  48. package/fesm2022/ngwr-i18n-nl.mjs +5 -0
  49. package/fesm2022/ngwr-i18n-nl.mjs.map +1 -1
  50. package/fesm2022/ngwr-i18n-pl.mjs +5 -0
  51. package/fesm2022/ngwr-i18n-pl.mjs.map +1 -1
  52. package/fesm2022/ngwr-i18n-pt.mjs +5 -0
  53. package/fesm2022/ngwr-i18n-pt.mjs.map +1 -1
  54. package/fesm2022/ngwr-i18n-ru.mjs +5 -0
  55. package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
  56. package/fesm2022/ngwr-i18n-sv.mjs +5 -0
  57. package/fesm2022/ngwr-i18n-sv.mjs.map +1 -1
  58. package/fesm2022/ngwr-i18n-tr.mjs +5 -0
  59. package/fesm2022/ngwr-i18n-tr.mjs.map +1 -1
  60. package/fesm2022/ngwr-i18n-uk.mjs +5 -0
  61. package/fesm2022/ngwr-i18n-uk.mjs.map +1 -1
  62. package/fesm2022/ngwr-i18n-vi.mjs +5 -0
  63. package/fesm2022/ngwr-i18n-vi.mjs.map +1 -1
  64. package/fesm2022/ngwr-i18n-zh-TW.mjs +5 -0
  65. package/fesm2022/ngwr-i18n-zh-TW.mjs.map +1 -1
  66. package/fesm2022/ngwr-i18n-zh.mjs +5 -0
  67. package/fesm2022/ngwr-i18n-zh.mjs.map +1 -1
  68. package/fesm2022/ngwr-lightbox.mjs +25 -4
  69. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  70. package/fesm2022/ngwr-list.mjs +2 -2
  71. package/fesm2022/ngwr-list.mjs.map +1 -1
  72. package/fesm2022/ngwr-mention.mjs +18 -2
  73. package/fesm2022/ngwr-mention.mjs.map +1 -1
  74. package/fesm2022/ngwr-overlay.mjs +119 -4
  75. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  76. package/fesm2022/ngwr-popconfirm.mjs +19 -3
  77. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  78. package/fesm2022/ngwr-popover-testing.mjs +22 -5
  79. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  80. package/fesm2022/ngwr-popover.mjs +215 -27
  81. package/fesm2022/ngwr-popover.mjs.map +1 -1
  82. package/fesm2022/ngwr-segmented.mjs +34 -1
  83. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  84. package/fesm2022/ngwr-select.mjs +15 -1
  85. package/fesm2022/ngwr-select.mjs.map +1 -1
  86. package/fesm2022/ngwr-toast.mjs +19 -2
  87. package/fesm2022/ngwr-toast.mjs.map +1 -1
  88. package/fesm2022/ngwr-tour.mjs +20 -6
  89. package/fesm2022/ngwr-tour.mjs.map +1 -1
  90. package/fesm2022/ngwr-tree.mjs +9 -2
  91. package/fesm2022/ngwr-tree.mjs.map +1 -1
  92. package/fesm2022/ngwr-version.mjs +1 -1
  93. package/fesm2022/ngwr-version.mjs.map +1 -1
  94. package/fesm2022/ngwr-window.mjs +18 -1
  95. package/fesm2022/ngwr-window.mjs.map +1 -1
  96. package/graph/styles/_index.scss +113 -0
  97. package/i18n/ar.json +5 -0
  98. package/i18n/cs.json +5 -0
  99. package/i18n/de.json +5 -0
  100. package/i18n/en.json +5 -0
  101. package/i18n/es.json +5 -0
  102. package/i18n/fr.json +5 -0
  103. package/i18n/he.json +5 -0
  104. package/i18n/hi.json +5 -0
  105. package/i18n/id.json +5 -0
  106. package/i18n/it.json +5 -0
  107. package/i18n/ja.json +5 -0
  108. package/i18n/ko.json +5 -0
  109. package/i18n/nl.json +5 -0
  110. package/i18n/pl.json +5 -0
  111. package/i18n/pt.json +5 -0
  112. package/i18n/ru.json +5 -0
  113. package/i18n/sv.json +5 -0
  114. package/i18n/tr.json +5 -0
  115. package/i18n/uk.json +5 -0
  116. package/i18n/vi.json +5 -0
  117. package/i18n/zh-TW.json +5 -0
  118. package/i18n/zh.json +5 -0
  119. package/llms-full.txt +12 -2
  120. package/llms.txt +8 -6
  121. package/package.json +10 -1
  122. package/schematics/use/symbol-map.json +2 -0
  123. package/segmented/styles/_index.scss +8 -0
  124. package/skills/ngwr/SKILL.md +1 -1
  125. package/skills/ngwr/references/catalog.md +2 -0
  126. package/styles.scss +1 -0
  127. package/theme/styles/_focus.scss +7 -0
  128. package/types/ngwr-cascader.d.ts +7 -0
  129. package/types/ngwr-color-picker.d.ts +8 -0
  130. package/types/ngwr-context-menu.d.ts +10 -0
  131. package/types/ngwr-date-picker.d.ts +16 -0
  132. package/types/ngwr-dialog.d.ts +1 -0
  133. package/types/ngwr-drawer.d.ts +28 -0
  134. package/types/ngwr-dropdown.d.ts +9 -0
  135. package/types/ngwr-graph-testing.d.ts +190 -0
  136. package/types/ngwr-graph.d.ts +203 -0
  137. package/types/ngwr-lightbox.d.ts +15 -0
  138. package/types/ngwr-mention.d.ts +7 -0
  139. package/types/ngwr-overlay.d.ts +62 -4
  140. package/types/ngwr-popconfirm.d.ts +1 -0
  141. package/types/ngwr-popover-testing.d.ts +22 -5
  142. package/types/ngwr-popover.d.ts +28 -8
  143. package/types/ngwr-segmented.d.ts +16 -0
  144. package/types/ngwr-select.d.ts +7 -0
  145. package/types/ngwr-toast.d.ts +2 -0
  146. package/types/ngwr-tour.d.ts +6 -0
  147. package/types/ngwr-tree.d.ts +2 -1
  148. package/types/ngwr-version.d.ts +1 -1
  149. package/types/ngwr-window.d.ts +1 -0
@@ -0,0 +1,113 @@
1
+ @use '../../theme/styles' as theme;
2
+
3
+ .wr-graph {
4
+ // The scroller's ground and its breathing room around the drawing.
5
+ --wr-graph-background: var(--wr-color-surface);
6
+ --wr-graph-padding: 1rem;
7
+ // Lines and arrowheads are kept quiet beside the cards: 60% of the muted role
8
+ // over the surface, 2.44:1 on white and 3.47:1 on the dark canvas (token
9
+ // arithmetic — no contrast gate measures an SVG stroke). That is under the 3:1
10
+ // WCAG 1.4.11 asks of a meaningful graphic in the light theme, and it is a
11
+ // maintainer's call rather than an oversight: every relation a line draws is
12
+ // also written out for assistive technology, and a consumer who needs the
13
+ // stronger line restores it through this hook.
14
+ --wr-graph-edge-color: color-mix(in srgb, var(--wr-color-on-surface-muted) 60%, var(--wr-color-surface));
15
+ // A whole pixel: a fractional stroke is antialiased into a smear that changes
16
+ // with the device pixel ratio, where a lighter colour stays crisp everywhere.
17
+ --wr-graph-edge-width: 1px;
18
+ // The default card, drawn when no `ng-template[wrGraphNode]` is given.
19
+ --wr-graph-card-background: var(--wr-color-surface);
20
+ --wr-graph-card-color: var(--wr-color-on-surface);
21
+ --wr-graph-card-border: var(--wr-color-outline);
22
+ --wr-graph-card-radius: var(--wr-border-radius-base);
23
+ --wr-graph-card-padding: 0.5rem 0.75rem;
24
+ --wr-graph-card-font-size: var(--wr-text-sm);
25
+
26
+ display: block;
27
+ // A grid or flex item's automatic minimum width is its min-content width, and
28
+ // the stage below is sized inline to the whole drawing — so without this the
29
+ // host refuses to shrink, stretches its track and the PAGE scrolls sideways.
30
+ // Zero lets the track decide, and the viewport's `overflow: auto` takes over.
31
+ min-width: 0;
32
+ max-width: 100%;
33
+ font-family: var(--wr-font-family-base);
34
+
35
+ // The component scrolls, never the page. `height: 100%` lets a host with a
36
+ // height constrain it; with no height it simply grows to the drawing.
37
+ &__viewport {
38
+ box-sizing: border-box;
39
+ max-width: 100%;
40
+ height: 100%;
41
+ padding: var(--wr-graph-padding);
42
+ overflow: auto;
43
+ background: var(--wr-graph-background);
44
+ border-radius: var(--wr-border-radius-base);
45
+ }
46
+
47
+ // Sized inline from the layout, so the scroll extent is known without measuring.
48
+ &__stage {
49
+ position: relative;
50
+ }
51
+
52
+ &__edges,
53
+ &__node {
54
+ position: absolute;
55
+ top: 0;
56
+ // rtl-ok: x is mirrored in TypeScript for RTL, so the origin stays the physical left edge
57
+ left: 0;
58
+ }
59
+
60
+ &__edges {
61
+ overflow: visible;
62
+ pointer-events: none;
63
+ }
64
+
65
+ &__edge {
66
+ fill: none;
67
+ stroke: var(--wr-graph-edge-color);
68
+ stroke-width: var(--wr-graph-edge-width);
69
+ stroke-linejoin: round;
70
+ }
71
+
72
+ // The arrowhead. Marker content inherits from the marker's own ancestors, which
73
+ // is why it takes the hook here rather than from the path that references it.
74
+ &__edges marker polygon {
75
+ fill: var(--wr-graph-edge-color);
76
+ }
77
+
78
+ &__node {
79
+ box-sizing: border-box;
80
+ }
81
+
82
+ &__card {
83
+ display: flex;
84
+ box-sizing: border-box;
85
+ align-items: center;
86
+ justify-content: center;
87
+ width: 100%;
88
+ height: 100%;
89
+ padding: var(--wr-graph-card-padding);
90
+ overflow: hidden;
91
+ color: var(--wr-graph-card-color);
92
+ font-size: var(--wr-graph-card-font-size);
93
+ line-height: 1.25;
94
+ text-align: center;
95
+ overflow-wrap: anywhere;
96
+ background: var(--wr-graph-card-background);
97
+ border: 1px solid var(--wr-graph-card-border);
98
+ border-radius: var(--wr-graph-card-radius);
99
+ }
100
+
101
+ // Each node's parents and children: read out, never drawn.
102
+ &__sr-only {
103
+ position: absolute;
104
+ width: 1px;
105
+ height: 1px;
106
+ padding: 0;
107
+ margin: -1px;
108
+ overflow: hidden;
109
+ clip: rect(0, 0, 0, 0);
110
+ white-space: nowrap;
111
+ border: 0;
112
+ }
113
+ }
package/i18n/ar.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "عداد"
348
348
  },
349
+ "graph": {
350
+ "label": "مخطط",
351
+ "parents": "الآباء: {{names}}.",
352
+ "children": "الأبناء: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "التقدم"
351
356
  },
package/i18n/cs.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Ukazatel"
348
348
  },
349
+ "graph": {
350
+ "label": "Graf",
351
+ "parents": "Rodiče: {{names}}.",
352
+ "children": "Potomci: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Průběh"
351
356
  },
package/i18n/de.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Messanzeige"
348
348
  },
349
+ "graph": {
350
+ "label": "Graph",
351
+ "parents": "Übergeordnet: {{names}}.",
352
+ "children": "Untergeordnet: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Fortschritt"
351
356
  },
package/i18n/en.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Gauge"
348
348
  },
349
+ "graph": {
350
+ "label": "Graph",
351
+ "parents": "Parents: {{names}}.",
352
+ "children": "Children: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Progress"
351
356
  },
package/i18n/es.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Indicador"
348
348
  },
349
+ "graph": {
350
+ "label": "Grafo",
351
+ "parents": "Padres: {{names}}.",
352
+ "children": "Hijos: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Progreso"
351
356
  },
package/i18n/fr.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Jauge"
348
348
  },
349
+ "graph": {
350
+ "label": "Graphe",
351
+ "parents": "Parents : {{names}}.",
352
+ "children": "Enfants : {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Progression"
351
356
  },
package/i18n/he.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "מחוון"
348
348
  },
349
+ "graph": {
350
+ "label": "גרף",
351
+ "parents": "הורים: {{names}}.",
352
+ "children": "ילדים: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "התקדמות"
351
356
  },
package/i18n/hi.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "गेज"
348
348
  },
349
+ "graph": {
350
+ "label": "ग्राफ़",
351
+ "parents": "पैरेंट: {{names}}।",
352
+ "children": "चाइल्ड: {{names}}।"
353
+ },
349
354
  "progress": {
350
355
  "label": "प्रगति"
351
356
  },
package/i18n/id.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Pengukur"
348
348
  },
349
+ "graph": {
350
+ "label": "Graf",
351
+ "parents": "Induk: {{names}}.",
352
+ "children": "Anak: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Kemajuan"
351
356
  },
package/i18n/it.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Indicatore"
348
348
  },
349
+ "graph": {
350
+ "label": "Grafo",
351
+ "parents": "Genitori: {{names}}.",
352
+ "children": "Figli: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Avanzamento"
351
356
  },
package/i18n/ja.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "ゲージ"
348
348
  },
349
+ "graph": {
350
+ "label": "グラフ",
351
+ "parents": "親:{{names}}。",
352
+ "children": "子:{{names}}。"
353
+ },
349
354
  "progress": {
350
355
  "label": "進行状況"
351
356
  },
package/i18n/ko.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "게이지"
348
348
  },
349
+ "graph": {
350
+ "label": "그래프",
351
+ "parents": "상위 항목: {{names}}.",
352
+ "children": "하위 항목: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "진행률"
351
356
  },
package/i18n/nl.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Meter"
348
348
  },
349
+ "graph": {
350
+ "label": "Graaf",
351
+ "parents": "Ouders: {{names}}.",
352
+ "children": "Kinderen: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Voortgang"
351
356
  },
package/i18n/pl.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Wskaźnik"
348
348
  },
349
+ "graph": {
350
+ "label": "Graf",
351
+ "parents": "Rodzice: {{names}}.",
352
+ "children": "Dzieci: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Postęp"
351
356
  },
package/i18n/pt.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Indicador"
348
348
  },
349
+ "graph": {
350
+ "label": "Grafo",
351
+ "parents": "Pais: {{names}}.",
352
+ "children": "Filhos: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Progresso"
351
356
  },
package/i18n/ru.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Индикатор"
348
348
  },
349
+ "graph": {
350
+ "label": "Граф",
351
+ "parents": "Родители: {{names}}.",
352
+ "children": "Дети: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Прогресс"
351
356
  },
package/i18n/sv.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Mätare"
348
348
  },
349
+ "graph": {
350
+ "label": "Graf",
351
+ "parents": "Föräldrar: {{names}}.",
352
+ "children": "Barn: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Förlopp"
351
356
  },
package/i18n/tr.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Gösterge"
348
348
  },
349
+ "graph": {
350
+ "label": "Çizge",
351
+ "parents": "Üst öğeler: {{names}}.",
352
+ "children": "Alt öğeler: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "İlerleme"
351
356
  },
package/i18n/uk.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Індикатор"
348
348
  },
349
+ "graph": {
350
+ "label": "Граф",
351
+ "parents": "Батьки: {{names}}.",
352
+ "children": "Діти: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Хід виконання"
351
356
  },
package/i18n/vi.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "Đồng hồ đo"
348
348
  },
349
+ "graph": {
350
+ "label": "Đồ thị",
351
+ "parents": "Nút cha: {{names}}.",
352
+ "children": "Nút con: {{names}}."
353
+ },
349
354
  "progress": {
350
355
  "label": "Tiến trình"
351
356
  },
package/i18n/zh-TW.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "儀表"
348
348
  },
349
+ "graph": {
350
+ "label": "圖",
351
+ "parents": "父節點:{{names}}。",
352
+ "children": "子節點:{{names}}。"
353
+ },
349
354
  "progress": {
350
355
  "label": "進度"
351
356
  },
package/i18n/zh.json CHANGED
@@ -346,6 +346,11 @@
346
346
  "gauge": {
347
347
  "label": "仪表盘"
348
348
  },
349
+ "graph": {
350
+ "label": "图",
351
+ "parents": "父节点:{{names}}。",
352
+ "children": "子节点:{{names}}。"
353
+ },
349
354
  "progress": {
350
355
  "label": "进度"
351
356
  },
package/llms-full.txt CHANGED
@@ -441,6 +441,16 @@
441
441
  - import: `import { WrGradientTextHarness } from 'ngwr/gradient-text/testing'`
442
442
  - exports: WrGradientTextHarness, WrGradientTextHarnessFilters
443
443
 
444
+ ## ngwr/graph
445
+ - import: `import { WrGraph } from 'ngwr/graph'`
446
+ - selector: `ng-template[wrGraphNode]`, `wr-graph`
447
+ - exports: WrGraph, WrGraphNodeTemplate, WrGraphEdge, WrGraphNode, WrGraphNodeContext
448
+ - Draws any graph of blocks joined parent to child — a node can have several parents as well as several children. The layout runs in layers from top to bottom without measuring anything, so a prerendered page ships the finished picture. Display only: the graph scrolls inside its own viewport, and nothing in it is selectable.
449
+
450
+ ## ngwr/graph/testing
451
+ - import: `import { WrGraphHarness } from 'ngwr/graph/testing'`
452
+ - exports: WrGraphHarness, WrGraphNodeHarness, WrGraphHarnessFilters, WrGraphNodeHarnessFilters
453
+
444
454
  ## ngwr/hotkey
445
455
  - import: `import { WrHotkey } from 'ngwr/hotkey'`
446
456
  - selector: `[wrHotkey]`
@@ -706,7 +716,7 @@
706
716
 
707
717
  ## ngwr/overlay
708
718
  - import: `import { WrOutsideClick } from 'ngwr/overlay'`
709
- - exports: wrAppendOverlayClose, wrMirrorOffsets, WrOutsideClick, WrOverlayContainer, provideWrOverlay, provideWrResponsiveOverlays, WR_OVERLAY, WR_OVERLAY_CONTAINER, WR_RESPONSIVE_OVERLAYS, wrPresentAsSheet, WrResponsiveOverlaysConfig
719
+ - exports: wrAppendOverlayClose, wrFollowDirection, wrMirrorOffsets, WrOutsideClick, WrOverlayContainer, provideWrOverlay, provideWrResponsiveOverlays, WR_OVERLAY, WR_OVERLAY_CONTAINER, WR_RESPONSIVE_OVERLAYS, wrPresentAsSheet, WrResponsiveOverlaysConfig
710
720
 
711
721
  ## ngwr/page-header
712
722
  - import: `import { WrPageHeader } from 'ngwr/page-header'`
@@ -747,7 +757,7 @@
747
757
  - import: `import { WrPopover } from 'ngwr/popover'`
748
758
  - selector: `[wrPopover]`
749
759
  - exports: WrPopover, WrPopoverPosition
750
- - Anchored content panel. Project a template (popover) or pass a plain string (tooltip — use `mode="tooltip"`). Click, hover, or focus to open. Built on CDK Overlay.
760
+ - Anchored content panel. Project a template (popover) or pass a plain string (tooltip — use `mode="tooltip"`). Click or hover to open; a tooltip also answers a keyboard focus. Built on CDK Overlay.
751
761
 
752
762
  ## ngwr/popover/testing
753
763
  - import: `import { WrPopoverHarness } from 'ngwr/popover/testing'`
package/llms.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # ngwr
2
2
 
3
3
  > Angular UI library — standalone, signals-first, zoneless, fully tree-shakable.
4
- > 225 secondary entry points, 174 component and directive classes, built on
4
+ > 227 secondary entry points, 177 component and directive classes, built on
5
5
  > `@angular/cdk` primitives. The only runtime dependency is `tslib`. Docs and
6
6
  > live demos: https://ngwr.dev — source: https://github.com/thekhegay/ngwr
7
7
 
@@ -169,7 +169,9 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
169
169
  - **Data** — `wr-table` (column pin/resize/drag-reorder, row selection,
170
170
  expandable rows, grouping, tree rows (`childrenKey`), summary rows,
171
171
  CSV export, virtualized body),
172
- `wr-pagination`, `wr-tree`, `wr-virtual-scroll`, `wr-sortable-list`
172
+ `wr-pagination`, `wr-tree`, `wr-graph` (read-only layered diagram: `nodes`
173
+ plus `{ from, to }` parent-to-child `edges`, each node a default card or an
174
+ `ng-template wrGraphNode`), `wr-virtual-scroll`, `wr-sortable-list`
173
175
  (drag-to-reorder, with `[wrDragHandle]` — both in ngwr/drag-drop).
174
176
  - **Feedback** — `wr-alert`, `wr-result`, `wr-empty`, `wr-skeleton`,
175
177
  `wr-spinner`.
@@ -238,17 +240,17 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
238
240
  `wr-tree` and `wr-select` (search mode), alongside the standalone
239
241
  `wr-virtual-scroll` wrapper.
240
242
  - **Testing** — CDK component harnesses ship beside the components they drive, at
241
- `ngwr/<name>/testing`. 70 entry points so far, 104 exported harness names over
242
- 103 distinct classes — `WrCalendarDayHarness` ships under two, since a date
243
+ `ngwr/<name>/testing`. 71 entry points so far, 106 exported harness names over
244
+ 105 distinct classes — `WrCalendarDayHarness` ships under two, since a date
243
245
  picker's popup IS a calendar — covering the
244
- form controls, the overlays, both data views, the navigation / disclosure set
246
+ form controls, the overlays, the data views, the navigation / disclosure set
245
247
  (`tabs`, `stepper`, `carousel`, `pagination`, `segmented`, `collapse`,
246
248
  `transfer`) and `markdown`: the form controls
247
249
  (`button`, `input`, `textarea`, `checkbox`, `switch`, `radio`, `select`,
248
250
  `input-number`, `input-otp`, `slider`, `rating`, `file-upload`, `color-picker`,
249
251
  `knob`, `form` for `<wr-form-field>`), the overlays (`date-picker`, `dropdown`,
250
252
  `popover`, `dialog`, `drawer`, `action-sheet`, `toast`, `context-menu`, `popconfirm`,
251
- `command-palette`, `cascader`, `mention`), the data views (`table`, `tree`),
253
+ `command-palette`, `cascader`, `mention`), the data views (`table`, `tree`, `graph`),
252
254
  `splitter`, `speed-dial`, `lightbox`, `tour`, `calendar`, `event-calendar`,
253
255
  `window`, `image-cropper`, every chart and eighteen of the twenty-one animations —
254
256
  every control, every overlay and every chart has one. `aurora`, `click-spark`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngwr",
3
- "version": "14.4.0",
3
+ "version": "14.5.0",
4
4
  "bin": {
5
5
  "ngwr-mcp": "mcp/server.js"
6
6
  },
@@ -316,6 +316,11 @@
316
316
  "types": "./types/ngwr-gradient-text.d.ts",
317
317
  "default": "./fesm2022/ngwr-gradient-text.mjs"
318
318
  },
319
+ "./graph": {
320
+ "sass": "./graph/styles/_index.scss",
321
+ "types": "./types/ngwr-graph.d.ts",
322
+ "default": "./fesm2022/ngwr-graph.mjs"
323
+ },
319
324
  "./grid": {
320
325
  "sass": "./styles/_grid.scss"
321
326
  },
@@ -795,6 +800,10 @@
795
800
  "types": "./types/ngwr-gradient-text-testing.d.ts",
796
801
  "default": "./fesm2022/ngwr-gradient-text-testing.mjs"
797
802
  },
803
+ "./graph/testing": {
804
+ "types": "./types/ngwr-graph-testing.d.ts",
805
+ "default": "./fesm2022/ngwr-graph-testing.mjs"
806
+ },
798
807
  "./hotkey": {
799
808
  "types": "./types/ngwr-hotkey.d.ts",
800
809
  "default": "./fesm2022/ngwr-hotkey.mjs"
@@ -91,6 +91,8 @@
91
91
  "WrGauge": "ngwr/gauge",
92
92
  "WrGlitchText": "ngwr/glitch-text",
93
93
  "WrGradientText": "ngwr/gradient-text",
94
+ "WrGraph": "ngwr/graph",
95
+ "WrGraphNodeTemplate": "ngwr/graph",
94
96
  "WrHotkey": "ngwr/hotkey",
95
97
  "WrHotkeyBinding": "ngwr/hotkey",
96
98
  "WrI18n": "ngwr/i18n",
@@ -70,6 +70,14 @@
70
70
  transition: transform 0.25s var(--wr-ease-out);
71
71
  }
72
72
 
73
+ // A direction flip mirrors the strip, which moves the thumb's slot by the whole
74
+ // width of it. Animated, that drags the pill across options it does not mark;
75
+ // the component sets this class for the tick the flip lands in so the pill is
76
+ // simply already there. Selection changes keep their slide.
77
+ &--flipping &__thumb {
78
+ transition: none;
79
+ }
80
+
73
81
  &--unselected &__thumb {
74
82
  opacity: 0;
75
83
  }
@@ -5,7 +5,7 @@ description: Build Angular UIs with the ngwr component library (standalone, sign
5
5
 
6
6
  # ngwr
7
7
 
8
- An Angular 22 UI library: 225 tree-shakable entry points, 112 of them shipping a selector.
8
+ An Angular 22 UI library: 227 tree-shakable entry points, 113 of them shipping a selector.
9
9
  Standalone, signals-first, zoneless, `ViewEncapsulation.None`. One runtime
10
10
  dependency (`tslib`).
11
11
 
@@ -89,6 +89,8 @@ root barrel for components.
89
89
  | `ngwr/glitch-text/testing` | `import { WrGlitchTextHarness } from 'ngwr/glitch-text/testing'` | — |
90
90
  | `ngwr/gradient-text` | `import { WrGradientText } from 'ngwr/gradient-text'` | `wr-gradient-text` |
91
91
  | `ngwr/gradient-text/testing` | `import { WrGradientTextHarness } from 'ngwr/gradient-text/testing'` | — |
92
+ | `ngwr/graph` | `import { WrGraph } from 'ngwr/graph'` | `ng-template[wrGraphNode]` `wr-graph` |
93
+ | `ngwr/graph/testing` | `import { WrGraphHarness } from 'ngwr/graph/testing'` | — |
92
94
  | `ngwr/hotkey` | `import { WrHotkey } from 'ngwr/hotkey'` | `[wrHotkey]` |
93
95
  | `ngwr/i18n` | `import { WrI18n } from 'ngwr/i18n'` | `[wrT]` |
94
96
  | `ngwr/i18n/ar` | `import { wrAr } from 'ngwr/i18n/ar'` | — |
package/styles.scss CHANGED
@@ -61,6 +61,7 @@
61
61
  @forward './gauge/styles';
62
62
  @forward './glitch-text/styles';
63
63
  @forward './gradient-text/styles';
64
+ @forward './graph/styles';
64
65
  @forward './icon/styles';
65
66
  @forward './image-cropper/styles';
66
67
  @forward './input/styles';
@@ -164,3 +164,10 @@
164
164
  .wr-alert__close:focus-visible {
165
165
  @include focus-ring;
166
166
  }
167
+
168
+ // Graph viewport — the scroller is the graph's one tab stop, so a keyboard user
169
+ // scrolling it needs to see where focus is. Safe as an OUTSET ring: the outline
170
+ // sits outside the scroller's own box, and `.wr-graph` sets no `overflow`.
171
+ .wr-graph__viewport:focus-visible {
172
+ @include focus-ring;
173
+ }
@@ -133,6 +133,13 @@ declare class WrCascader<T = string> implements FormValueControl<unknown> {
133
133
  private readonly scrollStrategies;
134
134
  private readonly destroyRef;
135
135
  private readonly injector;
136
+ /**
137
+ * Ambient reading direction, for the open panel alone — nothing in this
138
+ * component reads it directly. Optional so a bare `TestBed` needs no
139
+ * provider; `Directionality` is root-provided anyway, and a missing one
140
+ * simply reads as `ltr`.
141
+ */
142
+ private readonly dir;
136
143
  private overlayRef;
137
144
  constructor();
138
145
  protected onTriggerClick(): void;
@@ -415,6 +415,14 @@ declare class WrColorPickerTrigger {
415
415
  private readonly vcr;
416
416
  private readonly scrollStrategies;
417
417
  private readonly destroyRef;
418
+ private readonly injector;
419
+ /**
420
+ * Ambient reading direction, for the open panel alone — nothing in this
421
+ * directive reads it directly. Optional so a bare `TestBed` needs no
422
+ * provider; `Directionality` is root-provided anyway, and a missing one
423
+ * simply reads as `ltr`.
424
+ */
425
+ private readonly dir;
418
426
  protected readonly isOpen: _angular_core.WritableSignal<boolean>;
419
427
  private overlayRef;
420
428
  /** @internal Public so the host binding can read it. */
@@ -44,9 +44,18 @@ declare class WrContextMenu {
44
44
  readonly menu: _angular_core.InputSignal<WrContextMenuPanel>;
45
45
  private readonly host;
46
46
  private readonly overlay;
47
+ /**
48
+ * The reading direction the open menu has to keep up with.
49
+ *
50
+ * Optional inject, as on every other overlay here: `Directionality` is
51
+ * root-provided and so never null in an app, but a bare `TestBed` that
52
+ * provides nothing should still get a menu that opens.
53
+ */
54
+ private readonly dir;
47
55
  private readonly outsideClick;
48
56
  private readonly vcr;
49
57
  private readonly scrollStrategies;
58
+ private readonly injector;
50
59
  private readonly destroyRef;
51
60
  /**
52
61
  * Id of the menu element while this trigger's menu is open, published on the
@@ -219,6 +228,7 @@ declare class WrContextMenuItem {
219
228
  private readonly dir;
220
229
  private readonly vcr;
221
230
  private readonly scrollStrategies;
231
+ private readonly injector;
222
232
  private readonly destroyRef;
223
233
  private submenuRef;
224
234
  private submenuKeys;