@uzum-tech/ui 1.12.13 → 1.12.15

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.
@@ -32,6 +32,10 @@ exports.configProviderProps = {
32
32
  breakpoints: Object,
33
33
  breakpointProps: Object,
34
34
  breakpointThemeOverrides: Object,
35
+ breakpointMode: {
36
+ type: String,
37
+ default: 'desktop-first'
38
+ },
35
39
  preflightStyleDisabled: Boolean,
36
40
  inlineThemeDisabled: {
37
41
  type: Boolean,
@@ -56,7 +60,7 @@ exports.default = (0, vue_1.defineComponent)({
56
60
  const mergedThemeRef = (0, vue_1.computed)(() => {
57
61
  const { theme } = props;
58
62
  if (theme === null)
59
- return undefined;
63
+ return;
60
64
  const inheritedTheme = UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedThemeRef.value;
61
65
  return theme === undefined
62
66
  ? inheritedTheme
@@ -64,30 +68,68 @@ exports.default = (0, vue_1.defineComponent)({
64
68
  ? theme
65
69
  : Object.assign({}, inheritedTheme, theme);
66
70
  });
67
- const getActiveBreakpointValue = (breakpointMap) => {
68
- if (!breakpointMap || !_utils_1.isBrowser) {
69
- return undefined;
71
+ const mergedBreakpointModeRef = (0, vue_1.computed)(() => {
72
+ const { breakpointMode } = props;
73
+ return (breakpointMode ||
74
+ (UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedBreakpointModeRef.value) ||
75
+ 'desktop-first');
76
+ });
77
+ const getMergedBreakpointValues = (breakpointMap) => {
78
+ if (!breakpointMap)
79
+ return;
80
+ const breakpointWidths = Object.keys(breakpointMap)
81
+ .map(Number)
82
+ .sort((leftWidth, rightWidth) => leftWidth - rightWidth);
83
+ const mergedMap = {};
84
+ let previousValue;
85
+ for (const width of breakpointWidths) {
86
+ if (previousValue !== undefined) {
87
+ mergedMap[width] = (0, lodash_1.merge)({}, previousValue, breakpointMap[width]);
88
+ }
89
+ else {
90
+ mergedMap[width] = breakpointMap[width];
91
+ }
92
+ previousValue = mergedMap[width];
70
93
  }
94
+ return mergedMap;
95
+ };
96
+ const getActiveBreakpointValue = (breakpointMap, mode = 'desktop-first') => {
97
+ if (!breakpointMap || !_utils_1.isBrowser)
98
+ return;
99
+ const mergedMap = getMergedBreakpointValues(breakpointMap);
100
+ if (!mergedMap)
101
+ return;
71
102
  const currentWidth = windowWidthRef.value;
72
- const breakpointWidths = Object.keys(breakpointMap)
103
+ const breakpointWidths = Object.keys(mergedMap)
73
104
  .map(Number)
74
- .filter((width) => width <= currentWidth)
75
- .sort((a, b) => b - a);
76
- if (breakpointWidths.length === 0) {
77
- return undefined;
105
+ .sort((leftWidth, rightWidth) => leftWidth - rightWidth);
106
+ let matchingBreakpoints;
107
+ if (mode === 'mobile-first') {
108
+ matchingBreakpoints = breakpointWidths.filter((width) => width >= currentWidth);
109
+ if (matchingBreakpoints.length === 0) {
110
+ matchingBreakpoints = [breakpointWidths[breakpointWidths.length - 1]];
111
+ }
112
+ }
113
+ else {
114
+ matchingBreakpoints = breakpointWidths
115
+ .filter((width) => width <= currentWidth)
116
+ .reverse();
117
+ if (matchingBreakpoints.length === 0) {
118
+ matchingBreakpoints = [breakpointWidths[0]];
119
+ }
78
120
  }
79
- const activeBreakpoint = breakpointWidths[0];
80
- return breakpointMap[activeBreakpoint];
121
+ const activeBreakpoint = matchingBreakpoints[0];
122
+ return mergedMap[activeBreakpoint];
81
123
  };
82
- const activeBreakPointThemeOverridesRef = (0, vue_1.computed)(() => {
124
+ const activeBreakpointThemeOverridesRef = (0, vue_1.computed)(() => {
83
125
  const { breakpointThemeOverrides } = props;
84
126
  const breakpointThemeOverridesToUse = breakpointThemeOverrides !== null && breakpointThemeOverrides !== void 0 ? breakpointThemeOverrides : UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedBreakpointThemeOverridesRef.value;
85
- return getActiveBreakpointValue(breakpointThemeOverridesToUse);
127
+ return getActiveBreakpointValue(breakpointThemeOverridesToUse, mergedBreakpointModeRef.value);
86
128
  });
87
129
  const mergedThemeOverridesRef = (0, vue_1.computed)(() => {
88
130
  const { themeOverrides } = props;
89
131
  if (themeOverrides === null)
90
- return undefined;
132
+ return;
91
133
  let baseThemeOverrides;
92
134
  if (themeOverrides === undefined) {
93
135
  baseThemeOverrides = UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedThemeOverridesRef.value;
@@ -101,14 +143,14 @@ exports.default = (0, vue_1.defineComponent)({
101
143
  baseThemeOverrides = (0, lodash_1.merge)({}, inheritedThemeOverrides, themeOverrides);
102
144
  }
103
145
  }
104
- const activeBreakPointThemeOverrides = activeBreakPointThemeOverridesRef.value;
105
- if (!activeBreakPointThemeOverrides) {
146
+ const activeBreakpointThemeOverrides = activeBreakpointThemeOverridesRef.value;
147
+ if (!activeBreakpointThemeOverrides) {
106
148
  return baseThemeOverrides;
107
149
  }
108
150
  if (!baseThemeOverrides) {
109
- return activeBreakPointThemeOverrides;
151
+ return activeBreakpointThemeOverrides;
110
152
  }
111
- return (0, lodash_1.merge)({}, baseThemeOverrides, activeBreakPointThemeOverrides);
153
+ return (0, lodash_1.merge)({}, baseThemeOverrides, activeBreakpointThemeOverrides);
112
154
  });
113
155
  const mergedNamespaceRef = (0, vooks_1.useMemo)(() => {
114
156
  const { namespace } = props;
@@ -143,24 +185,24 @@ exports.default = (0, vue_1.defineComponent)({
143
185
  window.removeEventListener('resize', updateWindowWidth);
144
186
  }
145
187
  });
146
- const activeBreakPointPropsRef = (0, vue_1.computed)(() => {
188
+ const activeBreakpointPropsRef = (0, vue_1.computed)(() => {
147
189
  const { breakpointProps } = props;
148
190
  const breakpointPropsToUse = breakpointProps !== null && breakpointProps !== void 0 ? breakpointProps : UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedBreakpointPropsRef.value;
149
- return getActiveBreakpointValue(breakpointPropsToUse);
191
+ return getActiveBreakpointValue(breakpointPropsToUse, mergedBreakpointModeRef.value);
150
192
  });
151
193
  const mergedComponentPropsRef = (0, vue_1.computed)(() => {
152
194
  const { componentOptions } = props;
153
195
  const baseComponentOptions = componentOptions !== undefined
154
196
  ? componentOptions
155
197
  : UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedComponentPropsRef.value;
156
- const activeBreakPointProps = activeBreakPointPropsRef.value;
157
- if (!activeBreakPointProps) {
198
+ const activeBreakpointProps = activeBreakpointPropsRef.value;
199
+ if (!activeBreakpointProps) {
158
200
  return baseComponentOptions;
159
201
  }
160
202
  if (!baseComponentOptions) {
161
- return activeBreakPointProps;
203
+ return activeBreakpointProps;
162
204
  }
163
- return (0, lodash_1.merge)({}, baseComponentOptions, activeBreakPointProps);
205
+ return (0, lodash_1.merge)({}, baseComponentOptions, activeBreakpointProps);
164
206
  });
165
207
  const mergedClsPrefixRef = (0, vue_1.computed)(() => {
166
208
  const { clsPrefix } = props;
@@ -230,13 +272,16 @@ exports.default = (0, vue_1.defineComponent)({
230
272
  mergedComponentPropsRef,
231
273
  mergedBreakpointPropsRef,
232
274
  mergedBreakpointThemeOverridesRef,
275
+ mergedBreakpointModeRef,
276
+ activeBreakpointPropsRef,
277
+ activeBreakpointThemeOverridesRef,
233
278
  mergedBorderedRef,
234
279
  mergedNamespaceRef,
235
280
  mergedClsPrefixRef,
236
281
  mergedLocaleRef: (0, vue_1.computed)(() => {
237
282
  const { locale } = props;
238
283
  if (locale === null)
239
- return undefined;
284
+ return;
240
285
  return locale === undefined
241
286
  ? UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedLocaleRef.value
242
287
  : locale;
@@ -244,7 +289,7 @@ exports.default = (0, vue_1.defineComponent)({
244
289
  mergedDateLocaleRef: (0, vue_1.computed)(() => {
245
290
  const { dateLocale } = props;
246
291
  if (dateLocale === null)
247
- return undefined;
292
+ return;
248
293
  return dateLocale === undefined
249
294
  ? UConfigProvider === null || UConfigProvider === void 0 ? void 0 : UConfigProvider.mergedDateLocaleRef.value
250
295
  : dateLocale;
@@ -13,4 +13,4 @@ export type GlobalThemeOverrides = {
13
13
  } & {
14
14
  [key in keyof GlobalThemeWithoutCommon]?: ExtractThemeOverrides<GlobalThemeWithoutCommon[key]>;
15
15
  };
16
- export type { GlobalIconConfig, GlobalComponentConfig, BreakpointProps, BreakpointThemeOverrides } from './internal-interface';
16
+ export type { GlobalIconConfig, GlobalComponentConfig, BreakpointProps, BreakpointThemeOverrides, BreakpointMode } from './internal-interface';
@@ -429,6 +429,7 @@ export type RtlEnabledState = Partial<Record<keyof GlobalThemeWithoutCommon, Rtl
429
429
  export type Breakpoints = Record<string, number> | undefined;
430
430
  export type BreakpointProps = Record<number, GlobalComponentConfig> | undefined;
431
431
  export type BreakpointThemeOverrides = Record<number, GlobalThemeOverrides> | undefined;
432
+ export type BreakpointMode = 'mobile-first' | 'desktop-first';
432
433
  export interface ConfigProviderInjection {
433
434
  mergedBreakpointsRef: Ref<Breakpoints | undefined>;
434
435
  mergedClsPrefixRef: Ref<string>;
@@ -446,6 +447,9 @@ export interface ConfigProviderInjection {
446
447
  mergedThemeHashRef: Ref<string>;
447
448
  mergedBreakpointPropsRef: Ref<BreakpointProps | undefined>;
448
449
  mergedBreakpointThemeOverridesRef: Ref<BreakpointThemeOverrides | undefined>;
450
+ mergedBreakpointModeRef: Ref<BreakpointMode>;
451
+ activeBreakpointPropsRef: Ref<GlobalComponentConfig | undefined>;
452
+ activeBreakpointThemeOverridesRef: Ref<GlobalThemeOverrides | undefined>;
449
453
  inlineThemeDisabled: boolean;
450
454
  preflightStyleDisabled: boolean;
451
455
  }
@@ -43,6 +43,10 @@ export declare const headerProps: {
43
43
  type: PropType<HeaderPropsInterface["responsive"]>;
44
44
  default: boolean;
45
45
  };
46
+ isMobile: {
47
+ type: PropType<HeaderPropsInterface["isMobile"]>;
48
+ default: boolean;
49
+ };
46
50
  mobileMenuType: {
47
51
  type: PropType<"drawer" | "dropdown">;
48
52
  default: string;
@@ -213,6 +217,10 @@ declare const _default: import("vue").DefineComponent<{
213
217
  type: PropType<HeaderPropsInterface["responsive"]>;
214
218
  default: boolean;
215
219
  };
220
+ isMobile: {
221
+ type: PropType<HeaderPropsInterface["isMobile"]>;
222
+ default: boolean;
223
+ };
216
224
  mobileMenuType: {
217
225
  type: PropType<"drawer" | "dropdown">;
218
226
  default: string;
@@ -388,7 +396,7 @@ declare const _default: import("vue").DefineComponent<{
388
396
  key: string | number;
389
397
  icon?: (() => import("vue").VNodeChild) | undefined;
390
398
  }>;
391
- isMobile: ComputedRef<boolean>;
399
+ isMobile: boolean | undefined;
392
400
  mobileMenuVisible: import("vue").Ref<boolean>;
393
401
  searchVisible: import("vue").Ref<boolean>;
394
402
  handleSelectLang: (key: string | number) => void;
@@ -448,6 +456,10 @@ declare const _default: import("vue").DefineComponent<{
448
456
  type: PropType<HeaderPropsInterface["responsive"]>;
449
457
  default: boolean;
450
458
  };
459
+ isMobile: {
460
+ type: PropType<HeaderPropsInterface["isMobile"]>;
461
+ default: boolean;
462
+ };
451
463
  mobileMenuType: {
452
464
  type: PropType<"drawer" | "dropdown">;
453
465
  default: string;
@@ -596,6 +608,7 @@ declare const _default: import("vue").DefineComponent<{
596
608
  menuCardMinColumnWidth: string | number | undefined;
597
609
  logoSrc: string | undefined;
598
610
  logoAlt: string | undefined;
611
+ isMobile: boolean | undefined;
599
612
  mobileActionsCollapse: boolean | undefined;
600
613
  mobileShowFooterActions: boolean | undefined;
601
614
  mobilePrimaryActionText: string | undefined;
@@ -43,7 +43,6 @@ const _mixins_1 = require("../../_mixins");
43
43
  const styles_1 = require("../styles");
44
44
  const _utils_1 = require("../../_utils");
45
45
  const utils_1 = require("./utils");
46
- const composables_1 = require("../../_utils/composable/composables");
47
46
  const icon_1 = require("../../icon");
48
47
  const HeaderNavigation_1 = __importDefault(require("./HeaderNavigation"));
49
48
  const HeaderMobile_1 = __importDefault(require("./mobile/HeaderMobile"));
@@ -96,6 +95,9 @@ exports.headerProps = Object.assign(Object.assign({}, _mixins_1.useTheme.props),
96
95
  }, responsive: {
97
96
  type: Boolean,
98
97
  default: true
98
+ }, isMobile: {
99
+ type: Boolean,
100
+ default: true
99
101
  }, mobileMenuType: {
100
102
  type: String,
101
103
  default: 'drawer'
@@ -132,7 +134,7 @@ exports.default = (0, vue_1.defineComponent)({
132
134
  var _a, _b, _c;
133
135
  const { mergedClsPrefixRef } = (0, _mixins_1.useConfig)(props);
134
136
  const themeRef = (0, _mixins_1.useTheme)('Header', '-header', index_cssr_1.default, styles_1.headerLight, props, mergedClsPrefixRef);
135
- const isMobileRef = (0, composables_1.useIsMobile)();
137
+ const isMobileRef = props.isMobile;
136
138
  const mobileMenuVisibleRef = (0, vue_1.ref)(false);
137
139
  const searchVisibleRef = (0, vue_1.ref)(false);
138
140
  (0, vue_1.onBeforeMount)(() => {
@@ -114,7 +114,7 @@ declare const _default: import("vue").DefineComponent<{
114
114
  readonly onSearchResultSelect: PropType<(result: HeaderSearchResult) => void>;
115
115
  }>>, {
116
116
  readonly responsive: boolean;
117
- readonly mobileActionsCollapse: boolean;
118
117
  readonly isMobile: boolean;
118
+ readonly mobileActionsCollapse: boolean;
119
119
  }, {}>;
120
120
  export default _default;
@@ -16,6 +16,7 @@ export interface HeaderProps {
16
16
  logoAlt?: string;
17
17
  logoProps?: Partial<ImageProps>;
18
18
  responsive?: boolean;
19
+ isMobile?: boolean;
19
20
  mobileMenuType?: 'drawer' | 'dropdown';
20
21
  mobileActionsCollapse?: boolean;
21
22
  mobileShowFooterActions?: boolean;
@@ -23,12 +23,12 @@ exports.default = (0, cssr_1.cB)('header', `
23
23
  `), (0, cssr_1.cE)('logo', [(0, cssr_1.c)('img', `
24
24
  max-height: 24px;
25
25
  `)])]), (0, cssr_1.cM)('desktop', [(0, cssr_1.cE)('inner-wrapper', `
26
- width: 1300px;
26
+ width: 100%;
27
+ max-width: 1300px;
27
28
  box-sizing: border-box;
28
29
  display: flex;
29
30
  align-items: center;
30
31
  justify-content: space-between;
31
- gap: var(--u-header-navigation-gap);
32
32
  padding: 0;
33
33
  position: relative;
34
34
  height: 80px;
@@ -37,12 +37,14 @@ exports.default = (0, cssr_1.cB)('header', `
37
37
  display: flex;
38
38
  align-items: center;
39
39
  justify-content: space-between;
40
- gap: 60px;
40
+ flex: 1;
41
41
  height: 100%;
42
42
  `)]), (0, cssr_1.cE)('inner', `
43
+ width: 100%;
43
44
  box-sizing: border-box;
44
45
  display: flex;
45
46
  align-items: center;
47
+ justify-content: center;
46
48
  gap: var(--u-header-navigation-gap);
47
49
  padding: 0;
48
50
  position: relative;
@@ -79,7 +81,6 @@ exports.default = (0, cssr_1.cB)('header', `
79
81
  position: relative;
80
82
  display: inline-flex;
81
83
  align-items: center;
82
- gap: var(--u-header-action-gap);
83
84
  flex-shrink: 0;
84
85
  height: 100%;
85
86
  `, [(0, cssr_1.cE)('actions-block', `
package/lib/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare const _default: "1.12.13";
1
+ declare const _default: "1.12.15";
2
2
  export default _default;
package/lib/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = '1.12.13';
3
+ exports.default = '1.12.15';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uzum-tech/ui",
3
- "version": "1.12.13",
3
+ "version": "1.12.15",
4
4
  "description": "A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
package/web-types.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "framework": "vue",
4
4
  "name": "@uzum-tech/ui",
5
- "version": "1.12.13",
5
+ "version": "1.12.15",
6
6
  "js-types-syntax": "typescript",
7
7
  "contributions": {
8
8
  "html": {
@@ -3701,6 +3701,13 @@
3701
3701
  "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/config-provider",
3702
3702
  "type": "object"
3703
3703
  },
3704
+ {
3705
+ "name": "breakpoint-mode",
3706
+ "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/config-provider",
3707
+ "type": "'mobile-first' | 'desktop-first'",
3708
+ "description": "Controls how breakpoints are applied. In `desktop-first` mode (default), applies the largest breakpoint ≤ current width. In `mobile-first` mode, applies the smallest breakpoint ≥ current width.",
3709
+ "default": "'desktop-first'"
3710
+ },
3704
3711
  {
3705
3712
  "name": "preflight-style-disabled",
3706
3713
  "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/config-provider",
@@ -3730,14 +3737,14 @@
3730
3737
  "name": "break-point-props",
3731
3738
  "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/config-provider",
3732
3739
  "type": "{ [width: number]: GlobalComponentConfig }",
3733
- "description": "Component props configuration based on screen width. When screen width is less than or equal to the specified width, the corresponding component props will be applied. Useful for responsive design (e.g., smaller button size on mobile).",
3740
+ "description": "Component props configuration based on screen width. The behavior depends on `breakpoint-mode`. Values from previous breakpoints are inherited by default unless explicitly overridden.",
3734
3741
  "default": "undefined"
3735
3742
  },
3736
3743
  {
3737
3744
  "name": "break-point-theme-overrides",
3738
3745
  "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/config-provider",
3739
3746
  "type": "{ [width: number]: GlobalThemeOverrides }",
3740
- "description": "Theme variables configuration based on screen width. When screen width is less than or equal to the specified width, the corresponding theme overrides will be applied. Useful for responsive theming (e.g., different colors on mobile vs desktop).",
3747
+ "description": "Theme variables configuration based on screen width. The behavior depends on `breakpoint-mode`. Values from previous breakpoints are inherited by default unless explicitly overridden.",
3741
3748
  "default": "undefined"
3742
3749
  },
3743
3750
  {
@@ -18368,6 +18375,11 @@
18368
18375
  "description": "Enable responsive/mobile adaptation.",
18369
18376
  "default": "true"
18370
18377
  },
18378
+ {
18379
+ "name": "is-mobile",
18380
+ "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/header",
18381
+ "type": "boolean"
18382
+ },
18371
18383
  {
18372
18384
  "name": "mobile-menu-type",
18373
18385
  "doc-url": "https://uzum-ui.kapitalbank.uz/en-US/os-theme/components/header",