@rovula/ui 0.0.69 → 0.0.71
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/cjs/bundle.css +23 -9
- package/dist/cjs/bundle.js +3 -3
- package/dist/cjs/bundle.js.map +1 -1
- package/dist/cjs/types/components/Dropdown/Dropdown.styles.d.ts +0 -1
- package/dist/cjs/types/components/FocusedScrollView/FocusedScrollView.d.ts +12 -0
- package/dist/cjs/types/components/FocusedScrollView/FocusedScrollView.stories.d.ts +7 -0
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/components/Dropdown/Dropdown.js +2 -2
- package/dist/components/Dropdown/Dropdown.stories.js +1 -0
- package/dist/components/Dropdown/Dropdown.styles.js +6 -6
- package/dist/components/DropdownMenu/DropdownMenu.js +2 -2
- package/dist/components/FocusedScrollView/FocusedScrollView.js +67 -0
- package/dist/components/FocusedScrollView/FocusedScrollView.stories.js +33 -0
- package/dist/esm/bundle.css +23 -9
- package/dist/esm/bundle.js +2 -2
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/types/components/Dropdown/Dropdown.styles.d.ts +0 -1
- package/dist/esm/types/components/FocusedScrollView/FocusedScrollView.d.ts +12 -0
- package/dist/esm/types/components/FocusedScrollView/FocusedScrollView.stories.d.ts +7 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/index.d.ts +13 -2
- package/dist/index.js +1 -0
- package/dist/src/theme/global.css +30 -11
- package/package.json +1 -1
- package/src/components/Dropdown/Dropdown.stories.tsx +2 -0
- package/src/components/Dropdown/Dropdown.styles.ts +6 -6
- package/src/components/Dropdown/Dropdown.tsx +4 -10
- package/src/components/DropdownMenu/DropdownMenu.tsx +10 -2
- package/src/components/FocusedScrollView/FocusedScrollView.stories.tsx +114 -0
- package/src/components/FocusedScrollView/FocusedScrollView.tsx +112 -0
- package/src/index.ts +1 -0
|
@@ -2,7 +2,6 @@ export declare const iconWrapperVariant: (props?: ({
|
|
|
2
2
|
size?: "sm" | "md" | "lg" | null | undefined;
|
|
3
3
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
4
4
|
export declare const dropdownIconVariant: (props?: ({
|
|
5
|
-
size?: "sm" | "md" | "lg" | null | undefined;
|
|
6
5
|
disabled?: boolean | null | undefined;
|
|
7
6
|
isFocus?: boolean | null | undefined;
|
|
8
7
|
} & import("class-variance-authority/dist/types").ClassProp) | undefined) => string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React, { ReactNode, HTMLAttributes } from "react";
|
|
2
|
+
type ScrollAlign = "start" | "center" | "end";
|
|
3
|
+
type FocusedScrollViewProps = {
|
|
4
|
+
selectedKey?: string;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
direction?: "vertical" | "horizontal";
|
|
7
|
+
className?: string;
|
|
8
|
+
containerProps?: HTMLAttributes<HTMLDivElement>;
|
|
9
|
+
scrollAlign?: ScrollAlign;
|
|
10
|
+
};
|
|
11
|
+
export declare const FocusedScrollView: React.FC<FocusedScrollViewProps>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { FocusedScrollView } from "./FocusedScrollView";
|
|
3
|
+
declare const meta: Meta<typeof FocusedScrollView>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof FocusedScrollView>;
|
|
6
|
+
export declare const VerticalScroll: Story;
|
|
7
|
+
export declare const HorizontalScroll: Story;
|
|
@@ -33,6 +33,7 @@ export * from "./components/Toast/Toast";
|
|
|
33
33
|
export * from "./components/Toast/Toaster";
|
|
34
34
|
export * from "./components/Toast/useToast";
|
|
35
35
|
export * from "./components/Tree";
|
|
36
|
+
export * from "./components/FocusedScrollView/FocusedScrollView";
|
|
36
37
|
export type { ButtonProps } from "./components/Button/Button";
|
|
37
38
|
export type { InputProps } from "./components/TextInput/TextInput";
|
|
38
39
|
export type { DropdownProps, Options } from "./components/Dropdown/Dropdown";
|
|
@@ -13,7 +13,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
13
13
|
import { Fragment, forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, } from "react";
|
|
14
14
|
import * as Portal from "@radix-ui/react-portal";
|
|
15
15
|
import TextInput from "../TextInput/TextInput";
|
|
16
|
-
import { customInputVariant, dropdownIconVariant
|
|
16
|
+
import { customInputVariant, dropdownIconVariant } from "./Dropdown.styles";
|
|
17
17
|
import { ChevronDownIcon } from "@heroicons/react/16/solid";
|
|
18
18
|
import { cn } from "@/utils/cn";
|
|
19
19
|
const Dropdown = forwardRef((_a, ref) => {
|
|
@@ -170,7 +170,7 @@ const Dropdown = forwardRef((_a, ref) => {
|
|
|
170
170
|
keyCode.current = e.code;
|
|
171
171
|
(_a = props === null || props === void 0 ? void 0 : props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
172
172
|
}, [props === null || props === void 0 ? void 0 : props.onKeyDown]);
|
|
173
|
-
return (_jsxs("div", { className: `relative ${fullwidth ? "w-full" : ""}`, children: [_jsx(TextInput, Object.assign({ hasClearIcon: false, endIcon: _jsx(
|
|
173
|
+
return (_jsxs("div", { className: `relative ${fullwidth ? "w-full" : ""}`, children: [_jsx(TextInput, Object.assign({ hasClearIcon: false, endIcon: _jsx(ChevronDownIcon, { className: dropdownIconVariant({ isFocus: isFocused }) }) }, props, { ref: inputRef, readOnly: !filterMode, value: textValue, onChange: handleOnChangeText, label: label, placeholder: " ", type: "text", autoComplete: "off", rounded: rounded, variant: variant, helperText: helperText, errorMessage: errorMessage, fullwidth: fullwidth, error: error, required: required, id: _id, disabled: disabled, size: size, className: customInputVariant({ size }), onFocus: handleOnFocus, onBlur: handleOnBlur, onKeyDown: handleOnKeyDown })), isFocused &&
|
|
174
174
|
(usePortal ? (_jsx(Portal.Root, { container: document.body, children: renderOptions() })) : (renderOptions()))] }));
|
|
175
175
|
});
|
|
176
176
|
export default Dropdown;
|
|
@@ -13,11 +13,12 @@ export const iconWrapperVariant = cva(["absolute inset-y-0 right-0 flex items-ce
|
|
|
13
13
|
});
|
|
14
14
|
export const dropdownIconVariant = cva(["transition-all"], {
|
|
15
15
|
variants: {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
// Controll by text-input
|
|
17
|
+
// size: {
|
|
18
|
+
// sm: "size-[14px]",
|
|
19
|
+
// md: "size-5",
|
|
20
|
+
// lg: "size-6",
|
|
21
|
+
// },
|
|
21
22
|
disabled: {
|
|
22
23
|
true: "fill-input-text-disabled",
|
|
23
24
|
false: "fill-inherit",
|
|
@@ -28,7 +29,6 @@ export const dropdownIconVariant = cva(["transition-all"], {
|
|
|
28
29
|
},
|
|
29
30
|
},
|
|
30
31
|
defaultVariants: {
|
|
31
|
-
size: "md",
|
|
32
32
|
disabled: false,
|
|
33
33
|
isFocus: false,
|
|
34
34
|
},
|
|
@@ -31,13 +31,13 @@ DropdownMenuSubTrigger.displayName =
|
|
|
31
31
|
DropdownMenuPrimitive.SubTrigger.displayName;
|
|
32
32
|
const DropdownMenuSubContent = React.forwardRef((_a, ref) => {
|
|
33
33
|
var { className } = _a, props = __rest(_a, ["className"]);
|
|
34
|
-
return (_jsx(DropdownMenuPrimitive.SubContent, Object.assign({ ref: ref, className: cn("z-50 min-w-[154px] overflow-hidden rounded-md bg-base-popup text-base-popup-foreground
|
|
34
|
+
return (_jsx(DropdownMenuPrimitive.SubContent, Object.assign({ ref: ref, className: cn("z-50 min-w-[154px] overflow-hidden rounded-md bg-base-popup text-base-popup-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className) }, props, { style: Object.assign({ boxShadow: "var(--dropdown-menu-shadow)" }, props.style) })));
|
|
35
35
|
});
|
|
36
36
|
DropdownMenuSubContent.displayName =
|
|
37
37
|
DropdownMenuPrimitive.SubContent.displayName;
|
|
38
38
|
const DropdownMenuContent = React.forwardRef((_a, ref) => {
|
|
39
39
|
var { className, sideOffset = 4 } = _a, props = __rest(_a, ["className", "sideOffset"]);
|
|
40
|
-
return (_jsx(DropdownMenuPrimitive.Portal, { children: _jsx(DropdownMenuPrimitive.Content, Object.assign({ ref: ref, sideOffset: sideOffset, className: cn("z-50 min-w-[154px] overflow-hidden rounded-md bg-base-popup text-base-popup-foreground
|
|
40
|
+
return (_jsx(DropdownMenuPrimitive.Portal, { children: _jsx(DropdownMenuPrimitive.Content, Object.assign({ ref: ref, sideOffset: sideOffset, className: cn("z-50 min-w-[154px] overflow-hidden rounded-md bg-base-popup text-base-popup-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className) }, props, { style: Object.assign({ boxShadow: "var(--dropdown-menu-shadow)" }, props.style) })) }));
|
|
41
41
|
});
|
|
42
42
|
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
|
|
43
43
|
const DropdownMenuItem = React.forwardRef((_a, ref) => {
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect, cloneElement, isValidElement, } from "react";
|
|
3
|
+
export const FocusedScrollView = ({ selectedKey, children, direction = "vertical", className, containerProps, scrollAlign = "center", }) => {
|
|
4
|
+
const containerRef = useRef(null);
|
|
5
|
+
const itemRefs = useRef({});
|
|
6
|
+
const scrollToItem = (key) => {
|
|
7
|
+
const container = containerRef.current;
|
|
8
|
+
const item = itemRefs.current[key];
|
|
9
|
+
if (container && item) {
|
|
10
|
+
if (direction === "vertical") {
|
|
11
|
+
const containerTop = container.getBoundingClientRect().top;
|
|
12
|
+
const itemTop = item.getBoundingClientRect().top;
|
|
13
|
+
const offset = itemTop - containerTop + container.scrollTop;
|
|
14
|
+
const containerHeight = container.clientHeight;
|
|
15
|
+
const itemHeight = item.offsetHeight;
|
|
16
|
+
let targetTop = offset;
|
|
17
|
+
if (scrollAlign === "center") {
|
|
18
|
+
targetTop = offset - (containerHeight / 2 - itemHeight / 2);
|
|
19
|
+
}
|
|
20
|
+
else if (scrollAlign === "end") {
|
|
21
|
+
targetTop = offset + (itemHeight - containerHeight);
|
|
22
|
+
}
|
|
23
|
+
container.scrollTo({
|
|
24
|
+
top: targetTop,
|
|
25
|
+
behavior: "smooth",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else if (direction === "horizontal") {
|
|
29
|
+
const containerLeft = container.getBoundingClientRect().left;
|
|
30
|
+
const itemLeft = item.getBoundingClientRect().left;
|
|
31
|
+
const offset = itemLeft - containerLeft + container.scrollLeft;
|
|
32
|
+
const containerWidth = container.clientWidth;
|
|
33
|
+
const itemWidth = item.offsetWidth;
|
|
34
|
+
let targetLeft = offset;
|
|
35
|
+
if (scrollAlign === "center") {
|
|
36
|
+
targetLeft = offset - (containerWidth / 2 - itemWidth / 2);
|
|
37
|
+
}
|
|
38
|
+
else if (scrollAlign === "end") {
|
|
39
|
+
targetLeft = offset + (itemWidth - containerWidth);
|
|
40
|
+
}
|
|
41
|
+
container.scrollTo({
|
|
42
|
+
left: targetLeft,
|
|
43
|
+
behavior: "smooth",
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (selectedKey) {
|
|
50
|
+
scrollToItem(selectedKey);
|
|
51
|
+
}
|
|
52
|
+
}, [selectedKey, direction, scrollAlign]);
|
|
53
|
+
const enhancedChildren = Array.isArray(children)
|
|
54
|
+
? children.map((child) => {
|
|
55
|
+
if (isValidElement(child) && child.key) {
|
|
56
|
+
return cloneElement(child, {
|
|
57
|
+
// @ts-ignore
|
|
58
|
+
ref: (el) => {
|
|
59
|
+
itemRefs.current[String(child.key)] = el;
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return child;
|
|
64
|
+
})
|
|
65
|
+
: children;
|
|
66
|
+
return (_jsx("div", Object.assign({ ref: containerRef, className: `overflow-auto ${direction === "vertical" ? "max-h-60" : "max-w-full whitespace-nowrap"} ${className !== null && className !== void 0 ? className : ""}` }, containerProps, { children: enhancedChildren })));
|
|
67
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { FocusedScrollView } from "./FocusedScrollView";
|
|
4
|
+
const meta = {
|
|
5
|
+
title: "Components/FocusedScrollView",
|
|
6
|
+
component: FocusedScrollView,
|
|
7
|
+
args: {
|
|
8
|
+
direction: "vertical",
|
|
9
|
+
scrollAlign: "center",
|
|
10
|
+
className: "border border-input-default-stroke rounded",
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
export default meta;
|
|
14
|
+
const items = Array.from({ length: 30 }, (_, i) => `Item ${i + 1}`);
|
|
15
|
+
export const VerticalScroll = {
|
|
16
|
+
render: (args) => {
|
|
17
|
+
const [selected, setSelected] = useState("item-5");
|
|
18
|
+
return (_jsxs("div", { className: "p-6 space-y-4", children: [_jsxs("div", { className: "flex gap-2", children: [_jsx("button", { onClick: () => setSelected("item-5"), className: "px-3 py-1 bg-primary text-white rounded", children: "Scroll to Item 5" }), _jsx("button", { onClick: () => setSelected("item-20"), className: "px-3 py-1 bg-primary text-white rounded", children: "Scroll to Item 20" }), _jsx("button", { onClick: () => setSelected("item-29"), className: "px-3 py-1 bg-primary text-white rounded", children: "Scroll to Item 30" })] }), _jsx(FocusedScrollView, Object.assign({}, args, { selectedKey: selected, children: items.map((item, index) => (_jsx("div", { className: `px-4 py-2 ${selected === `item-${index + 1}`
|
|
19
|
+
? "bg-secondary text-secondary-foreground"
|
|
20
|
+
: "bg-white"}`, children: item }, `item-${index + 1}`))) }))] }));
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export const HorizontalScroll = {
|
|
24
|
+
args: {
|
|
25
|
+
direction: "horizontal",
|
|
26
|
+
},
|
|
27
|
+
render: (args) => {
|
|
28
|
+
const [selected, setSelected] = useState("item-15");
|
|
29
|
+
return (_jsxs("div", { className: "p-6 space-y-4", children: [_jsxs("div", { className: "flex gap-2", children: [_jsx("button", { onClick: () => setSelected("item-5"), className: "px-3 py-1 bg-primary text-white rounded", children: "Scroll to Item 5" }), _jsx("button", { onClick: () => setSelected("item-15"), className: "px-3 py-1 bg-primary text-white rounded", children: "Scroll to Item 15" }), _jsx("button", { onClick: () => setSelected("item-25"), className: "px-3 py-1 bg-primary text-white rounded", children: "Scroll to Item 25" })] }), _jsx(FocusedScrollView, Object.assign({}, args, { selectedKey: selected, children: items.map((item, index) => (_jsx("div", { className: `inline-block w-28 h-12 mx-2 text-center leading-[3rem] rounded ${selected === `item-${index + 1}`
|
|
30
|
+
? "bg-secondary text-secondary-foreground"
|
|
31
|
+
: "bg-gray-200"}`, children: item }, `item-${index + 1}`))) }))] }));
|
|
32
|
+
},
|
|
33
|
+
};
|
package/dist/esm/bundle.css
CHANGED
|
@@ -675,6 +675,10 @@ input[type=number] {
|
|
|
675
675
|
margin-left: -0.5rem;
|
|
676
676
|
margin-right: -0.5rem;
|
|
677
677
|
}
|
|
678
|
+
.mx-2{
|
|
679
|
+
margin-left: 0.5rem;
|
|
680
|
+
margin-right: 0.5rem;
|
|
681
|
+
}
|
|
678
682
|
.mx-4{
|
|
679
683
|
margin-left: 1rem;
|
|
680
684
|
margin-right: 1rem;
|
|
@@ -744,6 +748,9 @@ input[type=number] {
|
|
|
744
748
|
.block{
|
|
745
749
|
display: block;
|
|
746
750
|
}
|
|
751
|
+
.inline-block{
|
|
752
|
+
display: inline-block;
|
|
753
|
+
}
|
|
747
754
|
.flex{
|
|
748
755
|
display: flex;
|
|
749
756
|
}
|
|
@@ -906,6 +913,9 @@ input[type=number] {
|
|
|
906
913
|
.w-2{
|
|
907
914
|
width: 0.5rem;
|
|
908
915
|
}
|
|
916
|
+
.w-28{
|
|
917
|
+
width: 7rem;
|
|
918
|
+
}
|
|
909
919
|
.w-3{
|
|
910
920
|
width: 0.75rem;
|
|
911
921
|
}
|
|
@@ -974,6 +984,9 @@ input[type=number] {
|
|
|
974
984
|
min-width: -moz-fit-content;
|
|
975
985
|
min-width: fit-content;
|
|
976
986
|
}
|
|
987
|
+
.max-w-full{
|
|
988
|
+
max-width: 100%;
|
|
989
|
+
}
|
|
977
990
|
.max-w-lg{
|
|
978
991
|
max-width: 32rem;
|
|
979
992
|
}
|
|
@@ -1185,6 +1198,9 @@ input[type=number] {
|
|
|
1185
1198
|
.text-ellipsis{
|
|
1186
1199
|
text-overflow: ellipsis;
|
|
1187
1200
|
}
|
|
1201
|
+
.whitespace-nowrap{
|
|
1202
|
+
white-space: nowrap;
|
|
1203
|
+
}
|
|
1188
1204
|
.rounded{
|
|
1189
1205
|
border-radius: 0.25rem;
|
|
1190
1206
|
}
|
|
@@ -2669,6 +2685,10 @@ input[type=number] {
|
|
|
2669
2685
|
--tw-bg-opacity: 1;
|
|
2670
2686
|
background-color: color-mix(in srgb, var(--other-transparency-warning-8) calc(100% * var(--tw-bg-opacity, 1)), transparent);
|
|
2671
2687
|
}
|
|
2688
|
+
.bg-white{
|
|
2689
|
+
--tw-bg-opacity: 1;
|
|
2690
|
+
background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
|
|
2691
|
+
}
|
|
2672
2692
|
.bg-white-transparent-12{
|
|
2673
2693
|
--tw-bg-opacity: 1;
|
|
2674
2694
|
background-color: color-mix(in srgb, var(--other-transparency-white-12) calc(100% * var(--tw-bg-opacity, 1)), transparent);
|
|
@@ -3184,6 +3204,9 @@ input[type=number] {
|
|
|
3184
3204
|
.capitalize{
|
|
3185
3205
|
text-transform: capitalize;
|
|
3186
3206
|
}
|
|
3207
|
+
.leading-\[3rem\]{
|
|
3208
|
+
line-height: 3rem;
|
|
3209
|
+
}
|
|
3187
3210
|
.leading-none{
|
|
3188
3211
|
line-height: 1;
|
|
3189
3212
|
}
|
|
@@ -3494,11 +3517,6 @@ input[type=number] {
|
|
|
3494
3517
|
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
|
|
3495
3518
|
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
|
3496
3519
|
}
|
|
3497
|
-
.shadow-\[0px_2px_24px_0px_rgba\(145\2c _158\2c _171\2c _0\.24\)\]{
|
|
3498
|
-
--tw-shadow: 0px 2px 24px 0px rgba(145, 158, 171, 0.24);
|
|
3499
|
-
--tw-shadow-colored: 0px 2px 24px 0px var(--tw-shadow-color);
|
|
3500
|
-
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
|
3501
|
-
}
|
|
3502
3520
|
.shadow-lg{
|
|
3503
3521
|
--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
3504
3522
|
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
|
|
@@ -3509,10 +3527,6 @@ input[type=number] {
|
|
|
3509
3527
|
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
|
|
3510
3528
|
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
|
3511
3529
|
}
|
|
3512
|
-
.shadow-\[var\(--dropdown-menu-shadow\)\]{
|
|
3513
|
-
--tw-shadow-color: var(--dropdown-menu-shadow);
|
|
3514
|
-
--tw-shadow: var(--tw-shadow-colored);
|
|
3515
|
-
}
|
|
3516
3530
|
.outline-none{
|
|
3517
3531
|
outline: 2px solid transparent;
|
|
3518
3532
|
outline-offset: 2px;
|