ngwr 14.4.0 → 14.5.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 (163) hide show
  1. package/README.md +12 -6
  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 +25 -5
  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-i18n.mjs +13 -0
  69. package/fesm2022/ngwr-i18n.mjs.map +1 -1
  70. package/fesm2022/ngwr-lightbox.mjs +25 -4
  71. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  72. package/fesm2022/ngwr-list.mjs +2 -2
  73. package/fesm2022/ngwr-list.mjs.map +1 -1
  74. package/fesm2022/ngwr-mention.mjs +18 -2
  75. package/fesm2022/ngwr-mention.mjs.map +1 -1
  76. package/fesm2022/ngwr-overlay.mjs +119 -4
  77. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  78. package/fesm2022/ngwr-popconfirm.mjs +19 -3
  79. package/fesm2022/ngwr-popconfirm.mjs.map +1 -1
  80. package/fesm2022/ngwr-popover-testing.mjs +22 -5
  81. package/fesm2022/ngwr-popover-testing.mjs.map +1 -1
  82. package/fesm2022/ngwr-popover.mjs +215 -27
  83. package/fesm2022/ngwr-popover.mjs.map +1 -1
  84. package/fesm2022/ngwr-segmented.mjs +34 -1
  85. package/fesm2022/ngwr-segmented.mjs.map +1 -1
  86. package/fesm2022/ngwr-select.mjs +15 -1
  87. package/fesm2022/ngwr-select.mjs.map +1 -1
  88. package/fesm2022/ngwr-table.mjs +10 -2
  89. package/fesm2022/ngwr-table.mjs.map +1 -1
  90. package/fesm2022/ngwr-toast.mjs +19 -2
  91. package/fesm2022/ngwr-toast.mjs.map +1 -1
  92. package/fesm2022/ngwr-tour.mjs +20 -6
  93. package/fesm2022/ngwr-tour.mjs.map +1 -1
  94. package/fesm2022/ngwr-tree.mjs +9 -2
  95. package/fesm2022/ngwr-tree.mjs.map +1 -1
  96. package/fesm2022/ngwr-version.mjs +1 -1
  97. package/fesm2022/ngwr-version.mjs.map +1 -1
  98. package/fesm2022/ngwr-window.mjs +18 -1
  99. package/fesm2022/ngwr-window.mjs.map +1 -1
  100. package/graph/styles/_index.scss +113 -0
  101. package/i18n/ar.json +5 -0
  102. package/i18n/cs.json +5 -0
  103. package/i18n/de.json +5 -0
  104. package/i18n/en.json +5 -0
  105. package/i18n/es.json +5 -0
  106. package/i18n/fr.json +5 -0
  107. package/i18n/he.json +5 -0
  108. package/i18n/hi.json +5 -0
  109. package/i18n/id.json +5 -0
  110. package/i18n/it.json +5 -0
  111. package/i18n/ja.json +5 -0
  112. package/i18n/ko.json +5 -0
  113. package/i18n/nl.json +5 -0
  114. package/i18n/pl.json +5 -0
  115. package/i18n/pt.json +5 -0
  116. package/i18n/ru.json +5 -0
  117. package/i18n/sv.json +5 -0
  118. package/i18n/tr.json +5 -0
  119. package/i18n/uk.json +5 -0
  120. package/i18n/vi.json +5 -0
  121. package/i18n/zh-TW.json +5 -0
  122. package/i18n/zh.json +5 -0
  123. package/llms-full.txt +13 -3
  124. package/llms.txt +20 -9
  125. package/mcp/providers.js +8 -2
  126. package/package.json +10 -1
  127. package/schematics/migrations/v14/index.js +90 -34
  128. package/schematics/migrations/v7/index.js +15 -4
  129. package/schematics/migrations/v8/index.js +13 -2
  130. package/schematics/migrations/v9/index.js +19 -10
  131. package/schematics/use/symbol-map.json +2 -0
  132. package/segmented/styles/_index.scss +8 -0
  133. package/skills/ngwr/SKILL.md +10 -5
  134. package/skills/ngwr/references/catalog.md +2 -0
  135. package/skills/ngwr/references/setup.md +2 -2
  136. package/styles.scss +1 -0
  137. package/table/styles/_index.scss +39 -12
  138. package/theme/styles/_focus.scss +7 -0
  139. package/types/ngwr-cascader.d.ts +7 -0
  140. package/types/ngwr-color-picker.d.ts +8 -0
  141. package/types/ngwr-context-menu.d.ts +10 -0
  142. package/types/ngwr-date-picker.d.ts +16 -0
  143. package/types/ngwr-dialog.d.ts +1 -0
  144. package/types/ngwr-drawer.d.ts +28 -0
  145. package/types/ngwr-dropdown.d.ts +9 -0
  146. package/types/ngwr-graph-testing.d.ts +190 -0
  147. package/types/ngwr-graph.d.ts +203 -0
  148. package/types/ngwr-i18n-en.d.ts +16 -5
  149. package/types/ngwr-i18n.d.ts +13 -0
  150. package/types/ngwr-lightbox.d.ts +15 -0
  151. package/types/ngwr-mention.d.ts +7 -0
  152. package/types/ngwr-overlay.d.ts +62 -4
  153. package/types/ngwr-popconfirm.d.ts +1 -0
  154. package/types/ngwr-popover-testing.d.ts +22 -5
  155. package/types/ngwr-popover.d.ts +28 -8
  156. package/types/ngwr-segmented.d.ts +16 -0
  157. package/types/ngwr-select.d.ts +7 -0
  158. package/types/ngwr-table.d.ts +8 -0
  159. package/types/ngwr-toast.d.ts +2 -0
  160. package/types/ngwr-tour.d.ts +6 -0
  161. package/types/ngwr-tree.d.ts +2 -1
  162. package/types/ngwr-version.d.ts +1 -1
  163. 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]`
@@ -451,7 +461,7 @@
451
461
  - import: `import { WrI18n } from 'ngwr/i18n'`
452
462
  - selector: `[wrT]`
453
463
  - exports: WrI18n, WrTPipe, WrTDirective, WR_I18N_CONFIG, DEFAULT_WR_I18N_CONFIG, WrI18nCatalog, WrI18nConfig, WrI18nConfigResolved, WrI18nParams, WrI18nMissingHandler, WR_I18N_LOADER, WrI18nLoader, WR_I18N_BASE_CATALOGS, WrI18nBaseCatalogs, WrI18nStaticLoader, WrI18nStaticCatalogs, WrI18nStaticScopedCatalogs, WrI18nHttpLoader, WrI18nHttpLoaderConfig, provideWrI18n, provideWrI18nBaseCatalogs, provideWrI18nStaticLoader, provideWrI18nHttpLoader, ProvideWrI18nOptions, useI18nText, readI18nText, useI18nFormatter
454
- - Reactive i18n service. Active locale lives on a signal, catalogs load lazily through a swappable loader (HTTP or static), and double-brace placeholders interpolate at render time. Scopes let feature modules ship and load their own catalogs.
464
+ - Reactive i18n service. Active locale lives on a signal, catalogs load lazily through a swappable loader (HTTP or static), and double-brace placeholders interpolate at render time. Scopes let feature modules ship and load their own catalogs. Keep ngwr's own strings with `provideWrI18nBaseCatalogs` rather than spreading `wrEn` into your catalog: a spread is shallow, so any namespace you share with ngwr, e.g. `common`, `validation`, `table`, keeps only the side spread last, and the other side's keys stop resolving with nothing logged — ngwr's components fall back to English and a `wrT` read of a lost key renders the raw key.
455
465
 
456
466
  ## ngwr/i18n/ar
457
467
  - import: `import { wrAr } from 'ngwr/i18n/ar'`
@@ -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
 
@@ -84,7 +84,12 @@ Add from their entry points as needed:
84
84
  / `select`, and `linkTarget` / `copyable` on `markdown`. There is deliberately no
85
85
  `color` key — a bound `[color]="null"` means "no intent", which a default cannot
86
86
  express without inventing a sentinel.
87
- - `provideWrI18n(...)` + `provideWrI18nStaticLoader(...)` — localization.
87
+ - `provideWrI18n(...)` + `provideWrI18nBaseCatalogs({ en: wrEn })` +
88
+ `provideWrI18nStaticLoader(...)` — localization. ngwr's catalogs go in as a
89
+ BASE, never spread into yours: a spread is shallow, so any namespace you share
90
+ with ngwr, e.g. `common`, `validation`, `table`, keeps only the side spread
91
+ last, and the other side's keys stop resolving with nothing logged — ngwr's
92
+ components fall back to English and a `wrT` read renders the raw key.
88
93
  - `provideWrDateAdapter(...)` — calendar + date-picker (`ngwr/date/adapters/fns`
89
94
  or `ngwr/date/adapters/luxon`).
90
95
 
@@ -106,8 +111,12 @@ one element at a time; a step whose target is missing is skipped, not floated.
106
111
 
107
112
  ## Upgrading to v14
108
113
 
109
- Run `ng update ngwr@14`. It rewrites the renames and REPORTS the rest — read its
110
- output, because the reported half is where the silent failures are.
114
+ Run `ng update ngwr@14`, once, from whatever major the app is on — it runs every
115
+ migration between the installed version and 14, in order. Do not step through the
116
+ majors, and never target a 7.x, 8.x or 9.x release: their schematics die with
117
+ `exports is not defined in ES module scope`. It rewrites the renames and REPORTS
118
+ the rest — read its output, because the reported half is where the silent
119
+ failures are.
111
120
 
112
121
  Rewritten for you (six renames, one word per concept):
113
122
 
@@ -169,7 +178,9 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
169
178
  - **Data** — `wr-table` (column pin/resize/drag-reorder, row selection,
170
179
  expandable rows, grouping, tree rows (`childrenKey`), summary rows,
171
180
  CSV export, virtualized body),
172
- `wr-pagination`, `wr-tree`, `wr-virtual-scroll`, `wr-sortable-list`
181
+ `wr-pagination`, `wr-tree`, `wr-graph` (read-only layered diagram: `nodes`
182
+ plus `{ from, to }` parent-to-child `edges`, each node a default card or an
183
+ `ng-template wrGraphNode`), `wr-virtual-scroll`, `wr-sortable-list`
173
184
  (drag-to-reorder, with `[wrDragHandle]` — both in ngwr/drag-drop).
174
185
  - **Feedback** — `wr-alert`, `wr-result`, `wr-empty`, `wr-skeleton`,
175
186
  `wr-spinner`.
@@ -238,17 +249,17 @@ before writing your own. Full catalog: https://ngwr.dev/reference/components.
238
249
  `wr-tree` and `wr-select` (search mode), alongside the standalone
239
250
  `wr-virtual-scroll` wrapper.
240
251
  - **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
252
+ `ngwr/<name>/testing`. 71 entry points so far, 106 exported harness names over
253
+ 105 distinct classes — `WrCalendarDayHarness` ships under two, since a date
243
254
  picker's popup IS a calendar — covering the
244
- form controls, the overlays, both data views, the navigation / disclosure set
255
+ form controls, the overlays, the data views, the navigation / disclosure set
245
256
  (`tabs`, `stepper`, `carousel`, `pagination`, `segmented`, `collapse`,
246
257
  `transfer`) and `markdown`: the form controls
247
258
  (`button`, `input`, `textarea`, `checkbox`, `switch`, `radio`, `select`,
248
259
  `input-number`, `input-otp`, `slider`, `rating`, `file-upload`, `color-picker`,
249
260
  `knob`, `form` for `<wr-form-field>`), the overlays (`date-picker`, `dropdown`,
250
261
  `popover`, `dialog`, `drawer`, `action-sheet`, `toast`, `context-menu`, `popconfirm`,
251
- `command-palette`, `cascader`, `mention`), the data views (`table`, `tree`),
262
+ `command-palette`, `cascader`, `mention`), the data views (`table`, `tree`, `graph`),
252
263
  `splitter`, `speed-dial`, `lightbox`, `tour`, `calendar`, `event-calendar`,
253
264
  `window`, `image-cropper`, every chart and eighteen of the twenty-one animations —
254
265
  every control, every overlay and every chart has one. `aurora`, `click-spark`,
package/mcp/providers.js CHANGED
@@ -46,8 +46,14 @@ const REQUIRED_PROVIDERS = [
46
46
  test: /^WrTPipe$|^WrTDirective$|^WrI18n/,
47
47
  // Two entry points, and the comment has to say so: the catalog `wrEn` is
48
48
  // `ngwr/i18n/en`, not `ngwr/i18n`, which exports neither catalog.
49
- provider: "provideWrI18n() + provideWrI18nStaticLoader({ en: wrEn }) // from 'ngwr/i18n' + 'ngwr/i18n/en'",
50
- why: 'the pipe and directive read from a catalog you provide',
49
+ //
50
+ // `wrEn` goes in as a BASE and the loader carries only the app's keys. A
51
+ // loader serves only the catalog it is given, so the other way to keep both
52
+ // is a spread, and a spread is shallow: it silently drops one side of every
53
+ // namespace the two catalogs share. This line is what an agent pastes, so it
54
+ // has to be the form that survives the app adding its first `common` key.
55
+ provider: "provideWrI18n() + provideWrI18nBaseCatalogs({ en: wrEn }) + provideWrI18nStaticLoader({ en: { … } }) // from 'ngwr/i18n' + 'ngwr/i18n/en'",
56
+ why: "the pipe and directive read from a catalog you provide. Register ngwr's with `provideWrI18nBaseCatalogs`, never spread it into yours: a spread is shallow, so any namespace you share with ngwr, e.g. `common`, `validation`, `table`, keeps only the side spread last, and the other side's keys stop resolving with nothing logged — ngwr's components fall back to English and a `wrT` read of a lost key renders the raw key",
51
57
  },
52
58
  ];
53
59
  export { REQUIRED_PROVIDERS };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngwr",
3
- "version": "14.4.0",
3
+ "version": "14.5.1",
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"