@eduboxpro/studio 0.1.10 → 0.1.12

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, TemplateRef, ElementRef, WritableSignal, 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
@@ -256,6 +257,25 @@ interface DrawerDefaultsConfig {
256
257
  blockScroll?: boolean;
257
258
  role?: 'dialog' | 'alertdialog';
258
259
  }
260
+ /**
261
+ * Sidebar component defaults configuration
262
+ */
263
+ interface SidebarDefaultsConfig {
264
+ position?: 'left' | 'right';
265
+ size?: 'sm' | 'md' | 'lg' | 'full';
266
+ variant?: 'default' | 'minimal' | 'compact';
267
+ modal?: boolean;
268
+ collapsible?: boolean;
269
+ defaultCollapsed?: boolean;
270
+ closeOnNavigate?: boolean;
271
+ closeOnBackdropClick?: boolean;
272
+ closeOnEscape?: boolean;
273
+ blockScroll?: boolean;
274
+ swipeToClose?: boolean;
275
+ showHeader?: boolean;
276
+ showFooter?: boolean;
277
+ showCloseButton?: boolean;
278
+ }
259
279
  /**
260
280
  * Components defaults configuration
261
281
  */
@@ -270,6 +290,7 @@ interface ComponentsConfig {
270
290
  buttonToggleGroup?: ButtonToggleGroupDefaultsConfig;
271
291
  select?: SelectDefaultsConfig;
272
292
  drawer?: DrawerDefaultsConfig;
293
+ sidebar?: SidebarDefaultsConfig;
273
294
  }
274
295
  /**
275
296
  * Main Studio configuration interface
@@ -331,21 +352,30 @@ declare class StudioConfigService {
331
352
  */
332
353
  declare function provideStudioConfig(config?: StudioConfig): EnvironmentProviders;
333
354
 
355
+ /**
356
+ * Badge component types
357
+ */
358
+ type BadgeVariant = 'solid' | 'outline' | 'soft' | 'dot';
359
+ type BadgeSize = 'sm' | 'md' | 'lg';
360
+ type BadgeColor = 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info' | 'neutral';
361
+ type BadgeRadius = 'sm' | 'md' | 'lg' | 'full';
362
+ type BadgeIconPosition = 'left' | 'right';
363
+
334
364
  declare class BadgeComponent {
335
365
  private readonly configService;
336
366
  private readonly badgeDefaults;
337
- variantInput: _angular_core.InputSignal<"solid" | "outline" | "soft" | "dot" | undefined>;
338
- sizeInput: _angular_core.InputSignal<"sm" | "md" | "lg" | undefined>;
339
- colorInput: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | "info" | "neutral" | undefined>;
340
- radiusInput: _angular_core.InputSignal<"sm" | "md" | "lg" | "full" | undefined>;
367
+ variantInput: _angular_core.InputSignal<BadgeVariant | undefined>;
368
+ sizeInput: _angular_core.InputSignal<BadgeSize | undefined>;
369
+ colorInput: _angular_core.InputSignal<BadgeColor | undefined>;
370
+ radiusInput: _angular_core.InputSignal<BadgeRadius | undefined>;
341
371
  variant: _angular_core.Signal<"solid" | "outline" | "soft" | "dot">;
342
372
  size: _angular_core.Signal<"sm" | "md" | "lg">;
343
373
  color: _angular_core.Signal<"primary" | "secondary" | "success" | "error" | "warning" | "info" | "neutral">;
344
374
  radius: _angular_core.Signal<"sm" | "md" | "lg" | "full">;
345
375
  icon: _angular_core.InputSignal<string | undefined>;
346
- iconPosition: _angular_core.InputSignal<"left" | "right">;
376
+ iconPosition: _angular_core.InputSignal<BadgeIconPosition>;
347
377
  dot: _angular_core.InputSignal<boolean>;
348
- dotColor: _angular_core.InputSignal<"primary" | "secondary" | "success" | "error" | "warning" | "info" | "neutral" | undefined>;
378
+ dotColor: _angular_core.InputSignal<BadgeColor | undefined>;
349
379
  removable: _angular_core.InputSignal<boolean>;
350
380
  removed: _angular_core.OutputEmitterRef<void>;
351
381
  href: _angular_core.InputSignal<string | undefined>;
@@ -369,6 +399,38 @@ declare class BadgeComponent {
369
399
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BadgeComponent, "studio-badge", never, { "variantInput": { "alias": "variant"; "required": false; "isSignal": true; }; "sizeInput": { "alias": "size"; "required": false; "isSignal": true; }; "colorInput": { "alias": "color"; "required": false; "isSignal": true; }; "radiusInput": { "alias": "radius"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "dotColor": { "alias": "dotColor"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "showZero": { "alias": "showZero"; "required": false; "isSignal": true; }; "uppercase": { "alias": "uppercase"; "required": false; "isSignal": true; }; "bold": { "alias": "bold"; "required": false; "isSignal": true; }; "pulse": { "alias": "pulse"; "required": false; "isSignal": true; }; "autoColor": { "alias": "autoColor"; "required": false; "isSignal": true; }; }, { "removed": "removed"; "clicked": "clicked"; }, never, ["*"], true, never>;
370
400
  }
371
401
 
402
+ type BadgeWrapperPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
403
+ type BadgeWrapperSize = 'sm' | 'md' | 'lg';
404
+
405
+ /**
406
+ * BadgeWrapper component - Wraps content with a positioned badge
407
+ *
408
+ * @example
409
+ * <studio-badge-wrapper [count]="5" color="error">
410
+ * <studio-button variant="ghost">
411
+ * <studio-icon name="bell" />
412
+ * </studio-button>
413
+ * </studio-badge-wrapper>
414
+ */
415
+ declare class BadgeWrapperComponent {
416
+ count: _angular_core.InputSignal<string | number | undefined>;
417
+ content: _angular_core.InputSignal<string | undefined>;
418
+ variant: _angular_core.InputSignal<BadgeVariant>;
419
+ color: _angular_core.InputSignal<BadgeColor>;
420
+ size: _angular_core.InputSignal<BadgeWrapperSize>;
421
+ position: _angular_core.InputSignal<BadgeWrapperPosition>;
422
+ showZero: _angular_core.InputSignal<boolean>;
423
+ max: _angular_core.InputSignal<number>;
424
+ dot: _angular_core.InputSignal<boolean>;
425
+ overlap: _angular_core.InputSignal<boolean>;
426
+ class: _angular_core.InputSignal<string>;
427
+ protected hostClasses: _angular_core.Signal<string>;
428
+ protected badgeContent: _angular_core.Signal<string | undefined>;
429
+ protected shouldShowBadge: _angular_core.Signal<boolean>;
430
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BadgeWrapperComponent, never>;
431
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BadgeWrapperComponent, "studio-badge-wrapper", never, { "count": { "alias": "count"; "required": false; "isSignal": true; }; "content": { "alias": "content"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "showZero": { "alias": "showZero"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "overlap": { "alias": "overlap"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
432
+ }
433
+
372
434
  /**
373
435
  * Button component with multiple variants, sizes, colors and states
374
436
  *
@@ -793,39 +855,34 @@ declare class IconComponent {
793
855
  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>;
794
856
  }
795
857
 
858
+ type IconPreset = 'minimal' | 'common' | 'full';
859
+ interface StudioIconConfig {
860
+ preset?: IconPreset;
861
+ customIcons?: Record<string, any>;
862
+ }
796
863
  /**
797
- * Studio icon provider
798
- * Registers commonly used Lucide icons
864
+ * Studio icon provider с поддержкой preset'ов
799
865
  *
800
866
  * @example
801
867
  * ```typescript
802
- * // app.config.ts
803
- * import { provideStudioIcons } from '@eduboxpro/studio';
868
+ * // Минимальный набор (только для компонентов библиотеки)
869
+ * provideStudioIcons({ preset: 'minimal' });
804
870
  *
805
- * export const appConfig: ApplicationConfig = {
806
- * providers: [
807
- * provideStudioIcons()
808
- * ]
809
- * };
810
- * ```
871
+ * // Расширенный набор (рекомендуется)
872
+ * provideStudioIcons({ preset: 'common' });
811
873
  *
812
- * To add additional icons:
813
- * @example
814
- * ```typescript
815
- * import { LUCIDE_ICONS, LucideIconProvider } from 'lucide-angular';
816
- * import { Zap, Wifi } from 'lucide-angular';
874
+ * // Все иконки Lucide (~1400 штук)
875
+ * provideStudioIcons({ preset: 'full' });
817
876
  *
818
- * providers: [
819
- * provideStudioIcons(),
820
- * {
821
- * provide: LUCIDE_ICONS,
822
- * multi: true,
823
- * useValue: new LucideIconProvider({ Zap, Wifi })
824
- * }
825
- * ]
877
+ * // С кастомными иконками
878
+ * import { Zap, Wifi } from 'lucide-angular';
879
+ * provideStudioIcons({
880
+ * preset: 'common',
881
+ * customIcons: { Zap, Wifi }
882
+ * });
826
883
  * ```
827
884
  */
828
- declare function provideStudioIcons(): EnvironmentProviders;
885
+ declare function provideStudioIcons(config?: StudioIconConfig): EnvironmentProviders;
829
886
 
830
887
  type InputType = 'text' | 'email' | 'tel' | 'url' | 'password' | 'number' | 'search' | 'date' | 'time';
831
888
  type InputMode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';
@@ -908,6 +965,184 @@ declare class InputComponent implements ControlValueAccessor {
908
965
  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>;
909
966
  }
910
967
 
968
+ type MenuItemTarget = '_blank' | '_self' | '_parent' | '_top';
969
+ type MenuItemIconPosition = 'left' | 'right';
970
+ type MenuItemBadgeColor = 'primary' | 'secondary' | 'success' | 'error' | 'warning';
971
+ type MenuItemTooltipPosition = 'top' | 'bottom' | 'left' | 'right';
972
+ /**
973
+ * Menu item interface for JSON-driven menu structure
974
+ */
975
+ interface MenuItem {
976
+ id?: string;
977
+ label?: string;
978
+ href?: string;
979
+ routerLink?: string | string[];
980
+ queryParams?: Params;
981
+ fragment?: string;
982
+ target?: MenuItemTarget;
983
+ icon?: string;
984
+ iconPosition?: MenuItemIconPosition;
985
+ badge?: string | number;
986
+ badgeColor?: MenuItemBadgeColor;
987
+ items?: MenuItem[];
988
+ disabled?: boolean;
989
+ visible?: boolean;
990
+ separator?: boolean;
991
+ class?: string;
992
+ style?: Record<string, string>;
993
+ command?: (event?: MenuItemCommandEvent) => void;
994
+ tooltip?: string;
995
+ tooltipPosition?: MenuItemTooltipPosition;
996
+ data?: any;
997
+ }
998
+ /**
999
+ * Event emitted when menu item command is executed
1000
+ */
1001
+ interface MenuItemCommandEvent {
1002
+ originalEvent?: Event;
1003
+ item: MenuItem;
1004
+ }
1005
+ /**
1006
+ * Event emitted when menu item is clicked
1007
+ */
1008
+ interface MenuItemClickEvent {
1009
+ originalEvent: Event;
1010
+ item: MenuItem;
1011
+ }
1012
+ /**
1013
+ * Event emitted when expand state changes
1014
+ */
1015
+ interface MenuExpandEvent {
1016
+ itemId: string;
1017
+ expanded: boolean;
1018
+ }
1019
+
1020
+ type MenuOrientation = 'vertical' | 'horizontal';
1021
+ type MenuMode = 'static' | 'accordion' | 'overlay';
1022
+ type MenuSize = 'sm' | 'md' | 'lg';
1023
+ type MenuVariant = 'default' | 'filled' | 'outlined' | 'ghost';
1024
+ type MenuColor = 'primary' | 'secondary' | 'inherit';
1025
+ type MenuRadius = 'none' | 'sm' | 'md' | 'lg';
1026
+ type MenuSpacing = 'none' | 'sm' | 'md' | 'lg';
1027
+ type MenuExpandIconPosition = 'left' | 'right';
1028
+ /**
1029
+ * Menu component - Primitive component for navigation menus
1030
+ *
1031
+ * @example
1032
+ * <studio-menu
1033
+ * [items]="menuItems"
1034
+ * size="md"
1035
+ * variant="default"
1036
+ * (itemClick)="handleClick($event)"
1037
+ * />
1038
+ */
1039
+ declare class MenuComponent implements OnInit {
1040
+ private router;
1041
+ private platformId;
1042
+ items: _angular_core.InputSignal<MenuItem[]>;
1043
+ orientation: _angular_core.InputSignal<MenuOrientation>;
1044
+ mode: _angular_core.InputSignal<MenuMode>;
1045
+ collapsible: _angular_core.InputSignal<boolean>;
1046
+ defaultExpanded: _angular_core.InputSignal<string[]>;
1047
+ expandOnHover: _angular_core.InputSignal<boolean>;
1048
+ activeItem: _angular_core.InputSignal<string | undefined>;
1049
+ routerLinkActive: _angular_core.InputSignal<boolean>;
1050
+ selectOnNavigate: _angular_core.InputSignal<boolean>;
1051
+ routerLinkActiveOptions: _angular_core.InputSignal<IsActiveMatchOptions>;
1052
+ keyboardNavigation: _angular_core.InputSignal<boolean>;
1053
+ arrowNavigation: _angular_core.InputSignal<boolean>;
1054
+ homeEndNavigation: _angular_core.InputSignal<boolean>;
1055
+ animated: _angular_core.InputSignal<boolean>;
1056
+ animationDuration: _angular_core.InputSignal<number>;
1057
+ ariaLabel: _angular_core.InputSignal<string | undefined>;
1058
+ role: _angular_core.InputSignal<"menu" | "navigation">;
1059
+ size: _angular_core.InputSignal<MenuSize>;
1060
+ compact: _angular_core.InputSignal<boolean>;
1061
+ fullWidth: _angular_core.InputSignal<boolean>;
1062
+ variant: _angular_core.InputSignal<MenuVariant>;
1063
+ color: _angular_core.InputSignal<MenuColor>;
1064
+ radius: _angular_core.InputSignal<MenuRadius>;
1065
+ spacing: _angular_core.InputSignal<MenuSpacing>;
1066
+ showDividers: _angular_core.InputSignal<boolean>;
1067
+ iconSize: _angular_core.InputSignal<number>;
1068
+ iconOnly: _angular_core.InputSignal<boolean>;
1069
+ indentLevel: _angular_core.InputSignal<number>;
1070
+ showExpandIcon: _angular_core.InputSignal<boolean>;
1071
+ expandIconPosition: _angular_core.InputSignal<MenuExpandIconPosition>;
1072
+ expandIcon: _angular_core.InputSignal<string>;
1073
+ class: _angular_core.InputSignal<string>;
1074
+ itemClass: _angular_core.InputSignal<string>;
1075
+ level: _angular_core.InputSignal<number>;
1076
+ parentExpanded: _angular_core.InputSignal<boolean>;
1077
+ itemClick: _angular_core.OutputEmitterRef<MenuItemClickEvent>;
1078
+ itemSelect: _angular_core.OutputEmitterRef<MenuItem>;
1079
+ expandChange: _angular_core.OutputEmitterRef<MenuExpandEvent>;
1080
+ activeChange: _angular_core.OutputEmitterRef<string>;
1081
+ private expandedItems;
1082
+ private activeItemId;
1083
+ private focusedIndex;
1084
+ private flattenedItems;
1085
+ protected hostClasses: _angular_core.Signal<string>;
1086
+ constructor();
1087
+ ngOnInit(): void;
1088
+ isExpanded(item: MenuItem): boolean;
1089
+ isActive(item: MenuItem): boolean;
1090
+ isDisabled(item: MenuItem): boolean;
1091
+ isVisible(item: MenuItem): boolean;
1092
+ hasChildren(item: MenuItem): boolean;
1093
+ getItemId(item: MenuItem, index: number): string;
1094
+ handleItemClick(event: Event, item: MenuItem): void;
1095
+ handleItemMouseEnter(item: MenuItem): void;
1096
+ handleItemMouseLeave(item: MenuItem): void;
1097
+ toggleExpand(item: MenuItem): void;
1098
+ expand(item: MenuItem): void;
1099
+ collapse(item: MenuItem): void;
1100
+ handleKeyDown(event: KeyboardEvent): void;
1101
+ private focusNextItem;
1102
+ private focusPreviousItem;
1103
+ private expandFocusedItem;
1104
+ private collapseFocusedItem;
1105
+ private activateFocusedItem;
1106
+ private collapseAll;
1107
+ private flattenMenuItems;
1108
+ private updateActiveFromRouter;
1109
+ getIndentStyle(itemLevel?: number): Record<string, string>;
1110
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuComponent, never>;
1111
+ 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>;
1112
+ }
1113
+
1114
+ type NavbarVariant = 'default' | 'filled' | 'outlined' | 'ghost' | 'transparent';
1115
+ type NavbarColor = 'primary' | 'secondary' | 'inherit';
1116
+ type NavbarSize = 'sm' | 'md' | 'lg';
1117
+ type NavbarShadow = 'none' | 'sm' | 'md' | 'lg';
1118
+
1119
+ /**
1120
+ * Navbar component - Primitive component for navigation headers
1121
+ *
1122
+ * @example
1123
+ * <studio-navbar variant="filled" [sticky]="true">
1124
+ * <div navbarLeft>Logo</div>
1125
+ * <div navbarCenter>Search</div>
1126
+ * <div navbarRight>User menu</div>
1127
+ * </studio-navbar>
1128
+ */
1129
+ declare class NavbarComponent {
1130
+ variant: _angular_core.InputSignal<NavbarVariant>;
1131
+ color: _angular_core.InputSignal<NavbarColor>;
1132
+ shadow: _angular_core.InputSignal<NavbarShadow>;
1133
+ size: _angular_core.InputSignal<NavbarSize>;
1134
+ customHeight: _angular_core.InputSignal<number | null>;
1135
+ sticky: _angular_core.InputSignal<boolean>;
1136
+ blurBg: _angular_core.InputSignal<boolean>;
1137
+ bordered: _angular_core.InputSignal<boolean>;
1138
+ class: _angular_core.InputSignal<string>;
1139
+ navbarClick: _angular_core.OutputEmitterRef<MouseEvent>;
1140
+ protected hostClasses: _angular_core.Signal<string>;
1141
+ handleClick(event: MouseEvent): void;
1142
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NavbarComponent, never>;
1143
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NavbarComponent, "studio-navbar", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "customHeight": { "alias": "customHeight"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "blurBg": { "alias": "blurBg"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "navbarClick": "navbarClick"; }, never, ["[navbarLeft]", "[navbarCenter]", "[navbarRight]", "*"], true, never>;
1144
+ }
1145
+
911
1146
  interface SelectOption<T = any> {
912
1147
  label: string;
913
1148
  value: T;
@@ -1006,6 +1241,89 @@ declare class SelectComponent<T = any> implements ControlValueAccessor {
1006
1241
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent<any>, "studio-select", never, { "variantInput": { "alias": "variant"; "required": false; "isSignal": true; }; "sizeInput": { "alias": "size"; "required": false; "isSignal": true; }; "radiusInput": { "alias": "radius"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "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; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; "isSignal": true; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "searchChange": "searchChange"; "opened": "opened"; "closed": "closed"; "optionSelected": "optionSelected"; }, never, never, true, never>;
1007
1242
  }
1008
1243
 
1244
+ /**
1245
+ * Sidebar component types
1246
+ */
1247
+ type SidebarPosition = 'left' | 'right';
1248
+ type SidebarSize = 'sm' | 'md' | 'lg' | 'full';
1249
+ type SidebarVariant = 'default' | 'minimal' | 'compact';
1250
+ interface SidebarConfig {
1251
+ position?: SidebarPosition;
1252
+ size?: SidebarSize;
1253
+ variant?: SidebarVariant;
1254
+ collapsible?: boolean;
1255
+ defaultCollapsed?: boolean;
1256
+ modal?: boolean;
1257
+ closeOnNavigate?: boolean;
1258
+ showOverlay?: boolean;
1259
+ }
1260
+
1261
+ /**
1262
+ * Sidebar component - Navigation sidebar built on top of Drawer
1263
+ *
1264
+ * @example
1265
+ * <studio-sidebar [(visible)]="sidebarOpen">
1266
+ * <nav sidebarHeader>
1267
+ * <h2>Navigation</h2>
1268
+ * </nav>
1269
+ *
1270
+ * <studio-menu>
1271
+ * <studio-menu-item>Home</studio-menu-item>
1272
+ * <studio-menu-item>About</studio-menu-item>
1273
+ * </studio-menu>
1274
+ *
1275
+ * <div sidebarFooter>
1276
+ * <studio-button>Logout</studio-button>
1277
+ * </div>
1278
+ * </studio-sidebar>
1279
+ */
1280
+ declare class SidebarComponent {
1281
+ private readonly router;
1282
+ private readonly configService;
1283
+ private readonly sidebarDefaults;
1284
+ id: _angular_core.InputSignal<string>;
1285
+ visible: _angular_core.ModelSignal<boolean>;
1286
+ positionInput: _angular_core.InputSignal<SidebarPosition | undefined>;
1287
+ sizeInput: _angular_core.InputSignal<SidebarSize | undefined>;
1288
+ variantInput: _angular_core.InputSignal<SidebarVariant | undefined>;
1289
+ customWidth: _angular_core.InputSignal<string | undefined>;
1290
+ position: _angular_core.Signal<"left" | "right">;
1291
+ size: _angular_core.Signal<"sm" | "md" | "lg" | "full">;
1292
+ variant: _angular_core.Signal<"default" | "minimal" | "compact">;
1293
+ modalInput: _angular_core.InputSignal<boolean | undefined>;
1294
+ collapsibleInput: _angular_core.InputSignal<boolean | undefined>;
1295
+ defaultCollapsedInput: _angular_core.InputSignal<boolean | undefined>;
1296
+ closeOnNavigateInput: _angular_core.InputSignal<boolean | undefined>;
1297
+ closeOnBackdropClickInput: _angular_core.InputSignal<boolean | undefined>;
1298
+ closeOnEscapeInput: _angular_core.InputSignal<boolean | undefined>;
1299
+ blockScrollInput: _angular_core.InputSignal<boolean | undefined>;
1300
+ swipeToCloseInput: _angular_core.InputSignal<boolean | undefined>;
1301
+ modal: _angular_core.Signal<boolean>;
1302
+ collapsible: _angular_core.Signal<boolean>;
1303
+ defaultCollapsed: _angular_core.Signal<boolean>;
1304
+ closeOnNavigate: _angular_core.Signal<boolean>;
1305
+ closeOnBackdropClick: _angular_core.Signal<boolean>;
1306
+ closeOnEscape: _angular_core.Signal<boolean>;
1307
+ blockScroll: _angular_core.Signal<boolean>;
1308
+ swipeToClose: _angular_core.Signal<boolean>;
1309
+ header: _angular_core.InputSignal<string | undefined>;
1310
+ showHeaderInput: _angular_core.InputSignal<boolean | undefined>;
1311
+ showFooterInput: _angular_core.InputSignal<boolean | undefined>;
1312
+ showCloseButtonInput: _angular_core.InputSignal<boolean | undefined>;
1313
+ showHeader: _angular_core.Signal<boolean>;
1314
+ showFooter: _angular_core.Signal<boolean>;
1315
+ showCloseButton: _angular_core.Signal<boolean>;
1316
+ contentPadding: _angular_core.InputSignal<string | undefined>;
1317
+ contentGap: _angular_core.InputSignal<string | undefined>;
1318
+ background: _angular_core.InputSignal<string | undefined>;
1319
+ class: _angular_core.InputSignal<string>;
1320
+ protected hostClasses: _angular_core.Signal<string>;
1321
+ protected drawerSize: _angular_core.Signal<"sm" | "md" | "lg" | "xl" | "full">;
1322
+ constructor();
1323
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SidebarComponent, never>;
1324
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SidebarComponent, "studio-sidebar", 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; }; "variantInput": { "alias": "variant"; "required": false; "isSignal": true; }; "customWidth": { "alias": "customWidth"; "required": false; "isSignal": true; }; "modalInput": { "alias": "modal"; "required": false; "isSignal": true; }; "collapsibleInput": { "alias": "collapsible"; "required": false; "isSignal": true; }; "defaultCollapsedInput": { "alias": "defaultCollapsed"; "required": false; "isSignal": true; }; "closeOnNavigateInput": { "alias": "closeOnNavigate"; "required": false; "isSignal": true; }; "closeOnBackdropClickInput": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "closeOnEscapeInput": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "blockScrollInput": { "alias": "blockScroll"; "required": false; "isSignal": true; }; "swipeToCloseInput": { "alias": "swipeToClose"; "required": false; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "showHeaderInput": { "alias": "showHeader"; "required": false; "isSignal": true; }; "showFooterInput": { "alias": "showFooter"; "required": false; "isSignal": true; }; "showCloseButtonInput": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "contentPadding": { "alias": "contentPadding"; "required": false; "isSignal": true; }; "contentGap": { "alias": "contentGap"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; }, never, ["[sidebarHeader]", "*", "[sidebarFooter]"], true, never>;
1325
+ }
1326
+
1009
1327
  /**
1010
1328
  * Toggle switch component with customizable size and color
1011
1329
  *
@@ -1492,5 +1810,5 @@ declare function loadGoogleFonts(fonts: Array<{
1492
1810
  display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';
1493
1811
  }>): void;
1494
1812
 
1495
- export { BadgeComponent, ButtonComponent, ButtonGroupComponent, ButtonToggleGroupComponent, CheckboxComponent, DrawerComponent, DrawerService, IconComponent, InputComponent, MASK_PRESETS, MaskDirective, MaskEngine, STUDIO_CONFIG, SelectComponent, StudioConfigService, SwitchComponent, TextareaComponent, ThemeSwitchComponent, classNames, isSafeUrl, loadGoogleFont, loadGoogleFonts, provideStudioConfig, provideStudioIcons, sanitizeUrl, withConfigDefault };
1496
- 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, SelectDefaultsConfig, SelectDisplayContext, SelectOption, SelectOptionGroup, SelectPosition, SelectSize, SelectVariant, StudioConfig, StudioThemeConfig, SwitchDefaultsConfig, TextareaColor, TextareaDefaultsConfig, TextareaRadius, TextareaSize, TextareaVariant, ThemeMode };
1813
+ export { BadgeComponent, BadgeWrapperComponent, ButtonComponent, ButtonGroupComponent, ButtonToggleGroupComponent, CheckboxComponent, DrawerComponent, DrawerService, IconComponent, InputComponent, MASK_PRESETS, MaskDirective, MaskEngine, MenuComponent, NavbarComponent, STUDIO_CONFIG, SelectComponent, SidebarComponent, StudioConfigService, SwitchComponent, TextareaComponent, ThemeSwitchComponent, classNames, isSafeUrl, loadGoogleFont, loadGoogleFonts, provideStudioConfig, provideStudioIcons, sanitizeUrl, withConfigDefault };
1814
+ export type { BadgeColor, BadgeDefaultsConfig, BadgeIconPosition, BadgeRadius, BadgeSize, BadgeVariant, BadgeWrapperPosition, BadgeWrapperSize, 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, NavbarColor, NavbarShadow, NavbarSize, NavbarVariant, SelectDefaultsConfig, SelectDisplayContext, SelectOption, SelectOptionGroup, SelectPosition, SelectSize, SelectVariant, SidebarConfig, SidebarDefaultsConfig, SidebarPosition, SidebarSize, SidebarVariant, 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.10",
3
+ "version": "0.1.12",
4
4
  "description": "Modern Angular UI library for educational platforms with customizable design system",
5
5
  "keywords": [
6
6
  "angular",