@dmitriikapustin/ui 0.3.0 → 0.3.2

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/dist/index.cjs CHANGED
@@ -272,27 +272,75 @@ function Button(props) {
272
272
  iconRight
273
273
  ] });
274
274
  if (props.href !== void 0) {
275
- const _a = props, { href, target, rel, onClick } = _a, rest = __objRest(_a, ["href", "target", "rel", "onClick"]);
275
+ const _a = props, {
276
+ variant: _v2,
277
+ size: _s2,
278
+ loading: _l2,
279
+ icon: _i2,
280
+ iconRight: _ir2,
281
+ children: _c2,
282
+ disabled: _d2,
283
+ className: _cn2,
284
+ href: href,
285
+ target,
286
+ rel,
287
+ onClick
288
+ } = _a, domRest2 = __objRest(_a, [
289
+ // strip internal/non-DOM props
290
+ "variant",
291
+ "size",
292
+ "loading",
293
+ "icon",
294
+ "iconRight",
295
+ "children",
296
+ "disabled",
297
+ "className",
298
+ // pull out anchor-specific that we set explicitly below
299
+ "href",
300
+ "target",
301
+ "rel",
302
+ "onClick"
303
+ ]);
276
304
  const safeRel = target === "_blank" ? rel != null ? rel : "noopener noreferrer" : rel;
277
305
  const handleClick = disabled || loading ? (e) => e.preventDefault() : onClick;
278
306
  return /* @__PURE__ */ jsxRuntime.jsx(
279
307
  "a",
280
- __spreadProps(__spreadValues({}, rest), {
308
+ __spreadProps(__spreadValues({}, domRest2), {
281
309
  href,
282
310
  target,
283
311
  rel: safeRel,
284
312
  className: rootClass,
285
313
  "aria-disabled": disabled || loading || void 0,
286
- tabIndex: disabled || loading ? -1 : rest.tabIndex,
314
+ tabIndex: disabled || loading ? -1 : domRest2.tabIndex,
287
315
  onClick: handleClick,
288
316
  children: content
289
317
  })
290
318
  );
291
319
  }
292
- const _b = props, { href: _href } = _b, buttonRest = __objRest(_b, ["href"]);
320
+ const _b = props, {
321
+ variant: _v,
322
+ size: _s,
323
+ loading: _l,
324
+ icon: _i,
325
+ iconRight: _ir,
326
+ children: _c,
327
+ disabled: _d,
328
+ className: _cn,
329
+ href: _href
330
+ } = _b, domRest = __objRest(_b, [
331
+ "variant",
332
+ "size",
333
+ "loading",
334
+ "icon",
335
+ "iconRight",
336
+ "children",
337
+ "disabled",
338
+ "className",
339
+ "href"
340
+ ]);
293
341
  return /* @__PURE__ */ jsxRuntime.jsx(
294
342
  "button",
295
- __spreadProps(__spreadValues({}, buttonRest), {
343
+ __spreadProps(__spreadValues({}, domRest), {
296
344
  className: rootClass,
297
345
  disabled: disabled || loading,
298
346
  children: content
@@ -941,27 +989,57 @@ function IconButton(props) {
941
989
  const isDisabled = variant === "disabled" || disabled;
942
990
  const rootClass = `${__default10.root} ${__default10[variant]}${isDisabled ? ` ${__default10.isDisabled}` : ""}${className ? ` ${className}` : ""}`;
943
991
  if (props.href !== void 0) {
944
- const _a = props, { href, target, rel, onClick } = _a, rest = __objRest(_a, ["href", "target", "rel", "onClick"]);
992
+ const _a = props, {
993
+ icon: _i2,
994
+ variant: _v2,
995
+ className: _cn2,
996
+ disabled: _d2,
997
+ href,
998
+ target,
999
+ rel,
1000
+ onClick
1001
+ } = _a, domRest2 = __objRest(_a, [
1002
+ "icon",
1003
+ "variant",
1004
+ "className",
1005
+ "disabled",
1006
+ "href",
1007
+ "target",
1008
+ "rel",
1009
+ "onClick"
1010
+ ]);
945
1011
  const safeRel = target === "_blank" ? rel != null ? rel : "noopener noreferrer" : rel;
946
1012
  const handleClick = isDisabled ? (e) => e.preventDefault() : onClick;
947
1013
  return /* @__PURE__ */ jsxRuntime.jsx(
948
1014
  "a",
949
- __spreadProps(__spreadValues({}, rest), {
1015
+ __spreadProps(__spreadValues({}, domRest2), {
950
1016
  href,
951
1017
  target,
952
1018
  rel: safeRel,
953
1019
  className: rootClass,
954
1020
  "aria-disabled": isDisabled || void 0,
955
- tabIndex: isDisabled ? -1 : rest.tabIndex,
1021
+ tabIndex: isDisabled ? -1 : domRest2.tabIndex,
956
1022
  onClick: handleClick,
957
1023
  children: icon
958
1024
  })
959
1025
  );
960
1026
  }
961
- const _b = props, { href: _href } = _b, buttonRest = __objRest(_b, ["href"]);
1027
+ const _b = props, {
1028
+ icon: _i,
1029
+ variant: _v,
1030
+ className: _cn,
1031
+ disabled: _d,
1032
+ href: _href
1033
+ } = _b, domRest = __objRest(_b, [
1034
+ "icon",
1035
+ "variant",
1036
+ "className",
1037
+ "disabled",
1038
+ "href"
1039
+ ]);
962
1040
  return /* @__PURE__ */ jsxRuntime.jsx(
963
1041
  "button",
964
- __spreadProps(__spreadValues({}, buttonRest), {
1042
+ __spreadProps(__spreadValues({}, domRest), {
965
1043
  className: rootClass,
966
1044
  disabled: isDisabled,
967
1045
  children: icon
@@ -4092,6 +4170,18 @@ __styleInject(`@charset "UTF-8";
4092
4170
  margin-bottom: 1.5rem;
4093
4171
  }
4094
4172
 
4173
+ /* Compact layout \u2014 logo \u0438 nav \u0432\u043F\u043B\u043E\u0442\u043D\u0443\u044E \u0441\u0432\u0435\u0440\u0445\u0443, footer \u043F\u0440\u0438\u0436\u0430\u0442 \u043A \u043D\u0438\u0437\u0443 */
4174
+ .Sidebar-module_compact {
4175
+ justify-content: flex-start;
4176
+ gap: 1rem;
4177
+ }
4178
+ .Sidebar-module_compact .Sidebar-module_logo {
4179
+ margin-bottom: 0;
4180
+ }
4181
+ .Sidebar-module_compact .Sidebar-module_footer {
4182
+ margin-top: auto;
4183
+ }
4184
+
4095
4185
  .Sidebar-module_nav {
4096
4186
  display: flex;
4097
4187
  flex-direction: column;
@@ -4150,7 +4240,7 @@ __styleInject(`@charset "UTF-8";
4150
4240
  display: block;
4151
4241
  }
4152
4242
  }`);
4153
- var __default47 = { "root": "Sidebar-module_root", "menu": "Sidebar-module_menu", "courseSubmenu": "Sidebar-module_courseSubmenu", "logo": "Sidebar-module_logo", "nav": "Sidebar-module_nav", "footer": "Sidebar-module_footer", "legal": "Sidebar-module_legal", "overlay": "Sidebar-module_overlay", "collapsed": "Sidebar-module_collapsed", "open": "Sidebar-module_open", "overlayVisible": "Sidebar-module_overlayVisible" };
4243
+ var __default47 = { "root": "Sidebar-module_root", "menu": "Sidebar-module_menu", "courseSubmenu": "Sidebar-module_courseSubmenu", "logo": "Sidebar-module_logo", "compact": "Sidebar-module_compact", "footer": "Sidebar-module_footer", "nav": "Sidebar-module_nav", "legal": "Sidebar-module_legal", "overlay": "Sidebar-module_overlay", "collapsed": "Sidebar-module_collapsed", "open": "Sidebar-module_open", "overlayVisible": "Sidebar-module_overlayVisible" };
4154
4244
  var defaultMenuItems = [
4155
4245
  "\u0413\u043B\u0430\u0432\u043D\u0430\u044F",
4156
4246
  "\u041C\u043E\u0438 \u043A\u0443\u0440\u0441\u044B",
@@ -4187,7 +4277,8 @@ function Sidebar({
4187
4277
  logo,
4188
4278
  legalText,
4189
4279
  collapsed,
4190
- onToggle
4280
+ onToggle,
4281
+ layout = "space-between"
4191
4282
  }) {
4192
4283
  const rawItems = menuItems || (type === "courseSubmenu" ? courseMenuItems : defaultMenuItems);
4193
4284
  const items = normaliseItems(rawItems);
@@ -4213,7 +4304,7 @@ function Sidebar({
4213
4304
  /* @__PURE__ */ jsxRuntime.jsxs(
4214
4305
  "aside",
4215
4306
  {
4216
- className: `${__default47.root} ${widthClass}${collapseClasses ? ` ${collapseClasses}` : ""}${className ? ` ${className}` : ""}`,
4307
+ className: `${__default47.root} ${widthClass}${layout === "compact" ? ` ${__default47.compact}` : ""}${collapseClasses ? ` ${collapseClasses}` : ""}${className ? ` ${className}` : ""}`,
4217
4308
  children: [
4218
4309
  logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: __default47.logo, children: logo }),
4219
4310
  /* @__PURE__ */ jsxRuntime.jsx("nav", { className: __default47.nav, children: items.map((item, i) => {
package/dist/index.d.cts CHANGED
@@ -586,8 +586,14 @@ interface SidebarProps {
586
586
  collapsed?: boolean;
587
587
  /** Called when the user requests toggling the sidebar (e.g. clicking the overlay backdrop). */
588
588
  onToggle?: () => void;
589
+ /**
590
+ * Вертикальная раскладка детей.
591
+ * - `'space-between'` (default, BC) — logo / nav / footer распределены через `justify-content: space-between`.
592
+ * - `'compact'` — logo и nav сверху без зазора, footer прижимается к низу через `margin-top: auto`. Логотип теряет авто-`margin-bottom: 1.5rem`. Use-case: Select / site-switcher над nav.
593
+ */
594
+ layout?: 'space-between' | 'compact';
589
595
  }
590
- declare function Sidebar({ type, menuItems, footer, className, activeId, onItemClick, logo, legalText, collapsed, onToggle, }: SidebarProps): react_jsx_runtime.JSX.Element;
596
+ declare function Sidebar({ type, menuItems, footer, className, activeId, onItemClick, logo, legalText, collapsed, onToggle, layout, }: SidebarProps): react_jsx_runtime.JSX.Element;
591
597
 
592
598
  type AppCardVariant = 'default' | 'stamp' | 'stamp-padded';
593
599
  interface AppCardProps {
package/dist/index.d.ts CHANGED
@@ -586,8 +586,14 @@ interface SidebarProps {
586
586
  collapsed?: boolean;
587
587
  /** Called when the user requests toggling the sidebar (e.g. clicking the overlay backdrop). */
588
588
  onToggle?: () => void;
589
+ /**
590
+ * Вертикальная раскладка детей.
591
+ * - `'space-between'` (default, BC) — logo / nav / footer распределены через `justify-content: space-between`.
592
+ * - `'compact'` — logo и nav сверху без зазора, footer прижимается к низу через `margin-top: auto`. Логотип теряет авто-`margin-bottom: 1.5rem`. Use-case: Select / site-switcher над nav.
593
+ */
594
+ layout?: 'space-between' | 'compact';
589
595
  }
590
- declare function Sidebar({ type, menuItems, footer, className, activeId, onItemClick, logo, legalText, collapsed, onToggle, }: SidebarProps): react_jsx_runtime.JSX.Element;
596
+ declare function Sidebar({ type, menuItems, footer, className, activeId, onItemClick, logo, legalText, collapsed, onToggle, layout, }: SidebarProps): react_jsx_runtime.JSX.Element;
591
597
 
592
598
  type AppCardVariant = 'default' | 'stamp' | 'stamp-padded';
593
599
  interface AppCardProps {
package/dist/index.js CHANGED
@@ -266,27 +266,75 @@ function Button(props) {
266
266
  iconRight
267
267
  ] });
268
268
  if (props.href !== void 0) {
269
- const _a = props, { href, target, rel, onClick } = _a, rest = __objRest(_a, ["href", "target", "rel", "onClick"]);
269
+ const _a = props, {
270
+ variant: _v2,
271
+ size: _s2,
272
+ loading: _l2,
273
+ icon: _i2,
274
+ iconRight: _ir2,
275
+ children: _c2,
276
+ disabled: _d2,
277
+ className: _cn2,
278
+ href: href,
279
+ target,
280
+ rel,
281
+ onClick
282
+ } = _a, domRest2 = __objRest(_a, [
283
+ // strip internal/non-DOM props
284
+ "variant",
285
+ "size",
286
+ "loading",
287
+ "icon",
288
+ "iconRight",
289
+ "children",
290
+ "disabled",
291
+ "className",
292
+ // pull out anchor-specific that we set explicitly below
293
+ "href",
294
+ "target",
295
+ "rel",
296
+ "onClick"
297
+ ]);
270
298
  const safeRel = target === "_blank" ? rel != null ? rel : "noopener noreferrer" : rel;
271
299
  const handleClick = disabled || loading ? (e) => e.preventDefault() : onClick;
272
300
  return /* @__PURE__ */ jsx(
273
301
  "a",
274
- __spreadProps(__spreadValues({}, rest), {
302
+ __spreadProps(__spreadValues({}, domRest2), {
275
303
  href,
276
304
  target,
277
305
  rel: safeRel,
278
306
  className: rootClass,
279
307
  "aria-disabled": disabled || loading || void 0,
280
- tabIndex: disabled || loading ? -1 : rest.tabIndex,
308
+ tabIndex: disabled || loading ? -1 : domRest2.tabIndex,
281
309
  onClick: handleClick,
282
310
  children: content
283
311
  })
284
312
  );
285
313
  }
286
- const _b = props, { href: _href } = _b, buttonRest = __objRest(_b, ["href"]);
314
+ const _b = props, {
315
+ variant: _v,
316
+ size: _s,
317
+ loading: _l,
318
+ icon: _i,
319
+ iconRight: _ir,
320
+ children: _c,
321
+ disabled: _d,
322
+ className: _cn,
323
+ href: _href
324
+ } = _b, domRest = __objRest(_b, [
325
+ "variant",
326
+ "size",
327
+ "loading",
328
+ "icon",
329
+ "iconRight",
330
+ "children",
331
+ "disabled",
332
+ "className",
333
+ "href"
334
+ ]);
287
335
  return /* @__PURE__ */ jsx(
288
336
  "button",
289
- __spreadProps(__spreadValues({}, buttonRest), {
337
+ __spreadProps(__spreadValues({}, domRest), {
290
338
  className: rootClass,
291
339
  disabled: disabled || loading,
292
340
  children: content
@@ -935,27 +983,57 @@ function IconButton(props) {
935
983
  const isDisabled = variant === "disabled" || disabled;
936
984
  const rootClass = `${__default10.root} ${__default10[variant]}${isDisabled ? ` ${__default10.isDisabled}` : ""}${className ? ` ${className}` : ""}`;
937
985
  if (props.href !== void 0) {
938
- const _a = props, { href, target, rel, onClick } = _a, rest = __objRest(_a, ["href", "target", "rel", "onClick"]);
986
+ const _a = props, {
987
+ icon: _i2,
988
+ variant: _v2,
989
+ className: _cn2,
990
+ disabled: _d2,
991
+ href,
992
+ target,
993
+ rel,
994
+ onClick
995
+ } = _a, domRest2 = __objRest(_a, [
996
+ "icon",
997
+ "variant",
998
+ "className",
999
+ "disabled",
1000
+ "href",
1001
+ "target",
1002
+ "rel",
1003
+ "onClick"
1004
+ ]);
939
1005
  const safeRel = target === "_blank" ? rel != null ? rel : "noopener noreferrer" : rel;
940
1006
  const handleClick = isDisabled ? (e) => e.preventDefault() : onClick;
941
1007
  return /* @__PURE__ */ jsx(
942
1008
  "a",
943
- __spreadProps(__spreadValues({}, rest), {
1009
+ __spreadProps(__spreadValues({}, domRest2), {
944
1010
  href,
945
1011
  target,
946
1012
  rel: safeRel,
947
1013
  className: rootClass,
948
1014
  "aria-disabled": isDisabled || void 0,
949
- tabIndex: isDisabled ? -1 : rest.tabIndex,
1015
+ tabIndex: isDisabled ? -1 : domRest2.tabIndex,
950
1016
  onClick: handleClick,
951
1017
  children: icon
952
1018
  })
953
1019
  );
954
1020
  }
955
- const _b = props, { href: _href } = _b, buttonRest = __objRest(_b, ["href"]);
1021
+ const _b = props, {
1022
+ icon: _i,
1023
+ variant: _v,
1024
+ className: _cn,
1025
+ disabled: _d,
1026
+ href: _href
1027
+ } = _b, domRest = __objRest(_b, [
1028
+ "icon",
1029
+ "variant",
1030
+ "className",
1031
+ "disabled",
1032
+ "href"
1033
+ ]);
956
1034
  return /* @__PURE__ */ jsx(
957
1035
  "button",
958
- __spreadProps(__spreadValues({}, buttonRest), {
1036
+ __spreadProps(__spreadValues({}, domRest), {
959
1037
  className: rootClass,
960
1038
  disabled: isDisabled,
961
1039
  children: icon
@@ -4086,6 +4164,18 @@ __styleInject(`@charset "UTF-8";
4086
4164
  margin-bottom: 1.5rem;
4087
4165
  }
4088
4166
 
4167
+ /* Compact layout \u2014 logo \u0438 nav \u0432\u043F\u043B\u043E\u0442\u043D\u0443\u044E \u0441\u0432\u0435\u0440\u0445\u0443, footer \u043F\u0440\u0438\u0436\u0430\u0442 \u043A \u043D\u0438\u0437\u0443 */
4168
+ .Sidebar-module_compact {
4169
+ justify-content: flex-start;
4170
+ gap: 1rem;
4171
+ }
4172
+ .Sidebar-module_compact .Sidebar-module_logo {
4173
+ margin-bottom: 0;
4174
+ }
4175
+ .Sidebar-module_compact .Sidebar-module_footer {
4176
+ margin-top: auto;
4177
+ }
4178
+
4089
4179
  .Sidebar-module_nav {
4090
4180
  display: flex;
4091
4181
  flex-direction: column;
@@ -4144,7 +4234,7 @@ __styleInject(`@charset "UTF-8";
4144
4234
  display: block;
4145
4235
  }
4146
4236
  }`);
4147
- var __default47 = { "root": "Sidebar-module_root", "menu": "Sidebar-module_menu", "courseSubmenu": "Sidebar-module_courseSubmenu", "logo": "Sidebar-module_logo", "nav": "Sidebar-module_nav", "footer": "Sidebar-module_footer", "legal": "Sidebar-module_legal", "overlay": "Sidebar-module_overlay", "collapsed": "Sidebar-module_collapsed", "open": "Sidebar-module_open", "overlayVisible": "Sidebar-module_overlayVisible" };
4237
+ var __default47 = { "root": "Sidebar-module_root", "menu": "Sidebar-module_menu", "courseSubmenu": "Sidebar-module_courseSubmenu", "logo": "Sidebar-module_logo", "compact": "Sidebar-module_compact", "footer": "Sidebar-module_footer", "nav": "Sidebar-module_nav", "legal": "Sidebar-module_legal", "overlay": "Sidebar-module_overlay", "collapsed": "Sidebar-module_collapsed", "open": "Sidebar-module_open", "overlayVisible": "Sidebar-module_overlayVisible" };
4148
4238
  var defaultMenuItems = [
4149
4239
  "\u0413\u043B\u0430\u0432\u043D\u0430\u044F",
4150
4240
  "\u041C\u043E\u0438 \u043A\u0443\u0440\u0441\u044B",
@@ -4181,7 +4271,8 @@ function Sidebar({
4181
4271
  logo,
4182
4272
  legalText,
4183
4273
  collapsed,
4184
- onToggle
4274
+ onToggle,
4275
+ layout = "space-between"
4185
4276
  }) {
4186
4277
  const rawItems = menuItems || (type === "courseSubmenu" ? courseMenuItems : defaultMenuItems);
4187
4278
  const items = normaliseItems(rawItems);
@@ -4207,7 +4298,7 @@ function Sidebar({
4207
4298
  /* @__PURE__ */ jsxs(
4208
4299
  "aside",
4209
4300
  {
4210
- className: `${__default47.root} ${widthClass}${collapseClasses ? ` ${collapseClasses}` : ""}${className ? ` ${className}` : ""}`,
4301
+ className: `${__default47.root} ${widthClass}${layout === "compact" ? ` ${__default47.compact}` : ""}${collapseClasses ? ` ${collapseClasses}` : ""}${className ? ` ${className}` : ""}`,
4211
4302
  children: [
4212
4303
  logo && /* @__PURE__ */ jsx("div", { className: __default47.logo, children: logo }),
4213
4304
  /* @__PURE__ */ jsx("nav", { className: __default47.nav, children: items.map((item, i) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dmitriikapustin/ui",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Universal UI/UX Kit — React 19 component library with Atomic Design, CSS custom properties, and SCSS modules",
5
5
  "author": "Kapustin Team",
6
6
  "license": "MIT",