@eduboxpro/studio 0.1.9 → 0.1.11

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/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, EnvironmentProviders, ElementRef, Signal } from '@angular/core';
2
+ import { InjectionToken, EnvironmentProviders, TemplateRef, ElementRef, WritableSignal, OnInit, Signal } from '@angular/core';
3
3
  import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
4
4
  import { icons } from 'lucide-angular';
5
+ import { Params, IsActiveMatchOptions } from '@angular/router';
5
6
 
6
7
  /**
7
8
  * Theme mode: light or dark
@@ -231,6 +232,31 @@ interface SelectDefaultsConfig {
231
232
  maxHeight?: string;
232
233
  position?: 'auto' | 'top' | 'bottom';
233
234
  }
235
+ /**
236
+ * Drawer component defaults configuration
237
+ */
238
+ interface DrawerDefaultsConfig {
239
+ position?: 'left' | 'right' | 'top' | 'bottom';
240
+ size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
241
+ modal?: boolean;
242
+ closeOnEscape?: boolean;
243
+ closeOnBackdropClick?: boolean;
244
+ showHeader?: boolean;
245
+ showCloseButton?: boolean;
246
+ closeButtonPosition?: 'left' | 'right';
247
+ swipeToClose?: boolean;
248
+ swipeThreshold?: number;
249
+ animationDuration?: number;
250
+ animationEasing?: 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out';
251
+ disableAnimation?: boolean;
252
+ shadow?: boolean;
253
+ shadowSize?: 'sm' | 'md' | 'lg' | 'xl';
254
+ radius?: 'none' | 'sm' | 'md' | 'lg';
255
+ autoFocus?: boolean;
256
+ restoreFocus?: boolean;
257
+ blockScroll?: boolean;
258
+ role?: 'dialog' | 'alertdialog';
259
+ }
234
260
  /**
235
261
  * Components defaults configuration
236
262
  */
@@ -244,6 +270,7 @@ interface ComponentsConfig {
244
270
  buttonGroup?: ButtonGroupDefaultsConfig;
245
271
  buttonToggleGroup?: ButtonToggleGroupDefaultsConfig;
246
272
  select?: SelectDefaultsConfig;
273
+ drawer?: DrawerDefaultsConfig;
247
274
  }
248
275
  /**
249
276
  * Main Studio configuration interface
@@ -311,11 +338,11 @@ declare class BadgeComponent {
311
338
  variantInput: _angular_core.InputSignal<"solid" | "outline" | "soft" | "dot" | undefined>;
312
339
  sizeInput: _angular_core.InputSignal<"sm" | "md" | "lg" | undefined>;
313
340
  colorInput: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | "info" | "neutral" | undefined>;
314
- radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "full" | undefined>;
341
+ radiusInput: _angular_core.InputSignal<"full" | "sm" | "md" | "lg" | undefined>;
315
342
  variant: _angular_core.Signal<"solid" | "outline" | "soft" | "dot">;
316
343
  size: _angular_core.Signal<"sm" | "md" | "lg">;
317
344
  color: _angular_core.Signal<"primary" | "secondary" | "success" | "error" | "warning" | "info" | "neutral">;
318
- radius: _angular_core.Signal<"sm" | "md" | "lg" | "full">;
345
+ radius: _angular_core.Signal<"full" | "sm" | "md" | "lg">;
319
346
  icon: _angular_core.InputSignal<string | undefined>;
320
347
  iconPosition: _angular_core.InputSignal<"left" | "right">;
321
348
  dot: _angular_core.InputSignal<boolean>;
@@ -354,16 +381,16 @@ declare class BadgeComponent {
354
381
  declare class ButtonComponent {
355
382
  private readonly configService;
356
383
  private readonly buttonDefaults;
357
- variantInput: _angular_core.InputSignal<"solid" | "outline" | "ghost" | undefined>;
384
+ variantInput: _angular_core.InputSignal<"ghost" | "solid" | "outline" | undefined>;
358
385
  sizeInput: _angular_core.InputSignal<"sm" | "md" | "lg" | undefined>;
359
386
  colorInput: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | undefined>;
360
- radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | "xl" | "full" | undefined>;
387
+ radiusInput: _angular_core.InputSignal<"full" | "sm" | "md" | "lg" | "none" | "xl" | undefined>;
361
388
  shadowInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | undefined>;
362
389
  compactInput: _angular_core.InputSignal<boolean | undefined>;
363
- variant: _angular_core.Signal<"solid" | "outline" | "ghost">;
390
+ variant: _angular_core.Signal<"ghost" | "solid" | "outline">;
364
391
  size: _angular_core.Signal<"sm" | "md" | "lg">;
365
392
  color: _angular_core.Signal<"primary" | "secondary" | "success" | "error" | "warning">;
366
- radius: _angular_core.Signal<"sm" | "md" | "lg" | "none" | "xl" | "full">;
393
+ radius: _angular_core.Signal<"full" | "sm" | "md" | "lg" | "none" | "xl">;
367
394
  shadow: _angular_core.Signal<"sm" | "md" | "lg" | "none">;
368
395
  compact: _angular_core.Signal<boolean>;
369
396
  disabled: _angular_core.InputSignal<boolean>;
@@ -392,14 +419,14 @@ declare class ButtonGroupComponent {
392
419
  private readonly groupDefaults;
393
420
  orientationInput: _angular_core.InputSignal<"vertical" | "horizontal" | undefined>;
394
421
  sizeInput: _angular_core.InputSignal<"sm" | "md" | "lg" | undefined>;
395
- variantInput: _angular_core.InputSignal<"solid" | "outline" | "ghost" | undefined>;
422
+ variantInput: _angular_core.InputSignal<"ghost" | "solid" | "outline" | undefined>;
396
423
  colorInput: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | undefined>;
397
- radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | "xl" | "full" | undefined>;
424
+ radiusInput: _angular_core.InputSignal<"full" | "sm" | "md" | "lg" | "none" | "xl" | undefined>;
398
425
  orientation: _angular_core.Signal<"vertical" | "horizontal">;
399
426
  size: _angular_core.Signal<"sm" | "md" | "lg" | undefined>;
400
- variant: _angular_core.Signal<"solid" | "outline" | "ghost" | undefined>;
427
+ variant: _angular_core.Signal<"ghost" | "solid" | "outline" | undefined>;
401
428
  color: _angular_core.Signal<"primary" | "secondary" | "success" | "error" | "warning" | undefined>;
402
- radius: _angular_core.Signal<"sm" | "md" | "lg" | "none" | "xl" | "full" | undefined>;
429
+ radius: _angular_core.Signal<"full" | "sm" | "md" | "lg" | "none" | "xl" | undefined>;
403
430
  attached: _angular_core.InputSignal<boolean>;
404
431
  fullWidth: _angular_core.InputSignal<boolean>;
405
432
  disabled: _angular_core.InputSignal<boolean>;
@@ -574,6 +601,176 @@ type CheckboxColor = 'primary' | 'secondary' | 'success' | 'error';
574
601
  type CheckboxVariant = 'default' | 'outlined' | 'filled';
575
602
  type CheckboxRadius = 'none' | 'sm' | 'md' | 'lg' | 'full';
576
603
 
604
+ type DrawerPosition = 'left' | 'right' | 'top' | 'bottom';
605
+ type DrawerSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
606
+ type DrawerRadius = 'none' | 'sm' | 'md' | 'lg';
607
+ type DrawerShadowSize = 'sm' | 'md' | 'lg' | 'xl';
608
+ type DrawerRole = 'dialog' | 'alertdialog';
609
+ type DrawerAnimationEasing = 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out';
610
+ type DrawerCloseButtonPosition = 'left' | 'right';
611
+ interface DrawerConfig {
612
+ position?: DrawerPosition;
613
+ size?: DrawerSize;
614
+ modal?: boolean;
615
+ closeOnEscape?: boolean;
616
+ closeOnBackdropClick?: boolean;
617
+ showCloseButton?: boolean;
618
+ closeButtonPosition?: DrawerCloseButtonPosition;
619
+ swipeToClose?: boolean;
620
+ swipeThreshold?: number;
621
+ animationDuration?: number;
622
+ animationEasing?: DrawerAnimationEasing;
623
+ disableAnimation?: boolean;
624
+ shadow?: boolean;
625
+ shadowSize?: DrawerShadowSize;
626
+ radius?: DrawerRadius;
627
+ autoFocus?: boolean;
628
+ restoreFocus?: boolean;
629
+ blockScroll?: boolean;
630
+ role?: DrawerRole;
631
+ }
632
+
633
+ declare class DrawerComponent {
634
+ private readonly document;
635
+ private readonly destroyRef;
636
+ private readonly configService;
637
+ private readonly drawerService;
638
+ private readonly drawerDefaults;
639
+ protected readonly headerTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
640
+ protected readonly footerTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
641
+ protected readonly panelEl: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
642
+ id: _angular_core.InputSignal<string>;
643
+ visible: _angular_core.ModelSignal<boolean>;
644
+ positionInput: _angular_core.InputSignal<DrawerPosition | undefined>;
645
+ sizeInput: _angular_core.InputSignal<DrawerSize | undefined>;
646
+ customWidth: _angular_core.InputSignal<string | undefined>;
647
+ customHeight: _angular_core.InputSignal<string | undefined>;
648
+ position: _angular_core.Signal<"left" | "right" | "top" | "bottom">;
649
+ size: _angular_core.Signal<"full" | "sm" | "md" | "lg" | "xl">;
650
+ modalInput: _angular_core.InputSignal<boolean | undefined>;
651
+ closeOnEscapeInput: _angular_core.InputSignal<boolean | undefined>;
652
+ closeOnBackdropClickInput: _angular_core.InputSignal<boolean | undefined>;
653
+ blockScrollInput: _angular_core.InputSignal<boolean | undefined>;
654
+ modal: _angular_core.Signal<boolean>;
655
+ closeOnEscape: _angular_core.Signal<boolean>;
656
+ closeOnBackdropClick: _angular_core.Signal<boolean>;
657
+ blockScroll: _angular_core.Signal<boolean>;
658
+ header: _angular_core.InputSignal<string | undefined>;
659
+ showHeaderInput: _angular_core.InputSignal<boolean | undefined>;
660
+ showCloseButtonInput: _angular_core.InputSignal<boolean | undefined>;
661
+ closeButtonPositionInput: _angular_core.InputSignal<DrawerCloseButtonPosition | undefined>;
662
+ showFooter: _angular_core.InputSignal<boolean>;
663
+ showHeader: _angular_core.Signal<boolean>;
664
+ showCloseButton: _angular_core.Signal<boolean>;
665
+ closeButtonPosition: _angular_core.Signal<"left" | "right">;
666
+ swipeToCloseInput: _angular_core.InputSignal<boolean | undefined>;
667
+ swipeThresholdInput: _angular_core.InputSignal<number | undefined>;
668
+ swipeToClose: _angular_core.Signal<boolean>;
669
+ swipeThreshold: _angular_core.Signal<number>;
670
+ animationDurationInput: _angular_core.InputSignal<number | undefined>;
671
+ animationEasingInput: _angular_core.InputSignal<DrawerAnimationEasing | undefined>;
672
+ disableAnimationInput: _angular_core.InputSignal<boolean | undefined>;
673
+ animationDuration: _angular_core.Signal<number>;
674
+ animationEasing: _angular_core.Signal<"ease" | "ease-in" | "ease-out" | "ease-in-out">;
675
+ disableAnimation: _angular_core.Signal<boolean>;
676
+ radiusInput: _angular_core.InputSignal<DrawerRadius | undefined>;
677
+ shadowInput: _angular_core.InputSignal<boolean | undefined>;
678
+ shadowSizeInput: _angular_core.InputSignal<DrawerShadowSize | undefined>;
679
+ radius: _angular_core.Signal<"sm" | "md" | "lg" | "none">;
680
+ shadow: _angular_core.Signal<boolean>;
681
+ shadowSize: _angular_core.Signal<"sm" | "md" | "lg" | "xl">;
682
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
683
+ ariaLabelledBy: _angular_core.InputSignal<string | undefined>;
684
+ ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
685
+ autoFocusInput: _angular_core.InputSignal<boolean | undefined>;
686
+ restoreFocusInput: _angular_core.InputSignal<boolean | undefined>;
687
+ roleInput: _angular_core.InputSignal<DrawerRole | undefined>;
688
+ autoFocus: _angular_core.Signal<boolean>;
689
+ restoreFocus: _angular_core.Signal<boolean>;
690
+ role: _angular_core.Signal<"dialog" | "alertdialog">;
691
+ visibleChange: _angular_core.OutputEmitterRef<boolean>;
692
+ opened: _angular_core.OutputEmitterRef<void>;
693
+ closed: _angular_core.OutputEmitterRef<void>;
694
+ backdropClick: _angular_core.OutputEmitterRef<void>;
695
+ private previousActiveElement?;
696
+ private touchStartX;
697
+ private touchStartY;
698
+ private isDragging;
699
+ private scrollbarWidth;
700
+ protected hostClasses: _angular_core.Signal<string>;
701
+ constructor();
702
+ protected handleOpen(): void;
703
+ protected handleClose(): void;
704
+ open(): void;
705
+ close(): void;
706
+ toggle(): void;
707
+ protected handleBackdropClick(): void;
708
+ protected handleEscapeKey(event: KeyboardEvent): void;
709
+ protected onTouchStart(event: TouchEvent): void;
710
+ protected onTouchMove(event: TouchEvent): void;
711
+ protected onTouchEnd(event: TouchEvent): void;
712
+ private applyDragTransform;
713
+ private resetTransform;
714
+ private lockBodyScroll;
715
+ private unlockBodyScroll;
716
+ private setupFocusTrap;
717
+ private restorePreviousFocus;
718
+ private getFirstFocusableElement;
719
+ protected handleKeydown(event: KeyboardEvent): void;
720
+ private trapFocus;
721
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DrawerComponent, never>;
722
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DrawerComponent, "studio-drawer", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "positionInput": { "alias": "position"; "required": false; "isSignal": true; }; "sizeInput": { "alias": "size"; "required": false; "isSignal": true; }; "customWidth": { "alias": "customWidth"; "required": false; "isSignal": true; }; "customHeight": { "alias": "customHeight"; "required": false; "isSignal": true; }; "modalInput": { "alias": "modal"; "required": false; "isSignal": true; }; "closeOnEscapeInput": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "closeOnBackdropClickInput": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "blockScrollInput": { "alias": "blockScroll"; "required": false; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "showHeaderInput": { "alias": "showHeader"; "required": false; "isSignal": true; }; "showCloseButtonInput": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "closeButtonPositionInput": { "alias": "closeButtonPosition"; "required": false; "isSignal": true; }; "showFooter": { "alias": "showFooter"; "required": false; "isSignal": true; }; "swipeToCloseInput": { "alias": "swipeToClose"; "required": false; "isSignal": true; }; "swipeThresholdInput": { "alias": "swipeThreshold"; "required": false; "isSignal": true; }; "animationDurationInput": { "alias": "animationDuration"; "required": false; "isSignal": true; }; "animationEasingInput": { "alias": "animationEasing"; "required": false; "isSignal": true; }; "disableAnimationInput": { "alias": "disableAnimation"; "required": false; "isSignal": true; }; "radiusInput": { "alias": "radius"; "required": false; "isSignal": true; }; "shadowInput": { "alias": "shadow"; "required": false; "isSignal": true; }; "shadowSizeInput": { "alias": "shadowSize"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "autoFocusInput": { "alias": "autoFocus"; "required": false; "isSignal": true; }; "restoreFocusInput": { "alias": "restoreFocus"; "required": false; "isSignal": true; }; "roleInput": { "alias": "role"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; "visibleChange": "visibleChange"; "opened": "opened"; "closed": "closed"; "backdropClick": "backdropClick"; }, ["headerTemplate", "footerTemplate"], ["[drawerHeader]", "*", "[drawerFooter]"], true, never>;
723
+ }
724
+
725
+ /**
726
+ * Service for programmatic control of Drawer components
727
+ *
728
+ * @example
729
+ * ```typescript
730
+ * // In component
731
+ * private drawerService = inject(DrawerService);
732
+ *
733
+ * openSettings() {
734
+ * this.drawerService.open('settings-drawer');
735
+ * }
736
+ * ```
737
+ */
738
+ declare class DrawerService {
739
+ private drawers;
740
+ /**
741
+ * Register a drawer with the service
742
+ * Called automatically by DrawerComponent
743
+ */
744
+ register(id: string, signal: WritableSignal<boolean>): void;
745
+ /**
746
+ * Unregister a drawer from the service
747
+ * Called automatically on component destroy
748
+ */
749
+ unregister(id: string): void;
750
+ /**
751
+ * Open a drawer by ID
752
+ */
753
+ open(id: string): void;
754
+ /**
755
+ * Close a drawer by ID
756
+ */
757
+ close(id: string): void;
758
+ /**
759
+ * Toggle a drawer by ID
760
+ */
761
+ toggle(id: string): void;
762
+ /**
763
+ * Close all registered drawers
764
+ */
765
+ closeAll(): void;
766
+ /**
767
+ * Check if a drawer is open
768
+ */
769
+ isOpen(id: string): boolean;
770
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DrawerService, never>;
771
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DrawerService>;
772
+ }
773
+
577
774
  /**
578
775
  * Icon component with Lucide icons support
579
776
  *
@@ -597,39 +794,34 @@ declare class IconComponent {
597
794
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<IconComponent, "studio-icon", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "absoluteStrokeWidth": { "alias": "absoluteStrokeWidth"; "required": false; "isSignal": true; }; "showFallback": { "alias": "showFallback"; "required": false; "isSignal": true; }; "fallbackIcon": { "alias": "fallbackIcon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
598
795
  }
599
796
 
797
+ type IconPreset = 'minimal' | 'common' | 'full';
798
+ interface StudioIconConfig {
799
+ preset?: IconPreset;
800
+ customIcons?: Record<string, any>;
801
+ }
600
802
  /**
601
- * Studio icon provider
602
- * Registers commonly used Lucide icons
803
+ * Studio icon provider с поддержкой preset'ов
603
804
  *
604
805
  * @example
605
806
  * ```typescript
606
- * // app.config.ts
607
- * import { provideStudioIcons } from '@eduboxpro/studio';
807
+ * // Минимальный набор (только для компонентов библиотеки)
808
+ * provideStudioIcons({ preset: 'minimal' });
608
809
  *
609
- * export const appConfig: ApplicationConfig = {
610
- * providers: [
611
- * provideStudioIcons()
612
- * ]
613
- * };
614
- * ```
810
+ * // Расширенный набор (рекомендуется)
811
+ * provideStudioIcons({ preset: 'common' });
615
812
  *
616
- * To add additional icons:
617
- * @example
618
- * ```typescript
619
- * import { LUCIDE_ICONS, LucideIconProvider } from 'lucide-angular';
620
- * import { Zap, Wifi } from 'lucide-angular';
813
+ * // Все иконки Lucide (~1400 штук)
814
+ * provideStudioIcons({ preset: 'full' });
621
815
  *
622
- * providers: [
623
- * provideStudioIcons(),
624
- * {
625
- * provide: LUCIDE_ICONS,
626
- * multi: true,
627
- * useValue: new LucideIconProvider({ Zap, Wifi })
628
- * }
629
- * ]
816
+ * // С кастомными иконками
817
+ * import { Zap, Wifi } from 'lucide-angular';
818
+ * provideStudioIcons({
819
+ * preset: 'common',
820
+ * customIcons: { Zap, Wifi }
821
+ * });
630
822
  * ```
631
823
  */
632
- declare function provideStudioIcons(): EnvironmentProviders;
824
+ declare function provideStudioIcons(config?: StudioIconConfig): EnvironmentProviders;
633
825
 
634
826
  type InputType = 'text' | 'email' | 'tel' | 'url' | 'password' | 'number' | 'search' | 'date' | 'time';
635
827
  type InputMode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';
@@ -644,12 +836,12 @@ declare class InputComponent implements ControlValueAccessor {
644
836
  private readonly configService;
645
837
  private readonly inputDefaults;
646
838
  protected readonly inputEl: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
647
- variantInput: _angular_core.InputSignal<"outline" | "filled" | "underline" | undefined>;
839
+ variantInput: _angular_core.InputSignal<"filled" | "outline" | "underline" | undefined>;
648
840
  sizeInput: _angular_core.InputSignal<"sm" | "md" | "lg" | undefined>;
649
- radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | "full" | undefined>;
650
- variant: _angular_core.Signal<"outline" | "filled" | "underline">;
841
+ radiusInput: _angular_core.InputSignal<"full" | "sm" | "md" | "lg" | "none" | undefined>;
842
+ variant: _angular_core.Signal<"filled" | "outline" | "underline">;
651
843
  size: _angular_core.Signal<"sm" | "md" | "lg">;
652
- radius: _angular_core.Signal<"sm" | "md" | "lg" | "none" | "full">;
844
+ radius: _angular_core.Signal<"full" | "sm" | "md" | "lg" | "none">;
653
845
  disabled: _angular_core.InputSignal<boolean>;
654
846
  readonly: _angular_core.InputSignal<boolean>;
655
847
  loading: _angular_core.InputSignal<boolean>;
@@ -712,6 +904,152 @@ declare class InputComponent implements ControlValueAccessor {
712
904
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "studio-input", never, { "variantInput": { "alias": "variant"; "required": false; "isSignal": true; }; "sizeInput": { "alias": "size"; "required": false; "isSignal": true; }; "radiusInput": { "alias": "radius"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "inputmode": { "alias": "inputmode"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; "isSignal": true; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "showPasswordToggle": { "alias": "showPasswordToggle"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "autoFocus": { "alias": "autoFocus"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "focused": "focused"; "blurred": "blurred"; "cleared": "cleared"; "entered": "entered"; }, never, never, true, never>;
713
905
  }
714
906
 
907
+ type MenuItemTarget = '_blank' | '_self' | '_parent' | '_top';
908
+ type MenuItemIconPosition = 'left' | 'right';
909
+ type MenuItemBadgeColor = 'primary' | 'secondary' | 'success' | 'error' | 'warning';
910
+ type MenuItemTooltipPosition = 'top' | 'bottom' | 'left' | 'right';
911
+ /**
912
+ * Menu item interface for JSON-driven menu structure
913
+ */
914
+ interface MenuItem {
915
+ id?: string;
916
+ label?: string;
917
+ href?: string;
918
+ routerLink?: string | string[];
919
+ queryParams?: Params;
920
+ fragment?: string;
921
+ target?: MenuItemTarget;
922
+ icon?: string;
923
+ iconPosition?: MenuItemIconPosition;
924
+ badge?: string | number;
925
+ badgeColor?: MenuItemBadgeColor;
926
+ items?: MenuItem[];
927
+ disabled?: boolean;
928
+ visible?: boolean;
929
+ separator?: boolean;
930
+ class?: string;
931
+ style?: Record<string, string>;
932
+ command?: (event?: MenuItemCommandEvent) => void;
933
+ tooltip?: string;
934
+ tooltipPosition?: MenuItemTooltipPosition;
935
+ data?: any;
936
+ }
937
+ /**
938
+ * Event emitted when menu item command is executed
939
+ */
940
+ interface MenuItemCommandEvent {
941
+ originalEvent?: Event;
942
+ item: MenuItem;
943
+ }
944
+ /**
945
+ * Event emitted when menu item is clicked
946
+ */
947
+ interface MenuItemClickEvent {
948
+ originalEvent: Event;
949
+ item: MenuItem;
950
+ }
951
+ /**
952
+ * Event emitted when expand state changes
953
+ */
954
+ interface MenuExpandEvent {
955
+ itemId: string;
956
+ expanded: boolean;
957
+ }
958
+
959
+ type MenuOrientation = 'vertical' | 'horizontal';
960
+ type MenuMode = 'static' | 'accordion' | 'overlay';
961
+ type MenuSize = 'sm' | 'md' | 'lg';
962
+ type MenuVariant = 'default' | 'filled' | 'outlined' | 'ghost';
963
+ type MenuColor = 'primary' | 'secondary' | 'inherit';
964
+ type MenuRadius = 'none' | 'sm' | 'md' | 'lg';
965
+ type MenuSpacing = 'none' | 'sm' | 'md' | 'lg';
966
+ type MenuExpandIconPosition = 'left' | 'right';
967
+ /**
968
+ * Menu component - Primitive component for navigation menus
969
+ *
970
+ * @example
971
+ * <studio-menu
972
+ * [items]="menuItems"
973
+ * size="md"
974
+ * variant="default"
975
+ * (itemClick)="handleClick($event)"
976
+ * />
977
+ */
978
+ declare class MenuComponent implements OnInit {
979
+ private router;
980
+ private platformId;
981
+ items: _angular_core.InputSignal<MenuItem[]>;
982
+ orientation: _angular_core.InputSignal<MenuOrientation>;
983
+ mode: _angular_core.InputSignal<MenuMode>;
984
+ collapsible: _angular_core.InputSignal<boolean>;
985
+ defaultExpanded: _angular_core.InputSignal<string[]>;
986
+ expandOnHover: _angular_core.InputSignal<boolean>;
987
+ activeItem: _angular_core.InputSignal<string | undefined>;
988
+ routerLinkActive: _angular_core.InputSignal<boolean>;
989
+ selectOnNavigate: _angular_core.InputSignal<boolean>;
990
+ routerLinkActiveOptions: _angular_core.InputSignal<IsActiveMatchOptions>;
991
+ keyboardNavigation: _angular_core.InputSignal<boolean>;
992
+ arrowNavigation: _angular_core.InputSignal<boolean>;
993
+ homeEndNavigation: _angular_core.InputSignal<boolean>;
994
+ animated: _angular_core.InputSignal<boolean>;
995
+ animationDuration: _angular_core.InputSignal<number>;
996
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
997
+ role: _angular_core.InputSignal<"navigation" | "menu">;
998
+ size: _angular_core.InputSignal<MenuSize>;
999
+ compact: _angular_core.InputSignal<boolean>;
1000
+ fullWidth: _angular_core.InputSignal<boolean>;
1001
+ variant: _angular_core.InputSignal<MenuVariant>;
1002
+ color: _angular_core.InputSignal<MenuColor>;
1003
+ radius: _angular_core.InputSignal<MenuRadius>;
1004
+ spacing: _angular_core.InputSignal<MenuSpacing>;
1005
+ showDividers: _angular_core.InputSignal<boolean>;
1006
+ iconSize: _angular_core.InputSignal<number>;
1007
+ iconOnly: _angular_core.InputSignal<boolean>;
1008
+ indentLevel: _angular_core.InputSignal<number>;
1009
+ showExpandIcon: _angular_core.InputSignal<boolean>;
1010
+ expandIconPosition: _angular_core.InputSignal<MenuExpandIconPosition>;
1011
+ expandIcon: _angular_core.InputSignal<string>;
1012
+ class: _angular_core.InputSignal<string>;
1013
+ itemClass: _angular_core.InputSignal<string>;
1014
+ level: _angular_core.InputSignal<number>;
1015
+ parentExpanded: _angular_core.InputSignal<boolean>;
1016
+ itemClick: _angular_core.OutputEmitterRef<MenuItemClickEvent>;
1017
+ itemSelect: _angular_core.OutputEmitterRef<MenuItem>;
1018
+ expandChange: _angular_core.OutputEmitterRef<MenuExpandEvent>;
1019
+ activeChange: _angular_core.OutputEmitterRef<string>;
1020
+ private expandedItems;
1021
+ private activeItemId;
1022
+ private focusedIndex;
1023
+ private flattenedItems;
1024
+ protected hostClasses: _angular_core.Signal<string>;
1025
+ constructor();
1026
+ ngOnInit(): void;
1027
+ isExpanded(item: MenuItem): boolean;
1028
+ isActive(item: MenuItem): boolean;
1029
+ isDisabled(item: MenuItem): boolean;
1030
+ isVisible(item: MenuItem): boolean;
1031
+ hasChildren(item: MenuItem): boolean;
1032
+ getItemId(item: MenuItem, index: number): string;
1033
+ handleItemClick(event: Event, item: MenuItem): void;
1034
+ handleItemMouseEnter(item: MenuItem): void;
1035
+ handleItemMouseLeave(item: MenuItem): void;
1036
+ toggleExpand(item: MenuItem): void;
1037
+ expand(item: MenuItem): void;
1038
+ collapse(item: MenuItem): void;
1039
+ handleKeyDown(event: KeyboardEvent): void;
1040
+ private focusNextItem;
1041
+ private focusPreviousItem;
1042
+ private expandFocusedItem;
1043
+ private collapseFocusedItem;
1044
+ private activateFocusedItem;
1045
+ private collapseAll;
1046
+ private flattenMenuItems;
1047
+ private updateActiveFromRouter;
1048
+ getIndentStyle(itemLevel?: number): Record<string, string>;
1049
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuComponent, never>;
1050
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MenuComponent, "studio-menu", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "defaultExpanded": { "alias": "defaultExpanded"; "required": false; "isSignal": true; }; "expandOnHover": { "alias": "expandOnHover"; "required": false; "isSignal": true; }; "activeItem": { "alias": "activeItem"; "required": false; "isSignal": true; }; "routerLinkActive": { "alias": "routerLinkActive"; "required": false; "isSignal": true; }; "selectOnNavigate": { "alias": "selectOnNavigate"; "required": false; "isSignal": true; }; "routerLinkActiveOptions": { "alias": "routerLinkActiveOptions"; "required": false; "isSignal": true; }; "keyboardNavigation": { "alias": "keyboardNavigation"; "required": false; "isSignal": true; }; "arrowNavigation": { "alias": "arrowNavigation"; "required": false; "isSignal": true; }; "homeEndNavigation": { "alias": "homeEndNavigation"; "required": false; "isSignal": true; }; "animated": { "alias": "animated"; "required": false; "isSignal": true; }; "animationDuration": { "alias": "animationDuration"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "spacing": { "alias": "spacing"; "required": false; "isSignal": true; }; "showDividers": { "alias": "showDividers"; "required": false; "isSignal": true; }; "iconSize": { "alias": "iconSize"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; "indentLevel": { "alias": "indentLevel"; "required": false; "isSignal": true; }; "showExpandIcon": { "alias": "showExpandIcon"; "required": false; "isSignal": true; }; "expandIconPosition": { "alias": "expandIconPosition"; "required": false; "isSignal": true; }; "expandIcon": { "alias": "expandIcon"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "itemClass": { "alias": "itemClass"; "required": false; "isSignal": true; }; "level": { "alias": "level"; "required": false; "isSignal": true; }; "parentExpanded": { "alias": "parentExpanded"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "itemSelect": "itemSelect"; "expandChange": "expandChange"; "activeChange": "activeChange"; }, never, never, true, never>;
1051
+ }
1052
+
715
1053
  interface SelectOption<T = any> {
716
1054
  label: string;
717
1055
  value: T;
@@ -742,10 +1080,10 @@ declare class SelectComponent<T = any> implements ControlValueAccessor {
742
1080
  protected readonly dropdownEl: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
743
1081
  variantInput: _angular_core.InputSignal<SelectVariant | undefined>;
744
1082
  sizeInput: _angular_core.InputSignal<SelectSize | undefined>;
745
- radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | "full" | undefined>;
746
- variant: _angular_core.Signal<"outline" | "filled" | "underline">;
1083
+ radiusInput: _angular_core.InputSignal<"full" | "sm" | "md" | "lg" | "none" | undefined>;
1084
+ variant: _angular_core.Signal<"filled" | "outline" | "underline">;
747
1085
  size: _angular_core.Signal<"sm" | "md" | "lg">;
748
- radius: _angular_core.Signal<"sm" | "md" | "lg" | "none" | "full">;
1086
+ radius: _angular_core.Signal<"full" | "sm" | "md" | "lg" | "none">;
749
1087
  options: _angular_core.InputSignal<SelectOption<T>[] | SelectOptionGroup<T>[]>;
750
1088
  placeholder: _angular_core.InputSignal<string>;
751
1089
  multiple: _angular_core.InputSignal<boolean>;
@@ -892,7 +1230,7 @@ declare class TextareaComponent implements ControlValueAccessor {
892
1230
  /**
893
1231
  * Resize behavior
894
1232
  */
895
- resize: _angular_core.InputSignal<"none" | "vertical" | "horizontal" | "both">;
1233
+ resize: _angular_core.InputSignal<"vertical" | "horizontal" | "none" | "both">;
896
1234
  /**
897
1235
  * Maximum character length
898
1236
  */
@@ -1077,15 +1415,15 @@ declare class ButtonToggleGroupComponent implements ControlValueAccessor {
1077
1415
  allowEmpty: _angular_core.InputSignal<boolean>;
1078
1416
  orientationInput: _angular_core.InputSignal<"vertical" | "horizontal" | undefined>;
1079
1417
  sizeInput: _angular_core.InputSignal<"sm" | "md" | "lg" | undefined>;
1080
- variantInput: _angular_core.InputSignal<"solid" | "outline" | "ghost" | undefined>;
1418
+ variantInput: _angular_core.InputSignal<"ghost" | "solid" | "outline" | undefined>;
1081
1419
  colorInput: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | undefined>;
1082
- radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | "xl" | "full" | undefined>;
1420
+ radiusInput: _angular_core.InputSignal<"full" | "sm" | "md" | "lg" | "none" | "xl" | undefined>;
1083
1421
  shadowInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "none" | undefined>;
1084
1422
  orientation: _angular_core.Signal<"vertical" | "horizontal">;
1085
1423
  size: _angular_core.Signal<"sm" | "md" | "lg">;
1086
- variant: _angular_core.Signal<"solid" | "outline" | "ghost">;
1424
+ variant: _angular_core.Signal<"ghost" | "solid" | "outline">;
1087
1425
  color: _angular_core.Signal<"primary" | "secondary" | "success" | "error" | "warning">;
1088
- radius: _angular_core.Signal<"sm" | "md" | "lg" | "none" | "xl" | "full">;
1426
+ radius: _angular_core.Signal<"full" | "sm" | "md" | "lg" | "none" | "xl">;
1089
1427
  shadow: _angular_core.Signal<"sm" | "md" | "lg" | "none">;
1090
1428
  attached: _angular_core.InputSignal<boolean>;
1091
1429
  fullWidth: _angular_core.InputSignal<boolean>;
@@ -1296,5 +1634,5 @@ declare function loadGoogleFonts(fonts: Array<{
1296
1634
  display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';
1297
1635
  }>): void;
1298
1636
 
1299
- export { BadgeComponent, ButtonComponent, ButtonGroupComponent, ButtonToggleGroupComponent, CheckboxComponent, IconComponent, InputComponent, MASK_PRESETS, MaskDirective, MaskEngine, STUDIO_CONFIG, SelectComponent, StudioConfigService, SwitchComponent, TextareaComponent, ThemeSwitchComponent, classNames, isSafeUrl, loadGoogleFont, loadGoogleFonts, provideStudioConfig, provideStudioIcons, sanitizeUrl, withConfigDefault };
1300
- export type { BadgeDefaultsConfig, ButtonDefaultsConfig, ButtonGroupDefaultsConfig, ButtonToggleGroupDefaultsConfig, ButtonToggleGroupOption, ButtonToggleGroupValue, CheckboxColor, CheckboxDefaultsConfig, CheckboxRadius, CheckboxSize, CheckboxVariant, ColorConfig, ComponentsConfig, InputDefaultsConfig, InputMode, InputType, MaskConfig, MaskPreset, MaskResult, MaskToken, SelectDefaultsConfig, SelectDisplayContext, SelectOption, SelectOptionGroup, SelectPosition, SelectSize, SelectVariant, StudioConfig, StudioThemeConfig, SwitchDefaultsConfig, TextareaColor, TextareaDefaultsConfig, TextareaRadius, TextareaSize, TextareaVariant, ThemeMode };
1637
+ export { BadgeComponent, ButtonComponent, ButtonGroupComponent, ButtonToggleGroupComponent, CheckboxComponent, DrawerComponent, DrawerService, IconComponent, InputComponent, MASK_PRESETS, MaskDirective, MaskEngine, MenuComponent, STUDIO_CONFIG, SelectComponent, StudioConfigService, SwitchComponent, TextareaComponent, ThemeSwitchComponent, classNames, isSafeUrl, loadGoogleFont, loadGoogleFonts, provideStudioConfig, provideStudioIcons, sanitizeUrl, withConfigDefault };
1638
+ export type { BadgeDefaultsConfig, ButtonDefaultsConfig, ButtonGroupDefaultsConfig, ButtonToggleGroupDefaultsConfig, ButtonToggleGroupOption, ButtonToggleGroupValue, CheckboxColor, CheckboxDefaultsConfig, CheckboxRadius, CheckboxSize, CheckboxVariant, ColorConfig, ComponentsConfig, DrawerAnimationEasing, DrawerCloseButtonPosition, DrawerConfig, DrawerDefaultsConfig, DrawerPosition, DrawerRadius, DrawerRole, DrawerShadowSize, DrawerSize, InputDefaultsConfig, InputMode, InputType, MaskConfig, MaskPreset, MaskResult, MaskToken, MenuColor, MenuExpandEvent, MenuExpandIconPosition, MenuItem, MenuItemBadgeColor, MenuItemClickEvent, MenuItemCommandEvent, MenuItemIconPosition, MenuItemTarget, MenuItemTooltipPosition, MenuMode, MenuOrientation, MenuRadius, MenuSize, MenuSpacing, MenuVariant, SelectDefaultsConfig, SelectDisplayContext, SelectOption, SelectOptionGroup, SelectPosition, SelectSize, SelectVariant, StudioConfig, StudioThemeConfig, SwitchDefaultsConfig, TextareaColor, TextareaDefaultsConfig, TextareaRadius, TextareaSize, TextareaVariant, ThemeMode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eduboxpro/studio",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Modern Angular UI library for educational platforms with customizable design system",
5
5
  "keywords": [
6
6
  "angular",