ngx-strata 0.6.0 → 0.6.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-strata",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "A simple UI framework for quickly prototyping angular applications with a bit of flair.",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -89,7 +89,7 @@ for each component are stored in separate files.
89
89
 
90
90
  - **Accordion** (`st-accordion-group`): Read
91
91
  [`components/accordion.md`](components/accordion.md)
92
- - **Action-menu** (`st-action-menu`): Read
92
+ - **Action-menu** (`st-action-menu`, `[stContextMenu]`): Read
93
93
  [`components/action-menu.md`](components/action-menu.md)
94
94
  - **Alert** (`st-alert`): Read [`components/alert.md`](components/alert.md)
95
95
  - **Avatar** (`st-avatar`): Read [`components/avatar.md`](components/avatar.md)
@@ -152,6 +152,8 @@ for each component are stored in separate files.
152
152
  [`components/text-stack.md`](components/text-stack.md)
153
153
  - **Theming** (`[stTheme]`): Read
154
154
  [`components/theming.md`](components/theming.md)
155
- - **Time-picker** (`st-time-picker`): Read
156
- [`components/time-picker.md`](components/time-picker.md)
155
+ - **Timepicker** (`st-timepicker`): Read
156
+ [`components/timepicker.md`](components/timepicker.md)
157
+ - **Time-stepper** (`st-time-stepper`): Read
158
+ [`components/time-stepper.md`](components/time-stepper.md)
157
159
  - **Toggle** (`st-toggle`): Read [`components/toggle.md`](components/toggle.md)
@@ -6,9 +6,15 @@ This file contains the AI documentation for the `action-menu` feature and its re
6
6
  - **Selector**: `st-action-menu`
7
7
  - **Imports**: `StrataActionMenuComponent`
8
8
  - **Inputs**:
9
- - `[placement] (Placement)`
10
- - `[buttonSize] (ButtonSize)`
11
- - `[closeOnOutsideClick] (boolean)`
9
+ - `[placement] (Placement)`: Defaults to `'bottom-end'`.
10
+ - `[buttonSize] (ButtonSize)`: Defaults to `'md'`.
11
+ - `[closeOnOutsideClick] (boolean)`: Defaults to `true`.
12
+ - `[trigger] (boolean)`: Defaults to `true`. When `false`, the button trigger is not rendered (useful for context-only menus).
13
+ - **Methods**:
14
+ - `open()`: Opens the action menu.
15
+ - `close()`: Closes the action menu.
16
+ - `toggle()`: Toggles the action menu state.
17
+ - `openAt(position: { x: number; y: number } | MouseEvent | PointerEvent, placement?: Placement)`: Opens the menu at mouse/virtual element coordinates.
12
18
 
13
19
  ## ActionMenuItem (`<st-action-menu-item>`)
14
20
  - **Selector**: `st-action-menu-item`
@@ -19,6 +25,16 @@ This file contains the AI documentation for the `action-menu` feature and its re
19
25
  - **Outputs**:
20
26
  - `(menuItemClicked)`
21
27
 
28
+ ## ContextMenu Directive (`[stContextMenu]`)
29
+ - **Selector**: `[stContextMenu]`
30
+ - **Imports**: `StrataContextMenuDirective`
31
+ - **Inputs**:
32
+ - `[stContextMenu] (StrataActionMenuComponent)`: The target action menu to open on right-click.
33
+ - `[stContextMenuDisabled] (boolean)`: Disables context menu behavior (allows native browser context menu).
34
+ - `[stContextMenuPlacement] (Placement)`: Placement of menu relative to cursor (defaults to `'bottom-start'`).
35
+ - **Outputs**:
36
+ - `(contextMenuOpened)`: Emitted with `MouseEvent` when the context menu opens.
37
+
22
38
  ## Usage Example
23
39
 
24
40
  ```html
@@ -42,6 +58,22 @@ This file contains the AI documentation for the `action-menu` feature and its re
42
58
  Export
43
59
  </st-action-menu-item>
44
60
  </st-action-menu>
61
+
62
+ <!-- Context Menu Trigger on Element -->
63
+ <div [stContextMenu]="contextMenu" class="right-click-zone">
64
+ Right-click here to view actions
65
+ </div>
66
+
67
+ <st-action-menu #contextMenu [trigger]="false">
68
+ <st-action-menu-item (menuItemClicked)="copy()">
69
+ <st-icon name="copy" area="start"></st-icon>
70
+ Copy
71
+ </st-action-menu-item>
72
+ <st-action-menu-item (menuItemClicked)="delete()">
73
+ <st-icon name="trash" area="start"></st-icon>
74
+ Delete
75
+ </st-action-menu-item>
76
+ </st-action-menu>
45
77
  ```
46
78
 
47
79
 
@@ -39,6 +39,9 @@ The File Upload component provides a stylish, accessible dropzone for selecting
39
39
  | `disabled` | `input<boolean>` | `false` | Disable interactions |
40
40
  | `label` | `input<string>` | `'Choose a file or drag & drop it here'` | Primary prompt text |
41
41
  | `hint` | `input<string \| undefined>` | `undefined` | Secondary help text |
42
+ | `camera` | `input<boolean \| undefined>` | `undefined` | Tri-state flag: `undefined` auto-enables camera button for image uploads, `false` disables it, `true` forces it |
43
+ | `choosePhotoLabel` | `input<string>` | `'Choose Photo'` | Accessible text label for the gallery/browse button |
44
+ | `takePhotoLabel` | `input<string>` | `'Take Photo'` | Accessible text label for the camera button |
42
45
 
43
46
  ### Outputs
44
47
 
@@ -50,5 +53,6 @@ The File Upload component provides a stylish, accessible dropzone for selecting
50
53
 
51
54
  ### Methods
52
55
 
53
- - `browse()`: Opens the system file selection dialog.
56
+ - `browse(event?: Event)`: Opens the system file selection dialog.
57
+ - `browseCamera(event?: Event)`: Opens the native camera directly via `capture="environment"`.
54
58
  - `clear()`: Clears the native input value.
@@ -21,6 +21,6 @@ This file contains the AI documentation for the `icon` feature and its related c
21
21
  ```
22
22
 
23
23
  > **CRITICAL RULE FOR AI AGENTS regarding Icons:**
24
- > NEVER guess an icon name. Before using an `<st-icon>`, you MUST verify that the icon is registered in the host application (usually located in `src/app/shared/icon.config.ts`). Alternatively, you may use one of the **ngx-strata Base Icons**: <!-- BASE_ICONS_START -->`question`, `arrow-right`, `arrow-left`, `arrow-up`, `arrow-down`, `close`, `expand-up-down`, `clipboard`, `more`, `check`, or `calendar`<!-- BASE_ICONS_END -->. If the icon you want to use is NOT registered, you must STOP and ask the user to add it.
24
+ > NEVER guess an icon name. Before using an `<st-icon>`, you MUST verify that the icon is registered in the host application (usually located in `src/app/shared/icon.config.ts`). Alternatively, you may use one of the **ngx-strata Base Icons**: <!-- BASE_ICONS_START -->`question`, `arrow-right`, `arrow-left`, `arrow-up`, `arrow-down`, `close`, `expand-up-down`, `clipboard`, `more`, `check`, `calendar`, `clock`, `upload`, `camera`, or `image`<!-- BASE_ICONS_END -->. If the icon you want to use is NOT registered, you must STOP and ask the user to add it.
25
25
 
26
26
  > **Note to AI Agents**: Prioritize using these components over raw HTML equivalents. Use modern Angular Signals (input(), input.required(), and output()) for all data/event bindings. Do not use legacy @Input() or @Output() decorators.
@@ -0,0 +1,46 @@
1
+ # ngx-strata: time-stepper Feature
2
+
3
+ This file contains the AI documentation for the `st-time-stepper` inline component.
4
+
5
+ ## Time Stepper Component (`<st-time-stepper>`)
6
+ The embedded/inline column stepper widget for selecting hours, minutes, and seconds. Ideal for embedding directly into cards, modals, or custom layouts.
7
+
8
+ - **Selector**: `st-time-stepper`
9
+ - **Imports**: `StrataTimeStepperComponent`
10
+ - **Inputs & Models**:
11
+ - `[(value)] (string | Date | null)`: Two-way Signal model for time value (e.g., `'14:30'`, `'14:30:00'`, or a `Date` instance).
12
+ - `[format] ('12h' | '24h')`: Time notation format. Defaults to `'24h'`.
13
+ - `[showSeconds] (boolean)`: Whether seconds column is visible. Defaults to `false`.
14
+ - `[minuteStep] (number)`: Step interval for incrementing/decrementing minutes. Defaults to `1`.
15
+ - `[disabled] (boolean)`: Disables the time stepper controls.
16
+
17
+ ## Forms Integration
18
+ `StrataTimeStepperComponent` implements `ControlValueAccessor` and seamlessly supports both `[(ngModel)]` and Reactive Forms (`formControlName` / `[formControl]`).
19
+
20
+ ## Usage Examples
21
+
22
+ ### 1. 24-Hour Time Stepper
23
+ ```html
24
+ <st-time-stepper
25
+ [(value)]="selectedTime"
26
+ [minuteStep]="5"
27
+ />
28
+ ```
29
+
30
+ ### 2. Embedded in a Card
31
+ ```html
32
+ <st-card>
33
+ <st-time-stepper [(value)]="alarmTime" />
34
+ </st-card>
35
+ ```
36
+
37
+ ### 3. 12-Hour Format with Seconds
38
+ ```html
39
+ <st-time-stepper
40
+ [(value)]="appointmentTime"
41
+ format="12h"
42
+ [showSeconds]="true"
43
+ />
44
+ ```
45
+
46
+ > **Note to AI Agents**: Prioritize using these components over raw HTML equivalents. Use modern Angular Signals (input(), input.required(), model(), and output()) for all data/event bindings. Do not use legacy @Input() or @Output() decorators.
@@ -0,0 +1,60 @@
1
+ # ngx-strata: timepicker Feature
2
+
3
+ This file contains the AI documentation for the `st-timepicker` form control component.
4
+
5
+ ## Time Picker Form Control (`<st-timepicker>`)
6
+ A standalone form input component equipped with an input box, clock trigger icon, and dropdown overlay hosting the time selection controls.
7
+
8
+ - **Selector**: `st-timepicker`
9
+ - **Imports**: `StrataTimepickerComponent`
10
+ - **Inputs & Models**:
11
+ - `[(value)] (string | Date | null)`: Two-way Signal model for time value (e.g., `'14:30'`, `'14:30:00'`, or a `Date` instance).
12
+ - `[label] (string | undefined)`: Label text rendered above the input.
13
+ - `[placeholder] (string)`: Input placeholder text. Defaults to `'Select time'`.
14
+ - `[format] ('12h' | '24h')`: Display format and parsing mode. Defaults to `'24h'`.
15
+ - `[size] ('sm' | 'md' | 'lg')`: Visual control size. Defaults to `'md'`.
16
+ - `[showSeconds] (boolean)`: Whether to include seconds in display and dropdown. Defaults to `false`.
17
+ - `[minuteStep] (number)`: Step interval for minutes. Defaults to `1`.
18
+ - `[clearable] (boolean)`: Shows clear button when a value is selected. Defaults to `true`.
19
+ - `[disabled] (boolean)`: Disables the form control. Defaults to `false`.
20
+ - `[readonly] (boolean)`: Read-only mode. Defaults to `false`.
21
+ - `[fullWidth] (boolean)`: Expands control to full container width. Defaults to `false`.
22
+ - `[state] ('default' | 'error' | 'success' | 'warning')`: Feedback validation state.
23
+ - `[message] (string | undefined)`: Helper/validation message below the input.
24
+ - `(timeSelected)`: Emitted when time value changes.
25
+
26
+ ## Forms Integration
27
+ `StrataTimepickerComponent` implements `ControlValueAccessor` and seamlessly supports both `[(ngModel)]` and Reactive Forms (`formControlName` / `[formControl]`).
28
+
29
+ ## Usage Examples
30
+
31
+ ### 1. Basic 24-Hour Timepicker
32
+ ```html
33
+ <st-timepicker
34
+ label="Departure Time"
35
+ placeholder="Select departure time"
36
+ [(value)]="departureTime"
37
+ />
38
+ ```
39
+
40
+ ### 2. 12-Hour AM/PM Timepicker with Seconds
41
+ ```html
42
+ <st-timepicker
43
+ label="Appointment Time"
44
+ [(value)]="appointmentTime"
45
+ format="12h"
46
+ [showSeconds]="true"
47
+ />
48
+ ```
49
+
50
+ ### 3. Step Intervals and Size
51
+ ```html
52
+ <st-timepicker
53
+ size="sm"
54
+ label="Meeting Slot"
55
+ [minuteStep]="15"
56
+ [(value)]="meetingSlot"
57
+ />
58
+ ```
59
+
60
+ > **Note to AI Agents**: Prioritize using these components over raw HTML equivalents. Use modern Angular Signals (input(), input.required(), model(), and output()) for all data/event bindings. Do not use legacy @Input() or @Output() decorators.
@@ -1,6 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnInit, OnDestroy, AfterContentInit, EnvironmentProviders, InjectionToken, Provider, PipeTransform, ElementRef, OnChanges, TemplateRef, Renderer2, AfterViewInit, AfterContentChecked, SimpleChanges, Type, ViewContainerRef, QueryList, OutputEmitterRef } from '@angular/core';
3
- import { Placement } from '@floating-ui/dom';
3
+ import { Placement, ReferenceElement } from '@floating-ui/dom';
4
4
  import * as _angular_platform_browser from '@angular/platform-browser';
5
5
  import { SafeHtml, DomSanitizer } from '@angular/platform-browser';
6
6
  import { ControlValueAccessor } from '@angular/forms';
@@ -263,6 +263,7 @@ declare class StrataOverlayDirective implements OnChanges, OnDestroy {
263
263
  overlayPlacement: _angular_core.InputSignal<Placement>;
264
264
  overlayOffset: _angular_core.InputSignal<number>;
265
265
  overlayFitViewport: _angular_core.InputSignal<boolean>;
266
+ overlayTarget: _angular_core.InputSignal<ReferenceElement | null>;
266
267
  private readonly element;
267
268
  private readonly viewContainerRef;
268
269
  private readonly config;
@@ -270,13 +271,14 @@ declare class StrataOverlayDirective implements OnChanges, OnDestroy {
270
271
  private cleanup?;
271
272
  private viewRef?;
272
273
  ngOnChanges(): void;
274
+ private getTarget;
273
275
  private create;
274
276
  private updatePosition;
275
277
  private destroy;
276
278
  getOverlayElement(): HTMLElement | undefined;
277
279
  ngOnDestroy(): void;
278
280
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrataOverlayDirective, never>;
279
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrataOverlayDirective, "[stOverlay]", never, { "stOverlay": { "alias": "stOverlay"; "required": true; "isSignal": true; }; "overlayOpen": { "alias": "overlayOpen"; "required": false; "isSignal": true; }; "overlayPlacement": { "alias": "overlayPlacement"; "required": false; "isSignal": true; }; "overlayOffset": { "alias": "overlayOffset"; "required": false; "isSignal": true; }; "overlayFitViewport": { "alias": "overlayFitViewport"; "required": false; "isSignal": true; }; }, { "overlayOpen": "overlayOpenChange"; }, never, never, true, never>;
281
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrataOverlayDirective, "[stOverlay]", never, { "stOverlay": { "alias": "stOverlay"; "required": true; "isSignal": true; }; "overlayOpen": { "alias": "overlayOpen"; "required": false; "isSignal": true; }; "overlayPlacement": { "alias": "overlayPlacement"; "required": false; "isSignal": true; }; "overlayOffset": { "alias": "overlayOffset"; "required": false; "isSignal": true; }; "overlayFitViewport": { "alias": "overlayFitViewport"; "required": false; "isSignal": true; }; "overlayTarget": { "alias": "overlayTarget"; "required": false; "isSignal": true; }; }, { "overlayOpen": "overlayOpenChange"; }, never, never, true, never>;
280
282
  }
281
283
 
282
284
  declare class StrataActionMenuComponent {
@@ -287,12 +289,37 @@ declare class StrataActionMenuComponent {
287
289
  placement: _angular_core.InputSignal<Placement>;
288
290
  buttonSize: _angular_core.InputSignal<ButtonSize>;
289
291
  closeOnOutsideClick: _angular_core.InputSignal<boolean>;
292
+ trigger: _angular_core.InputSignal<boolean>;
290
293
  elementRef: ElementRef<HTMLElement>;
291
294
  renderer: Renderer2;
292
295
  menuOpen: _angular_core.WritableSignal<boolean>;
296
+ customTarget: _angular_core.WritableSignal<ReferenceElement | null>;
297
+ contextMenuPlacement: _angular_core.WritableSignal<Placement | null>;
298
+ effectivePlacement: _angular_core.Signal<Placement>;
293
299
  constructor();
300
+ open(): void;
301
+ close(): void;
302
+ toggle(): void;
303
+ openAt(position: {
304
+ x: number;
305
+ y: number;
306
+ } | MouseEvent | PointerEvent, placement?: Placement): void;
294
307
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrataActionMenuComponent, never>;
295
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrataActionMenuComponent, "st-action-menu", never, { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "buttonSize": { "alias": "buttonSize"; "required": false; "isSignal": true; }; "closeOnOutsideClick": { "alias": "closeOnOutsideClick"; "required": false; "isSignal": true; }; }, {}, ["projectedButton", "actionMenuItems"], ["button[stButton]", "st-action-menu-item"], true, never>;
308
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrataActionMenuComponent, "st-action-menu", never, { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "buttonSize": { "alias": "buttonSize"; "required": false; "isSignal": true; }; "closeOnOutsideClick": { "alias": "closeOnOutsideClick"; "required": false; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; }, {}, ["projectedButton", "actionMenuItems"], ["button[stButton]", "st-action-menu-item"], true, never>;
309
+ }
310
+
311
+ declare class StrataContextMenuDirective implements OnInit, OnDestroy {
312
+ stContextMenu: _angular_core.InputSignal<StrataActionMenuComponent | null | undefined>;
313
+ stContextMenuDisabled: _angular_core.InputSignal<boolean>;
314
+ stContextMenuPlacement: _angular_core.InputSignal<Placement>;
315
+ contextMenuOpened: _angular_core.OutputEmitterRef<MouseEvent>;
316
+ private readonly elementRef;
317
+ private readonly renderer;
318
+ private unlisten?;
319
+ ngOnInit(): void;
320
+ ngOnDestroy(): void;
321
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrataContextMenuDirective, never>;
322
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StrataContextMenuDirective, "[stContextMenu]", never, { "stContextMenu": { "alias": "stContextMenu"; "required": true; "isSignal": true; }; "stContextMenuDisabled": { "alias": "stContextMenuDisabled"; "required": false; "isSignal": true; }; "stContextMenuPlacement": { "alias": "stContextMenuPlacement"; "required": false; "isSignal": true; }; }, { "contextMenuOpened": "contextMenuOpened"; }, never, never, true, never>;
296
323
  }
297
324
 
298
325
  declare class StrataAlertComponent {
@@ -472,7 +499,7 @@ interface DateRangePreset {
472
499
  };
473
500
  }
474
501
 
475
- declare class StrataTimePickerComponent implements ControlValueAccessor {
502
+ declare class StrataTimeStepperComponent implements ControlValueAccessor {
476
503
  format: _angular_core.InputSignal<TimeFormat>;
477
504
  showSeconds: _angular_core.InputSignal<boolean>;
478
505
  minuteStep: _angular_core.InputSignal<number>;
@@ -508,8 +535,61 @@ declare class StrataTimePickerComponent implements ControlValueAccessor {
508
535
  registerOnChange(fn: (val: string | Date | null) => void): void;
509
536
  registerOnTouched(fn: () => void): void;
510
537
  setDisabledState(isDisabled: boolean): void;
511
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrataTimePickerComponent, never>;
512
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrataTimePickerComponent, "st-time-picker", never, { "format": { "alias": "format"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
538
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrataTimeStepperComponent, never>;
539
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrataTimeStepperComponent, "st-time-stepper", never, { "format": { "alias": "format"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
540
+ }
541
+
542
+ declare class StrataTimepickerComponent implements ControlValueAccessor {
543
+ private readonly defaultId;
544
+ label: _angular_core.InputSignal<string | undefined>;
545
+ id: _angular_core.InputSignal<string | undefined>;
546
+ name: _angular_core.InputSignal<string | undefined>;
547
+ placeholder: _angular_core.InputSignal<string>;
548
+ size: _angular_core.InputSignal<DatePickerSize>;
549
+ placement: _angular_core.InputSignal<Placement>;
550
+ format: _angular_core.InputSignal<TimeFormat>;
551
+ showSeconds: _angular_core.InputSignalWithTransform<boolean, unknown>;
552
+ minuteStep: _angular_core.InputSignal<number>;
553
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
554
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
555
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
556
+ fullWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
557
+ state: _angular_core.InputSignal<InputControlState | undefined>;
558
+ error: _angular_core.InputSignalWithTransform<boolean, unknown>;
559
+ message: _angular_core.InputSignal<string | undefined>;
560
+ colorMessage: _angular_core.InputSignalWithTransform<boolean, unknown>;
561
+ value: _angular_core.ModelSignal<string | Date | null>;
562
+ timeSelected: _angular_core.OutputEmitterRef<string | Date | null>;
563
+ open: _angular_core.WritableSignal<boolean>;
564
+ textInputValue: _angular_core.WritableSignal<string>;
565
+ private cvaDisabled;
566
+ effectiveDisabled: _angular_core.Signal<boolean>;
567
+ effectiveId: _angular_core.Signal<string>;
568
+ readonly effectiveState: _angular_core.Signal<InputControlState>;
569
+ readonly isMessageError: _angular_core.Signal<boolean>;
570
+ readonly isMessageSuccess: _angular_core.Signal<boolean>;
571
+ readonly isMessageWarning: _angular_core.Signal<boolean>;
572
+ private onChange;
573
+ private onTouched;
574
+ private overlayDirective;
575
+ private elementRef;
576
+ private renderer;
577
+ private destroyRef;
578
+ constructor();
579
+ toggle(event?: Event): void;
580
+ onInputTextChange(value: string): void;
581
+ onInputBlur(): void;
582
+ onStepperTimeSelected(val: string | Date | null): void;
583
+ clear(event: Event): void;
584
+ private formatTimeValue;
585
+ private parseTimeString;
586
+ private updateTimeValue;
587
+ writeValue(val: string | Date | null): void;
588
+ registerOnChange(fn: (val: string | Date | null) => void): void;
589
+ registerOnTouched(fn: () => void): void;
590
+ setDisabledState(isDisabled: boolean): void;
591
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrataTimepickerComponent, never>;
592
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrataTimepickerComponent, "st-timepicker", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "colorMessage": { "alias": "colorMessage"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "timeSelected": "timeSelected"; }, never, never, true, never>;
513
593
  }
514
594
 
515
595
  interface DateRange {
@@ -729,12 +809,16 @@ declare class StrataDividerComponent {
729
809
 
730
810
  declare class StrataFileUploadComponent {
731
811
  fileInput: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
812
+ cameraInput: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
732
813
  accept: _angular_core.InputSignal<string>;
733
814
  multiple: _angular_core.InputSignal<boolean>;
734
815
  maxFileSize: _angular_core.InputSignal<number | undefined>;
735
816
  disabled: _angular_core.InputSignal<boolean>;
736
817
  label: _angular_core.InputSignal<string>;
737
818
  hint: _angular_core.InputSignal<string | undefined>;
819
+ camera: _angular_core.InputSignalWithTransform<boolean | undefined, string | boolean | undefined>;
820
+ choosePhotoLabel: _angular_core.InputSignal<string>;
821
+ takePhotoLabel: _angular_core.InputSignal<string>;
738
822
  state: _angular_core.InputSignal<InputControlState | undefined>;
739
823
  error: _angular_core.InputSignalWithTransform<boolean, unknown>;
740
824
  message: _angular_core.InputSignal<string | undefined>;
@@ -744,6 +828,8 @@ declare class StrataFileUploadComponent {
744
828
  readonly isMessageError: _angular_core.Signal<boolean>;
745
829
  readonly isMessageSuccess: _angular_core.Signal<boolean>;
746
830
  readonly isMessageWarning: _angular_core.Signal<boolean>;
831
+ readonly isImageAccept: _angular_core.Signal<boolean>;
832
+ readonly showCamera: _angular_core.Signal<boolean>;
747
833
  fileSelect: _angular_core.OutputEmitterRef<File>;
748
834
  filesSelect: _angular_core.OutputEmitterRef<File[]>;
749
835
  fileRejected: _angular_core.OutputEmitterRef<{
@@ -765,12 +851,13 @@ declare class StrataFileUploadComponent {
765
851
  onDragLeave(event: DragEvent): void;
766
852
  onDrop(event: DragEvent): void;
767
853
  onFileChange(event: Event): void;
768
- browse(): void;
854
+ browse(event?: Event): void;
855
+ browseCamera(event?: Event): void;
769
856
  clear(): void;
770
857
  private processFiles;
771
858
  private matchesAccept;
772
859
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrataFileUploadComponent, never>;
773
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrataFileUploadComponent, "st-file-upload", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxFileSize": { "alias": "maxFileSize"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "colorMessage": { "alias": "colorMessage"; "required": false; "isSignal": true; }; }, { "fileSelect": "fileSelect"; "filesSelect": "filesSelect"; "fileRejected": "fileRejected"; }, never, ["[uploadIcon]", "*"], true, never>;
860
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrataFileUploadComponent, "st-file-upload", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxFileSize": { "alias": "maxFileSize"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "camera": { "alias": "camera"; "required": false; "isSignal": true; }; "choosePhotoLabel": { "alias": "choosePhotoLabel"; "required": false; "isSignal": true; }; "takePhotoLabel": { "alias": "takePhotoLabel"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "colorMessage": { "alias": "colorMessage"; "required": false; "isSignal": true; }; }, { "fileSelect": "fileSelect"; "filesSelect": "filesSelect"; "fileRejected": "fileRejected"; }, never, ["[uploadIcon]", "*"], true, never>;
774
861
  }
775
862
 
776
863
  declare abstract class IconLoader {
@@ -1822,5 +1909,5 @@ declare class StrataToggleComponent implements ControlValueAccessor {
1822
1909
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrataToggleComponent, "st-toggle", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "colorMessage": { "alias": "colorMessage"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, ["*"], true, [{ directive: typeof StrataActivatableDirective; inputs: { "disabled": "disabled"; }; outputs: { "activated": "activated"; }; }]>;
1823
1910
  }
1824
1911
 
1825
- export { BreakpointService, CapitalizePipe, DEFAULT_DATE_RANGE_PRESETS, DEFAULT_DURATION, DEFAULT_THEME, DarkmodeService, DeviceService, HotkeyService, HttpIconLoader, IconLoader, IconRegistry, IconRegistryService, ModalService, NotificationService, STRATA_CONFIG, StrataAccordionGroupComponent, StrataAccordionItemComponent, StrataActionMenuComponent, StrataActionMenuItemComponent, StrataActivatableDirective, StrataAlertComponent, StrataAlertContentComponent, StrataAutoResizeDirective, StrataAvatarComponent, StrataAvatarStackComponent, StrataBadgeComponent, StrataBreadcrumbComponent, StrataBreadcrumbItemComponent, StrataButtonDirective, StrataButtonGroupComponent, StrataCalendarComponent, StrataCardComponent, StrataCheckboxComponent, StrataDatePickerComponent, StrataDateRangePickerComponent, StrataDividerComponent, StrataFileUploadComponent, StrataIconComponent, StrataImageCropperComponent, StrataInputFieldComponent, StrataItemComponent, StrataItemListComponent, StrataKbdComponent, StrataMessageStateComponent, StrataModalBodyComponent, StrataModalComponent, StrataModalContainerComponent, StrataModalFooterComponent, StrataModalHeaderComponent, StrataModalRef, StrataNativeInputRefDirective, StrataNotificationComponent, StrataNotificationContainerComponent, StrataNumberDisplayComponent, StrataNumberStepperComponent, StrataOtpComponent, StrataOverlayDirective, StrataPaginationComponent, StrataProgressLinearComponent, StrataProgressRadialComponent, StrataRadioComponent, StrataRadioGroupComponent, StrataSegmentedControlComponent, StrataSegmentedControlItemComponent, StrataSelectItemComponent, StrataSelectTriggerDirective, StrataShellComponent, StrataSidemenuComponent, StrataSidemenuItemDirective, StrataSidemenuItemGroupComponent, StrataSidemenuSectionComponent, StrataSingleSelectComponent, StrataSkeletonComponent, StrataSliderComponent, StrataSpinnerComponent, StrataStepComponent, StrataStepperComponent, StrataTabItemComponent, StrataTabsComponent, StrataTagComponent, StrataTextStackComponent, StrataThemeDirective, StrataTimePickerComponent, StrataToggleComponent, StrataTooltipDirective, addDays, addMonths, addYears, createCalendarGrid, disableDateRange, disableDaysOfWeek, disableFutureDates, disablePastDates, disableWeekends, endOfDay, endOfMonth, formatDate, formatMonthTitle, getDayOfWeek, getDaysInMonth, getDefaultShortcutLabels, getLocaleDefaultDateFormat, getMonthNames, getWeekdayNames, isAfterDay, isApplePlatform, isBeforeDay, isSameDay, isSameMonth, isSameYear, isWeekend, isWithinDayRange, parseDate, provideBaseIcons, provideIcons, provideStrata, resolveIsApple, startOfDay, startOfMonth };
1912
+ export { BreakpointService, CapitalizePipe, DEFAULT_DATE_RANGE_PRESETS, DEFAULT_DURATION, DEFAULT_THEME, DarkmodeService, DeviceService, HotkeyService, HttpIconLoader, IconLoader, IconRegistry, IconRegistryService, ModalService, NotificationService, STRATA_CONFIG, StrataAccordionGroupComponent, StrataAccordionItemComponent, StrataActionMenuComponent, StrataActionMenuItemComponent, StrataActivatableDirective, StrataAlertComponent, StrataAlertContentComponent, StrataAutoResizeDirective, StrataAvatarComponent, StrataAvatarStackComponent, StrataBadgeComponent, StrataBreadcrumbComponent, StrataBreadcrumbItemComponent, StrataButtonDirective, StrataButtonGroupComponent, StrataCalendarComponent, StrataCardComponent, StrataCheckboxComponent, StrataContextMenuDirective, StrataDatePickerComponent, StrataDateRangePickerComponent, StrataDividerComponent, StrataFileUploadComponent, StrataIconComponent, StrataImageCropperComponent, StrataInputFieldComponent, StrataItemComponent, StrataItemListComponent, StrataKbdComponent, StrataMessageStateComponent, StrataModalBodyComponent, StrataModalComponent, StrataModalContainerComponent, StrataModalFooterComponent, StrataModalHeaderComponent, StrataModalRef, StrataNativeInputRefDirective, StrataNotificationComponent, StrataNotificationContainerComponent, StrataNumberDisplayComponent, StrataNumberStepperComponent, StrataOtpComponent, StrataOverlayDirective, StrataPaginationComponent, StrataProgressLinearComponent, StrataProgressRadialComponent, StrataRadioComponent, StrataRadioGroupComponent, StrataSegmentedControlComponent, StrataSegmentedControlItemComponent, StrataSelectItemComponent, StrataSelectTriggerDirective, StrataShellComponent, StrataSidemenuComponent, StrataSidemenuItemDirective, StrataSidemenuItemGroupComponent, StrataSidemenuSectionComponent, StrataSingleSelectComponent, StrataSkeletonComponent, StrataSliderComponent, StrataSpinnerComponent, StrataStepComponent, StrataStepperComponent, StrataTabItemComponent, StrataTabsComponent, StrataTagComponent, StrataTextStackComponent, StrataThemeDirective, StrataTimeStepperComponent, StrataTimepickerComponent, StrataToggleComponent, StrataTooltipDirective, addDays, addMonths, addYears, createCalendarGrid, disableDateRange, disableDaysOfWeek, disableFutureDates, disablePastDates, disableWeekends, endOfDay, endOfMonth, formatDate, formatMonthTitle, getDayOfWeek, getDaysInMonth, getDefaultShortcutLabels, getLocaleDefaultDateFormat, getMonthNames, getWeekdayNames, isAfterDay, isApplePlatform, isBeforeDay, isSameDay, isSameMonth, isSameYear, isWeekend, isWithinDayRange, parseDate, provideBaseIcons, provideIcons, provideStrata, resolveIsApple, startOfDay, startOfMonth };
1826
1913
  export type { AccordionVariant, AlertConfiguration, AvatarSize, AvatarStackSpacing, AvatarVariant, BadgePlacement, BadgeSize, BadgeVariant, ButtonGroupJustification, ButtonSize, ButtonVariant, CalendarDayCell, CalendarMode, CalendarSize, CalendarView, CardVariant, CropPosition, CropResult, CropShape, CurrentDarkmode, DarkmodeSetting, DatePickerSize, DateRange, DateRangePreset, HotkeyOptions, IconConfig, IconSize, InputControlState, InputFieldSize, ModalConfiguration, ModalFooterJustification, ModalPlacement, ModalSize, ModalVariant, NotificationAction, NotificationConfiguration, NotificationsWithIds, NumberStepperLayout, NumberStepperSize, OtpSize, OtpState, OtpType, PaginationItem, ProgressLinearGrowDirection, ProgressLinearLabelFormat, ProgressRadialLabelFormat, SegmentedControlSize, SingleSelectSize, SkeletonAnimation, SkeletonSize, SkeletonVariant, SpinnerSize, StepState, StepperOrientation, StepperSize, StepperTheme, StrataBreakpoint, StrataConfig, StrataNotificationRef, StrataOS, StrataPlatform, TagSize, TextStackOverflow, Theme, TimeFormat, TimePrecision, TooltipPlacement };
@@ -1,168 +0,0 @@
1
- st-file-upload {
2
- --st-file-upload-bg: var(--st-color-bg-default);
3
- --st-file-upload-border: var(--st-color-border-default);
4
- --st-file-upload-text: var(--st-color-text-primary);
5
- --st-file-upload-hint: var(--st-color-text-secondary);
6
- --st-file-upload-hover-bg: var(--st-color-bg-raised);
7
- --st-file-upload-hover-border: var(--st-color-accent-default);
8
- --st-file-upload-active-border: var(--st-color-accent-default);
9
- --st-file-upload-active-bg: var(--st-color-accent-subtle, var(--st-color-bg-raised));
10
- --st-file-upload-icon-color: var(--st-color-text-secondary);
11
- --st-file-upload-radius: var(--st-border-radius-xl);
12
-
13
- display: block;
14
- position: relative;
15
- box-sizing: border-box;
16
- background-color: var(--st-file-upload-bg);
17
- border: 2px dashed var(--st-file-upload-border);
18
- border-radius: var(--st-file-upload-radius);
19
- padding: var(--st-space-6) var(--st-space-4);
20
- text-align: center;
21
- cursor: pointer;
22
- transition:
23
- border-color var(--st-transition-fast),
24
- background-color var(--st-transition-fast),
25
- transform var(--st-transition-fast);
26
- user-select: none;
27
- outline: none;
28
-
29
- &:hover:not(.st-disabled) {
30
- background-color: var(--st-file-upload-hover-bg);
31
- border-color: var(--st-file-upload-hover-border);
32
-
33
- .st-file-upload-icon {
34
- color: var(--st-color-accent-default);
35
- transform: translateY(-2px);
36
- }
37
- }
38
-
39
- &:focus-visible:not(.st-disabled) {
40
- outline: 2px solid var(--st-color-accent-default);
41
- outline-offset: 2px;
42
- }
43
-
44
- &.st-drag-over {
45
- background-color: var(--st-file-upload-active-bg);
46
- border-color: var(--st-file-upload-active-border);
47
- border-style: solid;
48
- transform: scale(1.01);
49
-
50
- .st-file-upload-icon {
51
- color: var(--st-color-accent-default);
52
- transform: translateY(-4px) scale(1.1);
53
- }
54
- }
55
-
56
- &.st-disabled {
57
- opacity: 0.5;
58
- cursor: not-allowed;
59
- pointer-events: none;
60
- }
61
-
62
- .st-file-upload-input {
63
- position: absolute;
64
- width: 1px;
65
- height: 1px;
66
- padding: 0;
67
- margin: -1px;
68
- overflow: hidden;
69
- clip: rect(0, 0, 0, 0);
70
- white-space: nowrap;
71
- border-width: 0;
72
- }
73
-
74
- .st-file-upload-content {
75
- display: flex;
76
- flex-direction: column;
77
- align-items: center;
78
- justify-content: center;
79
- gap: var(--st-space-3);
80
- }
81
-
82
- .st-file-upload-icon-wrapper {
83
- display: flex;
84
- align-items: center;
85
- justify-content: center;
86
- width: 48px;
87
- height: 48px;
88
- border-radius: 50%;
89
- background-color: var(--st-color-bg-raised);
90
- transition: transform 0.2s ease;
91
- }
92
-
93
- .st-file-upload-icon {
94
- width: 24px;
95
- height: 24px;
96
- color: var(--st-file-upload-icon-color);
97
- transition: color 0.2s ease, transform 0.2s ease;
98
- }
99
-
100
- .st-file-upload-text {
101
- display: flex;
102
- flex-direction: column;
103
- gap: var(--st-space-1);
104
- }
105
-
106
- .st-file-upload-label {
107
- font-size: 0.95rem;
108
- font-weight: 500;
109
- color: var(--st-file-upload-text);
110
- }
111
-
112
- &.st-state-error,
113
- &.st-error {
114
- --st-file-upload-border: var(--st-color-feedback-error-default);
115
- --st-file-upload-hover-border: var(--st-color-feedback-error-hover, var(--st-color-feedback-error-default));
116
-
117
- &:hover:not(.st-disabled) .st-file-upload-icon {
118
- color: var(--st-color-feedback-error-default);
119
- }
120
-
121
- &:focus-visible:not(.st-disabled) {
122
- outline-color: var(--st-color-feedback-error-default);
123
- }
124
- }
125
-
126
- &.st-state-success {
127
- --st-file-upload-border: var(--st-color-feedback-success-default);
128
- --st-file-upload-hover-border: var(--st-color-feedback-success-hover, var(--st-color-feedback-success-default));
129
-
130
- &:hover:not(.st-disabled) .st-file-upload-icon {
131
- color: var(--st-color-feedback-success-default);
132
- }
133
-
134
- &:focus-visible:not(.st-disabled) {
135
- outline-color: var(--st-color-feedback-success-default);
136
- }
137
- }
138
-
139
- &.st-state-warning {
140
- --st-file-upload-border: var(--st-color-feedback-warning-default);
141
- --st-file-upload-hover-border: var(--st-color-feedback-warning-hover, var(--st-color-feedback-warning-default));
142
-
143
- &:hover:not(.st-disabled) .st-file-upload-icon {
144
- color: var(--st-color-feedback-warning-default);
145
- }
146
-
147
- &:focus-visible:not(.st-disabled) {
148
- outline-color: var(--st-color-feedback-warning-default);
149
- }
150
- }
151
-
152
- .st-file-upload-hint {
153
- font-size: 0.8rem;
154
- color: var(--st-file-upload-hint);
155
-
156
- &.st-message-error {
157
- color: var(--st-color-feedback-error-text);
158
- }
159
-
160
- &.st-message-success {
161
- color: var(--st-color-feedback-success-text);
162
- }
163
-
164
- &.st-message-warning {
165
- color: var(--st-color-feedback-warning-text);
166
- }
167
- }
168
- }