@vkzstudio/muza-ui 1.5.2 → 1.7.0
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/components/ArticleCard/ArticleCard.d.ts.map +1 -1
- package/dist/components/ArticleCard/ArticleCard.js +161 -170
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/Button.js +42 -40
- package/dist/components/Button/Button.stories.d.ts.map +1 -1
- package/dist/components/Carousel/Carousel.d.ts +99 -2
- package/dist/components/Carousel/Carousel.d.ts.map +1 -1
- package/dist/components/Carousel/Carousel.js +208 -151
- package/dist/components/Carousel/Carousel.stories.d.ts +2 -0
- package/dist/components/Carousel/Carousel.stories.d.ts.map +1 -1
- package/dist/components/Carousel/index.js +3 -2
- package/dist/components/CarouselSection/CarouselSection.examples.d.ts +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +22 -3
- package/dist/components/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.js +131 -105
- package/dist/components/DropdownMenu/DropdownMenu.stories.d.ts +3 -2
- package/dist/components/DropdownMenu/DropdownMenu.stories.d.ts.map +1 -1
- package/dist/components/MarketNav/MarketNav.examples.d.ts.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.js +28 -29
- package/dist/components/OfferCard/OfferCard.d.ts +45 -17
- package/dist/components/OfferCard/OfferCard.d.ts.map +1 -1
- package/dist/components/OfferCard/OfferCard.js +180 -266
- package/dist/components/OfferCard/OfferCard.stories.d.ts +5 -2
- package/dist/components/OfferCard/OfferCard.stories.d.ts.map +1 -1
- package/dist/components/PartnerCard/PartnerCard.d.ts +90 -26
- package/dist/components/PartnerCard/PartnerCard.d.ts.map +1 -1
- package/dist/components/PartnerCard/PartnerCard.js +323 -264
- package/dist/components/PartnerCard/PartnerCard.stories.d.ts +6 -0
- package/dist/components/PartnerCard/PartnerCard.stories.d.ts.map +1 -1
- package/dist/components/PriceTag/PriceTag.d.ts +37 -0
- package/dist/components/PriceTag/PriceTag.d.ts.map +1 -0
- package/dist/components/PriceTag/PriceTag.js +43 -0
- package/dist/components/PriceTag/PriceTag.stories.d.ts +8 -0
- package/dist/components/PriceTag/PriceTag.stories.d.ts.map +1 -0
- package/dist/components/PriceTag/index.d.ts +2 -0
- package/dist/components/PriceTag/index.d.ts.map +1 -0
- package/dist/components/PriceTag/index.js +5 -0
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +74 -100
- package/dist/components/Select/Select.stories.d.ts.map +1 -1
- package/dist/components/Select/SelectTrigger.d.ts +54 -0
- package/dist/components/Select/SelectTrigger.d.ts.map +1 -0
- package/dist/components/Select/SelectTrigger.js +57 -0
- package/dist/components/Select/SelectTrigger.stories.d.ts +11 -0
- package/dist/components/Select/SelectTrigger.stories.d.ts.map +1 -0
- package/dist/components/Select/index.d.ts +2 -0
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +6 -2
- package/dist/components/Select/utils.d.ts +10 -1
- package/dist/components/Select/utils.d.ts.map +1 -1
- package/dist/components/Select/utils.js +3 -5
- package/dist/components/Tooltip/Tooltip.d.ts +18 -7
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +116 -68
- package/dist/components/Tooltip/Tooltip.stories.d.ts +1 -0
- package/dist/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
- package/dist/components/UniversalFooter/UniversalFooter.js +1 -1
- package/dist/components/VoucherCard/VoucherCard.d.ts +24 -1
- package/dist/components/VoucherCard/VoucherCard.d.ts.map +1 -1
- package/dist/components/VoucherCard/VoucherCard.js +68 -76
- package/dist/components/VoucherCard/VoucherCard.stories.d.ts +1 -0
- package/dist/components/VoucherCard/VoucherCard.stories.d.ts.map +1 -1
- package/dist/components/WebCheckoutNav/WebCheckoutNav.examples.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/internal/CardCompactShell.d.ts +80 -0
- package/dist/components/internal/CardCompactShell.d.ts.map +1 -0
- package/dist/components/internal/CardCompactShell.js +148 -0
- package/dist/components/internal/CardImageSlot.d.ts +56 -0
- package/dist/components/internal/CardImageSlot.d.ts.map +1 -0
- package/dist/components/internal/CardImageSlot.js +85 -0
- package/dist/index.js +356 -348
- package/dist/muza-ui.css +1 -1
- package/dist/styles/token-sizes.css +16 -4
- package/dist/utils/cn.d.ts.map +1 -1
- package/dist/utils/cn.js +6 -3
- package/dist/utils/disabledLinkProps.d.ts +8 -1
- package/dist/utils/disabledLinkProps.d.ts.map +1 -1
- package/dist/utils/disabledLinkProps.js +0 -1
- package/llms-full.md +133 -2
- package/llms.txt +2 -0
- package/package.json +3 -1
|
@@ -132,8 +132,8 @@
|
|
|
132
132
|
--radius-comp-card-default-radius: var(--radius-xl);
|
|
133
133
|
--spacing-comp-card-default-p-hor: var(--spacing-2xl);
|
|
134
134
|
--spacing-comp-card-default-p-ver: var(--spacing-2xl);
|
|
135
|
-
--spacing-comp-carousel-gap: var(--spacing-md);
|
|
136
135
|
--spacing-comp-carousel-dots-gap: var(--spacing-lg);
|
|
136
|
+
--spacing-comp-carousel-gap: var(--spacing-lg);
|
|
137
137
|
--radius-comp-carousel-radius: var(--radius-lg);
|
|
138
138
|
--spacing-comp-carousel-arrow-offset-sm: var(--spacing-xl);
|
|
139
139
|
--spacing-comp-carousel-arrow-offset-v-sm: var(--spacing-xl);
|
|
@@ -237,6 +237,7 @@
|
|
|
237
237
|
--spacing-comp-offer-card-list-view-p-img: var(--spacing-sm);
|
|
238
238
|
--radius-comp-offer-card-list-view-radius-img: var(--radius-lg);
|
|
239
239
|
--spacing-comp-offer-card-list-view-gap: var(--spacing-xl);
|
|
240
|
+
--spacing-comp-offer-card-list-view-icon-size: var(--spacing-40);
|
|
240
241
|
--spacing-comp-offer-card-list-view-logo-size: var(--spacing-56);
|
|
241
242
|
--spacing-comp-offer-card-list-view-h-img: 112px;
|
|
242
243
|
--spacing-comp-offer-card-list-view-w-img: 112px;
|
|
@@ -265,6 +266,8 @@
|
|
|
265
266
|
--spacing-comp-partner-card-list-view-p-img: var(--spacing-sm);
|
|
266
267
|
--radius-comp-partner-card-list-view-radius-img: var(--radius-lg);
|
|
267
268
|
--spacing-comp-partner-card-list-view-gap: var(--spacing-xl);
|
|
269
|
+
--spacing-comp-partner-card-list-view-icon-size: var(--spacing-40);
|
|
270
|
+
--spacing-comp-partner-card-list-view-icon-size: var(--spacing-40);
|
|
268
271
|
--spacing-comp-partner-card-list-view-logo-size: var(--spacing-56);
|
|
269
272
|
--spacing-comp-partner-card-list-view-h-img: 112px;
|
|
270
273
|
--spacing-comp-partner-card-list-view-w-img: 112px;
|
|
@@ -551,8 +554,8 @@
|
|
|
551
554
|
--radius-comp-card-default-radius: var(--radius-xl);
|
|
552
555
|
--spacing-comp-card-default-p-hor: var(--spacing-2xl);
|
|
553
556
|
--spacing-comp-card-default-p-ver: var(--spacing-2xl);
|
|
554
|
-
--spacing-comp-carousel-gap: var(--spacing-md);
|
|
555
557
|
--spacing-comp-carousel-dots-gap: var(--spacing-lg);
|
|
558
|
+
--spacing-comp-carousel-gap: var(--spacing-lg);
|
|
556
559
|
--radius-comp-carousel-radius: var(--radius-lg);
|
|
557
560
|
--spacing-comp-carousel-arrow-offset-sm: var(--spacing-xl);
|
|
558
561
|
--spacing-comp-carousel-arrow-offset-v-sm: var(--spacing-xl);
|
|
@@ -656,6 +659,7 @@
|
|
|
656
659
|
--spacing-comp-offer-card-list-view-p-img: var(--spacing-sm);
|
|
657
660
|
--radius-comp-offer-card-list-view-radius-img: var(--radius-lg);
|
|
658
661
|
--spacing-comp-offer-card-list-view-gap: var(--spacing-xl);
|
|
662
|
+
--spacing-comp-offer-card-list-view-icon-size: var(--spacing-40);
|
|
659
663
|
--spacing-comp-offer-card-list-view-logo-size: var(--spacing-64);
|
|
660
664
|
--spacing-comp-offer-card-list-view-h-img: 112px;
|
|
661
665
|
--spacing-comp-offer-card-list-view-w-img: 112px;
|
|
@@ -684,6 +688,8 @@
|
|
|
684
688
|
--spacing-comp-partner-card-list-view-p-img: var(--spacing-sm);
|
|
685
689
|
--radius-comp-partner-card-list-view-radius-img: var(--radius-lg);
|
|
686
690
|
--spacing-comp-partner-card-list-view-gap: var(--spacing-xl);
|
|
691
|
+
--spacing-comp-partner-card-list-view-icon-size: var(--spacing-40);
|
|
692
|
+
--spacing-comp-partner-card-list-view-icon-size: var(--spacing-40);
|
|
687
693
|
--spacing-comp-partner-card-list-view-logo-size: var(--spacing-64);
|
|
688
694
|
--spacing-comp-partner-card-list-view-h-img: 112px;
|
|
689
695
|
--spacing-comp-partner-card-list-view-w-img: 112px;
|
|
@@ -971,10 +977,10 @@
|
|
|
971
977
|
--spacing-comp-card-default-p-hor: var(--spacing-lg);
|
|
972
978
|
--spacing-comp-card-default-p-ver: var(--spacing-xl);
|
|
973
979
|
--radius-comp-card-default-radius: var(--radius-xl);
|
|
974
|
-
--spacing-comp-carousel-gap: var(--spacing-sm);
|
|
975
980
|
--spacing-comp-carousel-arrow-offset: var(--spacing-md);
|
|
976
981
|
--spacing-comp-carousel-arrow-offset-sm: var(--spacing-md);
|
|
977
982
|
--spacing-comp-carousel-dots-gap: var(--spacing-md);
|
|
983
|
+
--spacing-comp-carousel-gap: var(--spacing-lg);
|
|
978
984
|
--radius-comp-carousel-radius: var(--radius-lg);
|
|
979
985
|
--spacing-comp-carousel-arrow-offset-v-sm: var(--spacing-xl);
|
|
980
986
|
--spacing-comp-carousel-circle-size: var(--spacing-24);
|
|
@@ -1076,6 +1082,7 @@
|
|
|
1076
1082
|
--spacing-comp-offer-card-list-view-p-img: var(--spacing-xs);
|
|
1077
1083
|
--spacing-comp-offer-card-list-view-gap: var(--spacing-lg);
|
|
1078
1084
|
--radius-comp-offer-card-list-view-radius-img: var(--radius-lg);
|
|
1085
|
+
--spacing-comp-offer-card-list-view-icon-size: var(--spacing-40);
|
|
1079
1086
|
--spacing-comp-offer-card-list-view-logo-size: var(--spacing-40);
|
|
1080
1087
|
--spacing-comp-offer-card-list-view-h-img: 106px;
|
|
1081
1088
|
--spacing-comp-offer-card-list-view-w-img: 106px;
|
|
@@ -1104,6 +1111,8 @@
|
|
|
1104
1111
|
--spacing-comp-partner-card-list-view-p-img: var(--spacing-xs);
|
|
1105
1112
|
--spacing-comp-partner-card-list-view-gap: var(--spacing-lg);
|
|
1106
1113
|
--radius-comp-partner-card-list-view-radius-img: var(--radius-lg);
|
|
1114
|
+
--spacing-comp-partner-card-list-view-icon-size: var(--spacing-40);
|
|
1115
|
+
--spacing-comp-partner-card-list-view-icon-size: var(--spacing-40);
|
|
1107
1116
|
--spacing-comp-partner-card-list-view-logo-size: var(--spacing-40);
|
|
1108
1117
|
--spacing-comp-partner-card-list-view-h-img: 106px;
|
|
1109
1118
|
--spacing-comp-partner-card-list-view-w-img: 106px;
|
|
@@ -1391,8 +1400,8 @@
|
|
|
1391
1400
|
--radius-comp-card-default-radius: var(--radius-xl);
|
|
1392
1401
|
--spacing-comp-card-default-p-hor: var(--spacing-2xl);
|
|
1393
1402
|
--spacing-comp-card-default-p-ver: var(--spacing-3xl);
|
|
1394
|
-
--spacing-comp-carousel-gap: var(--spacing-md);
|
|
1395
1403
|
--spacing-comp-carousel-dots-gap: var(--spacing-lg);
|
|
1404
|
+
--spacing-comp-carousel-gap: var(--spacing-lg);
|
|
1396
1405
|
--radius-comp-carousel-radius: var(--radius-lg);
|
|
1397
1406
|
--spacing-comp-carousel-arrow-offset-sm: var(--spacing-xl);
|
|
1398
1407
|
--spacing-comp-carousel-arrow-offset-v-sm: var(--spacing-xl);
|
|
@@ -1496,6 +1505,7 @@
|
|
|
1496
1505
|
--spacing-comp-offer-card-list-view-p-img: var(--spacing-sm);
|
|
1497
1506
|
--radius-comp-offer-card-list-view-radius-img: var(--radius-lg);
|
|
1498
1507
|
--spacing-comp-offer-card-list-view-gap: var(--spacing-xl);
|
|
1508
|
+
--spacing-comp-offer-card-list-view-icon-size: var(--spacing-40);
|
|
1499
1509
|
--spacing-comp-offer-card-list-view-logo-size: var(--spacing-64);
|
|
1500
1510
|
--spacing-comp-offer-card-list-view-h-img: 112px;
|
|
1501
1511
|
--spacing-comp-offer-card-list-view-w-img: 112px;
|
|
@@ -1524,6 +1534,8 @@
|
|
|
1524
1534
|
--spacing-comp-partner-card-list-view-p-img: var(--spacing-sm);
|
|
1525
1535
|
--radius-comp-partner-card-list-view-radius-img: var(--radius-lg);
|
|
1526
1536
|
--spacing-comp-partner-card-list-view-gap: var(--spacing-xl);
|
|
1537
|
+
--spacing-comp-partner-card-list-view-icon-size: var(--spacing-40);
|
|
1538
|
+
--spacing-comp-partner-card-list-view-icon-size: var(--spacing-40);
|
|
1527
1539
|
--spacing-comp-partner-card-list-view-logo-size: var(--spacing-64);
|
|
1528
1540
|
--spacing-comp-partner-card-list-view-h-img: 112px;
|
|
1529
1541
|
--spacing-comp-partner-card-list-view-w-img: 112px;
|
package/dist/utils/cn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../src/utils/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../src/utils/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AA6Z5C,eAAO,MAAM,EAAE,GAAI,GAAG,QAAQ,UAAU,EAAE,WAEzC,CAAA"}
|
package/dist/utils/cn.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { clsx as p } from "clsx";
|
|
2
|
-
import { extendTailwindMerge as
|
|
2
|
+
import { extendTailwindMerge as e } from "tailwind-merge";
|
|
3
3
|
const o = [
|
|
4
4
|
"none",
|
|
5
5
|
"2xs",
|
|
@@ -333,6 +333,7 @@ const o = [
|
|
|
333
333
|
"comp-offer-card-compact-p-img",
|
|
334
334
|
"comp-offer-card-compact-p-top",
|
|
335
335
|
"comp-offer-card-compact-radius",
|
|
336
|
+
"comp-offer-card-list-view-icon-size",
|
|
336
337
|
"comp-offer-card-search-gap",
|
|
337
338
|
"comp-offer-card-search-gap-text",
|
|
338
339
|
"comp-offer-card-search-h-img",
|
|
@@ -351,6 +352,7 @@ const o = [
|
|
|
351
352
|
"comp-partner-card-hero-sm-radius",
|
|
352
353
|
"comp-partner-card-list-view-gap",
|
|
353
354
|
"comp-partner-card-list-view-h-img",
|
|
355
|
+
"comp-partner-card-list-view-icon-size",
|
|
354
356
|
"comp-partner-card-list-view-p-img",
|
|
355
357
|
"comp-partner-card-list-view-radius-img",
|
|
356
358
|
"comp-partner-card-list-view-w-img",
|
|
@@ -380,6 +382,7 @@ const o = [
|
|
|
380
382
|
"comp-slider-track-h-sm",
|
|
381
383
|
"comp-voucher-listview-gap",
|
|
382
384
|
"comp-voucher-listview-h-img",
|
|
385
|
+
"comp-voucher-listview-icon-size",
|
|
383
386
|
"comp-voucher-listview-p",
|
|
384
387
|
"comp-voucher-listview-radius-img",
|
|
385
388
|
"comp-voucher-listview-w-img",
|
|
@@ -393,7 +396,7 @@ const o = [
|
|
|
393
396
|
"comp-dropdown-menu-market-min-w",
|
|
394
397
|
"comp-map-pin-card-p",
|
|
395
398
|
"comp-map-pin-card-radius"
|
|
396
|
-
],
|
|
399
|
+
], a = e({
|
|
397
400
|
extend: {
|
|
398
401
|
theme: {
|
|
399
402
|
spacing: o,
|
|
@@ -401,7 +404,7 @@ const o = [
|
|
|
401
404
|
},
|
|
402
405
|
classGroups: {}
|
|
403
406
|
}
|
|
404
|
-
}), t = (...c) =>
|
|
407
|
+
}), t = (...c) => a(p(c));
|
|
405
408
|
export {
|
|
406
409
|
t as cn
|
|
407
410
|
};
|
|
@@ -4,9 +4,16 @@ import type * as React from 'react';
|
|
|
4
4
|
* to make it non-navigable while disabled. Library-agnostic: removes the
|
|
5
5
|
* element from the tab order and blocks activation even when the navigation
|
|
6
6
|
* target is not `href` (e.g. React Router's `to`).
|
|
7
|
+
*
|
|
8
|
+
* Deliberately does **not** null the navigation prop. Router links validate
|
|
9
|
+
* their target eagerly — Next.js `<Link>` throws when `href` is `undefined` —
|
|
10
|
+
* so stripping it on a cloned `asChild` child tears down the card's subtree
|
|
11
|
+
* instead of disabling it. `tabIndex: -1`, `aria-disabled` and the `onClick`
|
|
12
|
+
* guard already make the element non-navigable, and the card root carries
|
|
13
|
+
* `pointer-events-none` on top of that. Components that render their own
|
|
14
|
+
* built-in `<a>` strip `href` there, where the element type is known.
|
|
7
15
|
*/
|
|
8
16
|
export declare const disabledLinkProps: {
|
|
9
|
-
href: undefined;
|
|
10
17
|
tabIndex: number;
|
|
11
18
|
'aria-disabled': true;
|
|
12
19
|
onClick: (event: React.MouseEvent) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disabledLinkProps.d.ts","sourceRoot":"","sources":["../../src/utils/disabledLinkProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC
|
|
1
|
+
{"version":3,"file":"disabledLinkProps.d.ts","sourceRoot":"","sources":["../../src/utils/disabledLinkProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB;;;qBAGX,KAAK,CAAC,UAAU;CACgB,CAAA"}
|
package/llms-full.md
CHANGED
|
@@ -44,8 +44,8 @@ NEVER create new UI components that duplicate Muza UI functionality. Check avail
|
|
|
44
44
|
|
|
45
45
|
**Complete Component List (57 components)**
|
|
46
46
|
|
|
47
|
-
**Form & Input (
|
|
48
|
-
Button, ButtonArrow, Input, PasswordInput, Textarea, Checkbox, Radio, Switch, Toggle, ToggleCheckButton, ToggleGroup, Select, MultiSelect, Searchbar, FileUpload, TextEditor, Slider
|
|
47
|
+
**Form & Input (18)**:
|
|
48
|
+
Button, ButtonArrow, Input, PasswordInput, Textarea, Checkbox, Radio, Switch, Toggle, ToggleCheckButton, ToggleGroup, Select, SelectTrigger, MultiSelect, Searchbar, FileUpload, TextEditor, Slider
|
|
49
49
|
|
|
50
50
|
**Layout & Structure (7)**:
|
|
51
51
|
Accordion, Card, Flex, Sheet, Typography, Dialog, Skeleton
|
|
@@ -176,6 +176,25 @@ import {
|
|
|
176
176
|
|
|
177
177
|
Sub-components: `DropdownMenu`, `DropdownMenuTrigger`, `DropdownMenuPortal`, `DropdownMenuContent`, `DropdownMenuItem`, `DropdownMenuCheckboxItem`, `DropdownMenuRadioGroup`, `DropdownMenuRadioItem`, `DropdownMenuSeparator`, `DropdownMenuButtonItem`
|
|
178
178
|
|
|
179
|
+
**Navigation entries must be links.** Use `asChild` on `DropdownMenuItem` so the item
|
|
180
|
+
renders as a real anchor instead of a div with an `onSelect` handler:
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
<DropdownMenuItem asChild icon={<HeartBold />}>
|
|
184
|
+
<Link href="/profile/favorite">Favorites</Link>
|
|
185
|
+
</DropdownMenuItem>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
This produces a single `<a role="menuitem">` carrying the item styling, with the icon
|
|
189
|
+
inside it. Do NOT use `onSelect={() => router.push('/x')}` for navigation — it throws
|
|
190
|
+
away middle-click, Ctrl+click, "open link in new tab", "copy link address", the hover
|
|
191
|
+
URL preview, link semantics for screen readers and framework prefetching.
|
|
192
|
+
|
|
193
|
+
`icon`, `isActive` and `description` all still render, and keyboard navigation,
|
|
194
|
+
typeahead and `onSelect` are unchanged. `asChild` works the same way on
|
|
195
|
+
`DropdownMenuCheckboxItem` and `DropdownMenuRadioItem`, though a navigating child makes
|
|
196
|
+
little sense for those.
|
|
197
|
+
|
|
179
198
|
#### Accordion
|
|
180
199
|
|
|
181
200
|
```tsx
|
|
@@ -222,6 +241,69 @@ import { Popover, PopoverContent, PopoverTrigger } from '@vkzstudio/muza-ui'
|
|
|
222
241
|
</Popover>
|
|
223
242
|
```
|
|
224
243
|
|
|
244
|
+
#### Carousel
|
|
245
|
+
|
|
246
|
+
Built on [Embla Carousel](https://www.embla-carousel.com/). `CarouselItem` is full-width by default — override `basis-*` for multi-slide layouts.
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
import {
|
|
250
|
+
Carousel,
|
|
251
|
+
CarouselContent,
|
|
252
|
+
CarouselDots,
|
|
253
|
+
CarouselItem,
|
|
254
|
+
CarouselNext,
|
|
255
|
+
CarouselPrevious,
|
|
256
|
+
} from '@vkzstudio/muza-ui'
|
|
257
|
+
|
|
258
|
+
;<Carousel align="start" options={{ loop: true }}>
|
|
259
|
+
<CarouselContent>
|
|
260
|
+
<CarouselItem className="basis-1/2 md:basis-1/3">Slide 1</CarouselItem>
|
|
261
|
+
<CarouselItem className="basis-1/2 md:basis-1/3">Slide 2</CarouselItem>
|
|
262
|
+
</CarouselContent>
|
|
263
|
+
<CarouselPrevious />
|
|
264
|
+
<CarouselNext />
|
|
265
|
+
<CarouselDots />
|
|
266
|
+
</Carousel>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**Autoplay** — set `autoplay` for a self-running carousel. Do NOT install `embla-carousel-autoplay` or hand-roll a timer in your app; the library owns this.
|
|
270
|
+
|
|
271
|
+
```tsx
|
|
272
|
+
// Advances every 5000ms by default; pair with loop for a seamless wrap
|
|
273
|
+
<Carousel autoplay options={{ loop: true }}>...</Carousel>
|
|
274
|
+
|
|
275
|
+
// Custom interval
|
|
276
|
+
<Carousel autoplay autoplayDelay={3000}>...</Carousel>
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
- Pauses on hover (mouse only) and while dragging; resumes on mouse leave, once the slide settles, or after a plain tap.
|
|
280
|
+
- Never runs under `prefers-reduced-motion: reduce`, or with a single slide.
|
|
281
|
+
- `autoplay` appends Embla's `Autoplay` plugin to `plugins`, so your own plugins keep working. Passing your own `Autoplay({ ... })` instance via `plugins` takes precedence — `autoplay` steps aside rather than adding a second timer.
|
|
282
|
+
|
|
283
|
+
**Custom controls** — `useCarousel()` exposes the carousel's state and controls to any descendant, so you don't need `setApi` + local state for a counter, progress bar, or bespoke dot strip. It throws outside a `<Carousel>`.
|
|
284
|
+
|
|
285
|
+
```tsx
|
|
286
|
+
import { useCarousel } from '@vkzstudio/muza-ui'
|
|
287
|
+
|
|
288
|
+
const SlideCounter = () => {
|
|
289
|
+
const { selectedIndex, slidesCount } = useCarousel()
|
|
290
|
+
return (
|
|
291
|
+
<span>
|
|
292
|
+
{selectedIndex + 1} / {slidesCount}
|
|
293
|
+
</span>
|
|
294
|
+
)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
;<Carousel>
|
|
298
|
+
<CarouselContent>...</CarouselContent>
|
|
299
|
+
<SlideCounter /> {/* must be inside <Carousel> */}
|
|
300
|
+
</Carousel>
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Returns `api`, `carouselRef`, `scrollPrev`, `scrollNext`, `scrollTo(index)`, `canScrollPrev`, `canScrollNext`, `selectedIndex`, `slidesCount`, plus the root's `options` / `orientation` / `plugins`.
|
|
304
|
+
|
|
305
|
+
Other props: `orientation` (`'horizontal' | 'vertical'`), `align`, `options` (Embla options), `plugins` (Embla plugins), `setApi` (imperative Embla API).
|
|
306
|
+
|
|
225
307
|
### 5. Complex Component APIs
|
|
226
308
|
|
|
227
309
|
#### DatePicker
|
|
@@ -274,6 +356,53 @@ import { Select } from '@vkzstudio/muza-ui'
|
|
|
274
356
|
/>
|
|
275
357
|
```
|
|
276
358
|
|
|
359
|
+
#### SelectTrigger (styling a menu trigger)
|
|
360
|
+
|
|
361
|
+
`Select` is a value picker with combobox/listbox semantics. When the design calls for
|
|
362
|
+
the select pill but the control is really a **menu** — an account dropdown, a filter
|
|
363
|
+
menu, a navigation dropdown — use `SelectTrigger`, the exact button `Select` renders,
|
|
364
|
+
exported on its own. Do not hand-copy the `comp-select-*` tokens into your own
|
|
365
|
+
`<button>`; that silently drifts whenever Select is restyled.
|
|
366
|
+
|
|
367
|
+
```tsx
|
|
368
|
+
import {
|
|
369
|
+
DropdownMenu,
|
|
370
|
+
DropdownMenuContent,
|
|
371
|
+
DropdownMenuItem,
|
|
372
|
+
DropdownMenuTrigger,
|
|
373
|
+
SelectTrigger,
|
|
374
|
+
} from '@vkzstudio/muza-ui'
|
|
375
|
+
|
|
376
|
+
;<DropdownMenu>
|
|
377
|
+
<DropdownMenuTrigger asChild>
|
|
378
|
+
<SelectTrigger size="sm" className="max-w-comp-market-nav-select-max-w">
|
|
379
|
+
{userName}
|
|
380
|
+
</SelectTrigger>
|
|
381
|
+
</DropdownMenuTrigger>
|
|
382
|
+
<DropdownMenuContent align="end" sideOffset={8}>
|
|
383
|
+
<DropdownMenuItem icon={<UserBold />}>My profile</DropdownMenuItem>
|
|
384
|
+
<DropdownMenuItem icon={<Logout2Outline />}>Log out</DropdownMenuItem>
|
|
385
|
+
</DropdownMenuContent>
|
|
386
|
+
</DropdownMenu>
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
Key points:
|
|
390
|
+
|
|
391
|
+
- **Stateless — no `open` prop.** The expanded border and the chevron rotation come
|
|
392
|
+
from `data-state="open"`, which Radix sets on the trigger in `Select`,
|
|
393
|
+
`DropdownMenu`, `Popover` and friends. Do not keep a local `menuOpen` state for
|
|
394
|
+
styling.
|
|
395
|
+
- **`asChild` works.** It is a `forwardRef` over a single `<button>` and spreads every
|
|
396
|
+
remaining prop, so Radix's ref, handlers, `aria-expanded`, `aria-haspopup` and
|
|
397
|
+
`data-state` all land on it.
|
|
398
|
+
- **It owns the chevron and truncation.** A `string` or `number` child is rendered in
|
|
399
|
+
the standard truncated label style; pass a node for full control.
|
|
400
|
+
- `className` is merged with `cn`, so `max-w-*` and friends work.
|
|
401
|
+
- Props: `size` (`'xs' | 'sm' | 'base' | 'lg'`), `error`, `disabled`, `prefix`,
|
|
402
|
+
`hasDescription`, plus all native `<button>` attributes.
|
|
403
|
+
- `triggerWrapperVariants` is also exported as an escape hatch for cases that cannot
|
|
404
|
+
use the component, but prefer the component.
|
|
405
|
+
|
|
277
406
|
#### toast() (imperative API)
|
|
278
407
|
|
|
279
408
|
Toast uses an imperative function, not a declarative component:
|
|
@@ -517,6 +646,8 @@ interface CustomButtonProps extends ButtonProps {
|
|
|
517
646
|
- Mix different UI libraries (Material-UI, Ant Design, etc.) with Muza UI
|
|
518
647
|
- Create custom toast/notification systems
|
|
519
648
|
- Use `<Alert variant="error">` - use `<Alert type="error">` instead
|
|
649
|
+
- Copy `comp-select-*` classes into your own trigger button - use `SelectTrigger`
|
|
650
|
+
- Use `<Select>` for a menu of actions - it is a combobox; use `SelectTrigger` inside `DropdownMenuTrigger asChild`
|
|
520
651
|
|
|
521
652
|
## DO
|
|
522
653
|
|
package/llms.txt
CHANGED
|
@@ -21,6 +21,8 @@ import '@vkzstudio/muza-ui/styles'
|
|
|
21
21
|
|
|
22
22
|
See llms-full.md for component APIs, compound component patterns, and react-hook-form integration.
|
|
23
23
|
|
|
24
|
+
Some components own behaviour you should not re-implement in an app — e.g. `Carousel` has built-in autoplay (`autoplay` / `autoplayDelay`, with hover/drag pausing and `prefers-reduced-motion` support), so don't install `embla-carousel-autoplay` or hand-roll a timer.
|
|
25
|
+
|
|
24
26
|
## Component Categories (57 total)
|
|
25
27
|
|
|
26
28
|
**Form & Input (17)**: Button, ButtonArrow, Input, PasswordInput, Textarea, Checkbox, Radio, Switch, Toggle, ToggleCheckButton, ToggleGroup, Select, MultiSelect, Searchbar, FileUpload, TextEditor, Slider
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vkzstudio/muza-ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "React component library built with Vite, shadcn/ui, and Tailwind CSS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
"add-component": "chmod +x scripts/add-component.sh && ./scripts/add-component.sh",
|
|
66
66
|
"add-component:win": "powershell -ExecutionPolicy Bypass -File scripts/add-component.ps1",
|
|
67
67
|
"tokens:import": "node scripts/import-tokens.mjs",
|
|
68
|
+
"changeset:version": "changeset version && npm install --package-lock-only --ignore-scripts",
|
|
68
69
|
"format": "prettier --write .",
|
|
69
70
|
"chromatic": "npx chromatic --project-token=chpt_23ce248b589dbff",
|
|
70
71
|
"test:visual": "storybook build --output-dir storybook-static --quiet && playwright test",
|
|
@@ -103,6 +104,7 @@
|
|
|
103
104
|
"clsx": "^2.1.0",
|
|
104
105
|
"color": "^5.0.2",
|
|
105
106
|
"date-fns": "^4.1.0",
|
|
107
|
+
"embla-carousel-autoplay": "^8.6.0",
|
|
106
108
|
"embla-carousel-react": "^8.6.0",
|
|
107
109
|
"framer-motion": "^12.29.0",
|
|
108
110
|
"input-otp": "^1.4.2",
|