ng-primitives 0.97.0 → 0.99.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.
@@ -1,5 +1,5 @@
1
1
  import * as ng_primitives_portal from 'ng-primitives/portal';
2
- import { NgpOffset, NgpOverlayContent, NgpOffsetInput, NgpOverlay } from 'ng-primitives/portal';
2
+ import { NgpOffset, NgpShift, NgpOverlayContent, NgpOffsetInput, NgpShiftInput, NgpOverlay } from 'ng-primitives/portal';
3
3
  export { injectOverlayContext as injectPopoverContext } from 'ng-primitives/portal';
4
4
  import * as _angular_core from '@angular/core';
5
5
  import { Provider, OnDestroy, InjectOptions, Signal } from '@angular/core';
@@ -57,6 +57,12 @@ interface NgpPopoverConfig {
57
57
  * @default scroll
58
58
  */
59
59
  scrollBehavior: 'reposition' | 'block';
60
+ /**
61
+ * Configure shift behavior to keep the popover in view.
62
+ * Can be a boolean to enable/disable, or an object with padding and limiter options.
63
+ * @default undefined (enabled by default in overlay)
64
+ */
65
+ shift: NgpShift;
60
66
  }
61
67
  /**
62
68
  * Provide the default Popover configuration
@@ -126,6 +132,12 @@ declare class NgpPopoverTrigger<T = null> implements OnDestroy {
126
132
  * @default true
127
133
  */
128
134
  readonly flip: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
135
+ /**
136
+ * Configure shift behavior to keep the popover in view.
137
+ * Can be a boolean to enable/disable, or an object with padding and limiter options.
138
+ * @default undefined (enabled by default in overlay)
139
+ */
140
+ readonly shift: _angular_core.InputSignalWithTransform<NgpShift, NgpShiftInput>;
129
141
  /**
130
142
  * Define the container in which the popover should be attached.
131
143
  * @default document.body
@@ -191,7 +203,7 @@ declare class NgpPopoverTrigger<T = null> implements OnDestroy {
191
203
  */
192
204
  private createOverlay;
193
205
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgpPopoverTrigger<any>, never>;
194
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpPopoverTrigger<any>, "[ngpPopoverTrigger]", ["ngpPopoverTrigger"], { "popover": { "alias": "ngpPopoverTrigger"; "required": false; "isSignal": true; }; "disabled": { "alias": "ngpPopoverTriggerDisabled"; "required": false; "isSignal": true; }; "placement": { "alias": "ngpPopoverTriggerPlacement"; "required": false; "isSignal": true; }; "offset": { "alias": "ngpPopoverTriggerOffset"; "required": false; "isSignal": true; }; "showDelay": { "alias": "ngpPopoverTriggerShowDelay"; "required": false; "isSignal": true; }; "hideDelay": { "alias": "ngpPopoverTriggerHideDelay"; "required": false; "isSignal": true; }; "flip": { "alias": "ngpPopoverTriggerFlip"; "required": false; "isSignal": true; }; "container": { "alias": "ngpPopoverTriggerContainer"; "required": false; "isSignal": true; }; "closeOnOutsideClick": { "alias": "ngpPopoverTriggerCloseOnOutsideClick"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "ngpPopoverTriggerCloseOnEscape"; "required": false; "isSignal": true; }; "scrollBehavior": { "alias": "ngpPopoverTriggerScrollBehavior"; "required": false; "isSignal": true; }; "context": { "alias": "ngpPopoverTriggerContext"; "required": false; "isSignal": true; }; "anchor": { "alias": "ngpPopoverTriggerAnchor"; "required": false; "isSignal": true; }; }, { "openChange": "ngpPopoverTriggerOpenChange"; }, never, never, true, never>;
206
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpPopoverTrigger<any>, "[ngpPopoverTrigger]", ["ngpPopoverTrigger"], { "popover": { "alias": "ngpPopoverTrigger"; "required": false; "isSignal": true; }; "disabled": { "alias": "ngpPopoverTriggerDisabled"; "required": false; "isSignal": true; }; "placement": { "alias": "ngpPopoverTriggerPlacement"; "required": false; "isSignal": true; }; "offset": { "alias": "ngpPopoverTriggerOffset"; "required": false; "isSignal": true; }; "showDelay": { "alias": "ngpPopoverTriggerShowDelay"; "required": false; "isSignal": true; }; "hideDelay": { "alias": "ngpPopoverTriggerHideDelay"; "required": false; "isSignal": true; }; "flip": { "alias": "ngpPopoverTriggerFlip"; "required": false; "isSignal": true; }; "shift": { "alias": "ngpPopoverTriggerShift"; "required": false; "isSignal": true; }; "container": { "alias": "ngpPopoverTriggerContainer"; "required": false; "isSignal": true; }; "closeOnOutsideClick": { "alias": "ngpPopoverTriggerCloseOnOutsideClick"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "ngpPopoverTriggerCloseOnEscape"; "required": false; "isSignal": true; }; "scrollBehavior": { "alias": "ngpPopoverTriggerScrollBehavior"; "required": false; "isSignal": true; }; "context": { "alias": "ngpPopoverTriggerContext"; "required": false; "isSignal": true; }; "anchor": { "alias": "ngpPopoverTriggerAnchor"; "required": false; "isSignal": true; }; }, { "openChange": "ngpPopoverTriggerOpenChange"; }, never, never, true, never>;
195
207
  }
196
208
  type NgpPopoverPlacement = 'top' | 'right' | 'bottom' | 'left' | 'top-start' | 'top-end' | 'right-start' | 'right-end' | 'bottom-start' | 'bottom-end' | 'left-start' | 'left-end';
197
209
 
@@ -6,6 +6,10 @@ import { injectToastContext, NgpToast, NgpToastManager } from 'ng-primitives/toa
6
6
  selector: '<%= prefix %>-toast',
7
7
  imports: [NgpButton],
8
8
  hostDirectives: [NgpToast],
9
+ host: {
10
+ 'animate.enter': 'toast-enter',
11
+ 'animate.leave': 'toast-leave',
12
+ },
9
13
  template: `
10
14
  <p class="toast-title">{{ context.header }}</p>
11
15
  <p class="toast-description">{{ context.description }}</p>
@@ -17,11 +21,6 @@ import { injectToastContext, NgpToast, NgpToastManager } from 'ng-primitives/toa
17
21
  :host {
18
22
  position: absolute;
19
23
  touch-action: none;
20
- transition:
21
- transform 0.4s,
22
- opacity 0.4s,
23
- height 0.4s,
24
- box-shadow 0.2s;
25
24
  box-sizing: border-box;
26
25
  align-items: center;
27
26
  gap: 6px;
@@ -31,16 +30,16 @@ import { injectToastContext, NgpToast, NgpToastManager } from 'ng-primitives/toa
31
30
  border: 1px solid var(--ngp-border);
32
31
  padding: 12px 16px;
33
32
  opacity: 0;
34
- transition: all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);
35
33
  border-radius: 8px;
36
34
  z-index: var(--ngp-toast-z-index);
37
35
  grid-template-columns: 1fr auto;
38
36
  grid-template-rows: min-content min-content;
39
37
  column-gap: 12px;
40
38
  align-items: center;
41
- width: var(--ngp-toast-width);
39
+ width: 350px;
42
40
  height: fit-content;
43
41
  transform: var(--y);
42
+ transition: all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);
44
43
  }
45
44
 
46
45
  .toast-title {
@@ -133,7 +132,7 @@ import { injectToastContext, NgpToast, NgpToastManager } from 'ng-primitives/toa
133
132
 
134
133
  :host[data-expanded='true'] {
135
134
  --y: translateY(calc(var(--lift) * var(--ngp-toast-offset)));
136
- height: var(--ngp-toast-height);
135
+ height: auto;
137
136
  }
138
137
 
139
138
  :host[data-swiping='true'] {
@@ -161,6 +160,71 @@ import { injectToastContext, NgpToast, NgpToastManager } from 'ng-primitives/toa
161
160
  /* Fade out from 45px to 100px swipe */
162
161
  opacity: calc(1 - clamp(0, (var(--ngp-toast-swipe-y, 0px) - 45) / 55, 1));
163
162
  }
163
+
164
+ /* Truncate text only when toast is not front AND not expanded */
165
+ :host[data-front='false'][data-expanded='false'] .toast-title {
166
+ overflow: hidden;
167
+ text-overflow: ellipsis;
168
+ white-space: nowrap;
169
+ }
170
+
171
+ :host[data-front='false'][data-expanded='false'] .toast-description {
172
+ overflow: hidden;
173
+ text-overflow: ellipsis;
174
+ white-space: nowrap;
175
+ }
176
+
177
+ /* Angular animations based on position */
178
+
179
+ /* Bottom position animations */
180
+ :host[data-position-y='bottom'].toast-enter {
181
+ animation: toast-slide-in-bottom 400ms cubic-bezier(0.215, 0.61, 0.355, 1);
182
+ }
183
+
184
+ :host[data-position-y='bottom'].toast-leave {
185
+ opacity: 0;
186
+ transform: translateY(100%);
187
+ transition:
188
+ opacity 400ms cubic-bezier(0.215, 0.61, 0.355, 1),
189
+ transform 400ms cubic-bezier(0.215, 0.61, 0.355, 1);
190
+ }
191
+
192
+ /* Top position animations */
193
+ :host[data-position-y='top'].toast-enter {
194
+ animation: toast-slide-in-top 400ms cubic-bezier(0.215, 0.61, 0.355, 1);
195
+ }
196
+
197
+ :host[data-position-y='top'].toast-leave {
198
+ opacity: 0;
199
+ transform: translateY(-100%);
200
+ transition:
201
+ opacity 400ms cubic-bezier(0.215, 0.61, 0.355, 1),
202
+ transform 400ms cubic-bezier(0.215, 0.61, 0.355, 1);
203
+ }
204
+
205
+ /* Keyframes for bottom position */
206
+ @keyframes toast-slide-in-bottom {
207
+ from {
208
+ opacity: 0;
209
+ transform: translateY(100%);
210
+ }
211
+ to {
212
+ opacity: 1;
213
+ transform: translateY(0);
214
+ }
215
+ }
216
+
217
+ /* Keyframes for top position */
218
+ @keyframes toast-slide-in-top {
219
+ from {
220
+ opacity: 0;
221
+ transform: translateY(-100%);
222
+ }
223
+ to {
224
+ opacity: 1;
225
+ transform: translateY(0);
226
+ }
227
+ }
164
228
  `,
165
229
  })
166
230
  export class Toast<%= componentSuffix %> {
package/toast/index.d.ts CHANGED
@@ -216,4 +216,4 @@ interface NgpToastRef {
216
216
  }
217
217
 
218
218
  export { NgpToast, NgpToastManager, injectToastContext, provideToastConfig };
219
- export type { NgpToastConfig, NgpToastRef };
219
+ export type { NgpToastConfig, NgpToastOptions, NgpToastRef };
@@ -84,6 +84,10 @@ interface NgpToggleGroupState {
84
84
  * Whether the toggle group is disabled.
85
85
  */
86
86
  readonly disabled: WritableSignal<boolean>;
87
+ /**
88
+ * The orientation of the toggle group.
89
+ */
90
+ readonly orientation: WritableSignal<NgpOrientation>;
87
91
  /**
88
92
  * Select a value in the toggle group.
89
93
  */
@@ -1,5 +1,5 @@
1
1
  import * as ng_primitives_portal from 'ng-primitives/portal';
2
- import { NgpOffset, NgpOverlayContent, NgpOffsetInput, NgpOverlay } from 'ng-primitives/portal';
2
+ import { NgpOffset, NgpShift, NgpOverlayContent, NgpOffsetInput, NgpShiftInput, NgpOverlay } from 'ng-primitives/portal';
3
3
  export { injectOverlayContext as injectTooltipContext } from 'ng-primitives/portal';
4
4
  import * as _angular_core from '@angular/core';
5
5
  import { Provider, OnDestroy, Signal } from '@angular/core';
@@ -49,6 +49,12 @@ interface NgpTooltipConfig {
49
49
  * @default true
50
50
  */
51
51
  useTextContent: boolean;
52
+ /**
53
+ * Configure shift behavior to keep the tooltip in view.
54
+ * Can be a boolean to enable/disable, or an object with padding and limiter options.
55
+ * @default undefined (enabled by default in overlay)
56
+ */
57
+ shift: NgpShift;
52
58
  }
53
59
  /**
54
60
  * Provide the default Tooltip configuration
@@ -119,6 +125,12 @@ declare class NgpTooltipTrigger<T = null> implements OnDestroy {
119
125
  * @default true
120
126
  */
121
127
  readonly flip: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
128
+ /**
129
+ * Configure shift behavior to keep the tooltip in view.
130
+ * Can be a boolean to enable/disable, or an object with padding and limiter options.
131
+ * @default undefined (enabled by default in overlay)
132
+ */
133
+ readonly shift: _angular_core.InputSignalWithTransform<NgpShift, NgpShiftInput>;
122
134
  /**
123
135
  * Define the container in which the tooltip should be attached.
124
136
  * @default document.body
@@ -181,7 +193,7 @@ declare class NgpTooltipTrigger<T = null> implements OnDestroy {
181
193
  */
182
194
  setTooltipId(id: string): void;
183
195
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgpTooltipTrigger<any>, never>;
184
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpTooltipTrigger<any>, "[ngpTooltipTrigger]", ["ngpTooltipTrigger"], { "tooltip": { "alias": "ngpTooltipTrigger"; "required": false; "isSignal": true; }; "disabled": { "alias": "ngpTooltipTriggerDisabled"; "required": false; "isSignal": true; }; "placement": { "alias": "ngpTooltipTriggerPlacement"; "required": false; "isSignal": true; }; "offset": { "alias": "ngpTooltipTriggerOffset"; "required": false; "isSignal": true; }; "showDelay": { "alias": "ngpTooltipTriggerShowDelay"; "required": false; "isSignal": true; }; "hideDelay": { "alias": "ngpTooltipTriggerHideDelay"; "required": false; "isSignal": true; }; "flip": { "alias": "ngpTooltipTriggerFlip"; "required": false; "isSignal": true; }; "container": { "alias": "ngpTooltipTriggerContainer"; "required": false; "isSignal": true; }; "showOnOverflow": { "alias": "ngpTooltipTriggerShowOnOverflow"; "required": false; "isSignal": true; }; "context": { "alias": "ngpTooltipTriggerContext"; "required": false; "isSignal": true; }; "useTextContent": { "alias": "ngpTooltipTriggerUseTextContent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
196
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgpTooltipTrigger<any>, "[ngpTooltipTrigger]", ["ngpTooltipTrigger"], { "tooltip": { "alias": "ngpTooltipTrigger"; "required": false; "isSignal": true; }; "disabled": { "alias": "ngpTooltipTriggerDisabled"; "required": false; "isSignal": true; }; "placement": { "alias": "ngpTooltipTriggerPlacement"; "required": false; "isSignal": true; }; "offset": { "alias": "ngpTooltipTriggerOffset"; "required": false; "isSignal": true; }; "showDelay": { "alias": "ngpTooltipTriggerShowDelay"; "required": false; "isSignal": true; }; "hideDelay": { "alias": "ngpTooltipTriggerHideDelay"; "required": false; "isSignal": true; }; "flip": { "alias": "ngpTooltipTriggerFlip"; "required": false; "isSignal": true; }; "shift": { "alias": "ngpTooltipTriggerShift"; "required": false; "isSignal": true; }; "container": { "alias": "ngpTooltipTriggerContainer"; "required": false; "isSignal": true; }; "showOnOverflow": { "alias": "ngpTooltipTriggerShowOnOverflow"; "required": false; "isSignal": true; }; "context": { "alias": "ngpTooltipTriggerContext"; "required": false; "isSignal": true; }; "useTextContent": { "alias": "ngpTooltipTriggerUseTextContent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
185
197
  }
186
198
  type NgpTooltipPlacement = 'top' | 'right' | 'bottom' | 'left' | 'top-start' | 'top-end' | 'right-start' | 'right-end' | 'bottom-start' | 'bottom-end' | 'left-start' | 'left-end';
187
199