commons-shared-web-ui 0.0.11 → 0.0.13

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
@@ -20,6 +20,7 @@ import * as i15 from '@angular/material/button';
20
20
  import * as i16 from '@angular/material/menu';
21
21
  import * as i17 from '@angular/material/progress-bar';
22
22
  import * as i18 from '@angular/material/tooltip';
23
+ import { TooltipPosition } from '@angular/material/tooltip';
23
24
  import * as i19 from '@angular/material/slider';
24
25
  import * as i20 from '@angular/material/list';
25
26
  import * as i21 from '@angular/material/chips';
@@ -33,6 +34,7 @@ import * as i28 from '@angular/material/expansion';
33
34
  import * as i29 from '@angular/cdk/accordion';
34
35
  import * as i3$1 from '@angular/forms';
35
36
  import { ControlValueAccessor, FormGroup, FormBuilder, AbstractControl, FormControl, FormArray, ValidatorFn, ValidationErrors } from '@angular/forms';
37
+ import * as i3$2 from '@angular/router';
36
38
  import { Router, ActivatedRoute } from '@angular/router';
37
39
  import * as i11$1 from '@angular/cdk/scrolling';
38
40
  import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
@@ -1521,6 +1523,27 @@ interface SectionConfig {
1521
1523
  allowMulti?: boolean;
1522
1524
  name?: string;
1523
1525
  label?: string;
1526
+ /** Configuration for the card-based multi-save UI (FAQ style) */
1527
+ multiSaveConfig?: MultiSaveConfig;
1528
+ }
1529
+ interface MultiSaveConfig {
1530
+ /** If TRUE, enable the Save/Cancel card-based flow for this repeater */
1531
+ active?: boolean;
1532
+ /**
1533
+ * The name of the field to show as the main 'heading' in the collapsed card.
1534
+ * Typically matches the question or name.
1535
+ */
1536
+ summaryField?: string;
1537
+ /**
1538
+ * Optional name of the field to show as the sub-text in the collapsed card.
1539
+ * Typically matches the answer or description.
1540
+ */
1541
+ descriptionField?: string;
1542
+ /**
1543
+ * Custom label key for the 'Add' button. If omitted, defaults to
1544
+ * '+ Add a [label]'.
1545
+ */
1546
+ addLabel?: string;
1524
1547
  }
1525
1548
  interface StepperConfig {
1526
1549
  children: FieldConfig[];
@@ -1666,6 +1689,17 @@ interface AttachmentConfig {
1666
1689
  acceptLabel?: string;
1667
1690
  /** Legacy: explicit list of allowed extensions (e.g. ['.pdf', '.jpg']) */
1668
1691
  allowedExtensions?: string[];
1692
+ /**
1693
+ * API endpoint to upload the file to. When provided, the file is POSTed as
1694
+ * multipart/form-data and the returned URL is stored as dataUrl instead of
1695
+ * the base64 data URL produced by FileReader.
1696
+ */
1697
+ uploadUrl?: string;
1698
+ /**
1699
+ * Entity type sent along with the upload request (e.g. 'ENTITY_TYPE.SESSION').
1700
+ * Only relevant when uploadUrl is set.
1701
+ */
1702
+ entityType?: string;
1669
1703
  }
1670
1704
  interface LocationConfig {
1671
1705
  enableCurrentLocation?: boolean;
@@ -1874,7 +1908,15 @@ declare class FormFieldComponent implements OnInit, OnDestroy {
1874
1908
  showPassword: boolean;
1875
1909
  isDragOver: boolean;
1876
1910
  fileUploadError: string;
1911
+ multiSaveError: string;
1877
1912
  private destroy$;
1913
+ /** FormControl used ONLY for the autocomplete text-input display value */
1914
+ autocompleteInputCtrl: FormControl<string>;
1915
+ /** Filtered option list shown in the mat-autocomplete panel */
1916
+ filteredOptions: {
1917
+ label: string;
1918
+ code: any;
1919
+ }[];
1878
1920
  /** For GROUP fields with allowMulti = true */
1879
1921
  groupFormArray: FormArray;
1880
1922
  /** For GROUP fields with allowMulti = false — single nested FormGroup */
@@ -1884,11 +1926,17 @@ declare class FormFieldComponent implements OnInit, OnDestroy {
1884
1926
  * Using a separate array (not FormArray.controls) + trackBy(id) ensures
1885
1927
  * Angular creates FRESH child components for every new row, preventing
1886
1928
  * cached values from bleeding into new instances.
1929
+ *
1930
+ * Enhanced with isEditing and isSaved flags for the 'multiSave' card UI.
1887
1931
  */
1888
- instanceList: Array<{
1932
+ instanceList: {
1889
1933
  id: number;
1890
1934
  fg: FormGroup;
1891
- }>;
1935
+ initialValue?: any;
1936
+ isEditing?: boolean;
1937
+ isSaved?: boolean;
1938
+ isExpanded?: boolean;
1939
+ }[];
1892
1940
  private _nextInstanceId;
1893
1941
  /**
1894
1942
  * Key used to register the GROUP control on the parent formGroup.
@@ -1897,6 +1945,7 @@ declare class FormFieldComponent implements OnInit, OnDestroy {
1897
1945
  get groupKey(): string;
1898
1946
  constructor(fb: FormBuilder, expressionService: ExpressionService, http: HttpClient);
1899
1947
  ngOnInit(): void;
1948
+ get addMultiLabel(): string;
1900
1949
  private initGroupField;
1901
1950
  /**
1902
1951
  * Sets up cross-field validation based on the `onValidate` formula.
@@ -1905,7 +1954,11 @@ declare class FormFieldComponent implements OnInit, OnDestroy {
1905
1954
  */
1906
1955
  private setupFormulaValidation;
1907
1956
  addGroupInstance(): void;
1908
- removeGroupInstance(index: number): void;
1957
+ saveGroupInstance(index: number): void;
1958
+ cancelGroupInstance(index: number): void;
1959
+ editGroupInstance(index: number): void;
1960
+ toggleExpandGroupInstance(index: number): void;
1961
+ removeGroupInstance(index: number, force?: boolean): void;
1909
1962
  trackByInstanceId(_: number, item: {
1910
1963
  id: number;
1911
1964
  fg: FormGroup;
@@ -1942,7 +1995,9 @@ declare class FormFieldComponent implements OnInit, OnDestroy {
1942
1995
  get isTextField(): boolean;
1943
1996
  get isNumberField(): boolean;
1944
1997
  get isDateField(): boolean;
1998
+ get isTimeField(): boolean;
1945
1999
  get isDropdown(): boolean;
2000
+ get isAutocomplete(): boolean;
1946
2001
  get isFileUpload(): boolean;
1947
2002
  get isRadio(): boolean;
1948
2003
  get isCheckbox(): boolean;
@@ -1953,6 +2008,22 @@ declare class FormFieldComponent implements OnInit, OnDestroy {
1953
2008
  get isGenerated(): boolean;
1954
2009
  get isRow(): boolean;
1955
2010
  get isGroup(): boolean;
2011
+ /**
2012
+ * Initialise the separate display-control that drives the mat-autocomplete
2013
+ * text input. The real form control always stores the *code* value.
2014
+ */
2015
+ private initAutocomplete;
2016
+ /** Filter options by the user's search text (matches label or code). */
2017
+ private _filterOptions;
2018
+ /** Put the human-readable label into the display control based on the stored code. */
2019
+ private _syncAutocompleteDisplayValue;
2020
+ /** Called when user picks an option from the mat-autocomplete panel. */
2021
+ onAutocompleteSelected(option: {
2022
+ label: string;
2023
+ code: any;
2024
+ }): void;
2025
+ /** Called when the input loses focus — clear display & value if text was manually deleted. */
2026
+ onAutocompleteClear(): void;
1956
2027
  /**
1957
2028
  * Returns the effective grid column span for a child inside a ROW.
1958
2029
  * If the child declares an explicit colSpan, use it.
@@ -1983,9 +2054,78 @@ declare class SmartFormModule {
1983
2054
  static ɵinj: i0.ɵɵInjectorDeclaration<SmartFormModule>;
1984
2055
  }
1985
2056
 
2057
+ interface SideNavItem {
2058
+ id: string;
2059
+ label: string;
2060
+ icon?: string;
2061
+ route?: string;
2062
+ roles?: string[];
2063
+ disabled?: boolean;
2064
+ showArrow?: boolean;
2065
+ tooltip?: string;
2066
+ }
2067
+ interface SideNavStyleConfig {
2068
+ bg?: string;
2069
+ width?: string;
2070
+ collapsedWidth?: string;
2071
+ fontFamily?: string;
2072
+ headingColor?: string;
2073
+ itemColor?: string;
2074
+ itemHoverBg?: string;
2075
+ activeBg?: string;
2076
+ activeColor?: string;
2077
+ activeHoverBg?: string;
2078
+ }
2079
+ interface SideNavSection {
2080
+ heading?: string;
2081
+ items: SideNavItem[];
2082
+ }
2083
+
2084
+ declare class SideNavComponent implements OnChanges {
2085
+ sections: SideNavSection[];
2086
+ userRoles?: string[];
2087
+ activeId?: string;
2088
+ styleConfig?: SideNavStyleConfig;
2089
+ /** Control whether the nav is collapsed externally (two-way bindable) */
2090
+ collapsed: boolean;
2091
+ /** Width of the nav when expanded. Overrides the CSS variable default. */
2092
+ width?: string;
2093
+ /** Width of the nav when collapsed (icons only). Overrides the CSS variable default. */
2094
+ collapsedWidth?: string;
2095
+ /** Whether to show the collapse toggle button */
2096
+ showCollapseToggle: boolean;
2097
+ /** Whether to hide icons when the side nav is expanded */
2098
+ hideIconsWhenExpanded: boolean;
2099
+ /** Whether to show tooltips on nav items */
2100
+ showTooltips: boolean;
2101
+ /** Position of the tooltip */
2102
+ tooltipPosition: TooltipPosition;
2103
+ itemClicked: EventEmitter<SideNavItem>;
2104
+ /** Emits whenever the collapsed state changes (supports two-way binding via [(collapsed)]) */
2105
+ collapsedChange: EventEmitter<boolean>;
2106
+ /** Applies collapsed class to :host for the width CSS transition */
2107
+ get isHostCollapsed(): boolean;
2108
+ filteredSections: SideNavSection[];
2109
+ ngOnChanges(changes: SimpleChanges): void;
2110
+ private filterSections;
2111
+ onItemClick(item: SideNavItem, event: Event): void;
2112
+ toggleCollapse(): void;
2113
+ get customStyles(): {
2114
+ [key: string]: string;
2115
+ };
2116
+ static ɵfac: i0.ɵɵFactoryDeclaration<SideNavComponent, never>;
2117
+ static ɵcmp: i0.ɵɵComponentDeclaration<SideNavComponent, "lib-side-nav", never, { "sections": { "alias": "sections"; "required": false; }; "userRoles": { "alias": "userRoles"; "required": false; }; "activeId": { "alias": "activeId"; "required": false; }; "styleConfig": { "alias": "styleConfig"; "required": false; }; "collapsed": { "alias": "collapsed"; "required": false; }; "width": { "alias": "width"; "required": false; }; "collapsedWidth": { "alias": "collapsedWidth"; "required": false; }; "showCollapseToggle": { "alias": "showCollapseToggle"; "required": false; }; "hideIconsWhenExpanded": { "alias": "hideIconsWhenExpanded"; "required": false; }; "showTooltips": { "alias": "showTooltips"; "required": false; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; }; }, { "itemClicked": "itemClicked"; "collapsedChange": "collapsedChange"; }, never, never, false, never>;
2118
+ }
2119
+
2120
+ declare class SideNavModule {
2121
+ static ɵfac: i0.ɵɵFactoryDeclaration<SideNavModule, never>;
2122
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SideNavModule, [typeof SideNavComponent], [typeof i2$1.CommonModule, typeof i3$2.RouterModule, typeof MaterialModule], [typeof SideNavComponent]>;
2123
+ static ɵinj: i0.ɵɵInjectorDeclaration<SideNavModule>;
2124
+ }
2125
+
1986
2126
  declare class SharedUiModule {
1987
2127
  static ɵfac: i0.ɵɵFactoryDeclaration<SharedUiModule, never>;
1988
- static ɵmod: i0.ɵɵNgModuleDeclaration<SharedUiModule, never, [typeof i2$1.CommonModule, typeof MaterialModule, typeof AlertModule, typeof ButtonModule, typeof ConfirmationModalModule, typeof FilterSidebarModule, typeof FilterModule, typeof SummaryCardModule, typeof ConfigurableFormModule, typeof FormComponentsModule, typeof SmartFormModule], [typeof MaterialModule, typeof AlertModule, typeof ButtonModule, typeof ConfirmationModalModule, typeof FilterSidebarModule, typeof FilterModule, typeof SummaryCardModule, typeof ConfigurableFormModule, typeof FormComponentsModule, typeof SmartFormModule]>;
2128
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SharedUiModule, never, [typeof i2$1.CommonModule, typeof MaterialModule, typeof AlertModule, typeof ButtonModule, typeof ConfirmationModalModule, typeof FilterSidebarModule, typeof FilterModule, typeof SummaryCardModule, typeof ConfigurableFormModule, typeof FormComponentsModule, typeof SmartFormModule, typeof SideNavModule], [typeof MaterialModule, typeof AlertModule, typeof ButtonModule, typeof ConfirmationModalModule, typeof FilterSidebarModule, typeof FilterModule, typeof SummaryCardModule, typeof ConfigurableFormModule, typeof FormComponentsModule, typeof SmartFormModule, typeof SideNavModule]>;
1989
2129
  static ɵinj: i0.ɵɵInjectorDeclaration<SharedUiModule>;
1990
2130
  }
1991
2131
 
@@ -2147,6 +2287,7 @@ declare const PAGINATION_THEME_DEFAULT = "theme-1";
2147
2287
  declare const PAGINATION_THEME_DARK = "theme-2";
2148
2288
  declare const NAV_VARIANT_DEFAULT: 'filled' | 'underline' | 'pills';
2149
2289
  declare const NAV_ORIENTATION_DEFAULT: 'horizontal' | 'vertical';
2290
+ declare const DEFAULT_SIDE_NAV_TOOLTIP_POSITION = "right";
2150
2291
 
2151
2292
  interface TableOption {
2152
2293
  label: string;
@@ -2385,6 +2526,7 @@ declare const SAMPLE_FORMS: {
2385
2526
  documentUploadForm: string;
2386
2527
  demandDefinitionForm: string;
2387
2528
  projectInfoForm: string;
2529
+ faqForm: string;
2388
2530
  };
2389
2531
 
2390
2532
  declare const smartForm_examples_d_SAMPLE_FORMS: typeof SAMPLE_FORMS;
@@ -2408,5 +2550,5 @@ declare class SnackbarModule {
2408
2550
  static ɵinj: i0.ɵɵInjectorDeclaration<SnackbarModule>;
2409
2551
  }
2410
2552
 
2411
- export { AlertComponent, AlertModule, ButtonComponent, ButtonModule, CheckboxComponent, ConfigurableFormComponent, configurableForm_examples_d as ConfigurableFormExamples, ConfigurableFormModule, ConfirmationModalComponent, ConfirmationModalModule, DEFAULT_ITEMS_PER_PAGE, DEFAULT_PAGE_SIZE_OPTIONS, DatepickerComponent, DropdownComponent, ExpressionService, FilterComponent, FilterModule, FilterSidebarComponent, FilterSidebarModule, FormComponentsModule, InputComponent, MaterialModule, NAV_ORIENTATION_DEFAULT, NAV_VARIANT_DEFAULT, NavComponent, NavModule, PAGINATION_THEME_DARK, PAGINATION_THEME_DEFAULT, PaginationComponent, PaginationModule, RadioComponent, SearchComponent, SharedUiModule, SmartFormComponent, SmartFormController, smartForm_examples_d as SmartFormExamples, SmartFormModule, SmartTableComponent, SmartTableModule, SnackbarComponent, SnackbarModule, SnackbarService, StringUtils, SummaryCardComponent, SummaryCardModule, ToggleComponent, ValidationUtils, clearLocalStorage, clearSessionStorage, getLocalStorageItem, getSessionStorageItem, removeLocalStorageItem, removeSessionStorageItem, setLocalStorageItem, setSessionStorageItem, translateConfig };
2412
- export type { AlertLabels, AlertVariant, AttachmentConfig, ButtonLabels, ButtonVariant, CheckboxConfig, CheckboxLabels, CheckboxOption, ConfirmationModalConfig, DateConfig, DatePickerConfig, DatepickerLabels, DropdownConfig, DropdownLabels, DropdownOption, EmailConfig, FieldConfig, FieldType, FilterChangeEvent, FilterConfig, FilterItem, FilterItemType, FilterOutput, FilterSearchConfig, FilterSidebarChangeEvent, FilterSidebarConfig, FilterSidebarOutput, FormConfig, FormField, FormOption, FormSchema, FormSection, GeneratedConfig, IconInput, InputConfig, InputLabels, InputType, JsonFieldConfig, JsonFormConfig, KeyType, LengthConstraint, LocationConfig, NavItem, NavStyleConfig, NestedStringConfig, NumberConfig, OptionConfig$1 as OptionConfig, OptionDTO, OptionItem, PaginationConfig, PaginationLabels, PhoneConfig, QueryParamsConfig, RadioConfig, RadioLabels, RadioOption, RangeConfig, RatingConfig, SearchConfig, SearchLabels, SectionConfig, SnackbarConfig, SnackbarVariant, StepperConfig, SubmitConfig, SummaryCardConfig, SummaryCardLabels, SummaryCardMeta, TableAction, TableActionItem, TableColumn, TableConfig, TableFilter, TableFilterChangeEvent, TableFilterColumn, TableFilterConfig, TableFilterItem, TableFilterLabels, TableFilterOutput, TableLabels, TableOption, TableTheme, TextConfig, ToggleConfig, ToggleLabels, UIConfig, UISubType, UIType, UploadedFile, ValidationResult, ValidationRules };
2553
+ export { AlertComponent, AlertModule, ButtonComponent, ButtonModule, CheckboxComponent, ConfigurableFormComponent, configurableForm_examples_d as ConfigurableFormExamples, ConfigurableFormModule, ConfirmationModalComponent, ConfirmationModalModule, DEFAULT_ITEMS_PER_PAGE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_SIDE_NAV_TOOLTIP_POSITION, DatepickerComponent, DropdownComponent, ExpressionService, FilterComponent, FilterModule, FilterSidebarComponent, FilterSidebarModule, FormComponentsModule, InputComponent, MaterialModule, NAV_ORIENTATION_DEFAULT, NAV_VARIANT_DEFAULT, NavComponent, NavModule, PAGINATION_THEME_DARK, PAGINATION_THEME_DEFAULT, PaginationComponent, PaginationModule, RadioComponent, SearchComponent, SharedUiModule, SideNavComponent, SideNavModule, SmartFormComponent, SmartFormController, smartForm_examples_d as SmartFormExamples, SmartFormModule, SmartTableComponent, SmartTableModule, SnackbarComponent, SnackbarModule, SnackbarService, StringUtils, SummaryCardComponent, SummaryCardModule, ToggleComponent, ValidationUtils, clearLocalStorage, clearSessionStorage, getLocalStorageItem, getSessionStorageItem, removeLocalStorageItem, removeSessionStorageItem, setLocalStorageItem, setSessionStorageItem, translateConfig };
2554
+ export type { AlertLabels, AlertVariant, AttachmentConfig, ButtonLabels, ButtonVariant, CheckboxConfig, CheckboxLabels, CheckboxOption, ConfirmationModalConfig, DateConfig, DatePickerConfig, DatepickerLabels, DropdownConfig, DropdownLabels, DropdownOption, EmailConfig, FieldConfig, FieldType, FilterChangeEvent, FilterConfig, FilterItem, FilterItemType, FilterOutput, FilterSearchConfig, FilterSidebarChangeEvent, FilterSidebarConfig, FilterSidebarOutput, FormConfig, FormField, FormOption, FormSchema, FormSection, GeneratedConfig, IconInput, InputConfig, InputLabels, InputType, JsonFieldConfig, JsonFormConfig, KeyType, LengthConstraint, LocationConfig, NavItem, NavStyleConfig, NestedStringConfig, NumberConfig, OptionConfig$1 as OptionConfig, OptionDTO, OptionItem, PaginationConfig, PaginationLabels, PhoneConfig, QueryParamsConfig, RadioConfig, RadioLabels, RadioOption, RangeConfig, RatingConfig, SearchConfig, SearchLabels, SectionConfig, SideNavItem, SideNavSection, SideNavStyleConfig, SnackbarConfig, SnackbarVariant, StepperConfig, SubmitConfig, SummaryCardConfig, SummaryCardLabels, SummaryCardMeta, TableAction, TableActionItem, TableColumn, TableConfig, TableFilter, TableFilterChangeEvent, TableFilterColumn, TableFilterConfig, TableFilterItem, TableFilterLabels, TableFilterOutput, TableLabels, TableOption, TableTheme, TextConfig, ToggleConfig, ToggleLabels, UIConfig, UISubType, UIType, UploadedFile, ValidationResult, ValidationRules };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commons-shared-web-ui",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "peerDependencies": {
5
5
  "@angular/animations": "20.3.15",
6
6
  "@angular/cdk": "20.2.14",
@@ -0,0 +1,94 @@
1
+ @use 'sass:map';
2
+
3
+ $default-side-nav-config: (
4
+ // Container & Global
5
+ bg: #F9C80E0D,
6
+ width: 220px,
7
+ collapsed-width: 56px,
8
+ gap-sections: 24px,
9
+ padding: 16px,
10
+
11
+ // Typographic Global
12
+ font-family: ('Poppins', sans-serif),
13
+
14
+ // Header Typography
15
+ heading-font-weight: 500,
16
+ heading-font-size: 16px,
17
+ heading-color: #3C4043,
18
+
19
+ // Item Defaults (Inactive)
20
+ item-gap: 4px,
21
+ item-padding: 12px 16px,
22
+ item-border-radius: 8px,
23
+ item-font-weight: 400,
24
+ item-font-size: 14px,
25
+ item-color: #5F6368,
26
+
27
+ // Item Hover
28
+ // (Figma didn't strictly specify hover for inactive, assume subtle transparency on the active color)
29
+ item-hover-bg: rgba(#E63E30, 0.05),
30
+ item-hover-color: #3C4043,
31
+
32
+ // Active Item
33
+ active-bg: #E63E30,
34
+ active-color: #FFFFFF,
35
+ active-font-weight: 500,
36
+ active-hover-bg: #D4382B, // Darkened active color
37
+
38
+ // Disable State
39
+ disabled-opacity: 0.5,
40
+
41
+ // Tooltip Styling
42
+ tooltip-bg: rgba(0, 0, 0, 0.8),
43
+ tooltip-color: #FFFFFF,
44
+ tooltip-padding: 8px 12px,
45
+ tooltip-border-radius: 6px,
46
+ tooltip-font-size: 12px
47
+ );
48
+
49
+ @mixin side-nav-theme($user-config: ()) {
50
+ $config: map.merge($default-side-nav-config, $user-config);
51
+
52
+ // Container
53
+ --cc-side-nav-bg: #{map.get($config, bg)};
54
+ --cc-side-nav-width: #{map.get($config, width)};
55
+ --cc-side-nav-collapsed-width: #{map.get($config, collapsed-width)};
56
+ --cc-side-nav-gap-sections: #{map.get($config, gap-sections)};
57
+ --cc-side-nav-padding: #{map.get($config, padding)};
58
+
59
+ // Typography Family
60
+ --cc-side-nav-font-family: #{map.get($config, font-family)};
61
+
62
+ // Headers
63
+ --cc-side-nav-heading-font-weight: #{map.get($config, heading-font-weight)};
64
+ --cc-side-nav-heading-font-size: #{map.get($config, heading-font-size)};
65
+ --cc-side-nav-heading-color: #{map.get($config, heading-color)};
66
+
67
+ // Items Config
68
+ --cc-side-nav-item-gap: #{map.get($config, item-gap)};
69
+ --cc-side-nav-item-padding: #{map.get($config, item-padding)};
70
+ --cc-side-nav-item-border-radius: #{map.get($config, item-border-radius)};
71
+
72
+ // Inactive Items
73
+ --cc-side-nav-item-font-weight: #{map.get($config, item-font-weight)};
74
+ --cc-side-nav-item-font-size: #{map.get($config, item-font-size)};
75
+ --cc-side-nav-item-color: #{map.get($config, item-color)};
76
+ --cc-side-nav-item-hover-bg: #{map.get($config, item-hover-bg)};
77
+ --cc-side-nav-item-hover-color: #{map.get($config, item-hover-color)};
78
+
79
+ // Active Items
80
+ --cc-side-nav-active-bg: #{map.get($config, active-bg)};
81
+ --cc-side-nav-active-color: #{map.get($config, active-color)};
82
+ --cc-side-nav-active-font-weight: #{map.get($config, active-font-weight)};
83
+ --cc-side-nav-active-hover-bg: #{map.get($config, active-hover-bg)};
84
+
85
+ // Disabled
86
+ --cc-side-nav-disabled-opacity: #{map.get($config, disabled-opacity)};
87
+
88
+ // Tooltip
89
+ --cc-side-nav-tooltip-bg: #{map.get($config, tooltip-bg)};
90
+ --cc-side-nav-tooltip-color: #{map.get($config, tooltip-color)};
91
+ --cc-side-nav-tooltip-padding: #{map.get($config, tooltip-padding)};
92
+ --cc-side-nav-tooltip-border-radius: #{map.get($config, tooltip-border-radius)};
93
+ --cc-side-nav-tooltip-font-size: #{map.get($config, tooltip-font-size)};
94
+ }
@@ -1,3 +1,4 @@
1
+ @use '../modules/side-nav/side-nav.theme' as sideNav;
1
2
  @import 'quill/dist/quill.snow.css';
2
3
 
3
4
  :root {
@@ -49,6 +50,19 @@
49
50
  --field-input-height: 40px;
50
51
  --field-input-radius: 7px;
51
52
  --field-hint-color: #5f6368;
53
+
54
+ /* MultiSave (Card Repeater) */
55
+ --ms-card-bg: #ffffff;
56
+ --ms-card-border: #e8eaed;
57
+ --ms-card-radius: 10px;
58
+ --ms-card-shadow: 0 1px 4px rgba(0, 0, 0, 0.05);
59
+ --ms-card-shadow-hover: 0 6px 16px rgba(0, 0, 0, 0.08);
60
+ --ms-title-color: #111827;
61
+ --ms-desc-color: #6b7280;
62
+ --ms-btn-add-color: #3b82f6;
63
+ --ms-btn-add-hover: #2563eb;
64
+
65
+ @include sideNav.side-nav-theme();
52
66
  }
53
67
 
54
68
  /* ----------------------------------------------------