whatsapp-ui-react 0.0.1
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/LICENSE +201 -0
- package/README.md +133 -0
- package/dist/components/Chat/Chat.d.ts +48 -0
- package/dist/components/Chat/Chat.d.ts.map +1 -0
- package/dist/components/Chat/ChatReplyContext.d.ts +22 -0
- package/dist/components/Chat/ChatReplyContext.d.ts.map +1 -0
- package/dist/components/Chat/DayDivider.d.ts +11 -0
- package/dist/components/Chat/DayDivider.d.ts.map +1 -0
- package/dist/components/Chat/Header.d.ts +16 -0
- package/dist/components/Chat/Header.d.ts.map +1 -0
- package/dist/components/Chat/Inputfield.d.ts +31 -0
- package/dist/components/Chat/Inputfield.d.ts.map +1 -0
- package/dist/components/Chat/InputfieldActions.d.ts +26 -0
- package/dist/components/Chat/InputfieldActions.d.ts.map +1 -0
- package/dist/components/Chat/MessageList.d.ts +11 -0
- package/dist/components/Chat/MessageList.d.ts.map +1 -0
- package/dist/components/Chat/index.d.ts +11 -0
- package/dist/components/Chat/index.d.ts.map +1 -0
- package/dist/components/Chat/index.parts.d.ts +13 -0
- package/dist/components/Chat/index.parts.d.ts.map +1 -0
- package/dist/components/Message/Audio/Audio.d.ts +13 -0
- package/dist/components/Message/Audio/Audio.d.ts.map +1 -0
- package/dist/components/Message/Audio/index.d.ts +3 -0
- package/dist/components/Message/Audio/index.d.ts.map +1 -0
- package/dist/components/Message/Contact/Contact.d.ts +9 -0
- package/dist/components/Message/Contact/Contact.d.ts.map +1 -0
- package/dist/components/Message/Contact/index.d.ts +3 -0
- package/dist/components/Message/Contact/index.d.ts.map +1 -0
- package/dist/components/Message/Emoji/Emoji.d.ts +16 -0
- package/dist/components/Message/Emoji/Emoji.d.ts.map +1 -0
- package/dist/components/Message/Emoji/index.d.ts +3 -0
- package/dist/components/Message/Emoji/index.d.ts.map +1 -0
- package/dist/components/Message/Event/Event.d.ts +9 -0
- package/dist/components/Message/Event/Event.d.ts.map +1 -0
- package/dist/components/Message/Event/index.d.ts +3 -0
- package/dist/components/Message/Event/index.d.ts.map +1 -0
- package/dist/components/Message/File/File.d.ts +9 -0
- package/dist/components/Message/File/File.d.ts.map +1 -0
- package/dist/components/Message/File/index.d.ts +3 -0
- package/dist/components/Message/File/index.d.ts.map +1 -0
- package/dist/components/Message/Gif/Gif.d.ts +9 -0
- package/dist/components/Message/Gif/Gif.d.ts.map +1 -0
- package/dist/components/Message/Gif/index.d.ts +3 -0
- package/dist/components/Message/Gif/index.d.ts.map +1 -0
- package/dist/components/Message/Image/Image.d.ts +15 -0
- package/dist/components/Message/Image/Image.d.ts.map +1 -0
- package/dist/components/Message/Image/index.d.ts +3 -0
- package/dist/components/Message/Image/index.d.ts.map +1 -0
- package/dist/components/Message/Location/Location.d.ts +9 -0
- package/dist/components/Message/Location/Location.d.ts.map +1 -0
- package/dist/components/Message/Location/index.d.ts +3 -0
- package/dist/components/Message/Location/index.d.ts.map +1 -0
- package/dist/components/Message/Message.d.ts +34 -0
- package/dist/components/Message/Message.d.ts.map +1 -0
- package/dist/components/Message/MessageContext.d.ts +32 -0
- package/dist/components/Message/MessageContext.d.ts.map +1 -0
- package/dist/components/Message/Poll/Poll.d.ts +9 -0
- package/dist/components/Message/Poll/Poll.d.ts.map +1 -0
- package/dist/components/Message/Poll/index.d.ts +3 -0
- package/dist/components/Message/Poll/index.d.ts.map +1 -0
- package/dist/components/Message/StatusIcon.d.ts +12 -0
- package/dist/components/Message/StatusIcon.d.ts.map +1 -0
- package/dist/components/Message/Sticker/Sticker.d.ts +13 -0
- package/dist/components/Message/Sticker/Sticker.d.ts.map +1 -0
- package/dist/components/Message/Sticker/index.d.ts +3 -0
- package/dist/components/Message/Sticker/index.d.ts.map +1 -0
- package/dist/components/Message/Text/Text.d.ts +11 -0
- package/dist/components/Message/Text/Text.d.ts.map +1 -0
- package/dist/components/Message/Text/index.d.ts +3 -0
- package/dist/components/Message/Text/index.d.ts.map +1 -0
- package/dist/components/Message/Video/Video.d.ts +9 -0
- package/dist/components/Message/Video/Video.d.ts.map +1 -0
- package/dist/components/Message/Video/index.d.ts +3 -0
- package/dist/components/Message/Video/index.d.ts.map +1 -0
- package/dist/components/Message/Voice/Voice.d.ts +13 -0
- package/dist/components/Message/Voice/Voice.d.ts.map +1 -0
- package/dist/components/Message/Voice/Waveform.d.ts +18 -0
- package/dist/components/Message/Voice/Waveform.d.ts.map +1 -0
- package/dist/components/Message/Voice/index.d.ts +3 -0
- package/dist/components/Message/Voice/index.d.ts.map +1 -0
- package/dist/components/Message/index.d.ts +31 -0
- package/dist/components/Message/index.d.ts.map +1 -0
- package/dist/components/Message/index.parts.d.ts +33 -0
- package/dist/components/Message/index.parts.d.ts.map +1 -0
- package/dist/components/Reply/Reply.d.ts +14 -0
- package/dist/components/Reply/Reply.d.ts.map +1 -0
- package/dist/components/Reply/index.d.ts +3 -0
- package/dist/components/Reply/index.d.ts.map +1 -0
- package/dist/hooks/useAudioPlayer.d.ts +26 -0
- package/dist/hooks/useAudioPlayer.d.ts.map +1 -0
- package/dist/hooks/useMessages.d.ts +13 -0
- package/dist/hooks/useMessages.d.ts.map +1 -0
- package/dist/hooks/useReply.d.ts +22 -0
- package/dist/hooks/useReply.d.ts.map +1 -0
- package/dist/icons/AttachIcon.d.ts +7 -0
- package/dist/icons/AttachIcon.d.ts.map +1 -0
- package/dist/icons/AudioFileIcon.d.ts +8 -0
- package/dist/icons/AudioFileIcon.d.ts.map +1 -0
- package/dist/icons/AvatarPlaceholderIcon.d.ts +7 -0
- package/dist/icons/AvatarPlaceholderIcon.d.ts.map +1 -0
- package/dist/icons/BubbleTailIcon.d.ts +4 -0
- package/dist/icons/BubbleTailIcon.d.ts.map +1 -0
- package/dist/icons/MicFillIcon.d.ts +7 -0
- package/dist/icons/MicFillIcon.d.ts.map +1 -0
- package/dist/icons/MicOutlineIcon.d.ts +7 -0
- package/dist/icons/MicOutlineIcon.d.ts.map +1 -0
- package/dist/icons/PauseIcon.d.ts +7 -0
- package/dist/icons/PauseIcon.d.ts.map +1 -0
- package/dist/icons/PlayIcon.d.ts +7 -0
- package/dist/icons/PlayIcon.d.ts.map +1 -0
- package/dist/icons/SendIcon.d.ts +7 -0
- package/dist/icons/SendIcon.d.ts.map +1 -0
- package/dist/icons/StatusDoubleCheckIcon.d.ts +7 -0
- package/dist/icons/StatusDoubleCheckIcon.d.ts.map +1 -0
- package/dist/icons/StatusSendingIcon.d.ts +7 -0
- package/dist/icons/StatusSendingIcon.d.ts.map +1 -0
- package/dist/icons/StatusSentIcon.d.ts +7 -0
- package/dist/icons/StatusSentIcon.d.ts.map +1 -0
- package/dist/icons/StickerIcon.d.ts +7 -0
- package/dist/icons/StickerIcon.d.ts.map +1 -0
- package/dist/icons/index.d.ts +14 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/index.cjs +4316 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4315 -0
- package/dist/index.js.map +1 -0
- package/dist/tailwind.css +49 -0
- package/dist/utils/audio.d.ts +14 -0
- package/dist/utils/audio.d.ts.map +1 -0
- package/dist/utils/cn.d.ts +4 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/color.d.ts +3 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/date.d.ts +5 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/extractText.d.ts +7 -0
- package/dist/utils/extractText.d.ts.map +1 -0
- package/dist/utils/groupMessages.d.ts +24 -0
- package/dist/utils/groupMessages.d.ts.map +1 -0
- package/dist/utils/message.d.ts +5 -0
- package/dist/utils/message.d.ts.map +1 -0
- package/dist/utils/string.d.ts +3 -0
- package/dist/utils/string.d.ts.map +1 -0
- package/dist/utils/time.d.ts +8 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/package.json +96 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,4315 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React, { useRef, useState, useEffect, useCallback } from "react";
|
|
3
|
+
function AttachIcon({ className }) {
|
|
4
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx(
|
|
5
|
+
"path",
|
|
6
|
+
{
|
|
7
|
+
d: "M11 13H5.5C4.94772 13 4.5 12.5523 4.5 12C4.5 11.4477 4.94772 11 5.5 11H11V5.5C11 4.94772 11.4477 4.5 12 4.5C12.5523 4.5 13 4.94772 13 5.5V11H18.5C19.0523 11 19.5 11.4477 19.5 12C19.5 12.5523 19.0523 13 18.5 13H13V18.5C13 19.0523 12.5523 19.5 12 19.5C11.4477 19.5 11 19.0523 11 18.5V13Z",
|
|
8
|
+
fill: "currentColor"
|
|
9
|
+
}
|
|
10
|
+
) });
|
|
11
|
+
}
|
|
12
|
+
function AudioFileIcon({ className, title }) {
|
|
13
|
+
return /* @__PURE__ */ jsxs(
|
|
14
|
+
"svg",
|
|
15
|
+
{
|
|
16
|
+
viewBox: "0 0 55 55",
|
|
17
|
+
height: "40",
|
|
18
|
+
width: "40",
|
|
19
|
+
preserveAspectRatio: "xMidYMid meet",
|
|
20
|
+
"aria-hidden": "true",
|
|
21
|
+
className,
|
|
22
|
+
children: [
|
|
23
|
+
title && /* @__PURE__ */ jsx("title", { children: title }),
|
|
24
|
+
/* @__PURE__ */ jsx("path", { fill: "#FFAD1F", d: "M0,0h55v55H0V0z" }),
|
|
25
|
+
/* @__PURE__ */ jsx(
|
|
26
|
+
"path",
|
|
27
|
+
{
|
|
28
|
+
fill: "#FFFFFF",
|
|
29
|
+
d: "M27.5,16c-5.6,0-10,4.4-10,10v7.8c0,1.9,1.4,3.3,3.3,3.3h3.3v-8.9h-4.4V26\n c0-4.3,3.4-7.8,7.8-7.8s7.8,3.4,7.8,7.8v2.2h-4.4v8.9h3.3c1.9,0,3.3-1.4,3.3-3.3V26\n C37.5,20.4,33.1,16,27.5,16z"
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
function AvatarPlaceholderIcon({ className }) {
|
|
37
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx("path", { d: "M12 12c2.7 0 4.8-2.1 4.8-4.8S14.7 2.4 12 2.4 7.2 4.5 7.2 7.2 9.3 12 12 12zm0 2.4c-3.2 0-9.6 1.6-9.6 4.8V21h19.2v-1.8c0-3.2-6.4-4.8-9.6-4.8z" }) });
|
|
38
|
+
}
|
|
39
|
+
function BubbleTailIcon() {
|
|
40
|
+
return /* @__PURE__ */ jsxs(
|
|
41
|
+
"svg",
|
|
42
|
+
{
|
|
43
|
+
viewBox: "0 0 8 13",
|
|
44
|
+
height: "13",
|
|
45
|
+
width: "8",
|
|
46
|
+
preserveAspectRatio: "xMidYMid meet",
|
|
47
|
+
"aria-hidden": "true",
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsx("path", { opacity: "0.13", d: "M5.188,1H0v11.193l6.467-8.625C7.526,2.156,6.958,1,5.188,1z" }),
|
|
50
|
+
/* @__PURE__ */ jsx("path", { fill: "currentColor", d: "M5.188,0H0v11.193l6.467-8.625C7.526,1.156,6.958,0,5.188,0z" })
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
function MicFillIcon({ className }) {
|
|
56
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx(
|
|
57
|
+
"path",
|
|
58
|
+
{
|
|
59
|
+
d: "M12 14a2.9 2.9 0 0 1-2.125-.875A2.9 2.9 0 0 1 9 11V5q0-1.25.875-2.125A2.9 2.9 0 0 1 12 2q1.25 0 2.125.875T15 5v6q0 1.25-.875 2.125A2.9 2.9 0 0 1 12 14m0 7a1 1 0 0 1-1-1v-2.075q-2.6-.35-4.3-2.325-1.37-1.59-1.636-3.603C4.992 11.45 5.448 11 6 11s.988.452 1.09.995q.274 1.443 1.373 2.543Q9.926 16 12 16q2.075 0 3.537-1.463 1.099-1.098 1.373-2.543c.102-.542.538-.994 1.09-.994s1.008.45.936.997Q18.669 14.01 17.3 15.6q-1.7 1.975-4.3 2.325V20a1 1 0 0 1-1 1",
|
|
60
|
+
fill: "currentColor"
|
|
61
|
+
}
|
|
62
|
+
) });
|
|
63
|
+
}
|
|
64
|
+
function MicOutlineIcon({ className }) {
|
|
65
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx(
|
|
66
|
+
"path",
|
|
67
|
+
{
|
|
68
|
+
d: "M12 14C11.1667 14 10.4583 13.7083 9.875 13.125C9.29167 12.5417 9 11.8333 9 11V5C9 4.16667 9.29167 3.45833 9.875 2.875C10.4583 2.29167 11.1667 2 12 2C12.8333 2 13.5417 2.29167 14.125 2.875C14.7083 3.45833 15 4.16667 15 5V11C15 11.8333 14.7083 12.5417 14.125 13.125C13.5417 13.7083 12.8333 14 12 14ZM12 21C11.4477 21 11 20.5523 11 20V17.925C9.26667 17.6917 7.83333 16.9167 6.7 15.6C5.78727 14.5396 5.24207 13.3387 5.06441 11.9973C4.9919 11.4498 5.44772 11 6 11C6.55228 11 6.98782 11.4518 7.0905 11.9945C7.27271 12.9574 7.73004 13.805 8.4625 14.5375C9.4375 15.5125 10.6167 16 12 16C13.3833 16 14.5625 15.5125 15.5375 14.5375C16.27 13.805 16.7273 12.9574 16.9095 11.9945C17.0122 11.4518 17.4477 11 18 11C18.5523 11 19.0081 11.4498 18.9356 11.9973C18.7579 13.3387 18.2127 14.5396 17.3 15.6C16.1667 16.9167 14.7333 17.6917 13 17.925V20C13 20.5523 12.5523 21 12 21ZM12 12C12.2833 12 12.5208 11.9042 12.7125 11.7125C12.9042 11.5208 13 11.2833 13 11V5C13 4.71667 12.9042 4.47917 12.7125 4.2875C12.5208 4.09583 12.2833 4 12 4C11.7167 4 11.4792 4.09583 11.2875 4.2875C11.0958 4.47917 11 4.71667 11 5V11C11 11.2833 11.0958 11.5208 11.2875 11.7125C11.4792 11.9042 11.7167 12 12 12Z",
|
|
69
|
+
fill: "currentColor"
|
|
70
|
+
}
|
|
71
|
+
) });
|
|
72
|
+
}
|
|
73
|
+
function PauseIcon({ className }) {
|
|
74
|
+
return /* @__PURE__ */ jsx(
|
|
75
|
+
"svg",
|
|
76
|
+
{
|
|
77
|
+
viewBox: "0 0 34 34",
|
|
78
|
+
height: "24",
|
|
79
|
+
width: "24",
|
|
80
|
+
preserveAspectRatio: "xMidYMid meet",
|
|
81
|
+
fill: "currentColor",
|
|
82
|
+
"aria-hidden": "true",
|
|
83
|
+
className,
|
|
84
|
+
children: /* @__PURE__ */ jsx("path", { d: "M9.2,25c0,0.5,0.4,1,0.9,1h3.6c0.5,0,0.9-0.4,0.9-1V9c0-0.5-0.4-0.9-0.9-0.9h-3.6C9.7,8,9.2,8.4,9.2,9V25z M20.2,8c-0.5,0-1,0.4-1,0.9V25c0,0.5,0.4,1,1,1h3.6c0.5,0,1-0.4,1-1V9c0-0.5-0.4-0.9-1-0.9C23.8,8,20.2,8,20.2,8z" })
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
function PlayIcon({ className }) {
|
|
89
|
+
return /* @__PURE__ */ jsx(
|
|
90
|
+
"svg",
|
|
91
|
+
{
|
|
92
|
+
viewBox: "0 0 34 34",
|
|
93
|
+
height: "24",
|
|
94
|
+
width: "24",
|
|
95
|
+
preserveAspectRatio: "xMidYMid meet",
|
|
96
|
+
fill: "currentColor",
|
|
97
|
+
"aria-hidden": "true",
|
|
98
|
+
className,
|
|
99
|
+
children: /* @__PURE__ */ jsx("path", { d: "M8.5,8.7c0-1.7,1.2-2.4,2.6-1.5l14.4,8.3c1.4,0.8,1.4,2.2,0,3l-14.4,8.3c-1.4,0.8-2.6,0.2-2.6-1.5V8.7z" })
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
function SendIcon({ className }) {
|
|
104
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx("path", { d: "M3.4 20.5l17.8-8.5a.5.5 0 000-.9L3.4 2.5a.5.5 0 00-.7.6l2.2 7.1c.1.2.2.4.5.4h7.4a.75.75 0 010 1.5H5.4a.5.5 0 00-.5.4l-2.2 7.1a.5.5 0 00.7.6z" }) });
|
|
105
|
+
}
|
|
106
|
+
function StatusDoubleCheckIcon({ className }) {
|
|
107
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 16 11", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx(
|
|
108
|
+
"path",
|
|
109
|
+
{
|
|
110
|
+
d: "M11.0714 0.652832C10.991 0.585124 10.8894 0.55127 10.7667 0.55127C10.6186 0.55127 10.4916 0.610514 10.3858 0.729004L4.19688 8.36523L1.79112 6.09277C1.7488 6.04622 1.69802 6.01025 1.63877 5.98486C1.57953 5.95947 1.51817 5.94678 1.45469 5.94678C1.32351 5.94678 1.20925 5.99544 1.11192 6.09277L0.800883 6.40381C0.707784 6.49268 0.661235 6.60482 0.661235 6.74023C0.661235 6.87565 0.707784 6.98991 0.800883 7.08301L3.79698 10.0791C3.94509 10.2145 4.11224 10.2822 4.29844 10.2822C4.40424 10.2822 4.5058 10.259 4.60313 10.2124C4.70046 10.1659 4.78086 10.1003 4.84434 10.0156L11.4903 1.59863C11.5623 1.5013 11.5982 1.40186 11.5982 1.30029C11.5982 1.14372 11.5348 1.01888 11.4078 0.925781L11.0714 0.652832ZM8.6212 8.32715C8.43077 8.20866 8.2488 8.09017 8.0753 7.97168C7.99489 7.89128 7.8891 7.85107 7.75791 7.85107C7.6098 7.85107 7.4892 7.90397 7.3961 8.00977L7.10411 8.33984C7.01947 8.43717 6.97715 8.54508 6.97715 8.66357C6.97715 8.79476 7.0237 8.90902 7.1168 9.00635L8.1959 10.0791C8.33132 10.2145 8.49636 10.2822 8.69102 10.2822C8.79681 10.2822 8.89838 10.259 8.99571 10.2124C9.09304 10.1659 9.17556 10.1003 9.24327 10.0156L15.8639 1.62402C15.9358 1.53939 15.9718 1.43994 15.9718 1.32568C15.9718 1.1818 15.9125 1.05697 15.794 0.951172L15.4386 0.678223C15.3582 0.610514 15.2587 0.57666 15.1402 0.57666C14.9964 0.57666 14.8715 0.635905 14.7657 0.754395L8.6212 8.32715Z",
|
|
111
|
+
fill: "currentColor"
|
|
112
|
+
}
|
|
113
|
+
) });
|
|
114
|
+
}
|
|
115
|
+
function StatusSendingIcon({ className }) {
|
|
116
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx("circle", { cx: "6", cy: "6", r: "5", stroke: "currentColor", strokeWidth: "1.5" }) });
|
|
117
|
+
}
|
|
118
|
+
function StatusSentIcon({ className }) {
|
|
119
|
+
return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 16 11", fill: "none", "aria-hidden": "true", className, children: /* @__PURE__ */ jsx(
|
|
120
|
+
"path",
|
|
121
|
+
{
|
|
122
|
+
d: "M11.0714 0.652832C10.991 0.585124 10.8894 0.55127 10.7667 0.55127C10.6186 0.55127 10.4916 0.610514 10.3858 0.729004L4.19688 8.36523L1.79112 6.09277C1.7488 6.04622 1.69802 6.01025 1.63877 5.98486C1.57953 5.95947 1.51817 5.94678 1.45469 5.94678C1.32351 5.94678 1.20925 5.99544 1.11192 6.09277L0.800883 6.40381C0.707784 6.49268 0.661235 6.60482 0.661235 6.74023C0.661235 6.87565 0.707784 6.98991 0.800883 7.08301L3.79698 10.0791C3.94509 10.2145 4.11224 10.2822 4.29844 10.2822C4.40424 10.2822 4.5058 10.259 4.60313 10.2124C4.70046 10.1659 4.78086 10.1003 4.84434 10.0156L11.4903 1.59863C11.5623 1.5013 11.5982 1.40186 11.5982 1.30029C11.5982 1.14372 11.5348 1.01888 11.4078 0.925781L11.0714 0.652832Z",
|
|
123
|
+
fill: "currentColor"
|
|
124
|
+
}
|
|
125
|
+
) });
|
|
126
|
+
}
|
|
127
|
+
function StickerIcon({ className }) {
|
|
128
|
+
return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", className, children: [
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
"path",
|
|
131
|
+
{
|
|
132
|
+
d: "M8.49893 10.2521C9.32736 10.2521 9.99893 9.5805 9.99893 8.75208C9.99893 7.92365 9.32736 7.25208 8.49893 7.25208C7.6705 7.25208 6.99893 7.92365 6.99893 8.75208C6.99893 9.5805 7.6705 10.2521 8.49893 10.2521Z",
|
|
133
|
+
fill: "currentColor"
|
|
134
|
+
}
|
|
135
|
+
),
|
|
136
|
+
/* @__PURE__ */ jsx(
|
|
137
|
+
"path",
|
|
138
|
+
{
|
|
139
|
+
d: "M17.0011 8.75208C17.0011 9.5805 16.3295 10.2521 15.5011 10.2521C14.6726 10.2521 14.0011 9.5805 14.0011 8.75208C14.0011 7.92365 14.6726 7.25208 15.5011 7.25208C16.3295 7.25208 17.0011 7.92365 17.0011 8.75208Z",
|
|
140
|
+
fill: "currentColor"
|
|
141
|
+
}
|
|
142
|
+
),
|
|
143
|
+
/* @__PURE__ */ jsx(
|
|
144
|
+
"path",
|
|
145
|
+
{
|
|
146
|
+
fillRule: "evenodd",
|
|
147
|
+
clipRule: "evenodd",
|
|
148
|
+
d: "M16.8221 19.9799C15.5379 21.2537 13.8087 21.9781 12 22H9.27273C5.25611 22 2 18.7439 2 14.7273V9.27273C2 5.25611 5.25611 2 9.27273 2H14.7273C18.7439 2 22 5.25611 22 9.27273V11.8141C22 13.7532 21.2256 15.612 19.8489 16.9776L16.8221 19.9799ZM14.7273 4H9.27273C6.36068 4 4 6.36068 4 9.27273V14.7273C4 17.6393 6.36068 20 9.27273 20H11.3331C11.722 19.8971 12.0081 19.5417 12.0058 19.1204L11.9935 16.8564C11.9933 16.8201 11.9935 16.784 11.9941 16.7479C11.0454 16.7473 10.159 16.514 9.33502 16.0479C8.51002 15.5812 7.84752 14.9479 7.34752 14.1479C7.24752 13.9479 7.25585 13.7479 7.37252 13.5479C7.48919 13.3479 7.66419 13.2479 7.89752 13.2479L13.5939 13.2479C14.4494 12.481 15.5811 12.016 16.8216 12.0208L19.0806 12.0296C19.5817 12.0315 19.9889 11.6259 19.9889 11.1248V9.07648H19.9964C19.8932 6.25535 17.5736 4 14.7273 4ZM14.0057 19.1095C14.0066 19.2605 13.9959 19.4089 13.9744 19.5537C14.5044 19.3124 14.9926 18.9776 15.4136 18.5599L18.4405 15.5576C18.8989 15.1029 19.2653 14.5726 19.5274 13.996C19.3793 14.0187 19.2275 14.0301 19.0729 14.0295L16.8138 14.0208C15.252 14.0147 13.985 15.2837 13.9935 16.8455L14.0057 19.1095Z",
|
|
149
|
+
fill: "currentColor"
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
] });
|
|
153
|
+
}
|
|
154
|
+
function r(e) {
|
|
155
|
+
var t, f, n = "";
|
|
156
|
+
if ("string" == typeof e || "number" == typeof e) n += e;
|
|
157
|
+
else if ("object" == typeof e) if (Array.isArray(e)) {
|
|
158
|
+
var o = e.length;
|
|
159
|
+
for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
|
|
160
|
+
} else for (f in e) e[f] && (n && (n += " "), n += f);
|
|
161
|
+
return n;
|
|
162
|
+
}
|
|
163
|
+
function clsx() {
|
|
164
|
+
for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
|
|
165
|
+
return n;
|
|
166
|
+
}
|
|
167
|
+
const concatArrays = (array1, array2) => {
|
|
168
|
+
const combinedArray = new Array(array1.length + array2.length);
|
|
169
|
+
for (let i = 0; i < array1.length; i++) {
|
|
170
|
+
combinedArray[i] = array1[i];
|
|
171
|
+
}
|
|
172
|
+
for (let i = 0; i < array2.length; i++) {
|
|
173
|
+
combinedArray[array1.length + i] = array2[i];
|
|
174
|
+
}
|
|
175
|
+
return combinedArray;
|
|
176
|
+
};
|
|
177
|
+
const createClassValidatorObject = (classGroupId, validator) => ({
|
|
178
|
+
classGroupId,
|
|
179
|
+
validator
|
|
180
|
+
});
|
|
181
|
+
const createClassPartObject = (nextPart = /* @__PURE__ */ new Map(), validators = null, classGroupId) => ({
|
|
182
|
+
nextPart,
|
|
183
|
+
validators,
|
|
184
|
+
classGroupId
|
|
185
|
+
});
|
|
186
|
+
const CLASS_PART_SEPARATOR = "-";
|
|
187
|
+
const EMPTY_CONFLICTS = [];
|
|
188
|
+
const ARBITRARY_PROPERTY_PREFIX = "arbitrary..";
|
|
189
|
+
const createClassGroupUtils = (config) => {
|
|
190
|
+
const classMap = createClassMap(config);
|
|
191
|
+
const {
|
|
192
|
+
conflictingClassGroups,
|
|
193
|
+
conflictingClassGroupModifiers
|
|
194
|
+
} = config;
|
|
195
|
+
const getClassGroupId = (className) => {
|
|
196
|
+
if (className.startsWith("[") && className.endsWith("]")) {
|
|
197
|
+
return getGroupIdForArbitraryProperty(className);
|
|
198
|
+
}
|
|
199
|
+
const classParts = className.split(CLASS_PART_SEPARATOR);
|
|
200
|
+
const startIndex = classParts[0] === "" && classParts.length > 1 ? 1 : 0;
|
|
201
|
+
return getGroupRecursive(classParts, startIndex, classMap);
|
|
202
|
+
};
|
|
203
|
+
const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
|
|
204
|
+
if (hasPostfixModifier) {
|
|
205
|
+
const modifierConflicts = conflictingClassGroupModifiers[classGroupId];
|
|
206
|
+
const baseConflicts = conflictingClassGroups[classGroupId];
|
|
207
|
+
if (modifierConflicts) {
|
|
208
|
+
if (baseConflicts) {
|
|
209
|
+
return concatArrays(baseConflicts, modifierConflicts);
|
|
210
|
+
}
|
|
211
|
+
return modifierConflicts;
|
|
212
|
+
}
|
|
213
|
+
return baseConflicts || EMPTY_CONFLICTS;
|
|
214
|
+
}
|
|
215
|
+
return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;
|
|
216
|
+
};
|
|
217
|
+
return {
|
|
218
|
+
getClassGroupId,
|
|
219
|
+
getConflictingClassGroupIds
|
|
220
|
+
};
|
|
221
|
+
};
|
|
222
|
+
const getGroupRecursive = (classParts, startIndex, classPartObject) => {
|
|
223
|
+
const classPathsLength = classParts.length - startIndex;
|
|
224
|
+
if (classPathsLength === 0) {
|
|
225
|
+
return classPartObject.classGroupId;
|
|
226
|
+
}
|
|
227
|
+
const currentClassPart = classParts[startIndex];
|
|
228
|
+
const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
|
|
229
|
+
if (nextClassPartObject) {
|
|
230
|
+
const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);
|
|
231
|
+
if (result) return result;
|
|
232
|
+
}
|
|
233
|
+
const validators = classPartObject.validators;
|
|
234
|
+
if (validators === null) {
|
|
235
|
+
return void 0;
|
|
236
|
+
}
|
|
237
|
+
const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);
|
|
238
|
+
const validatorsLength = validators.length;
|
|
239
|
+
for (let i = 0; i < validatorsLength; i++) {
|
|
240
|
+
const validatorObj = validators[i];
|
|
241
|
+
if (validatorObj.validator(classRest)) {
|
|
242
|
+
return validatorObj.classGroupId;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return void 0;
|
|
246
|
+
};
|
|
247
|
+
const getGroupIdForArbitraryProperty = (className) => className.slice(1, -1).indexOf(":") === -1 ? void 0 : (() => {
|
|
248
|
+
const content = className.slice(1, -1);
|
|
249
|
+
const colonIndex = content.indexOf(":");
|
|
250
|
+
const property = content.slice(0, colonIndex);
|
|
251
|
+
return property ? ARBITRARY_PROPERTY_PREFIX + property : void 0;
|
|
252
|
+
})();
|
|
253
|
+
const createClassMap = (config) => {
|
|
254
|
+
const {
|
|
255
|
+
theme,
|
|
256
|
+
classGroups
|
|
257
|
+
} = config;
|
|
258
|
+
return processClassGroups(classGroups, theme);
|
|
259
|
+
};
|
|
260
|
+
const processClassGroups = (classGroups, theme) => {
|
|
261
|
+
const classMap = createClassPartObject();
|
|
262
|
+
for (const classGroupId in classGroups) {
|
|
263
|
+
const group = classGroups[classGroupId];
|
|
264
|
+
processClassesRecursively(group, classMap, classGroupId, theme);
|
|
265
|
+
}
|
|
266
|
+
return classMap;
|
|
267
|
+
};
|
|
268
|
+
const processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
|
|
269
|
+
const len = classGroup.length;
|
|
270
|
+
for (let i = 0; i < len; i++) {
|
|
271
|
+
const classDefinition = classGroup[i];
|
|
272
|
+
processClassDefinition(classDefinition, classPartObject, classGroupId, theme);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
const processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
|
|
276
|
+
if (typeof classDefinition === "string") {
|
|
277
|
+
processStringDefinition(classDefinition, classPartObject, classGroupId);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (typeof classDefinition === "function") {
|
|
281
|
+
processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);
|
|
285
|
+
};
|
|
286
|
+
const processStringDefinition = (classDefinition, classPartObject, classGroupId) => {
|
|
287
|
+
const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition);
|
|
288
|
+
classPartObjectToEdit.classGroupId = classGroupId;
|
|
289
|
+
};
|
|
290
|
+
const processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
|
|
291
|
+
if (isThemeGetter(classDefinition)) {
|
|
292
|
+
processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
if (classPartObject.validators === null) {
|
|
296
|
+
classPartObject.validators = [];
|
|
297
|
+
}
|
|
298
|
+
classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));
|
|
299
|
+
};
|
|
300
|
+
const processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
|
|
301
|
+
const entries = Object.entries(classDefinition);
|
|
302
|
+
const len = entries.length;
|
|
303
|
+
for (let i = 0; i < len; i++) {
|
|
304
|
+
const [key, value] = entries[i];
|
|
305
|
+
processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
const getPart = (classPartObject, path) => {
|
|
309
|
+
let current = classPartObject;
|
|
310
|
+
const parts = path.split(CLASS_PART_SEPARATOR);
|
|
311
|
+
const len = parts.length;
|
|
312
|
+
for (let i = 0; i < len; i++) {
|
|
313
|
+
const part = parts[i];
|
|
314
|
+
let next = current.nextPart.get(part);
|
|
315
|
+
if (!next) {
|
|
316
|
+
next = createClassPartObject();
|
|
317
|
+
current.nextPart.set(part, next);
|
|
318
|
+
}
|
|
319
|
+
current = next;
|
|
320
|
+
}
|
|
321
|
+
return current;
|
|
322
|
+
};
|
|
323
|
+
const isThemeGetter = (func) => "isThemeGetter" in func && func.isThemeGetter === true;
|
|
324
|
+
const createLruCache = (maxCacheSize) => {
|
|
325
|
+
if (maxCacheSize < 1) {
|
|
326
|
+
return {
|
|
327
|
+
get: () => void 0,
|
|
328
|
+
set: () => {
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
let cacheSize = 0;
|
|
333
|
+
let cache = /* @__PURE__ */ Object.create(null);
|
|
334
|
+
let previousCache = /* @__PURE__ */ Object.create(null);
|
|
335
|
+
const update = (key, value) => {
|
|
336
|
+
cache[key] = value;
|
|
337
|
+
cacheSize++;
|
|
338
|
+
if (cacheSize > maxCacheSize) {
|
|
339
|
+
cacheSize = 0;
|
|
340
|
+
previousCache = cache;
|
|
341
|
+
cache = /* @__PURE__ */ Object.create(null);
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
return {
|
|
345
|
+
get(key) {
|
|
346
|
+
let value = cache[key];
|
|
347
|
+
if (value !== void 0) {
|
|
348
|
+
return value;
|
|
349
|
+
}
|
|
350
|
+
if ((value = previousCache[key]) !== void 0) {
|
|
351
|
+
update(key, value);
|
|
352
|
+
return value;
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
set(key, value) {
|
|
356
|
+
if (key in cache) {
|
|
357
|
+
cache[key] = value;
|
|
358
|
+
} else {
|
|
359
|
+
update(key, value);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
};
|
|
364
|
+
const IMPORTANT_MODIFIER = "!";
|
|
365
|
+
const MODIFIER_SEPARATOR = ":";
|
|
366
|
+
const EMPTY_MODIFIERS = [];
|
|
367
|
+
const createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({
|
|
368
|
+
modifiers,
|
|
369
|
+
hasImportantModifier,
|
|
370
|
+
baseClassName,
|
|
371
|
+
maybePostfixModifierPosition,
|
|
372
|
+
isExternal
|
|
373
|
+
});
|
|
374
|
+
const createParseClassName = (config) => {
|
|
375
|
+
const {
|
|
376
|
+
prefix,
|
|
377
|
+
experimentalParseClassName
|
|
378
|
+
} = config;
|
|
379
|
+
let parseClassName = (className) => {
|
|
380
|
+
const modifiers = [];
|
|
381
|
+
let bracketDepth = 0;
|
|
382
|
+
let parenDepth = 0;
|
|
383
|
+
let modifierStart = 0;
|
|
384
|
+
let postfixModifierPosition;
|
|
385
|
+
const len = className.length;
|
|
386
|
+
for (let index = 0; index < len; index++) {
|
|
387
|
+
const currentCharacter = className[index];
|
|
388
|
+
if (bracketDepth === 0 && parenDepth === 0) {
|
|
389
|
+
if (currentCharacter === MODIFIER_SEPARATOR) {
|
|
390
|
+
modifiers.push(className.slice(modifierStart, index));
|
|
391
|
+
modifierStart = index + 1;
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
if (currentCharacter === "/") {
|
|
395
|
+
postfixModifierPosition = index;
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (currentCharacter === "[") bracketDepth++;
|
|
400
|
+
else if (currentCharacter === "]") bracketDepth--;
|
|
401
|
+
else if (currentCharacter === "(") parenDepth++;
|
|
402
|
+
else if (currentCharacter === ")") parenDepth--;
|
|
403
|
+
}
|
|
404
|
+
const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);
|
|
405
|
+
let baseClassName = baseClassNameWithImportantModifier;
|
|
406
|
+
let hasImportantModifier = false;
|
|
407
|
+
if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {
|
|
408
|
+
baseClassName = baseClassNameWithImportantModifier.slice(0, -1);
|
|
409
|
+
hasImportantModifier = true;
|
|
410
|
+
} else if (
|
|
411
|
+
/**
|
|
412
|
+
* In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.
|
|
413
|
+
* @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864
|
|
414
|
+
*/
|
|
415
|
+
baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)
|
|
416
|
+
) {
|
|
417
|
+
baseClassName = baseClassNameWithImportantModifier.slice(1);
|
|
418
|
+
hasImportantModifier = true;
|
|
419
|
+
}
|
|
420
|
+
const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0;
|
|
421
|
+
return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);
|
|
422
|
+
};
|
|
423
|
+
if (prefix) {
|
|
424
|
+
const fullPrefix = prefix + MODIFIER_SEPARATOR;
|
|
425
|
+
const parseClassNameOriginal = parseClassName;
|
|
426
|
+
parseClassName = (className) => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, void 0, true);
|
|
427
|
+
}
|
|
428
|
+
if (experimentalParseClassName) {
|
|
429
|
+
const parseClassNameOriginal = parseClassName;
|
|
430
|
+
parseClassName = (className) => experimentalParseClassName({
|
|
431
|
+
className,
|
|
432
|
+
parseClassName: parseClassNameOriginal
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
return parseClassName;
|
|
436
|
+
};
|
|
437
|
+
const createSortModifiers = (config) => {
|
|
438
|
+
const modifierWeights = /* @__PURE__ */ new Map();
|
|
439
|
+
config.orderSensitiveModifiers.forEach((mod, index) => {
|
|
440
|
+
modifierWeights.set(mod, 1e6 + index);
|
|
441
|
+
});
|
|
442
|
+
return (modifiers) => {
|
|
443
|
+
const result = [];
|
|
444
|
+
let currentSegment = [];
|
|
445
|
+
for (let i = 0; i < modifiers.length; i++) {
|
|
446
|
+
const modifier = modifiers[i];
|
|
447
|
+
const isArbitrary = modifier[0] === "[";
|
|
448
|
+
const isOrderSensitive = modifierWeights.has(modifier);
|
|
449
|
+
if (isArbitrary || isOrderSensitive) {
|
|
450
|
+
if (currentSegment.length > 0) {
|
|
451
|
+
currentSegment.sort();
|
|
452
|
+
result.push(...currentSegment);
|
|
453
|
+
currentSegment = [];
|
|
454
|
+
}
|
|
455
|
+
result.push(modifier);
|
|
456
|
+
} else {
|
|
457
|
+
currentSegment.push(modifier);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
if (currentSegment.length > 0) {
|
|
461
|
+
currentSegment.sort();
|
|
462
|
+
result.push(...currentSegment);
|
|
463
|
+
}
|
|
464
|
+
return result;
|
|
465
|
+
};
|
|
466
|
+
};
|
|
467
|
+
const createConfigUtils = (config) => ({
|
|
468
|
+
cache: createLruCache(config.cacheSize),
|
|
469
|
+
parseClassName: createParseClassName(config),
|
|
470
|
+
sortModifiers: createSortModifiers(config),
|
|
471
|
+
...createClassGroupUtils(config)
|
|
472
|
+
});
|
|
473
|
+
const SPLIT_CLASSES_REGEX = /\s+/;
|
|
474
|
+
const mergeClassList = (classList, configUtils) => {
|
|
475
|
+
const {
|
|
476
|
+
parseClassName,
|
|
477
|
+
getClassGroupId,
|
|
478
|
+
getConflictingClassGroupIds,
|
|
479
|
+
sortModifiers
|
|
480
|
+
} = configUtils;
|
|
481
|
+
const classGroupsInConflict = [];
|
|
482
|
+
const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
|
|
483
|
+
let result = "";
|
|
484
|
+
for (let index = classNames.length - 1; index >= 0; index -= 1) {
|
|
485
|
+
const originalClassName = classNames[index];
|
|
486
|
+
const {
|
|
487
|
+
isExternal,
|
|
488
|
+
modifiers,
|
|
489
|
+
hasImportantModifier,
|
|
490
|
+
baseClassName,
|
|
491
|
+
maybePostfixModifierPosition
|
|
492
|
+
} = parseClassName(originalClassName);
|
|
493
|
+
if (isExternal) {
|
|
494
|
+
result = originalClassName + (result.length > 0 ? " " + result : result);
|
|
495
|
+
continue;
|
|
496
|
+
}
|
|
497
|
+
let hasPostfixModifier = !!maybePostfixModifierPosition;
|
|
498
|
+
let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);
|
|
499
|
+
if (!classGroupId) {
|
|
500
|
+
if (!hasPostfixModifier) {
|
|
501
|
+
result = originalClassName + (result.length > 0 ? " " + result : result);
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
504
|
+
classGroupId = getClassGroupId(baseClassName);
|
|
505
|
+
if (!classGroupId) {
|
|
506
|
+
result = originalClassName + (result.length > 0 ? " " + result : result);
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
hasPostfixModifier = false;
|
|
510
|
+
}
|
|
511
|
+
const variantModifier = modifiers.length === 0 ? "" : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(":");
|
|
512
|
+
const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
|
|
513
|
+
const classId = modifierId + classGroupId;
|
|
514
|
+
if (classGroupsInConflict.indexOf(classId) > -1) {
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
classGroupsInConflict.push(classId);
|
|
518
|
+
const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
|
|
519
|
+
for (let i = 0; i < conflictGroups.length; ++i) {
|
|
520
|
+
const group = conflictGroups[i];
|
|
521
|
+
classGroupsInConflict.push(modifierId + group);
|
|
522
|
+
}
|
|
523
|
+
result = originalClassName + (result.length > 0 ? " " + result : result);
|
|
524
|
+
}
|
|
525
|
+
return result;
|
|
526
|
+
};
|
|
527
|
+
const twJoin = (...classLists) => {
|
|
528
|
+
let index = 0;
|
|
529
|
+
let argument;
|
|
530
|
+
let resolvedValue;
|
|
531
|
+
let string = "";
|
|
532
|
+
while (index < classLists.length) {
|
|
533
|
+
if (argument = classLists[index++]) {
|
|
534
|
+
if (resolvedValue = toValue(argument)) {
|
|
535
|
+
string && (string += " ");
|
|
536
|
+
string += resolvedValue;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
return string;
|
|
541
|
+
};
|
|
542
|
+
const toValue = (mix) => {
|
|
543
|
+
if (typeof mix === "string") {
|
|
544
|
+
return mix;
|
|
545
|
+
}
|
|
546
|
+
let resolvedValue;
|
|
547
|
+
let string = "";
|
|
548
|
+
for (let k = 0; k < mix.length; k++) {
|
|
549
|
+
if (mix[k]) {
|
|
550
|
+
if (resolvedValue = toValue(mix[k])) {
|
|
551
|
+
string && (string += " ");
|
|
552
|
+
string += resolvedValue;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
return string;
|
|
557
|
+
};
|
|
558
|
+
const createTailwindMerge = (createConfigFirst, ...createConfigRest) => {
|
|
559
|
+
let configUtils;
|
|
560
|
+
let cacheGet;
|
|
561
|
+
let cacheSet;
|
|
562
|
+
let functionToCall;
|
|
563
|
+
const initTailwindMerge = (classList) => {
|
|
564
|
+
const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
|
|
565
|
+
configUtils = createConfigUtils(config);
|
|
566
|
+
cacheGet = configUtils.cache.get;
|
|
567
|
+
cacheSet = configUtils.cache.set;
|
|
568
|
+
functionToCall = tailwindMerge;
|
|
569
|
+
return tailwindMerge(classList);
|
|
570
|
+
};
|
|
571
|
+
const tailwindMerge = (classList) => {
|
|
572
|
+
const cachedResult = cacheGet(classList);
|
|
573
|
+
if (cachedResult) {
|
|
574
|
+
return cachedResult;
|
|
575
|
+
}
|
|
576
|
+
const result = mergeClassList(classList, configUtils);
|
|
577
|
+
cacheSet(classList, result);
|
|
578
|
+
return result;
|
|
579
|
+
};
|
|
580
|
+
functionToCall = initTailwindMerge;
|
|
581
|
+
return (...args) => functionToCall(twJoin(...args));
|
|
582
|
+
};
|
|
583
|
+
const fallbackThemeArr = [];
|
|
584
|
+
const fromTheme = (key) => {
|
|
585
|
+
const themeGetter = (theme) => theme[key] || fallbackThemeArr;
|
|
586
|
+
themeGetter.isThemeGetter = true;
|
|
587
|
+
return themeGetter;
|
|
588
|
+
};
|
|
589
|
+
const arbitraryValueRegex = /^\[(?:(\w[\w-]*):)?(.+)\]$/i;
|
|
590
|
+
const arbitraryVariableRegex = /^\((?:(\w[\w-]*):)?(.+)\)$/i;
|
|
591
|
+
const fractionRegex = /^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/;
|
|
592
|
+
const tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
|
|
593
|
+
const lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/;
|
|
594
|
+
const colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/;
|
|
595
|
+
const shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
|
|
596
|
+
const imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
|
|
597
|
+
const isFraction = (value) => fractionRegex.test(value);
|
|
598
|
+
const isNumber = (value) => !!value && !Number.isNaN(Number(value));
|
|
599
|
+
const isInteger = (value) => !!value && Number.isInteger(Number(value));
|
|
600
|
+
const isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1));
|
|
601
|
+
const isTshirtSize = (value) => tshirtUnitRegex.test(value);
|
|
602
|
+
const isAny = () => true;
|
|
603
|
+
const isLengthOnly = (value) => (
|
|
604
|
+
// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.
|
|
605
|
+
// For example, `hsl(0 0% 0%)` would be classified as a length without this check.
|
|
606
|
+
// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.
|
|
607
|
+
lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)
|
|
608
|
+
);
|
|
609
|
+
const isNever = () => false;
|
|
610
|
+
const isShadow = (value) => shadowRegex.test(value);
|
|
611
|
+
const isImage = (value) => imageRegex.test(value);
|
|
612
|
+
const isAnyNonArbitrary = (value) => !isArbitraryValue(value) && !isArbitraryVariable(value);
|
|
613
|
+
const isArbitrarySize = (value) => getIsArbitraryValue(value, isLabelSize, isNever);
|
|
614
|
+
const isArbitraryValue = (value) => arbitraryValueRegex.test(value);
|
|
615
|
+
const isArbitraryLength = (value) => getIsArbitraryValue(value, isLabelLength, isLengthOnly);
|
|
616
|
+
const isArbitraryNumber = (value) => getIsArbitraryValue(value, isLabelNumber, isNumber);
|
|
617
|
+
const isArbitraryWeight = (value) => getIsArbitraryValue(value, isLabelWeight, isAny);
|
|
618
|
+
const isArbitraryFamilyName = (value) => getIsArbitraryValue(value, isLabelFamilyName, isNever);
|
|
619
|
+
const isArbitraryPosition = (value) => getIsArbitraryValue(value, isLabelPosition, isNever);
|
|
620
|
+
const isArbitraryImage = (value) => getIsArbitraryValue(value, isLabelImage, isImage);
|
|
621
|
+
const isArbitraryShadow = (value) => getIsArbitraryValue(value, isLabelShadow, isShadow);
|
|
622
|
+
const isArbitraryVariable = (value) => arbitraryVariableRegex.test(value);
|
|
623
|
+
const isArbitraryVariableLength = (value) => getIsArbitraryVariable(value, isLabelLength);
|
|
624
|
+
const isArbitraryVariableFamilyName = (value) => getIsArbitraryVariable(value, isLabelFamilyName);
|
|
625
|
+
const isArbitraryVariablePosition = (value) => getIsArbitraryVariable(value, isLabelPosition);
|
|
626
|
+
const isArbitraryVariableSize = (value) => getIsArbitraryVariable(value, isLabelSize);
|
|
627
|
+
const isArbitraryVariableImage = (value) => getIsArbitraryVariable(value, isLabelImage);
|
|
628
|
+
const isArbitraryVariableShadow = (value) => getIsArbitraryVariable(value, isLabelShadow, true);
|
|
629
|
+
const isArbitraryVariableWeight = (value) => getIsArbitraryVariable(value, isLabelWeight, true);
|
|
630
|
+
const getIsArbitraryValue = (value, testLabel, testValue) => {
|
|
631
|
+
const result = arbitraryValueRegex.exec(value);
|
|
632
|
+
if (result) {
|
|
633
|
+
if (result[1]) {
|
|
634
|
+
return testLabel(result[1]);
|
|
635
|
+
}
|
|
636
|
+
return testValue(result[2]);
|
|
637
|
+
}
|
|
638
|
+
return false;
|
|
639
|
+
};
|
|
640
|
+
const getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {
|
|
641
|
+
const result = arbitraryVariableRegex.exec(value);
|
|
642
|
+
if (result) {
|
|
643
|
+
if (result[1]) {
|
|
644
|
+
return testLabel(result[1]);
|
|
645
|
+
}
|
|
646
|
+
return shouldMatchNoLabel;
|
|
647
|
+
}
|
|
648
|
+
return false;
|
|
649
|
+
};
|
|
650
|
+
const isLabelPosition = (label) => label === "position" || label === "percentage";
|
|
651
|
+
const isLabelImage = (label) => label === "image" || label === "url";
|
|
652
|
+
const isLabelSize = (label) => label === "length" || label === "size" || label === "bg-size";
|
|
653
|
+
const isLabelLength = (label) => label === "length";
|
|
654
|
+
const isLabelNumber = (label) => label === "number";
|
|
655
|
+
const isLabelFamilyName = (label) => label === "family-name";
|
|
656
|
+
const isLabelWeight = (label) => label === "number" || label === "weight";
|
|
657
|
+
const isLabelShadow = (label) => label === "shadow";
|
|
658
|
+
const getDefaultConfig = () => {
|
|
659
|
+
const themeColor = fromTheme("color");
|
|
660
|
+
const themeFont = fromTheme("font");
|
|
661
|
+
const themeText = fromTheme("text");
|
|
662
|
+
const themeFontWeight = fromTheme("font-weight");
|
|
663
|
+
const themeTracking = fromTheme("tracking");
|
|
664
|
+
const themeLeading = fromTheme("leading");
|
|
665
|
+
const themeBreakpoint = fromTheme("breakpoint");
|
|
666
|
+
const themeContainer = fromTheme("container");
|
|
667
|
+
const themeSpacing = fromTheme("spacing");
|
|
668
|
+
const themeRadius = fromTheme("radius");
|
|
669
|
+
const themeShadow = fromTheme("shadow");
|
|
670
|
+
const themeInsetShadow = fromTheme("inset-shadow");
|
|
671
|
+
const themeTextShadow = fromTheme("text-shadow");
|
|
672
|
+
const themeDropShadow = fromTheme("drop-shadow");
|
|
673
|
+
const themeBlur = fromTheme("blur");
|
|
674
|
+
const themePerspective = fromTheme("perspective");
|
|
675
|
+
const themeAspect = fromTheme("aspect");
|
|
676
|
+
const themeEase = fromTheme("ease");
|
|
677
|
+
const themeAnimate = fromTheme("animate");
|
|
678
|
+
const scaleBreak = () => ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"];
|
|
679
|
+
const scalePosition = () => [
|
|
680
|
+
"center",
|
|
681
|
+
"top",
|
|
682
|
+
"bottom",
|
|
683
|
+
"left",
|
|
684
|
+
"right",
|
|
685
|
+
"top-left",
|
|
686
|
+
// Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
|
|
687
|
+
"left-top",
|
|
688
|
+
"top-right",
|
|
689
|
+
// Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
|
|
690
|
+
"right-top",
|
|
691
|
+
"bottom-right",
|
|
692
|
+
// Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
|
|
693
|
+
"right-bottom",
|
|
694
|
+
"bottom-left",
|
|
695
|
+
// Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
|
|
696
|
+
"left-bottom"
|
|
697
|
+
];
|
|
698
|
+
const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];
|
|
699
|
+
const scaleOverflow = () => ["auto", "hidden", "clip", "visible", "scroll"];
|
|
700
|
+
const scaleOverscroll = () => ["auto", "contain", "none"];
|
|
701
|
+
const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];
|
|
702
|
+
const scaleInset = () => [isFraction, "full", "auto", ...scaleUnambiguousSpacing()];
|
|
703
|
+
const scaleGridTemplateColsRows = () => [isInteger, "none", "subgrid", isArbitraryVariable, isArbitraryValue];
|
|
704
|
+
const scaleGridColRowStartAndEnd = () => ["auto", {
|
|
705
|
+
span: ["full", isInteger, isArbitraryVariable, isArbitraryValue]
|
|
706
|
+
}, isInteger, isArbitraryVariable, isArbitraryValue];
|
|
707
|
+
const scaleGridColRowStartOrEnd = () => [isInteger, "auto", isArbitraryVariable, isArbitraryValue];
|
|
708
|
+
const scaleGridAutoColsRows = () => ["auto", "min", "max", "fr", isArbitraryVariable, isArbitraryValue];
|
|
709
|
+
const scaleAlignPrimaryAxis = () => ["start", "end", "center", "between", "around", "evenly", "stretch", "baseline", "center-safe", "end-safe"];
|
|
710
|
+
const scaleAlignSecondaryAxis = () => ["start", "end", "center", "stretch", "center-safe", "end-safe"];
|
|
711
|
+
const scaleMargin = () => ["auto", ...scaleUnambiguousSpacing()];
|
|
712
|
+
const scaleSizing = () => [isFraction, "auto", "full", "dvw", "dvh", "lvw", "lvh", "svw", "svh", "min", "max", "fit", ...scaleUnambiguousSpacing()];
|
|
713
|
+
const scaleSizingInline = () => [isFraction, "screen", "full", "dvw", "lvw", "svw", "min", "max", "fit", ...scaleUnambiguousSpacing()];
|
|
714
|
+
const scaleSizingBlock = () => [isFraction, "screen", "full", "lh", "dvh", "lvh", "svh", "min", "max", "fit", ...scaleUnambiguousSpacing()];
|
|
715
|
+
const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];
|
|
716
|
+
const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {
|
|
717
|
+
position: [isArbitraryVariable, isArbitraryValue]
|
|
718
|
+
}];
|
|
719
|
+
const scaleBgRepeat = () => ["no-repeat", {
|
|
720
|
+
repeat: ["", "x", "y", "space", "round"]
|
|
721
|
+
}];
|
|
722
|
+
const scaleBgSize = () => ["auto", "cover", "contain", isArbitraryVariableSize, isArbitrarySize, {
|
|
723
|
+
size: [isArbitraryVariable, isArbitraryValue]
|
|
724
|
+
}];
|
|
725
|
+
const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];
|
|
726
|
+
const scaleRadius = () => [
|
|
727
|
+
// Deprecated since Tailwind CSS v4.0.0
|
|
728
|
+
"",
|
|
729
|
+
"none",
|
|
730
|
+
"full",
|
|
731
|
+
themeRadius,
|
|
732
|
+
isArbitraryVariable,
|
|
733
|
+
isArbitraryValue
|
|
734
|
+
];
|
|
735
|
+
const scaleBorderWidth = () => ["", isNumber, isArbitraryVariableLength, isArbitraryLength];
|
|
736
|
+
const scaleLineStyle = () => ["solid", "dashed", "dotted", "double"];
|
|
737
|
+
const scaleBlendMode = () => ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
|
|
738
|
+
const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];
|
|
739
|
+
const scaleBlur = () => [
|
|
740
|
+
// Deprecated since Tailwind CSS v4.0.0
|
|
741
|
+
"",
|
|
742
|
+
"none",
|
|
743
|
+
themeBlur,
|
|
744
|
+
isArbitraryVariable,
|
|
745
|
+
isArbitraryValue
|
|
746
|
+
];
|
|
747
|
+
const scaleRotate = () => ["none", isNumber, isArbitraryVariable, isArbitraryValue];
|
|
748
|
+
const scaleScale = () => ["none", isNumber, isArbitraryVariable, isArbitraryValue];
|
|
749
|
+
const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];
|
|
750
|
+
const scaleTranslate = () => [isFraction, "full", ...scaleUnambiguousSpacing()];
|
|
751
|
+
return {
|
|
752
|
+
cacheSize: 500,
|
|
753
|
+
theme: {
|
|
754
|
+
animate: ["spin", "ping", "pulse", "bounce"],
|
|
755
|
+
aspect: ["video"],
|
|
756
|
+
blur: [isTshirtSize],
|
|
757
|
+
breakpoint: [isTshirtSize],
|
|
758
|
+
color: [isAny],
|
|
759
|
+
container: [isTshirtSize],
|
|
760
|
+
"drop-shadow": [isTshirtSize],
|
|
761
|
+
ease: ["in", "out", "in-out"],
|
|
762
|
+
font: [isAnyNonArbitrary],
|
|
763
|
+
"font-weight": ["thin", "extralight", "light", "normal", "medium", "semibold", "bold", "extrabold", "black"],
|
|
764
|
+
"inset-shadow": [isTshirtSize],
|
|
765
|
+
leading: ["none", "tight", "snug", "normal", "relaxed", "loose"],
|
|
766
|
+
perspective: ["dramatic", "near", "normal", "midrange", "distant", "none"],
|
|
767
|
+
radius: [isTshirtSize],
|
|
768
|
+
shadow: [isTshirtSize],
|
|
769
|
+
spacing: ["px", isNumber],
|
|
770
|
+
text: [isTshirtSize],
|
|
771
|
+
"text-shadow": [isTshirtSize],
|
|
772
|
+
tracking: ["tighter", "tight", "normal", "wide", "wider", "widest"]
|
|
773
|
+
},
|
|
774
|
+
classGroups: {
|
|
775
|
+
// --------------
|
|
776
|
+
// --- Layout ---
|
|
777
|
+
// --------------
|
|
778
|
+
/**
|
|
779
|
+
* Aspect Ratio
|
|
780
|
+
* @see https://tailwindcss.com/docs/aspect-ratio
|
|
781
|
+
*/
|
|
782
|
+
aspect: [{
|
|
783
|
+
aspect: ["auto", "square", isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]
|
|
784
|
+
}],
|
|
785
|
+
/**
|
|
786
|
+
* Container
|
|
787
|
+
* @see https://tailwindcss.com/docs/container
|
|
788
|
+
* @deprecated since Tailwind CSS v4.0.0
|
|
789
|
+
*/
|
|
790
|
+
container: ["container"],
|
|
791
|
+
/**
|
|
792
|
+
* Columns
|
|
793
|
+
* @see https://tailwindcss.com/docs/columns
|
|
794
|
+
*/
|
|
795
|
+
columns: [{
|
|
796
|
+
columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]
|
|
797
|
+
}],
|
|
798
|
+
/**
|
|
799
|
+
* Break After
|
|
800
|
+
* @see https://tailwindcss.com/docs/break-after
|
|
801
|
+
*/
|
|
802
|
+
"break-after": [{
|
|
803
|
+
"break-after": scaleBreak()
|
|
804
|
+
}],
|
|
805
|
+
/**
|
|
806
|
+
* Break Before
|
|
807
|
+
* @see https://tailwindcss.com/docs/break-before
|
|
808
|
+
*/
|
|
809
|
+
"break-before": [{
|
|
810
|
+
"break-before": scaleBreak()
|
|
811
|
+
}],
|
|
812
|
+
/**
|
|
813
|
+
* Break Inside
|
|
814
|
+
* @see https://tailwindcss.com/docs/break-inside
|
|
815
|
+
*/
|
|
816
|
+
"break-inside": [{
|
|
817
|
+
"break-inside": ["auto", "avoid", "avoid-page", "avoid-column"]
|
|
818
|
+
}],
|
|
819
|
+
/**
|
|
820
|
+
* Box Decoration Break
|
|
821
|
+
* @see https://tailwindcss.com/docs/box-decoration-break
|
|
822
|
+
*/
|
|
823
|
+
"box-decoration": [{
|
|
824
|
+
"box-decoration": ["slice", "clone"]
|
|
825
|
+
}],
|
|
826
|
+
/**
|
|
827
|
+
* Box Sizing
|
|
828
|
+
* @see https://tailwindcss.com/docs/box-sizing
|
|
829
|
+
*/
|
|
830
|
+
box: [{
|
|
831
|
+
box: ["border", "content"]
|
|
832
|
+
}],
|
|
833
|
+
/**
|
|
834
|
+
* Display
|
|
835
|
+
* @see https://tailwindcss.com/docs/display
|
|
836
|
+
*/
|
|
837
|
+
display: ["block", "inline-block", "inline", "flex", "inline-flex", "table", "inline-table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row-group", "table-row", "flow-root", "grid", "inline-grid", "contents", "list-item", "hidden"],
|
|
838
|
+
/**
|
|
839
|
+
* Screen Reader Only
|
|
840
|
+
* @see https://tailwindcss.com/docs/display#screen-reader-only
|
|
841
|
+
*/
|
|
842
|
+
sr: ["sr-only", "not-sr-only"],
|
|
843
|
+
/**
|
|
844
|
+
* Floats
|
|
845
|
+
* @see https://tailwindcss.com/docs/float
|
|
846
|
+
*/
|
|
847
|
+
float: [{
|
|
848
|
+
float: ["right", "left", "none", "start", "end"]
|
|
849
|
+
}],
|
|
850
|
+
/**
|
|
851
|
+
* Clear
|
|
852
|
+
* @see https://tailwindcss.com/docs/clear
|
|
853
|
+
*/
|
|
854
|
+
clear: [{
|
|
855
|
+
clear: ["left", "right", "both", "none", "start", "end"]
|
|
856
|
+
}],
|
|
857
|
+
/**
|
|
858
|
+
* Isolation
|
|
859
|
+
* @see https://tailwindcss.com/docs/isolation
|
|
860
|
+
*/
|
|
861
|
+
isolation: ["isolate", "isolation-auto"],
|
|
862
|
+
/**
|
|
863
|
+
* Object Fit
|
|
864
|
+
* @see https://tailwindcss.com/docs/object-fit
|
|
865
|
+
*/
|
|
866
|
+
"object-fit": [{
|
|
867
|
+
object: ["contain", "cover", "fill", "none", "scale-down"]
|
|
868
|
+
}],
|
|
869
|
+
/**
|
|
870
|
+
* Object Position
|
|
871
|
+
* @see https://tailwindcss.com/docs/object-position
|
|
872
|
+
*/
|
|
873
|
+
"object-position": [{
|
|
874
|
+
object: scalePositionWithArbitrary()
|
|
875
|
+
}],
|
|
876
|
+
/**
|
|
877
|
+
* Overflow
|
|
878
|
+
* @see https://tailwindcss.com/docs/overflow
|
|
879
|
+
*/
|
|
880
|
+
overflow: [{
|
|
881
|
+
overflow: scaleOverflow()
|
|
882
|
+
}],
|
|
883
|
+
/**
|
|
884
|
+
* Overflow X
|
|
885
|
+
* @see https://tailwindcss.com/docs/overflow
|
|
886
|
+
*/
|
|
887
|
+
"overflow-x": [{
|
|
888
|
+
"overflow-x": scaleOverflow()
|
|
889
|
+
}],
|
|
890
|
+
/**
|
|
891
|
+
* Overflow Y
|
|
892
|
+
* @see https://tailwindcss.com/docs/overflow
|
|
893
|
+
*/
|
|
894
|
+
"overflow-y": [{
|
|
895
|
+
"overflow-y": scaleOverflow()
|
|
896
|
+
}],
|
|
897
|
+
/**
|
|
898
|
+
* Overscroll Behavior
|
|
899
|
+
* @see https://tailwindcss.com/docs/overscroll-behavior
|
|
900
|
+
*/
|
|
901
|
+
overscroll: [{
|
|
902
|
+
overscroll: scaleOverscroll()
|
|
903
|
+
}],
|
|
904
|
+
/**
|
|
905
|
+
* Overscroll Behavior X
|
|
906
|
+
* @see https://tailwindcss.com/docs/overscroll-behavior
|
|
907
|
+
*/
|
|
908
|
+
"overscroll-x": [{
|
|
909
|
+
"overscroll-x": scaleOverscroll()
|
|
910
|
+
}],
|
|
911
|
+
/**
|
|
912
|
+
* Overscroll Behavior Y
|
|
913
|
+
* @see https://tailwindcss.com/docs/overscroll-behavior
|
|
914
|
+
*/
|
|
915
|
+
"overscroll-y": [{
|
|
916
|
+
"overscroll-y": scaleOverscroll()
|
|
917
|
+
}],
|
|
918
|
+
/**
|
|
919
|
+
* Position
|
|
920
|
+
* @see https://tailwindcss.com/docs/position
|
|
921
|
+
*/
|
|
922
|
+
position: ["static", "fixed", "absolute", "relative", "sticky"],
|
|
923
|
+
/**
|
|
924
|
+
* Inset
|
|
925
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
926
|
+
*/
|
|
927
|
+
inset: [{
|
|
928
|
+
inset: scaleInset()
|
|
929
|
+
}],
|
|
930
|
+
/**
|
|
931
|
+
* Inset Inline
|
|
932
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
933
|
+
*/
|
|
934
|
+
"inset-x": [{
|
|
935
|
+
"inset-x": scaleInset()
|
|
936
|
+
}],
|
|
937
|
+
/**
|
|
938
|
+
* Inset Block
|
|
939
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
940
|
+
*/
|
|
941
|
+
"inset-y": [{
|
|
942
|
+
"inset-y": scaleInset()
|
|
943
|
+
}],
|
|
944
|
+
/**
|
|
945
|
+
* Inset Inline Start
|
|
946
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
947
|
+
* @todo class group will be renamed to `inset-s` in next major release
|
|
948
|
+
*/
|
|
949
|
+
start: [{
|
|
950
|
+
"inset-s": scaleInset(),
|
|
951
|
+
/**
|
|
952
|
+
* @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.
|
|
953
|
+
* @see https://github.com/tailwindlabs/tailwindcss/pull/19613
|
|
954
|
+
*/
|
|
955
|
+
start: scaleInset()
|
|
956
|
+
}],
|
|
957
|
+
/**
|
|
958
|
+
* Inset Inline End
|
|
959
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
960
|
+
* @todo class group will be renamed to `inset-e` in next major release
|
|
961
|
+
*/
|
|
962
|
+
end: [{
|
|
963
|
+
"inset-e": scaleInset(),
|
|
964
|
+
/**
|
|
965
|
+
* @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.
|
|
966
|
+
* @see https://github.com/tailwindlabs/tailwindcss/pull/19613
|
|
967
|
+
*/
|
|
968
|
+
end: scaleInset()
|
|
969
|
+
}],
|
|
970
|
+
/**
|
|
971
|
+
* Inset Block Start
|
|
972
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
973
|
+
*/
|
|
974
|
+
"inset-bs": [{
|
|
975
|
+
"inset-bs": scaleInset()
|
|
976
|
+
}],
|
|
977
|
+
/**
|
|
978
|
+
* Inset Block End
|
|
979
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
980
|
+
*/
|
|
981
|
+
"inset-be": [{
|
|
982
|
+
"inset-be": scaleInset()
|
|
983
|
+
}],
|
|
984
|
+
/**
|
|
985
|
+
* Top
|
|
986
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
987
|
+
*/
|
|
988
|
+
top: [{
|
|
989
|
+
top: scaleInset()
|
|
990
|
+
}],
|
|
991
|
+
/**
|
|
992
|
+
* Right
|
|
993
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
994
|
+
*/
|
|
995
|
+
right: [{
|
|
996
|
+
right: scaleInset()
|
|
997
|
+
}],
|
|
998
|
+
/**
|
|
999
|
+
* Bottom
|
|
1000
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
1001
|
+
*/
|
|
1002
|
+
bottom: [{
|
|
1003
|
+
bottom: scaleInset()
|
|
1004
|
+
}],
|
|
1005
|
+
/**
|
|
1006
|
+
* Left
|
|
1007
|
+
* @see https://tailwindcss.com/docs/top-right-bottom-left
|
|
1008
|
+
*/
|
|
1009
|
+
left: [{
|
|
1010
|
+
left: scaleInset()
|
|
1011
|
+
}],
|
|
1012
|
+
/**
|
|
1013
|
+
* Visibility
|
|
1014
|
+
* @see https://tailwindcss.com/docs/visibility
|
|
1015
|
+
*/
|
|
1016
|
+
visibility: ["visible", "invisible", "collapse"],
|
|
1017
|
+
/**
|
|
1018
|
+
* Z-Index
|
|
1019
|
+
* @see https://tailwindcss.com/docs/z-index
|
|
1020
|
+
*/
|
|
1021
|
+
z: [{
|
|
1022
|
+
z: [isInteger, "auto", isArbitraryVariable, isArbitraryValue]
|
|
1023
|
+
}],
|
|
1024
|
+
// ------------------------
|
|
1025
|
+
// --- Flexbox and Grid ---
|
|
1026
|
+
// ------------------------
|
|
1027
|
+
/**
|
|
1028
|
+
* Flex Basis
|
|
1029
|
+
* @see https://tailwindcss.com/docs/flex-basis
|
|
1030
|
+
*/
|
|
1031
|
+
basis: [{
|
|
1032
|
+
basis: [isFraction, "full", "auto", themeContainer, ...scaleUnambiguousSpacing()]
|
|
1033
|
+
}],
|
|
1034
|
+
/**
|
|
1035
|
+
* Flex Direction
|
|
1036
|
+
* @see https://tailwindcss.com/docs/flex-direction
|
|
1037
|
+
*/
|
|
1038
|
+
"flex-direction": [{
|
|
1039
|
+
flex: ["row", "row-reverse", "col", "col-reverse"]
|
|
1040
|
+
}],
|
|
1041
|
+
/**
|
|
1042
|
+
* Flex Wrap
|
|
1043
|
+
* @see https://tailwindcss.com/docs/flex-wrap
|
|
1044
|
+
*/
|
|
1045
|
+
"flex-wrap": [{
|
|
1046
|
+
flex: ["nowrap", "wrap", "wrap-reverse"]
|
|
1047
|
+
}],
|
|
1048
|
+
/**
|
|
1049
|
+
* Flex
|
|
1050
|
+
* @see https://tailwindcss.com/docs/flex
|
|
1051
|
+
*/
|
|
1052
|
+
flex: [{
|
|
1053
|
+
flex: [isNumber, isFraction, "auto", "initial", "none", isArbitraryValue]
|
|
1054
|
+
}],
|
|
1055
|
+
/**
|
|
1056
|
+
* Flex Grow
|
|
1057
|
+
* @see https://tailwindcss.com/docs/flex-grow
|
|
1058
|
+
*/
|
|
1059
|
+
grow: [{
|
|
1060
|
+
grow: ["", isNumber, isArbitraryVariable, isArbitraryValue]
|
|
1061
|
+
}],
|
|
1062
|
+
/**
|
|
1063
|
+
* Flex Shrink
|
|
1064
|
+
* @see https://tailwindcss.com/docs/flex-shrink
|
|
1065
|
+
*/
|
|
1066
|
+
shrink: [{
|
|
1067
|
+
shrink: ["", isNumber, isArbitraryVariable, isArbitraryValue]
|
|
1068
|
+
}],
|
|
1069
|
+
/**
|
|
1070
|
+
* Order
|
|
1071
|
+
* @see https://tailwindcss.com/docs/order
|
|
1072
|
+
*/
|
|
1073
|
+
order: [{
|
|
1074
|
+
order: [isInteger, "first", "last", "none", isArbitraryVariable, isArbitraryValue]
|
|
1075
|
+
}],
|
|
1076
|
+
/**
|
|
1077
|
+
* Grid Template Columns
|
|
1078
|
+
* @see https://tailwindcss.com/docs/grid-template-columns
|
|
1079
|
+
*/
|
|
1080
|
+
"grid-cols": [{
|
|
1081
|
+
"grid-cols": scaleGridTemplateColsRows()
|
|
1082
|
+
}],
|
|
1083
|
+
/**
|
|
1084
|
+
* Grid Column Start / End
|
|
1085
|
+
* @see https://tailwindcss.com/docs/grid-column
|
|
1086
|
+
*/
|
|
1087
|
+
"col-start-end": [{
|
|
1088
|
+
col: scaleGridColRowStartAndEnd()
|
|
1089
|
+
}],
|
|
1090
|
+
/**
|
|
1091
|
+
* Grid Column Start
|
|
1092
|
+
* @see https://tailwindcss.com/docs/grid-column
|
|
1093
|
+
*/
|
|
1094
|
+
"col-start": [{
|
|
1095
|
+
"col-start": scaleGridColRowStartOrEnd()
|
|
1096
|
+
}],
|
|
1097
|
+
/**
|
|
1098
|
+
* Grid Column End
|
|
1099
|
+
* @see https://tailwindcss.com/docs/grid-column
|
|
1100
|
+
*/
|
|
1101
|
+
"col-end": [{
|
|
1102
|
+
"col-end": scaleGridColRowStartOrEnd()
|
|
1103
|
+
}],
|
|
1104
|
+
/**
|
|
1105
|
+
* Grid Template Rows
|
|
1106
|
+
* @see https://tailwindcss.com/docs/grid-template-rows
|
|
1107
|
+
*/
|
|
1108
|
+
"grid-rows": [{
|
|
1109
|
+
"grid-rows": scaleGridTemplateColsRows()
|
|
1110
|
+
}],
|
|
1111
|
+
/**
|
|
1112
|
+
* Grid Row Start / End
|
|
1113
|
+
* @see https://tailwindcss.com/docs/grid-row
|
|
1114
|
+
*/
|
|
1115
|
+
"row-start-end": [{
|
|
1116
|
+
row: scaleGridColRowStartAndEnd()
|
|
1117
|
+
}],
|
|
1118
|
+
/**
|
|
1119
|
+
* Grid Row Start
|
|
1120
|
+
* @see https://tailwindcss.com/docs/grid-row
|
|
1121
|
+
*/
|
|
1122
|
+
"row-start": [{
|
|
1123
|
+
"row-start": scaleGridColRowStartOrEnd()
|
|
1124
|
+
}],
|
|
1125
|
+
/**
|
|
1126
|
+
* Grid Row End
|
|
1127
|
+
* @see https://tailwindcss.com/docs/grid-row
|
|
1128
|
+
*/
|
|
1129
|
+
"row-end": [{
|
|
1130
|
+
"row-end": scaleGridColRowStartOrEnd()
|
|
1131
|
+
}],
|
|
1132
|
+
/**
|
|
1133
|
+
* Grid Auto Flow
|
|
1134
|
+
* @see https://tailwindcss.com/docs/grid-auto-flow
|
|
1135
|
+
*/
|
|
1136
|
+
"grid-flow": [{
|
|
1137
|
+
"grid-flow": ["row", "col", "dense", "row-dense", "col-dense"]
|
|
1138
|
+
}],
|
|
1139
|
+
/**
|
|
1140
|
+
* Grid Auto Columns
|
|
1141
|
+
* @see https://tailwindcss.com/docs/grid-auto-columns
|
|
1142
|
+
*/
|
|
1143
|
+
"auto-cols": [{
|
|
1144
|
+
"auto-cols": scaleGridAutoColsRows()
|
|
1145
|
+
}],
|
|
1146
|
+
/**
|
|
1147
|
+
* Grid Auto Rows
|
|
1148
|
+
* @see https://tailwindcss.com/docs/grid-auto-rows
|
|
1149
|
+
*/
|
|
1150
|
+
"auto-rows": [{
|
|
1151
|
+
"auto-rows": scaleGridAutoColsRows()
|
|
1152
|
+
}],
|
|
1153
|
+
/**
|
|
1154
|
+
* Gap
|
|
1155
|
+
* @see https://tailwindcss.com/docs/gap
|
|
1156
|
+
*/
|
|
1157
|
+
gap: [{
|
|
1158
|
+
gap: scaleUnambiguousSpacing()
|
|
1159
|
+
}],
|
|
1160
|
+
/**
|
|
1161
|
+
* Gap X
|
|
1162
|
+
* @see https://tailwindcss.com/docs/gap
|
|
1163
|
+
*/
|
|
1164
|
+
"gap-x": [{
|
|
1165
|
+
"gap-x": scaleUnambiguousSpacing()
|
|
1166
|
+
}],
|
|
1167
|
+
/**
|
|
1168
|
+
* Gap Y
|
|
1169
|
+
* @see https://tailwindcss.com/docs/gap
|
|
1170
|
+
*/
|
|
1171
|
+
"gap-y": [{
|
|
1172
|
+
"gap-y": scaleUnambiguousSpacing()
|
|
1173
|
+
}],
|
|
1174
|
+
/**
|
|
1175
|
+
* Justify Content
|
|
1176
|
+
* @see https://tailwindcss.com/docs/justify-content
|
|
1177
|
+
*/
|
|
1178
|
+
"justify-content": [{
|
|
1179
|
+
justify: [...scaleAlignPrimaryAxis(), "normal"]
|
|
1180
|
+
}],
|
|
1181
|
+
/**
|
|
1182
|
+
* Justify Items
|
|
1183
|
+
* @see https://tailwindcss.com/docs/justify-items
|
|
1184
|
+
*/
|
|
1185
|
+
"justify-items": [{
|
|
1186
|
+
"justify-items": [...scaleAlignSecondaryAxis(), "normal"]
|
|
1187
|
+
}],
|
|
1188
|
+
/**
|
|
1189
|
+
* Justify Self
|
|
1190
|
+
* @see https://tailwindcss.com/docs/justify-self
|
|
1191
|
+
*/
|
|
1192
|
+
"justify-self": [{
|
|
1193
|
+
"justify-self": ["auto", ...scaleAlignSecondaryAxis()]
|
|
1194
|
+
}],
|
|
1195
|
+
/**
|
|
1196
|
+
* Align Content
|
|
1197
|
+
* @see https://tailwindcss.com/docs/align-content
|
|
1198
|
+
*/
|
|
1199
|
+
"align-content": [{
|
|
1200
|
+
content: ["normal", ...scaleAlignPrimaryAxis()]
|
|
1201
|
+
}],
|
|
1202
|
+
/**
|
|
1203
|
+
* Align Items
|
|
1204
|
+
* @see https://tailwindcss.com/docs/align-items
|
|
1205
|
+
*/
|
|
1206
|
+
"align-items": [{
|
|
1207
|
+
items: [...scaleAlignSecondaryAxis(), {
|
|
1208
|
+
baseline: ["", "last"]
|
|
1209
|
+
}]
|
|
1210
|
+
}],
|
|
1211
|
+
/**
|
|
1212
|
+
* Align Self
|
|
1213
|
+
* @see https://tailwindcss.com/docs/align-self
|
|
1214
|
+
*/
|
|
1215
|
+
"align-self": [{
|
|
1216
|
+
self: ["auto", ...scaleAlignSecondaryAxis(), {
|
|
1217
|
+
baseline: ["", "last"]
|
|
1218
|
+
}]
|
|
1219
|
+
}],
|
|
1220
|
+
/**
|
|
1221
|
+
* Place Content
|
|
1222
|
+
* @see https://tailwindcss.com/docs/place-content
|
|
1223
|
+
*/
|
|
1224
|
+
"place-content": [{
|
|
1225
|
+
"place-content": scaleAlignPrimaryAxis()
|
|
1226
|
+
}],
|
|
1227
|
+
/**
|
|
1228
|
+
* Place Items
|
|
1229
|
+
* @see https://tailwindcss.com/docs/place-items
|
|
1230
|
+
*/
|
|
1231
|
+
"place-items": [{
|
|
1232
|
+
"place-items": [...scaleAlignSecondaryAxis(), "baseline"]
|
|
1233
|
+
}],
|
|
1234
|
+
/**
|
|
1235
|
+
* Place Self
|
|
1236
|
+
* @see https://tailwindcss.com/docs/place-self
|
|
1237
|
+
*/
|
|
1238
|
+
"place-self": [{
|
|
1239
|
+
"place-self": ["auto", ...scaleAlignSecondaryAxis()]
|
|
1240
|
+
}],
|
|
1241
|
+
// Spacing
|
|
1242
|
+
/**
|
|
1243
|
+
* Padding
|
|
1244
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1245
|
+
*/
|
|
1246
|
+
p: [{
|
|
1247
|
+
p: scaleUnambiguousSpacing()
|
|
1248
|
+
}],
|
|
1249
|
+
/**
|
|
1250
|
+
* Padding Inline
|
|
1251
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1252
|
+
*/
|
|
1253
|
+
px: [{
|
|
1254
|
+
px: scaleUnambiguousSpacing()
|
|
1255
|
+
}],
|
|
1256
|
+
/**
|
|
1257
|
+
* Padding Block
|
|
1258
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1259
|
+
*/
|
|
1260
|
+
py: [{
|
|
1261
|
+
py: scaleUnambiguousSpacing()
|
|
1262
|
+
}],
|
|
1263
|
+
/**
|
|
1264
|
+
* Padding Inline Start
|
|
1265
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1266
|
+
*/
|
|
1267
|
+
ps: [{
|
|
1268
|
+
ps: scaleUnambiguousSpacing()
|
|
1269
|
+
}],
|
|
1270
|
+
/**
|
|
1271
|
+
* Padding Inline End
|
|
1272
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1273
|
+
*/
|
|
1274
|
+
pe: [{
|
|
1275
|
+
pe: scaleUnambiguousSpacing()
|
|
1276
|
+
}],
|
|
1277
|
+
/**
|
|
1278
|
+
* Padding Block Start
|
|
1279
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1280
|
+
*/
|
|
1281
|
+
pbs: [{
|
|
1282
|
+
pbs: scaleUnambiguousSpacing()
|
|
1283
|
+
}],
|
|
1284
|
+
/**
|
|
1285
|
+
* Padding Block End
|
|
1286
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1287
|
+
*/
|
|
1288
|
+
pbe: [{
|
|
1289
|
+
pbe: scaleUnambiguousSpacing()
|
|
1290
|
+
}],
|
|
1291
|
+
/**
|
|
1292
|
+
* Padding Top
|
|
1293
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1294
|
+
*/
|
|
1295
|
+
pt: [{
|
|
1296
|
+
pt: scaleUnambiguousSpacing()
|
|
1297
|
+
}],
|
|
1298
|
+
/**
|
|
1299
|
+
* Padding Right
|
|
1300
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1301
|
+
*/
|
|
1302
|
+
pr: [{
|
|
1303
|
+
pr: scaleUnambiguousSpacing()
|
|
1304
|
+
}],
|
|
1305
|
+
/**
|
|
1306
|
+
* Padding Bottom
|
|
1307
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1308
|
+
*/
|
|
1309
|
+
pb: [{
|
|
1310
|
+
pb: scaleUnambiguousSpacing()
|
|
1311
|
+
}],
|
|
1312
|
+
/**
|
|
1313
|
+
* Padding Left
|
|
1314
|
+
* @see https://tailwindcss.com/docs/padding
|
|
1315
|
+
*/
|
|
1316
|
+
pl: [{
|
|
1317
|
+
pl: scaleUnambiguousSpacing()
|
|
1318
|
+
}],
|
|
1319
|
+
/**
|
|
1320
|
+
* Margin
|
|
1321
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1322
|
+
*/
|
|
1323
|
+
m: [{
|
|
1324
|
+
m: scaleMargin()
|
|
1325
|
+
}],
|
|
1326
|
+
/**
|
|
1327
|
+
* Margin Inline
|
|
1328
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1329
|
+
*/
|
|
1330
|
+
mx: [{
|
|
1331
|
+
mx: scaleMargin()
|
|
1332
|
+
}],
|
|
1333
|
+
/**
|
|
1334
|
+
* Margin Block
|
|
1335
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1336
|
+
*/
|
|
1337
|
+
my: [{
|
|
1338
|
+
my: scaleMargin()
|
|
1339
|
+
}],
|
|
1340
|
+
/**
|
|
1341
|
+
* Margin Inline Start
|
|
1342
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1343
|
+
*/
|
|
1344
|
+
ms: [{
|
|
1345
|
+
ms: scaleMargin()
|
|
1346
|
+
}],
|
|
1347
|
+
/**
|
|
1348
|
+
* Margin Inline End
|
|
1349
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1350
|
+
*/
|
|
1351
|
+
me: [{
|
|
1352
|
+
me: scaleMargin()
|
|
1353
|
+
}],
|
|
1354
|
+
/**
|
|
1355
|
+
* Margin Block Start
|
|
1356
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1357
|
+
*/
|
|
1358
|
+
mbs: [{
|
|
1359
|
+
mbs: scaleMargin()
|
|
1360
|
+
}],
|
|
1361
|
+
/**
|
|
1362
|
+
* Margin Block End
|
|
1363
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1364
|
+
*/
|
|
1365
|
+
mbe: [{
|
|
1366
|
+
mbe: scaleMargin()
|
|
1367
|
+
}],
|
|
1368
|
+
/**
|
|
1369
|
+
* Margin Top
|
|
1370
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1371
|
+
*/
|
|
1372
|
+
mt: [{
|
|
1373
|
+
mt: scaleMargin()
|
|
1374
|
+
}],
|
|
1375
|
+
/**
|
|
1376
|
+
* Margin Right
|
|
1377
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1378
|
+
*/
|
|
1379
|
+
mr: [{
|
|
1380
|
+
mr: scaleMargin()
|
|
1381
|
+
}],
|
|
1382
|
+
/**
|
|
1383
|
+
* Margin Bottom
|
|
1384
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1385
|
+
*/
|
|
1386
|
+
mb: [{
|
|
1387
|
+
mb: scaleMargin()
|
|
1388
|
+
}],
|
|
1389
|
+
/**
|
|
1390
|
+
* Margin Left
|
|
1391
|
+
* @see https://tailwindcss.com/docs/margin
|
|
1392
|
+
*/
|
|
1393
|
+
ml: [{
|
|
1394
|
+
ml: scaleMargin()
|
|
1395
|
+
}],
|
|
1396
|
+
/**
|
|
1397
|
+
* Space Between X
|
|
1398
|
+
* @see https://tailwindcss.com/docs/margin#adding-space-between-children
|
|
1399
|
+
*/
|
|
1400
|
+
"space-x": [{
|
|
1401
|
+
"space-x": scaleUnambiguousSpacing()
|
|
1402
|
+
}],
|
|
1403
|
+
/**
|
|
1404
|
+
* Space Between X Reverse
|
|
1405
|
+
* @see https://tailwindcss.com/docs/margin#adding-space-between-children
|
|
1406
|
+
*/
|
|
1407
|
+
"space-x-reverse": ["space-x-reverse"],
|
|
1408
|
+
/**
|
|
1409
|
+
* Space Between Y
|
|
1410
|
+
* @see https://tailwindcss.com/docs/margin#adding-space-between-children
|
|
1411
|
+
*/
|
|
1412
|
+
"space-y": [{
|
|
1413
|
+
"space-y": scaleUnambiguousSpacing()
|
|
1414
|
+
}],
|
|
1415
|
+
/**
|
|
1416
|
+
* Space Between Y Reverse
|
|
1417
|
+
* @see https://tailwindcss.com/docs/margin#adding-space-between-children
|
|
1418
|
+
*/
|
|
1419
|
+
"space-y-reverse": ["space-y-reverse"],
|
|
1420
|
+
// --------------
|
|
1421
|
+
// --- Sizing ---
|
|
1422
|
+
// --------------
|
|
1423
|
+
/**
|
|
1424
|
+
* Size
|
|
1425
|
+
* @see https://tailwindcss.com/docs/width#setting-both-width-and-height
|
|
1426
|
+
*/
|
|
1427
|
+
size: [{
|
|
1428
|
+
size: scaleSizing()
|
|
1429
|
+
}],
|
|
1430
|
+
/**
|
|
1431
|
+
* Inline Size
|
|
1432
|
+
* @see https://tailwindcss.com/docs/width
|
|
1433
|
+
*/
|
|
1434
|
+
"inline-size": [{
|
|
1435
|
+
inline: ["auto", ...scaleSizingInline()]
|
|
1436
|
+
}],
|
|
1437
|
+
/**
|
|
1438
|
+
* Min-Inline Size
|
|
1439
|
+
* @see https://tailwindcss.com/docs/min-width
|
|
1440
|
+
*/
|
|
1441
|
+
"min-inline-size": [{
|
|
1442
|
+
"min-inline": ["auto", ...scaleSizingInline()]
|
|
1443
|
+
}],
|
|
1444
|
+
/**
|
|
1445
|
+
* Max-Inline Size
|
|
1446
|
+
* @see https://tailwindcss.com/docs/max-width
|
|
1447
|
+
*/
|
|
1448
|
+
"max-inline-size": [{
|
|
1449
|
+
"max-inline": ["none", ...scaleSizingInline()]
|
|
1450
|
+
}],
|
|
1451
|
+
/**
|
|
1452
|
+
* Block Size
|
|
1453
|
+
* @see https://tailwindcss.com/docs/height
|
|
1454
|
+
*/
|
|
1455
|
+
"block-size": [{
|
|
1456
|
+
block: ["auto", ...scaleSizingBlock()]
|
|
1457
|
+
}],
|
|
1458
|
+
/**
|
|
1459
|
+
* Min-Block Size
|
|
1460
|
+
* @see https://tailwindcss.com/docs/min-height
|
|
1461
|
+
*/
|
|
1462
|
+
"min-block-size": [{
|
|
1463
|
+
"min-block": ["auto", ...scaleSizingBlock()]
|
|
1464
|
+
}],
|
|
1465
|
+
/**
|
|
1466
|
+
* Max-Block Size
|
|
1467
|
+
* @see https://tailwindcss.com/docs/max-height
|
|
1468
|
+
*/
|
|
1469
|
+
"max-block-size": [{
|
|
1470
|
+
"max-block": ["none", ...scaleSizingBlock()]
|
|
1471
|
+
}],
|
|
1472
|
+
/**
|
|
1473
|
+
* Width
|
|
1474
|
+
* @see https://tailwindcss.com/docs/width
|
|
1475
|
+
*/
|
|
1476
|
+
w: [{
|
|
1477
|
+
w: [themeContainer, "screen", ...scaleSizing()]
|
|
1478
|
+
}],
|
|
1479
|
+
/**
|
|
1480
|
+
* Min-Width
|
|
1481
|
+
* @see https://tailwindcss.com/docs/min-width
|
|
1482
|
+
*/
|
|
1483
|
+
"min-w": [{
|
|
1484
|
+
"min-w": [
|
|
1485
|
+
themeContainer,
|
|
1486
|
+
"screen",
|
|
1487
|
+
/** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
|
|
1488
|
+
"none",
|
|
1489
|
+
...scaleSizing()
|
|
1490
|
+
]
|
|
1491
|
+
}],
|
|
1492
|
+
/**
|
|
1493
|
+
* Max-Width
|
|
1494
|
+
* @see https://tailwindcss.com/docs/max-width
|
|
1495
|
+
*/
|
|
1496
|
+
"max-w": [{
|
|
1497
|
+
"max-w": [
|
|
1498
|
+
themeContainer,
|
|
1499
|
+
"screen",
|
|
1500
|
+
"none",
|
|
1501
|
+
/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
|
|
1502
|
+
"prose",
|
|
1503
|
+
/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
|
|
1504
|
+
{
|
|
1505
|
+
screen: [themeBreakpoint]
|
|
1506
|
+
},
|
|
1507
|
+
...scaleSizing()
|
|
1508
|
+
]
|
|
1509
|
+
}],
|
|
1510
|
+
/**
|
|
1511
|
+
* Height
|
|
1512
|
+
* @see https://tailwindcss.com/docs/height
|
|
1513
|
+
*/
|
|
1514
|
+
h: [{
|
|
1515
|
+
h: ["screen", "lh", ...scaleSizing()]
|
|
1516
|
+
}],
|
|
1517
|
+
/**
|
|
1518
|
+
* Min-Height
|
|
1519
|
+
* @see https://tailwindcss.com/docs/min-height
|
|
1520
|
+
*/
|
|
1521
|
+
"min-h": [{
|
|
1522
|
+
"min-h": ["screen", "lh", "none", ...scaleSizing()]
|
|
1523
|
+
}],
|
|
1524
|
+
/**
|
|
1525
|
+
* Max-Height
|
|
1526
|
+
* @see https://tailwindcss.com/docs/max-height
|
|
1527
|
+
*/
|
|
1528
|
+
"max-h": [{
|
|
1529
|
+
"max-h": ["screen", "lh", ...scaleSizing()]
|
|
1530
|
+
}],
|
|
1531
|
+
// ------------------
|
|
1532
|
+
// --- Typography ---
|
|
1533
|
+
// ------------------
|
|
1534
|
+
/**
|
|
1535
|
+
* Font Size
|
|
1536
|
+
* @see https://tailwindcss.com/docs/font-size
|
|
1537
|
+
*/
|
|
1538
|
+
"font-size": [{
|
|
1539
|
+
text: ["base", themeText, isArbitraryVariableLength, isArbitraryLength]
|
|
1540
|
+
}],
|
|
1541
|
+
/**
|
|
1542
|
+
* Font Smoothing
|
|
1543
|
+
* @see https://tailwindcss.com/docs/font-smoothing
|
|
1544
|
+
*/
|
|
1545
|
+
"font-smoothing": ["antialiased", "subpixel-antialiased"],
|
|
1546
|
+
/**
|
|
1547
|
+
* Font Style
|
|
1548
|
+
* @see https://tailwindcss.com/docs/font-style
|
|
1549
|
+
*/
|
|
1550
|
+
"font-style": ["italic", "not-italic"],
|
|
1551
|
+
/**
|
|
1552
|
+
* Font Weight
|
|
1553
|
+
* @see https://tailwindcss.com/docs/font-weight
|
|
1554
|
+
*/
|
|
1555
|
+
"font-weight": [{
|
|
1556
|
+
font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight]
|
|
1557
|
+
}],
|
|
1558
|
+
/**
|
|
1559
|
+
* Font Stretch
|
|
1560
|
+
* @see https://tailwindcss.com/docs/font-stretch
|
|
1561
|
+
*/
|
|
1562
|
+
"font-stretch": [{
|
|
1563
|
+
"font-stretch": ["ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "normal", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded", isPercent, isArbitraryValue]
|
|
1564
|
+
}],
|
|
1565
|
+
/**
|
|
1566
|
+
* Font Family
|
|
1567
|
+
* @see https://tailwindcss.com/docs/font-family
|
|
1568
|
+
*/
|
|
1569
|
+
"font-family": [{
|
|
1570
|
+
font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont]
|
|
1571
|
+
}],
|
|
1572
|
+
/**
|
|
1573
|
+
* Font Feature Settings
|
|
1574
|
+
* @see https://tailwindcss.com/docs/font-feature-settings
|
|
1575
|
+
*/
|
|
1576
|
+
"font-features": [{
|
|
1577
|
+
"font-features": [isArbitraryValue]
|
|
1578
|
+
}],
|
|
1579
|
+
/**
|
|
1580
|
+
* Font Variant Numeric
|
|
1581
|
+
* @see https://tailwindcss.com/docs/font-variant-numeric
|
|
1582
|
+
*/
|
|
1583
|
+
"fvn-normal": ["normal-nums"],
|
|
1584
|
+
/**
|
|
1585
|
+
* Font Variant Numeric
|
|
1586
|
+
* @see https://tailwindcss.com/docs/font-variant-numeric
|
|
1587
|
+
*/
|
|
1588
|
+
"fvn-ordinal": ["ordinal"],
|
|
1589
|
+
/**
|
|
1590
|
+
* Font Variant Numeric
|
|
1591
|
+
* @see https://tailwindcss.com/docs/font-variant-numeric
|
|
1592
|
+
*/
|
|
1593
|
+
"fvn-slashed-zero": ["slashed-zero"],
|
|
1594
|
+
/**
|
|
1595
|
+
* Font Variant Numeric
|
|
1596
|
+
* @see https://tailwindcss.com/docs/font-variant-numeric
|
|
1597
|
+
*/
|
|
1598
|
+
"fvn-figure": ["lining-nums", "oldstyle-nums"],
|
|
1599
|
+
/**
|
|
1600
|
+
* Font Variant Numeric
|
|
1601
|
+
* @see https://tailwindcss.com/docs/font-variant-numeric
|
|
1602
|
+
*/
|
|
1603
|
+
"fvn-spacing": ["proportional-nums", "tabular-nums"],
|
|
1604
|
+
/**
|
|
1605
|
+
* Font Variant Numeric
|
|
1606
|
+
* @see https://tailwindcss.com/docs/font-variant-numeric
|
|
1607
|
+
*/
|
|
1608
|
+
"fvn-fraction": ["diagonal-fractions", "stacked-fractions"],
|
|
1609
|
+
/**
|
|
1610
|
+
* Letter Spacing
|
|
1611
|
+
* @see https://tailwindcss.com/docs/letter-spacing
|
|
1612
|
+
*/
|
|
1613
|
+
tracking: [{
|
|
1614
|
+
tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]
|
|
1615
|
+
}],
|
|
1616
|
+
/**
|
|
1617
|
+
* Line Clamp
|
|
1618
|
+
* @see https://tailwindcss.com/docs/line-clamp
|
|
1619
|
+
*/
|
|
1620
|
+
"line-clamp": [{
|
|
1621
|
+
"line-clamp": [isNumber, "none", isArbitraryVariable, isArbitraryNumber]
|
|
1622
|
+
}],
|
|
1623
|
+
/**
|
|
1624
|
+
* Line Height
|
|
1625
|
+
* @see https://tailwindcss.com/docs/line-height
|
|
1626
|
+
*/
|
|
1627
|
+
leading: [{
|
|
1628
|
+
leading: [
|
|
1629
|
+
/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
|
|
1630
|
+
themeLeading,
|
|
1631
|
+
...scaleUnambiguousSpacing()
|
|
1632
|
+
]
|
|
1633
|
+
}],
|
|
1634
|
+
/**
|
|
1635
|
+
* List Style Image
|
|
1636
|
+
* @see https://tailwindcss.com/docs/list-style-image
|
|
1637
|
+
*/
|
|
1638
|
+
"list-image": [{
|
|
1639
|
+
"list-image": ["none", isArbitraryVariable, isArbitraryValue]
|
|
1640
|
+
}],
|
|
1641
|
+
/**
|
|
1642
|
+
* List Style Position
|
|
1643
|
+
* @see https://tailwindcss.com/docs/list-style-position
|
|
1644
|
+
*/
|
|
1645
|
+
"list-style-position": [{
|
|
1646
|
+
list: ["inside", "outside"]
|
|
1647
|
+
}],
|
|
1648
|
+
/**
|
|
1649
|
+
* List Style Type
|
|
1650
|
+
* @see https://tailwindcss.com/docs/list-style-type
|
|
1651
|
+
*/
|
|
1652
|
+
"list-style-type": [{
|
|
1653
|
+
list: ["disc", "decimal", "none", isArbitraryVariable, isArbitraryValue]
|
|
1654
|
+
}],
|
|
1655
|
+
/**
|
|
1656
|
+
* Text Alignment
|
|
1657
|
+
* @see https://tailwindcss.com/docs/text-align
|
|
1658
|
+
*/
|
|
1659
|
+
"text-alignment": [{
|
|
1660
|
+
text: ["left", "center", "right", "justify", "start", "end"]
|
|
1661
|
+
}],
|
|
1662
|
+
/**
|
|
1663
|
+
* Placeholder Color
|
|
1664
|
+
* @deprecated since Tailwind CSS v3.0.0
|
|
1665
|
+
* @see https://v3.tailwindcss.com/docs/placeholder-color
|
|
1666
|
+
*/
|
|
1667
|
+
"placeholder-color": [{
|
|
1668
|
+
placeholder: scaleColor()
|
|
1669
|
+
}],
|
|
1670
|
+
/**
|
|
1671
|
+
* Text Color
|
|
1672
|
+
* @see https://tailwindcss.com/docs/text-color
|
|
1673
|
+
*/
|
|
1674
|
+
"text-color": [{
|
|
1675
|
+
text: scaleColor()
|
|
1676
|
+
}],
|
|
1677
|
+
/**
|
|
1678
|
+
* Text Decoration
|
|
1679
|
+
* @see https://tailwindcss.com/docs/text-decoration
|
|
1680
|
+
*/
|
|
1681
|
+
"text-decoration": ["underline", "overline", "line-through", "no-underline"],
|
|
1682
|
+
/**
|
|
1683
|
+
* Text Decoration Style
|
|
1684
|
+
* @see https://tailwindcss.com/docs/text-decoration-style
|
|
1685
|
+
*/
|
|
1686
|
+
"text-decoration-style": [{
|
|
1687
|
+
decoration: [...scaleLineStyle(), "wavy"]
|
|
1688
|
+
}],
|
|
1689
|
+
/**
|
|
1690
|
+
* Text Decoration Thickness
|
|
1691
|
+
* @see https://tailwindcss.com/docs/text-decoration-thickness
|
|
1692
|
+
*/
|
|
1693
|
+
"text-decoration-thickness": [{
|
|
1694
|
+
decoration: [isNumber, "from-font", "auto", isArbitraryVariable, isArbitraryLength]
|
|
1695
|
+
}],
|
|
1696
|
+
/**
|
|
1697
|
+
* Text Decoration Color
|
|
1698
|
+
* @see https://tailwindcss.com/docs/text-decoration-color
|
|
1699
|
+
*/
|
|
1700
|
+
"text-decoration-color": [{
|
|
1701
|
+
decoration: scaleColor()
|
|
1702
|
+
}],
|
|
1703
|
+
/**
|
|
1704
|
+
* Text Underline Offset
|
|
1705
|
+
* @see https://tailwindcss.com/docs/text-underline-offset
|
|
1706
|
+
*/
|
|
1707
|
+
"underline-offset": [{
|
|
1708
|
+
"underline-offset": [isNumber, "auto", isArbitraryVariable, isArbitraryValue]
|
|
1709
|
+
}],
|
|
1710
|
+
/**
|
|
1711
|
+
* Text Transform
|
|
1712
|
+
* @see https://tailwindcss.com/docs/text-transform
|
|
1713
|
+
*/
|
|
1714
|
+
"text-transform": ["uppercase", "lowercase", "capitalize", "normal-case"],
|
|
1715
|
+
/**
|
|
1716
|
+
* Text Overflow
|
|
1717
|
+
* @see https://tailwindcss.com/docs/text-overflow
|
|
1718
|
+
*/
|
|
1719
|
+
"text-overflow": ["truncate", "text-ellipsis", "text-clip"],
|
|
1720
|
+
/**
|
|
1721
|
+
* Text Wrap
|
|
1722
|
+
* @see https://tailwindcss.com/docs/text-wrap
|
|
1723
|
+
*/
|
|
1724
|
+
"text-wrap": [{
|
|
1725
|
+
text: ["wrap", "nowrap", "balance", "pretty"]
|
|
1726
|
+
}],
|
|
1727
|
+
/**
|
|
1728
|
+
* Text Indent
|
|
1729
|
+
* @see https://tailwindcss.com/docs/text-indent
|
|
1730
|
+
*/
|
|
1731
|
+
indent: [{
|
|
1732
|
+
indent: scaleUnambiguousSpacing()
|
|
1733
|
+
}],
|
|
1734
|
+
/**
|
|
1735
|
+
* Vertical Alignment
|
|
1736
|
+
* @see https://tailwindcss.com/docs/vertical-align
|
|
1737
|
+
*/
|
|
1738
|
+
"vertical-align": [{
|
|
1739
|
+
align: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super", isArbitraryVariable, isArbitraryValue]
|
|
1740
|
+
}],
|
|
1741
|
+
/**
|
|
1742
|
+
* Whitespace
|
|
1743
|
+
* @see https://tailwindcss.com/docs/whitespace
|
|
1744
|
+
*/
|
|
1745
|
+
whitespace: [{
|
|
1746
|
+
whitespace: ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"]
|
|
1747
|
+
}],
|
|
1748
|
+
/**
|
|
1749
|
+
* Word Break
|
|
1750
|
+
* @see https://tailwindcss.com/docs/word-break
|
|
1751
|
+
*/
|
|
1752
|
+
break: [{
|
|
1753
|
+
break: ["normal", "words", "all", "keep"]
|
|
1754
|
+
}],
|
|
1755
|
+
/**
|
|
1756
|
+
* Overflow Wrap
|
|
1757
|
+
* @see https://tailwindcss.com/docs/overflow-wrap
|
|
1758
|
+
*/
|
|
1759
|
+
wrap: [{
|
|
1760
|
+
wrap: ["break-word", "anywhere", "normal"]
|
|
1761
|
+
}],
|
|
1762
|
+
/**
|
|
1763
|
+
* Hyphens
|
|
1764
|
+
* @see https://tailwindcss.com/docs/hyphens
|
|
1765
|
+
*/
|
|
1766
|
+
hyphens: [{
|
|
1767
|
+
hyphens: ["none", "manual", "auto"]
|
|
1768
|
+
}],
|
|
1769
|
+
/**
|
|
1770
|
+
* Content
|
|
1771
|
+
* @see https://tailwindcss.com/docs/content
|
|
1772
|
+
*/
|
|
1773
|
+
content: [{
|
|
1774
|
+
content: ["none", isArbitraryVariable, isArbitraryValue]
|
|
1775
|
+
}],
|
|
1776
|
+
// -------------------
|
|
1777
|
+
// --- Backgrounds ---
|
|
1778
|
+
// -------------------
|
|
1779
|
+
/**
|
|
1780
|
+
* Background Attachment
|
|
1781
|
+
* @see https://tailwindcss.com/docs/background-attachment
|
|
1782
|
+
*/
|
|
1783
|
+
"bg-attachment": [{
|
|
1784
|
+
bg: ["fixed", "local", "scroll"]
|
|
1785
|
+
}],
|
|
1786
|
+
/**
|
|
1787
|
+
* Background Clip
|
|
1788
|
+
* @see https://tailwindcss.com/docs/background-clip
|
|
1789
|
+
*/
|
|
1790
|
+
"bg-clip": [{
|
|
1791
|
+
"bg-clip": ["border", "padding", "content", "text"]
|
|
1792
|
+
}],
|
|
1793
|
+
/**
|
|
1794
|
+
* Background Origin
|
|
1795
|
+
* @see https://tailwindcss.com/docs/background-origin
|
|
1796
|
+
*/
|
|
1797
|
+
"bg-origin": [{
|
|
1798
|
+
"bg-origin": ["border", "padding", "content"]
|
|
1799
|
+
}],
|
|
1800
|
+
/**
|
|
1801
|
+
* Background Position
|
|
1802
|
+
* @see https://tailwindcss.com/docs/background-position
|
|
1803
|
+
*/
|
|
1804
|
+
"bg-position": [{
|
|
1805
|
+
bg: scaleBgPosition()
|
|
1806
|
+
}],
|
|
1807
|
+
/**
|
|
1808
|
+
* Background Repeat
|
|
1809
|
+
* @see https://tailwindcss.com/docs/background-repeat
|
|
1810
|
+
*/
|
|
1811
|
+
"bg-repeat": [{
|
|
1812
|
+
bg: scaleBgRepeat()
|
|
1813
|
+
}],
|
|
1814
|
+
/**
|
|
1815
|
+
* Background Size
|
|
1816
|
+
* @see https://tailwindcss.com/docs/background-size
|
|
1817
|
+
*/
|
|
1818
|
+
"bg-size": [{
|
|
1819
|
+
bg: scaleBgSize()
|
|
1820
|
+
}],
|
|
1821
|
+
/**
|
|
1822
|
+
* Background Image
|
|
1823
|
+
* @see https://tailwindcss.com/docs/background-image
|
|
1824
|
+
*/
|
|
1825
|
+
"bg-image": [{
|
|
1826
|
+
bg: ["none", {
|
|
1827
|
+
linear: [{
|
|
1828
|
+
to: ["t", "tr", "r", "br", "b", "bl", "l", "tl"]
|
|
1829
|
+
}, isInteger, isArbitraryVariable, isArbitraryValue],
|
|
1830
|
+
radial: ["", isArbitraryVariable, isArbitraryValue],
|
|
1831
|
+
conic: [isInteger, isArbitraryVariable, isArbitraryValue]
|
|
1832
|
+
}, isArbitraryVariableImage, isArbitraryImage]
|
|
1833
|
+
}],
|
|
1834
|
+
/**
|
|
1835
|
+
* Background Color
|
|
1836
|
+
* @see https://tailwindcss.com/docs/background-color
|
|
1837
|
+
*/
|
|
1838
|
+
"bg-color": [{
|
|
1839
|
+
bg: scaleColor()
|
|
1840
|
+
}],
|
|
1841
|
+
/**
|
|
1842
|
+
* Gradient Color Stops From Position
|
|
1843
|
+
* @see https://tailwindcss.com/docs/gradient-color-stops
|
|
1844
|
+
*/
|
|
1845
|
+
"gradient-from-pos": [{
|
|
1846
|
+
from: scaleGradientStopPosition()
|
|
1847
|
+
}],
|
|
1848
|
+
/**
|
|
1849
|
+
* Gradient Color Stops Via Position
|
|
1850
|
+
* @see https://tailwindcss.com/docs/gradient-color-stops
|
|
1851
|
+
*/
|
|
1852
|
+
"gradient-via-pos": [{
|
|
1853
|
+
via: scaleGradientStopPosition()
|
|
1854
|
+
}],
|
|
1855
|
+
/**
|
|
1856
|
+
* Gradient Color Stops To Position
|
|
1857
|
+
* @see https://tailwindcss.com/docs/gradient-color-stops
|
|
1858
|
+
*/
|
|
1859
|
+
"gradient-to-pos": [{
|
|
1860
|
+
to: scaleGradientStopPosition()
|
|
1861
|
+
}],
|
|
1862
|
+
/**
|
|
1863
|
+
* Gradient Color Stops From
|
|
1864
|
+
* @see https://tailwindcss.com/docs/gradient-color-stops
|
|
1865
|
+
*/
|
|
1866
|
+
"gradient-from": [{
|
|
1867
|
+
from: scaleColor()
|
|
1868
|
+
}],
|
|
1869
|
+
/**
|
|
1870
|
+
* Gradient Color Stops Via
|
|
1871
|
+
* @see https://tailwindcss.com/docs/gradient-color-stops
|
|
1872
|
+
*/
|
|
1873
|
+
"gradient-via": [{
|
|
1874
|
+
via: scaleColor()
|
|
1875
|
+
}],
|
|
1876
|
+
/**
|
|
1877
|
+
* Gradient Color Stops To
|
|
1878
|
+
* @see https://tailwindcss.com/docs/gradient-color-stops
|
|
1879
|
+
*/
|
|
1880
|
+
"gradient-to": [{
|
|
1881
|
+
to: scaleColor()
|
|
1882
|
+
}],
|
|
1883
|
+
// ---------------
|
|
1884
|
+
// --- Borders ---
|
|
1885
|
+
// ---------------
|
|
1886
|
+
/**
|
|
1887
|
+
* Border Radius
|
|
1888
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1889
|
+
*/
|
|
1890
|
+
rounded: [{
|
|
1891
|
+
rounded: scaleRadius()
|
|
1892
|
+
}],
|
|
1893
|
+
/**
|
|
1894
|
+
* Border Radius Start
|
|
1895
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1896
|
+
*/
|
|
1897
|
+
"rounded-s": [{
|
|
1898
|
+
"rounded-s": scaleRadius()
|
|
1899
|
+
}],
|
|
1900
|
+
/**
|
|
1901
|
+
* Border Radius End
|
|
1902
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1903
|
+
*/
|
|
1904
|
+
"rounded-e": [{
|
|
1905
|
+
"rounded-e": scaleRadius()
|
|
1906
|
+
}],
|
|
1907
|
+
/**
|
|
1908
|
+
* Border Radius Top
|
|
1909
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1910
|
+
*/
|
|
1911
|
+
"rounded-t": [{
|
|
1912
|
+
"rounded-t": scaleRadius()
|
|
1913
|
+
}],
|
|
1914
|
+
/**
|
|
1915
|
+
* Border Radius Right
|
|
1916
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1917
|
+
*/
|
|
1918
|
+
"rounded-r": [{
|
|
1919
|
+
"rounded-r": scaleRadius()
|
|
1920
|
+
}],
|
|
1921
|
+
/**
|
|
1922
|
+
* Border Radius Bottom
|
|
1923
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1924
|
+
*/
|
|
1925
|
+
"rounded-b": [{
|
|
1926
|
+
"rounded-b": scaleRadius()
|
|
1927
|
+
}],
|
|
1928
|
+
/**
|
|
1929
|
+
* Border Radius Left
|
|
1930
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1931
|
+
*/
|
|
1932
|
+
"rounded-l": [{
|
|
1933
|
+
"rounded-l": scaleRadius()
|
|
1934
|
+
}],
|
|
1935
|
+
/**
|
|
1936
|
+
* Border Radius Start Start
|
|
1937
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1938
|
+
*/
|
|
1939
|
+
"rounded-ss": [{
|
|
1940
|
+
"rounded-ss": scaleRadius()
|
|
1941
|
+
}],
|
|
1942
|
+
/**
|
|
1943
|
+
* Border Radius Start End
|
|
1944
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1945
|
+
*/
|
|
1946
|
+
"rounded-se": [{
|
|
1947
|
+
"rounded-se": scaleRadius()
|
|
1948
|
+
}],
|
|
1949
|
+
/**
|
|
1950
|
+
* Border Radius End End
|
|
1951
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1952
|
+
*/
|
|
1953
|
+
"rounded-ee": [{
|
|
1954
|
+
"rounded-ee": scaleRadius()
|
|
1955
|
+
}],
|
|
1956
|
+
/**
|
|
1957
|
+
* Border Radius End Start
|
|
1958
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1959
|
+
*/
|
|
1960
|
+
"rounded-es": [{
|
|
1961
|
+
"rounded-es": scaleRadius()
|
|
1962
|
+
}],
|
|
1963
|
+
/**
|
|
1964
|
+
* Border Radius Top Left
|
|
1965
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1966
|
+
*/
|
|
1967
|
+
"rounded-tl": [{
|
|
1968
|
+
"rounded-tl": scaleRadius()
|
|
1969
|
+
}],
|
|
1970
|
+
/**
|
|
1971
|
+
* Border Radius Top Right
|
|
1972
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1973
|
+
*/
|
|
1974
|
+
"rounded-tr": [{
|
|
1975
|
+
"rounded-tr": scaleRadius()
|
|
1976
|
+
}],
|
|
1977
|
+
/**
|
|
1978
|
+
* Border Radius Bottom Right
|
|
1979
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1980
|
+
*/
|
|
1981
|
+
"rounded-br": [{
|
|
1982
|
+
"rounded-br": scaleRadius()
|
|
1983
|
+
}],
|
|
1984
|
+
/**
|
|
1985
|
+
* Border Radius Bottom Left
|
|
1986
|
+
* @see https://tailwindcss.com/docs/border-radius
|
|
1987
|
+
*/
|
|
1988
|
+
"rounded-bl": [{
|
|
1989
|
+
"rounded-bl": scaleRadius()
|
|
1990
|
+
}],
|
|
1991
|
+
/**
|
|
1992
|
+
* Border Width
|
|
1993
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
1994
|
+
*/
|
|
1995
|
+
"border-w": [{
|
|
1996
|
+
border: scaleBorderWidth()
|
|
1997
|
+
}],
|
|
1998
|
+
/**
|
|
1999
|
+
* Border Width Inline
|
|
2000
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2001
|
+
*/
|
|
2002
|
+
"border-w-x": [{
|
|
2003
|
+
"border-x": scaleBorderWidth()
|
|
2004
|
+
}],
|
|
2005
|
+
/**
|
|
2006
|
+
* Border Width Block
|
|
2007
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2008
|
+
*/
|
|
2009
|
+
"border-w-y": [{
|
|
2010
|
+
"border-y": scaleBorderWidth()
|
|
2011
|
+
}],
|
|
2012
|
+
/**
|
|
2013
|
+
* Border Width Inline Start
|
|
2014
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2015
|
+
*/
|
|
2016
|
+
"border-w-s": [{
|
|
2017
|
+
"border-s": scaleBorderWidth()
|
|
2018
|
+
}],
|
|
2019
|
+
/**
|
|
2020
|
+
* Border Width Inline End
|
|
2021
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2022
|
+
*/
|
|
2023
|
+
"border-w-e": [{
|
|
2024
|
+
"border-e": scaleBorderWidth()
|
|
2025
|
+
}],
|
|
2026
|
+
/**
|
|
2027
|
+
* Border Width Block Start
|
|
2028
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2029
|
+
*/
|
|
2030
|
+
"border-w-bs": [{
|
|
2031
|
+
"border-bs": scaleBorderWidth()
|
|
2032
|
+
}],
|
|
2033
|
+
/**
|
|
2034
|
+
* Border Width Block End
|
|
2035
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2036
|
+
*/
|
|
2037
|
+
"border-w-be": [{
|
|
2038
|
+
"border-be": scaleBorderWidth()
|
|
2039
|
+
}],
|
|
2040
|
+
/**
|
|
2041
|
+
* Border Width Top
|
|
2042
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2043
|
+
*/
|
|
2044
|
+
"border-w-t": [{
|
|
2045
|
+
"border-t": scaleBorderWidth()
|
|
2046
|
+
}],
|
|
2047
|
+
/**
|
|
2048
|
+
* Border Width Right
|
|
2049
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2050
|
+
*/
|
|
2051
|
+
"border-w-r": [{
|
|
2052
|
+
"border-r": scaleBorderWidth()
|
|
2053
|
+
}],
|
|
2054
|
+
/**
|
|
2055
|
+
* Border Width Bottom
|
|
2056
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2057
|
+
*/
|
|
2058
|
+
"border-w-b": [{
|
|
2059
|
+
"border-b": scaleBorderWidth()
|
|
2060
|
+
}],
|
|
2061
|
+
/**
|
|
2062
|
+
* Border Width Left
|
|
2063
|
+
* @see https://tailwindcss.com/docs/border-width
|
|
2064
|
+
*/
|
|
2065
|
+
"border-w-l": [{
|
|
2066
|
+
"border-l": scaleBorderWidth()
|
|
2067
|
+
}],
|
|
2068
|
+
/**
|
|
2069
|
+
* Divide Width X
|
|
2070
|
+
* @see https://tailwindcss.com/docs/border-width#between-children
|
|
2071
|
+
*/
|
|
2072
|
+
"divide-x": [{
|
|
2073
|
+
"divide-x": scaleBorderWidth()
|
|
2074
|
+
}],
|
|
2075
|
+
/**
|
|
2076
|
+
* Divide Width X Reverse
|
|
2077
|
+
* @see https://tailwindcss.com/docs/border-width#between-children
|
|
2078
|
+
*/
|
|
2079
|
+
"divide-x-reverse": ["divide-x-reverse"],
|
|
2080
|
+
/**
|
|
2081
|
+
* Divide Width Y
|
|
2082
|
+
* @see https://tailwindcss.com/docs/border-width#between-children
|
|
2083
|
+
*/
|
|
2084
|
+
"divide-y": [{
|
|
2085
|
+
"divide-y": scaleBorderWidth()
|
|
2086
|
+
}],
|
|
2087
|
+
/**
|
|
2088
|
+
* Divide Width Y Reverse
|
|
2089
|
+
* @see https://tailwindcss.com/docs/border-width#between-children
|
|
2090
|
+
*/
|
|
2091
|
+
"divide-y-reverse": ["divide-y-reverse"],
|
|
2092
|
+
/**
|
|
2093
|
+
* Border Style
|
|
2094
|
+
* @see https://tailwindcss.com/docs/border-style
|
|
2095
|
+
*/
|
|
2096
|
+
"border-style": [{
|
|
2097
|
+
border: [...scaleLineStyle(), "hidden", "none"]
|
|
2098
|
+
}],
|
|
2099
|
+
/**
|
|
2100
|
+
* Divide Style
|
|
2101
|
+
* @see https://tailwindcss.com/docs/border-style#setting-the-divider-style
|
|
2102
|
+
*/
|
|
2103
|
+
"divide-style": [{
|
|
2104
|
+
divide: [...scaleLineStyle(), "hidden", "none"]
|
|
2105
|
+
}],
|
|
2106
|
+
/**
|
|
2107
|
+
* Border Color
|
|
2108
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2109
|
+
*/
|
|
2110
|
+
"border-color": [{
|
|
2111
|
+
border: scaleColor()
|
|
2112
|
+
}],
|
|
2113
|
+
/**
|
|
2114
|
+
* Border Color Inline
|
|
2115
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2116
|
+
*/
|
|
2117
|
+
"border-color-x": [{
|
|
2118
|
+
"border-x": scaleColor()
|
|
2119
|
+
}],
|
|
2120
|
+
/**
|
|
2121
|
+
* Border Color Block
|
|
2122
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2123
|
+
*/
|
|
2124
|
+
"border-color-y": [{
|
|
2125
|
+
"border-y": scaleColor()
|
|
2126
|
+
}],
|
|
2127
|
+
/**
|
|
2128
|
+
* Border Color Inline Start
|
|
2129
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2130
|
+
*/
|
|
2131
|
+
"border-color-s": [{
|
|
2132
|
+
"border-s": scaleColor()
|
|
2133
|
+
}],
|
|
2134
|
+
/**
|
|
2135
|
+
* Border Color Inline End
|
|
2136
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2137
|
+
*/
|
|
2138
|
+
"border-color-e": [{
|
|
2139
|
+
"border-e": scaleColor()
|
|
2140
|
+
}],
|
|
2141
|
+
/**
|
|
2142
|
+
* Border Color Block Start
|
|
2143
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2144
|
+
*/
|
|
2145
|
+
"border-color-bs": [{
|
|
2146
|
+
"border-bs": scaleColor()
|
|
2147
|
+
}],
|
|
2148
|
+
/**
|
|
2149
|
+
* Border Color Block End
|
|
2150
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2151
|
+
*/
|
|
2152
|
+
"border-color-be": [{
|
|
2153
|
+
"border-be": scaleColor()
|
|
2154
|
+
}],
|
|
2155
|
+
/**
|
|
2156
|
+
* Border Color Top
|
|
2157
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2158
|
+
*/
|
|
2159
|
+
"border-color-t": [{
|
|
2160
|
+
"border-t": scaleColor()
|
|
2161
|
+
}],
|
|
2162
|
+
/**
|
|
2163
|
+
* Border Color Right
|
|
2164
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2165
|
+
*/
|
|
2166
|
+
"border-color-r": [{
|
|
2167
|
+
"border-r": scaleColor()
|
|
2168
|
+
}],
|
|
2169
|
+
/**
|
|
2170
|
+
* Border Color Bottom
|
|
2171
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2172
|
+
*/
|
|
2173
|
+
"border-color-b": [{
|
|
2174
|
+
"border-b": scaleColor()
|
|
2175
|
+
}],
|
|
2176
|
+
/**
|
|
2177
|
+
* Border Color Left
|
|
2178
|
+
* @see https://tailwindcss.com/docs/border-color
|
|
2179
|
+
*/
|
|
2180
|
+
"border-color-l": [{
|
|
2181
|
+
"border-l": scaleColor()
|
|
2182
|
+
}],
|
|
2183
|
+
/**
|
|
2184
|
+
* Divide Color
|
|
2185
|
+
* @see https://tailwindcss.com/docs/divide-color
|
|
2186
|
+
*/
|
|
2187
|
+
"divide-color": [{
|
|
2188
|
+
divide: scaleColor()
|
|
2189
|
+
}],
|
|
2190
|
+
/**
|
|
2191
|
+
* Outline Style
|
|
2192
|
+
* @see https://tailwindcss.com/docs/outline-style
|
|
2193
|
+
*/
|
|
2194
|
+
"outline-style": [{
|
|
2195
|
+
outline: [...scaleLineStyle(), "none", "hidden"]
|
|
2196
|
+
}],
|
|
2197
|
+
/**
|
|
2198
|
+
* Outline Offset
|
|
2199
|
+
* @see https://tailwindcss.com/docs/outline-offset
|
|
2200
|
+
*/
|
|
2201
|
+
"outline-offset": [{
|
|
2202
|
+
"outline-offset": [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2203
|
+
}],
|
|
2204
|
+
/**
|
|
2205
|
+
* Outline Width
|
|
2206
|
+
* @see https://tailwindcss.com/docs/outline-width
|
|
2207
|
+
*/
|
|
2208
|
+
"outline-w": [{
|
|
2209
|
+
outline: ["", isNumber, isArbitraryVariableLength, isArbitraryLength]
|
|
2210
|
+
}],
|
|
2211
|
+
/**
|
|
2212
|
+
* Outline Color
|
|
2213
|
+
* @see https://tailwindcss.com/docs/outline-color
|
|
2214
|
+
*/
|
|
2215
|
+
"outline-color": [{
|
|
2216
|
+
outline: scaleColor()
|
|
2217
|
+
}],
|
|
2218
|
+
// ---------------
|
|
2219
|
+
// --- Effects ---
|
|
2220
|
+
// ---------------
|
|
2221
|
+
/**
|
|
2222
|
+
* Box Shadow
|
|
2223
|
+
* @see https://tailwindcss.com/docs/box-shadow
|
|
2224
|
+
*/
|
|
2225
|
+
shadow: [{
|
|
2226
|
+
shadow: [
|
|
2227
|
+
// Deprecated since Tailwind CSS v4.0.0
|
|
2228
|
+
"",
|
|
2229
|
+
"none",
|
|
2230
|
+
themeShadow,
|
|
2231
|
+
isArbitraryVariableShadow,
|
|
2232
|
+
isArbitraryShadow
|
|
2233
|
+
]
|
|
2234
|
+
}],
|
|
2235
|
+
/**
|
|
2236
|
+
* Box Shadow Color
|
|
2237
|
+
* @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color
|
|
2238
|
+
*/
|
|
2239
|
+
"shadow-color": [{
|
|
2240
|
+
shadow: scaleColor()
|
|
2241
|
+
}],
|
|
2242
|
+
/**
|
|
2243
|
+
* Inset Box Shadow
|
|
2244
|
+
* @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow
|
|
2245
|
+
*/
|
|
2246
|
+
"inset-shadow": [{
|
|
2247
|
+
"inset-shadow": ["none", themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]
|
|
2248
|
+
}],
|
|
2249
|
+
/**
|
|
2250
|
+
* Inset Box Shadow Color
|
|
2251
|
+
* @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color
|
|
2252
|
+
*/
|
|
2253
|
+
"inset-shadow-color": [{
|
|
2254
|
+
"inset-shadow": scaleColor()
|
|
2255
|
+
}],
|
|
2256
|
+
/**
|
|
2257
|
+
* Ring Width
|
|
2258
|
+
* @see https://tailwindcss.com/docs/box-shadow#adding-a-ring
|
|
2259
|
+
*/
|
|
2260
|
+
"ring-w": [{
|
|
2261
|
+
ring: scaleBorderWidth()
|
|
2262
|
+
}],
|
|
2263
|
+
/**
|
|
2264
|
+
* Ring Width Inset
|
|
2265
|
+
* @see https://v3.tailwindcss.com/docs/ring-width#inset-rings
|
|
2266
|
+
* @deprecated since Tailwind CSS v4.0.0
|
|
2267
|
+
* @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
|
|
2268
|
+
*/
|
|
2269
|
+
"ring-w-inset": ["ring-inset"],
|
|
2270
|
+
/**
|
|
2271
|
+
* Ring Color
|
|
2272
|
+
* @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color
|
|
2273
|
+
*/
|
|
2274
|
+
"ring-color": [{
|
|
2275
|
+
ring: scaleColor()
|
|
2276
|
+
}],
|
|
2277
|
+
/**
|
|
2278
|
+
* Ring Offset Width
|
|
2279
|
+
* @see https://v3.tailwindcss.com/docs/ring-offset-width
|
|
2280
|
+
* @deprecated since Tailwind CSS v4.0.0
|
|
2281
|
+
* @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
|
|
2282
|
+
*/
|
|
2283
|
+
"ring-offset-w": [{
|
|
2284
|
+
"ring-offset": [isNumber, isArbitraryLength]
|
|
2285
|
+
}],
|
|
2286
|
+
/**
|
|
2287
|
+
* Ring Offset Color
|
|
2288
|
+
* @see https://v3.tailwindcss.com/docs/ring-offset-color
|
|
2289
|
+
* @deprecated since Tailwind CSS v4.0.0
|
|
2290
|
+
* @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
|
|
2291
|
+
*/
|
|
2292
|
+
"ring-offset-color": [{
|
|
2293
|
+
"ring-offset": scaleColor()
|
|
2294
|
+
}],
|
|
2295
|
+
/**
|
|
2296
|
+
* Inset Ring Width
|
|
2297
|
+
* @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring
|
|
2298
|
+
*/
|
|
2299
|
+
"inset-ring-w": [{
|
|
2300
|
+
"inset-ring": scaleBorderWidth()
|
|
2301
|
+
}],
|
|
2302
|
+
/**
|
|
2303
|
+
* Inset Ring Color
|
|
2304
|
+
* @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color
|
|
2305
|
+
*/
|
|
2306
|
+
"inset-ring-color": [{
|
|
2307
|
+
"inset-ring": scaleColor()
|
|
2308
|
+
}],
|
|
2309
|
+
/**
|
|
2310
|
+
* Text Shadow
|
|
2311
|
+
* @see https://tailwindcss.com/docs/text-shadow
|
|
2312
|
+
*/
|
|
2313
|
+
"text-shadow": [{
|
|
2314
|
+
"text-shadow": ["none", themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]
|
|
2315
|
+
}],
|
|
2316
|
+
/**
|
|
2317
|
+
* Text Shadow Color
|
|
2318
|
+
* @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color
|
|
2319
|
+
*/
|
|
2320
|
+
"text-shadow-color": [{
|
|
2321
|
+
"text-shadow": scaleColor()
|
|
2322
|
+
}],
|
|
2323
|
+
/**
|
|
2324
|
+
* Opacity
|
|
2325
|
+
* @see https://tailwindcss.com/docs/opacity
|
|
2326
|
+
*/
|
|
2327
|
+
opacity: [{
|
|
2328
|
+
opacity: [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2329
|
+
}],
|
|
2330
|
+
/**
|
|
2331
|
+
* Mix Blend Mode
|
|
2332
|
+
* @see https://tailwindcss.com/docs/mix-blend-mode
|
|
2333
|
+
*/
|
|
2334
|
+
"mix-blend": [{
|
|
2335
|
+
"mix-blend": [...scaleBlendMode(), "plus-darker", "plus-lighter"]
|
|
2336
|
+
}],
|
|
2337
|
+
/**
|
|
2338
|
+
* Background Blend Mode
|
|
2339
|
+
* @see https://tailwindcss.com/docs/background-blend-mode
|
|
2340
|
+
*/
|
|
2341
|
+
"bg-blend": [{
|
|
2342
|
+
"bg-blend": scaleBlendMode()
|
|
2343
|
+
}],
|
|
2344
|
+
/**
|
|
2345
|
+
* Mask Clip
|
|
2346
|
+
* @see https://tailwindcss.com/docs/mask-clip
|
|
2347
|
+
*/
|
|
2348
|
+
"mask-clip": [{
|
|
2349
|
+
"mask-clip": ["border", "padding", "content", "fill", "stroke", "view"]
|
|
2350
|
+
}, "mask-no-clip"],
|
|
2351
|
+
/**
|
|
2352
|
+
* Mask Composite
|
|
2353
|
+
* @see https://tailwindcss.com/docs/mask-composite
|
|
2354
|
+
*/
|
|
2355
|
+
"mask-composite": [{
|
|
2356
|
+
mask: ["add", "subtract", "intersect", "exclude"]
|
|
2357
|
+
}],
|
|
2358
|
+
/**
|
|
2359
|
+
* Mask Image
|
|
2360
|
+
* @see https://tailwindcss.com/docs/mask-image
|
|
2361
|
+
*/
|
|
2362
|
+
"mask-image-linear-pos": [{
|
|
2363
|
+
"mask-linear": [isNumber]
|
|
2364
|
+
}],
|
|
2365
|
+
"mask-image-linear-from-pos": [{
|
|
2366
|
+
"mask-linear-from": scaleMaskImagePosition()
|
|
2367
|
+
}],
|
|
2368
|
+
"mask-image-linear-to-pos": [{
|
|
2369
|
+
"mask-linear-to": scaleMaskImagePosition()
|
|
2370
|
+
}],
|
|
2371
|
+
"mask-image-linear-from-color": [{
|
|
2372
|
+
"mask-linear-from": scaleColor()
|
|
2373
|
+
}],
|
|
2374
|
+
"mask-image-linear-to-color": [{
|
|
2375
|
+
"mask-linear-to": scaleColor()
|
|
2376
|
+
}],
|
|
2377
|
+
"mask-image-t-from-pos": [{
|
|
2378
|
+
"mask-t-from": scaleMaskImagePosition()
|
|
2379
|
+
}],
|
|
2380
|
+
"mask-image-t-to-pos": [{
|
|
2381
|
+
"mask-t-to": scaleMaskImagePosition()
|
|
2382
|
+
}],
|
|
2383
|
+
"mask-image-t-from-color": [{
|
|
2384
|
+
"mask-t-from": scaleColor()
|
|
2385
|
+
}],
|
|
2386
|
+
"mask-image-t-to-color": [{
|
|
2387
|
+
"mask-t-to": scaleColor()
|
|
2388
|
+
}],
|
|
2389
|
+
"mask-image-r-from-pos": [{
|
|
2390
|
+
"mask-r-from": scaleMaskImagePosition()
|
|
2391
|
+
}],
|
|
2392
|
+
"mask-image-r-to-pos": [{
|
|
2393
|
+
"mask-r-to": scaleMaskImagePosition()
|
|
2394
|
+
}],
|
|
2395
|
+
"mask-image-r-from-color": [{
|
|
2396
|
+
"mask-r-from": scaleColor()
|
|
2397
|
+
}],
|
|
2398
|
+
"mask-image-r-to-color": [{
|
|
2399
|
+
"mask-r-to": scaleColor()
|
|
2400
|
+
}],
|
|
2401
|
+
"mask-image-b-from-pos": [{
|
|
2402
|
+
"mask-b-from": scaleMaskImagePosition()
|
|
2403
|
+
}],
|
|
2404
|
+
"mask-image-b-to-pos": [{
|
|
2405
|
+
"mask-b-to": scaleMaskImagePosition()
|
|
2406
|
+
}],
|
|
2407
|
+
"mask-image-b-from-color": [{
|
|
2408
|
+
"mask-b-from": scaleColor()
|
|
2409
|
+
}],
|
|
2410
|
+
"mask-image-b-to-color": [{
|
|
2411
|
+
"mask-b-to": scaleColor()
|
|
2412
|
+
}],
|
|
2413
|
+
"mask-image-l-from-pos": [{
|
|
2414
|
+
"mask-l-from": scaleMaskImagePosition()
|
|
2415
|
+
}],
|
|
2416
|
+
"mask-image-l-to-pos": [{
|
|
2417
|
+
"mask-l-to": scaleMaskImagePosition()
|
|
2418
|
+
}],
|
|
2419
|
+
"mask-image-l-from-color": [{
|
|
2420
|
+
"mask-l-from": scaleColor()
|
|
2421
|
+
}],
|
|
2422
|
+
"mask-image-l-to-color": [{
|
|
2423
|
+
"mask-l-to": scaleColor()
|
|
2424
|
+
}],
|
|
2425
|
+
"mask-image-x-from-pos": [{
|
|
2426
|
+
"mask-x-from": scaleMaskImagePosition()
|
|
2427
|
+
}],
|
|
2428
|
+
"mask-image-x-to-pos": [{
|
|
2429
|
+
"mask-x-to": scaleMaskImagePosition()
|
|
2430
|
+
}],
|
|
2431
|
+
"mask-image-x-from-color": [{
|
|
2432
|
+
"mask-x-from": scaleColor()
|
|
2433
|
+
}],
|
|
2434
|
+
"mask-image-x-to-color": [{
|
|
2435
|
+
"mask-x-to": scaleColor()
|
|
2436
|
+
}],
|
|
2437
|
+
"mask-image-y-from-pos": [{
|
|
2438
|
+
"mask-y-from": scaleMaskImagePosition()
|
|
2439
|
+
}],
|
|
2440
|
+
"mask-image-y-to-pos": [{
|
|
2441
|
+
"mask-y-to": scaleMaskImagePosition()
|
|
2442
|
+
}],
|
|
2443
|
+
"mask-image-y-from-color": [{
|
|
2444
|
+
"mask-y-from": scaleColor()
|
|
2445
|
+
}],
|
|
2446
|
+
"mask-image-y-to-color": [{
|
|
2447
|
+
"mask-y-to": scaleColor()
|
|
2448
|
+
}],
|
|
2449
|
+
"mask-image-radial": [{
|
|
2450
|
+
"mask-radial": [isArbitraryVariable, isArbitraryValue]
|
|
2451
|
+
}],
|
|
2452
|
+
"mask-image-radial-from-pos": [{
|
|
2453
|
+
"mask-radial-from": scaleMaskImagePosition()
|
|
2454
|
+
}],
|
|
2455
|
+
"mask-image-radial-to-pos": [{
|
|
2456
|
+
"mask-radial-to": scaleMaskImagePosition()
|
|
2457
|
+
}],
|
|
2458
|
+
"mask-image-radial-from-color": [{
|
|
2459
|
+
"mask-radial-from": scaleColor()
|
|
2460
|
+
}],
|
|
2461
|
+
"mask-image-radial-to-color": [{
|
|
2462
|
+
"mask-radial-to": scaleColor()
|
|
2463
|
+
}],
|
|
2464
|
+
"mask-image-radial-shape": [{
|
|
2465
|
+
"mask-radial": ["circle", "ellipse"]
|
|
2466
|
+
}],
|
|
2467
|
+
"mask-image-radial-size": [{
|
|
2468
|
+
"mask-radial": [{
|
|
2469
|
+
closest: ["side", "corner"],
|
|
2470
|
+
farthest: ["side", "corner"]
|
|
2471
|
+
}]
|
|
2472
|
+
}],
|
|
2473
|
+
"mask-image-radial-pos": [{
|
|
2474
|
+
"mask-radial-at": scalePosition()
|
|
2475
|
+
}],
|
|
2476
|
+
"mask-image-conic-pos": [{
|
|
2477
|
+
"mask-conic": [isNumber]
|
|
2478
|
+
}],
|
|
2479
|
+
"mask-image-conic-from-pos": [{
|
|
2480
|
+
"mask-conic-from": scaleMaskImagePosition()
|
|
2481
|
+
}],
|
|
2482
|
+
"mask-image-conic-to-pos": [{
|
|
2483
|
+
"mask-conic-to": scaleMaskImagePosition()
|
|
2484
|
+
}],
|
|
2485
|
+
"mask-image-conic-from-color": [{
|
|
2486
|
+
"mask-conic-from": scaleColor()
|
|
2487
|
+
}],
|
|
2488
|
+
"mask-image-conic-to-color": [{
|
|
2489
|
+
"mask-conic-to": scaleColor()
|
|
2490
|
+
}],
|
|
2491
|
+
/**
|
|
2492
|
+
* Mask Mode
|
|
2493
|
+
* @see https://tailwindcss.com/docs/mask-mode
|
|
2494
|
+
*/
|
|
2495
|
+
"mask-mode": [{
|
|
2496
|
+
mask: ["alpha", "luminance", "match"]
|
|
2497
|
+
}],
|
|
2498
|
+
/**
|
|
2499
|
+
* Mask Origin
|
|
2500
|
+
* @see https://tailwindcss.com/docs/mask-origin
|
|
2501
|
+
*/
|
|
2502
|
+
"mask-origin": [{
|
|
2503
|
+
"mask-origin": ["border", "padding", "content", "fill", "stroke", "view"]
|
|
2504
|
+
}],
|
|
2505
|
+
/**
|
|
2506
|
+
* Mask Position
|
|
2507
|
+
* @see https://tailwindcss.com/docs/mask-position
|
|
2508
|
+
*/
|
|
2509
|
+
"mask-position": [{
|
|
2510
|
+
mask: scaleBgPosition()
|
|
2511
|
+
}],
|
|
2512
|
+
/**
|
|
2513
|
+
* Mask Repeat
|
|
2514
|
+
* @see https://tailwindcss.com/docs/mask-repeat
|
|
2515
|
+
*/
|
|
2516
|
+
"mask-repeat": [{
|
|
2517
|
+
mask: scaleBgRepeat()
|
|
2518
|
+
}],
|
|
2519
|
+
/**
|
|
2520
|
+
* Mask Size
|
|
2521
|
+
* @see https://tailwindcss.com/docs/mask-size
|
|
2522
|
+
*/
|
|
2523
|
+
"mask-size": [{
|
|
2524
|
+
mask: scaleBgSize()
|
|
2525
|
+
}],
|
|
2526
|
+
/**
|
|
2527
|
+
* Mask Type
|
|
2528
|
+
* @see https://tailwindcss.com/docs/mask-type
|
|
2529
|
+
*/
|
|
2530
|
+
"mask-type": [{
|
|
2531
|
+
"mask-type": ["alpha", "luminance"]
|
|
2532
|
+
}],
|
|
2533
|
+
/**
|
|
2534
|
+
* Mask Image
|
|
2535
|
+
* @see https://tailwindcss.com/docs/mask-image
|
|
2536
|
+
*/
|
|
2537
|
+
"mask-image": [{
|
|
2538
|
+
mask: ["none", isArbitraryVariable, isArbitraryValue]
|
|
2539
|
+
}],
|
|
2540
|
+
// ---------------
|
|
2541
|
+
// --- Filters ---
|
|
2542
|
+
// ---------------
|
|
2543
|
+
/**
|
|
2544
|
+
* Filter
|
|
2545
|
+
* @see https://tailwindcss.com/docs/filter
|
|
2546
|
+
*/
|
|
2547
|
+
filter: [{
|
|
2548
|
+
filter: [
|
|
2549
|
+
// Deprecated since Tailwind CSS v3.0.0
|
|
2550
|
+
"",
|
|
2551
|
+
"none",
|
|
2552
|
+
isArbitraryVariable,
|
|
2553
|
+
isArbitraryValue
|
|
2554
|
+
]
|
|
2555
|
+
}],
|
|
2556
|
+
/**
|
|
2557
|
+
* Blur
|
|
2558
|
+
* @see https://tailwindcss.com/docs/blur
|
|
2559
|
+
*/
|
|
2560
|
+
blur: [{
|
|
2561
|
+
blur: scaleBlur()
|
|
2562
|
+
}],
|
|
2563
|
+
/**
|
|
2564
|
+
* Brightness
|
|
2565
|
+
* @see https://tailwindcss.com/docs/brightness
|
|
2566
|
+
*/
|
|
2567
|
+
brightness: [{
|
|
2568
|
+
brightness: [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2569
|
+
}],
|
|
2570
|
+
/**
|
|
2571
|
+
* Contrast
|
|
2572
|
+
* @see https://tailwindcss.com/docs/contrast
|
|
2573
|
+
*/
|
|
2574
|
+
contrast: [{
|
|
2575
|
+
contrast: [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2576
|
+
}],
|
|
2577
|
+
/**
|
|
2578
|
+
* Drop Shadow
|
|
2579
|
+
* @see https://tailwindcss.com/docs/drop-shadow
|
|
2580
|
+
*/
|
|
2581
|
+
"drop-shadow": [{
|
|
2582
|
+
"drop-shadow": [
|
|
2583
|
+
// Deprecated since Tailwind CSS v4.0.0
|
|
2584
|
+
"",
|
|
2585
|
+
"none",
|
|
2586
|
+
themeDropShadow,
|
|
2587
|
+
isArbitraryVariableShadow,
|
|
2588
|
+
isArbitraryShadow
|
|
2589
|
+
]
|
|
2590
|
+
}],
|
|
2591
|
+
/**
|
|
2592
|
+
* Drop Shadow Color
|
|
2593
|
+
* @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color
|
|
2594
|
+
*/
|
|
2595
|
+
"drop-shadow-color": [{
|
|
2596
|
+
"drop-shadow": scaleColor()
|
|
2597
|
+
}],
|
|
2598
|
+
/**
|
|
2599
|
+
* Grayscale
|
|
2600
|
+
* @see https://tailwindcss.com/docs/grayscale
|
|
2601
|
+
*/
|
|
2602
|
+
grayscale: [{
|
|
2603
|
+
grayscale: ["", isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2604
|
+
}],
|
|
2605
|
+
/**
|
|
2606
|
+
* Hue Rotate
|
|
2607
|
+
* @see https://tailwindcss.com/docs/hue-rotate
|
|
2608
|
+
*/
|
|
2609
|
+
"hue-rotate": [{
|
|
2610
|
+
"hue-rotate": [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2611
|
+
}],
|
|
2612
|
+
/**
|
|
2613
|
+
* Invert
|
|
2614
|
+
* @see https://tailwindcss.com/docs/invert
|
|
2615
|
+
*/
|
|
2616
|
+
invert: [{
|
|
2617
|
+
invert: ["", isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2618
|
+
}],
|
|
2619
|
+
/**
|
|
2620
|
+
* Saturate
|
|
2621
|
+
* @see https://tailwindcss.com/docs/saturate
|
|
2622
|
+
*/
|
|
2623
|
+
saturate: [{
|
|
2624
|
+
saturate: [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2625
|
+
}],
|
|
2626
|
+
/**
|
|
2627
|
+
* Sepia
|
|
2628
|
+
* @see https://tailwindcss.com/docs/sepia
|
|
2629
|
+
*/
|
|
2630
|
+
sepia: [{
|
|
2631
|
+
sepia: ["", isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2632
|
+
}],
|
|
2633
|
+
/**
|
|
2634
|
+
* Backdrop Filter
|
|
2635
|
+
* @see https://tailwindcss.com/docs/backdrop-filter
|
|
2636
|
+
*/
|
|
2637
|
+
"backdrop-filter": [{
|
|
2638
|
+
"backdrop-filter": [
|
|
2639
|
+
// Deprecated since Tailwind CSS v3.0.0
|
|
2640
|
+
"",
|
|
2641
|
+
"none",
|
|
2642
|
+
isArbitraryVariable,
|
|
2643
|
+
isArbitraryValue
|
|
2644
|
+
]
|
|
2645
|
+
}],
|
|
2646
|
+
/**
|
|
2647
|
+
* Backdrop Blur
|
|
2648
|
+
* @see https://tailwindcss.com/docs/backdrop-blur
|
|
2649
|
+
*/
|
|
2650
|
+
"backdrop-blur": [{
|
|
2651
|
+
"backdrop-blur": scaleBlur()
|
|
2652
|
+
}],
|
|
2653
|
+
/**
|
|
2654
|
+
* Backdrop Brightness
|
|
2655
|
+
* @see https://tailwindcss.com/docs/backdrop-brightness
|
|
2656
|
+
*/
|
|
2657
|
+
"backdrop-brightness": [{
|
|
2658
|
+
"backdrop-brightness": [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2659
|
+
}],
|
|
2660
|
+
/**
|
|
2661
|
+
* Backdrop Contrast
|
|
2662
|
+
* @see https://tailwindcss.com/docs/backdrop-contrast
|
|
2663
|
+
*/
|
|
2664
|
+
"backdrop-contrast": [{
|
|
2665
|
+
"backdrop-contrast": [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2666
|
+
}],
|
|
2667
|
+
/**
|
|
2668
|
+
* Backdrop Grayscale
|
|
2669
|
+
* @see https://tailwindcss.com/docs/backdrop-grayscale
|
|
2670
|
+
*/
|
|
2671
|
+
"backdrop-grayscale": [{
|
|
2672
|
+
"backdrop-grayscale": ["", isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2673
|
+
}],
|
|
2674
|
+
/**
|
|
2675
|
+
* Backdrop Hue Rotate
|
|
2676
|
+
* @see https://tailwindcss.com/docs/backdrop-hue-rotate
|
|
2677
|
+
*/
|
|
2678
|
+
"backdrop-hue-rotate": [{
|
|
2679
|
+
"backdrop-hue-rotate": [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2680
|
+
}],
|
|
2681
|
+
/**
|
|
2682
|
+
* Backdrop Invert
|
|
2683
|
+
* @see https://tailwindcss.com/docs/backdrop-invert
|
|
2684
|
+
*/
|
|
2685
|
+
"backdrop-invert": [{
|
|
2686
|
+
"backdrop-invert": ["", isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2687
|
+
}],
|
|
2688
|
+
/**
|
|
2689
|
+
* Backdrop Opacity
|
|
2690
|
+
* @see https://tailwindcss.com/docs/backdrop-opacity
|
|
2691
|
+
*/
|
|
2692
|
+
"backdrop-opacity": [{
|
|
2693
|
+
"backdrop-opacity": [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2694
|
+
}],
|
|
2695
|
+
/**
|
|
2696
|
+
* Backdrop Saturate
|
|
2697
|
+
* @see https://tailwindcss.com/docs/backdrop-saturate
|
|
2698
|
+
*/
|
|
2699
|
+
"backdrop-saturate": [{
|
|
2700
|
+
"backdrop-saturate": [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2701
|
+
}],
|
|
2702
|
+
/**
|
|
2703
|
+
* Backdrop Sepia
|
|
2704
|
+
* @see https://tailwindcss.com/docs/backdrop-sepia
|
|
2705
|
+
*/
|
|
2706
|
+
"backdrop-sepia": [{
|
|
2707
|
+
"backdrop-sepia": ["", isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2708
|
+
}],
|
|
2709
|
+
// --------------
|
|
2710
|
+
// --- Tables ---
|
|
2711
|
+
// --------------
|
|
2712
|
+
/**
|
|
2713
|
+
* Border Collapse
|
|
2714
|
+
* @see https://tailwindcss.com/docs/border-collapse
|
|
2715
|
+
*/
|
|
2716
|
+
"border-collapse": [{
|
|
2717
|
+
border: ["collapse", "separate"]
|
|
2718
|
+
}],
|
|
2719
|
+
/**
|
|
2720
|
+
* Border Spacing
|
|
2721
|
+
* @see https://tailwindcss.com/docs/border-spacing
|
|
2722
|
+
*/
|
|
2723
|
+
"border-spacing": [{
|
|
2724
|
+
"border-spacing": scaleUnambiguousSpacing()
|
|
2725
|
+
}],
|
|
2726
|
+
/**
|
|
2727
|
+
* Border Spacing X
|
|
2728
|
+
* @see https://tailwindcss.com/docs/border-spacing
|
|
2729
|
+
*/
|
|
2730
|
+
"border-spacing-x": [{
|
|
2731
|
+
"border-spacing-x": scaleUnambiguousSpacing()
|
|
2732
|
+
}],
|
|
2733
|
+
/**
|
|
2734
|
+
* Border Spacing Y
|
|
2735
|
+
* @see https://tailwindcss.com/docs/border-spacing
|
|
2736
|
+
*/
|
|
2737
|
+
"border-spacing-y": [{
|
|
2738
|
+
"border-spacing-y": scaleUnambiguousSpacing()
|
|
2739
|
+
}],
|
|
2740
|
+
/**
|
|
2741
|
+
* Table Layout
|
|
2742
|
+
* @see https://tailwindcss.com/docs/table-layout
|
|
2743
|
+
*/
|
|
2744
|
+
"table-layout": [{
|
|
2745
|
+
table: ["auto", "fixed"]
|
|
2746
|
+
}],
|
|
2747
|
+
/**
|
|
2748
|
+
* Caption Side
|
|
2749
|
+
* @see https://tailwindcss.com/docs/caption-side
|
|
2750
|
+
*/
|
|
2751
|
+
caption: [{
|
|
2752
|
+
caption: ["top", "bottom"]
|
|
2753
|
+
}],
|
|
2754
|
+
// ---------------------------------
|
|
2755
|
+
// --- Transitions and Animation ---
|
|
2756
|
+
// ---------------------------------
|
|
2757
|
+
/**
|
|
2758
|
+
* Transition Property
|
|
2759
|
+
* @see https://tailwindcss.com/docs/transition-property
|
|
2760
|
+
*/
|
|
2761
|
+
transition: [{
|
|
2762
|
+
transition: ["", "all", "colors", "opacity", "shadow", "transform", "none", isArbitraryVariable, isArbitraryValue]
|
|
2763
|
+
}],
|
|
2764
|
+
/**
|
|
2765
|
+
* Transition Behavior
|
|
2766
|
+
* @see https://tailwindcss.com/docs/transition-behavior
|
|
2767
|
+
*/
|
|
2768
|
+
"transition-behavior": [{
|
|
2769
|
+
transition: ["normal", "discrete"]
|
|
2770
|
+
}],
|
|
2771
|
+
/**
|
|
2772
|
+
* Transition Duration
|
|
2773
|
+
* @see https://tailwindcss.com/docs/transition-duration
|
|
2774
|
+
*/
|
|
2775
|
+
duration: [{
|
|
2776
|
+
duration: [isNumber, "initial", isArbitraryVariable, isArbitraryValue]
|
|
2777
|
+
}],
|
|
2778
|
+
/**
|
|
2779
|
+
* Transition Timing Function
|
|
2780
|
+
* @see https://tailwindcss.com/docs/transition-timing-function
|
|
2781
|
+
*/
|
|
2782
|
+
ease: [{
|
|
2783
|
+
ease: ["linear", "initial", themeEase, isArbitraryVariable, isArbitraryValue]
|
|
2784
|
+
}],
|
|
2785
|
+
/**
|
|
2786
|
+
* Transition Delay
|
|
2787
|
+
* @see https://tailwindcss.com/docs/transition-delay
|
|
2788
|
+
*/
|
|
2789
|
+
delay: [{
|
|
2790
|
+
delay: [isNumber, isArbitraryVariable, isArbitraryValue]
|
|
2791
|
+
}],
|
|
2792
|
+
/**
|
|
2793
|
+
* Animation
|
|
2794
|
+
* @see https://tailwindcss.com/docs/animation
|
|
2795
|
+
*/
|
|
2796
|
+
animate: [{
|
|
2797
|
+
animate: ["none", themeAnimate, isArbitraryVariable, isArbitraryValue]
|
|
2798
|
+
}],
|
|
2799
|
+
// ------------------
|
|
2800
|
+
// --- Transforms ---
|
|
2801
|
+
// ------------------
|
|
2802
|
+
/**
|
|
2803
|
+
* Backface Visibility
|
|
2804
|
+
* @see https://tailwindcss.com/docs/backface-visibility
|
|
2805
|
+
*/
|
|
2806
|
+
backface: [{
|
|
2807
|
+
backface: ["hidden", "visible"]
|
|
2808
|
+
}],
|
|
2809
|
+
/**
|
|
2810
|
+
* Perspective
|
|
2811
|
+
* @see https://tailwindcss.com/docs/perspective
|
|
2812
|
+
*/
|
|
2813
|
+
perspective: [{
|
|
2814
|
+
perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]
|
|
2815
|
+
}],
|
|
2816
|
+
/**
|
|
2817
|
+
* Perspective Origin
|
|
2818
|
+
* @see https://tailwindcss.com/docs/perspective-origin
|
|
2819
|
+
*/
|
|
2820
|
+
"perspective-origin": [{
|
|
2821
|
+
"perspective-origin": scalePositionWithArbitrary()
|
|
2822
|
+
}],
|
|
2823
|
+
/**
|
|
2824
|
+
* Rotate
|
|
2825
|
+
* @see https://tailwindcss.com/docs/rotate
|
|
2826
|
+
*/
|
|
2827
|
+
rotate: [{
|
|
2828
|
+
rotate: scaleRotate()
|
|
2829
|
+
}],
|
|
2830
|
+
/**
|
|
2831
|
+
* Rotate X
|
|
2832
|
+
* @see https://tailwindcss.com/docs/rotate
|
|
2833
|
+
*/
|
|
2834
|
+
"rotate-x": [{
|
|
2835
|
+
"rotate-x": scaleRotate()
|
|
2836
|
+
}],
|
|
2837
|
+
/**
|
|
2838
|
+
* Rotate Y
|
|
2839
|
+
* @see https://tailwindcss.com/docs/rotate
|
|
2840
|
+
*/
|
|
2841
|
+
"rotate-y": [{
|
|
2842
|
+
"rotate-y": scaleRotate()
|
|
2843
|
+
}],
|
|
2844
|
+
/**
|
|
2845
|
+
* Rotate Z
|
|
2846
|
+
* @see https://tailwindcss.com/docs/rotate
|
|
2847
|
+
*/
|
|
2848
|
+
"rotate-z": [{
|
|
2849
|
+
"rotate-z": scaleRotate()
|
|
2850
|
+
}],
|
|
2851
|
+
/**
|
|
2852
|
+
* Scale
|
|
2853
|
+
* @see https://tailwindcss.com/docs/scale
|
|
2854
|
+
*/
|
|
2855
|
+
scale: [{
|
|
2856
|
+
scale: scaleScale()
|
|
2857
|
+
}],
|
|
2858
|
+
/**
|
|
2859
|
+
* Scale X
|
|
2860
|
+
* @see https://tailwindcss.com/docs/scale
|
|
2861
|
+
*/
|
|
2862
|
+
"scale-x": [{
|
|
2863
|
+
"scale-x": scaleScale()
|
|
2864
|
+
}],
|
|
2865
|
+
/**
|
|
2866
|
+
* Scale Y
|
|
2867
|
+
* @see https://tailwindcss.com/docs/scale
|
|
2868
|
+
*/
|
|
2869
|
+
"scale-y": [{
|
|
2870
|
+
"scale-y": scaleScale()
|
|
2871
|
+
}],
|
|
2872
|
+
/**
|
|
2873
|
+
* Scale Z
|
|
2874
|
+
* @see https://tailwindcss.com/docs/scale
|
|
2875
|
+
*/
|
|
2876
|
+
"scale-z": [{
|
|
2877
|
+
"scale-z": scaleScale()
|
|
2878
|
+
}],
|
|
2879
|
+
/**
|
|
2880
|
+
* Scale 3D
|
|
2881
|
+
* @see https://tailwindcss.com/docs/scale
|
|
2882
|
+
*/
|
|
2883
|
+
"scale-3d": ["scale-3d"],
|
|
2884
|
+
/**
|
|
2885
|
+
* Skew
|
|
2886
|
+
* @see https://tailwindcss.com/docs/skew
|
|
2887
|
+
*/
|
|
2888
|
+
skew: [{
|
|
2889
|
+
skew: scaleSkew()
|
|
2890
|
+
}],
|
|
2891
|
+
/**
|
|
2892
|
+
* Skew X
|
|
2893
|
+
* @see https://tailwindcss.com/docs/skew
|
|
2894
|
+
*/
|
|
2895
|
+
"skew-x": [{
|
|
2896
|
+
"skew-x": scaleSkew()
|
|
2897
|
+
}],
|
|
2898
|
+
/**
|
|
2899
|
+
* Skew Y
|
|
2900
|
+
* @see https://tailwindcss.com/docs/skew
|
|
2901
|
+
*/
|
|
2902
|
+
"skew-y": [{
|
|
2903
|
+
"skew-y": scaleSkew()
|
|
2904
|
+
}],
|
|
2905
|
+
/**
|
|
2906
|
+
* Transform
|
|
2907
|
+
* @see https://tailwindcss.com/docs/transform
|
|
2908
|
+
*/
|
|
2909
|
+
transform: [{
|
|
2910
|
+
transform: [isArbitraryVariable, isArbitraryValue, "", "none", "gpu", "cpu"]
|
|
2911
|
+
}],
|
|
2912
|
+
/**
|
|
2913
|
+
* Transform Origin
|
|
2914
|
+
* @see https://tailwindcss.com/docs/transform-origin
|
|
2915
|
+
*/
|
|
2916
|
+
"transform-origin": [{
|
|
2917
|
+
origin: scalePositionWithArbitrary()
|
|
2918
|
+
}],
|
|
2919
|
+
/**
|
|
2920
|
+
* Transform Style
|
|
2921
|
+
* @see https://tailwindcss.com/docs/transform-style
|
|
2922
|
+
*/
|
|
2923
|
+
"transform-style": [{
|
|
2924
|
+
transform: ["3d", "flat"]
|
|
2925
|
+
}],
|
|
2926
|
+
/**
|
|
2927
|
+
* Translate
|
|
2928
|
+
* @see https://tailwindcss.com/docs/translate
|
|
2929
|
+
*/
|
|
2930
|
+
translate: [{
|
|
2931
|
+
translate: scaleTranslate()
|
|
2932
|
+
}],
|
|
2933
|
+
/**
|
|
2934
|
+
* Translate X
|
|
2935
|
+
* @see https://tailwindcss.com/docs/translate
|
|
2936
|
+
*/
|
|
2937
|
+
"translate-x": [{
|
|
2938
|
+
"translate-x": scaleTranslate()
|
|
2939
|
+
}],
|
|
2940
|
+
/**
|
|
2941
|
+
* Translate Y
|
|
2942
|
+
* @see https://tailwindcss.com/docs/translate
|
|
2943
|
+
*/
|
|
2944
|
+
"translate-y": [{
|
|
2945
|
+
"translate-y": scaleTranslate()
|
|
2946
|
+
}],
|
|
2947
|
+
/**
|
|
2948
|
+
* Translate Z
|
|
2949
|
+
* @see https://tailwindcss.com/docs/translate
|
|
2950
|
+
*/
|
|
2951
|
+
"translate-z": [{
|
|
2952
|
+
"translate-z": scaleTranslate()
|
|
2953
|
+
}],
|
|
2954
|
+
/**
|
|
2955
|
+
* Translate None
|
|
2956
|
+
* @see https://tailwindcss.com/docs/translate
|
|
2957
|
+
*/
|
|
2958
|
+
"translate-none": ["translate-none"],
|
|
2959
|
+
// ---------------------
|
|
2960
|
+
// --- Interactivity ---
|
|
2961
|
+
// ---------------------
|
|
2962
|
+
/**
|
|
2963
|
+
* Accent Color
|
|
2964
|
+
* @see https://tailwindcss.com/docs/accent-color
|
|
2965
|
+
*/
|
|
2966
|
+
accent: [{
|
|
2967
|
+
accent: scaleColor()
|
|
2968
|
+
}],
|
|
2969
|
+
/**
|
|
2970
|
+
* Appearance
|
|
2971
|
+
* @see https://tailwindcss.com/docs/appearance
|
|
2972
|
+
*/
|
|
2973
|
+
appearance: [{
|
|
2974
|
+
appearance: ["none", "auto"]
|
|
2975
|
+
}],
|
|
2976
|
+
/**
|
|
2977
|
+
* Caret Color
|
|
2978
|
+
* @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
|
|
2979
|
+
*/
|
|
2980
|
+
"caret-color": [{
|
|
2981
|
+
caret: scaleColor()
|
|
2982
|
+
}],
|
|
2983
|
+
/**
|
|
2984
|
+
* Color Scheme
|
|
2985
|
+
* @see https://tailwindcss.com/docs/color-scheme
|
|
2986
|
+
*/
|
|
2987
|
+
"color-scheme": [{
|
|
2988
|
+
scheme: ["normal", "dark", "light", "light-dark", "only-dark", "only-light"]
|
|
2989
|
+
}],
|
|
2990
|
+
/**
|
|
2991
|
+
* Cursor
|
|
2992
|
+
* @see https://tailwindcss.com/docs/cursor
|
|
2993
|
+
*/
|
|
2994
|
+
cursor: [{
|
|
2995
|
+
cursor: ["auto", "default", "pointer", "wait", "text", "move", "help", "not-allowed", "none", "context-menu", "progress", "cell", "crosshair", "vertical-text", "alias", "copy", "no-drop", "grab", "grabbing", "all-scroll", "col-resize", "row-resize", "n-resize", "e-resize", "s-resize", "w-resize", "ne-resize", "nw-resize", "se-resize", "sw-resize", "ew-resize", "ns-resize", "nesw-resize", "nwse-resize", "zoom-in", "zoom-out", isArbitraryVariable, isArbitraryValue]
|
|
2996
|
+
}],
|
|
2997
|
+
/**
|
|
2998
|
+
* Field Sizing
|
|
2999
|
+
* @see https://tailwindcss.com/docs/field-sizing
|
|
3000
|
+
*/
|
|
3001
|
+
"field-sizing": [{
|
|
3002
|
+
"field-sizing": ["fixed", "content"]
|
|
3003
|
+
}],
|
|
3004
|
+
/**
|
|
3005
|
+
* Pointer Events
|
|
3006
|
+
* @see https://tailwindcss.com/docs/pointer-events
|
|
3007
|
+
*/
|
|
3008
|
+
"pointer-events": [{
|
|
3009
|
+
"pointer-events": ["auto", "none"]
|
|
3010
|
+
}],
|
|
3011
|
+
/**
|
|
3012
|
+
* Resize
|
|
3013
|
+
* @see https://tailwindcss.com/docs/resize
|
|
3014
|
+
*/
|
|
3015
|
+
resize: [{
|
|
3016
|
+
resize: ["none", "", "y", "x"]
|
|
3017
|
+
}],
|
|
3018
|
+
/**
|
|
3019
|
+
* Scroll Behavior
|
|
3020
|
+
* @see https://tailwindcss.com/docs/scroll-behavior
|
|
3021
|
+
*/
|
|
3022
|
+
"scroll-behavior": [{
|
|
3023
|
+
scroll: ["auto", "smooth"]
|
|
3024
|
+
}],
|
|
3025
|
+
/**
|
|
3026
|
+
* Scroll Margin
|
|
3027
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3028
|
+
*/
|
|
3029
|
+
"scroll-m": [{
|
|
3030
|
+
"scroll-m": scaleUnambiguousSpacing()
|
|
3031
|
+
}],
|
|
3032
|
+
/**
|
|
3033
|
+
* Scroll Margin Inline
|
|
3034
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3035
|
+
*/
|
|
3036
|
+
"scroll-mx": [{
|
|
3037
|
+
"scroll-mx": scaleUnambiguousSpacing()
|
|
3038
|
+
}],
|
|
3039
|
+
/**
|
|
3040
|
+
* Scroll Margin Block
|
|
3041
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3042
|
+
*/
|
|
3043
|
+
"scroll-my": [{
|
|
3044
|
+
"scroll-my": scaleUnambiguousSpacing()
|
|
3045
|
+
}],
|
|
3046
|
+
/**
|
|
3047
|
+
* Scroll Margin Inline Start
|
|
3048
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3049
|
+
*/
|
|
3050
|
+
"scroll-ms": [{
|
|
3051
|
+
"scroll-ms": scaleUnambiguousSpacing()
|
|
3052
|
+
}],
|
|
3053
|
+
/**
|
|
3054
|
+
* Scroll Margin Inline End
|
|
3055
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3056
|
+
*/
|
|
3057
|
+
"scroll-me": [{
|
|
3058
|
+
"scroll-me": scaleUnambiguousSpacing()
|
|
3059
|
+
}],
|
|
3060
|
+
/**
|
|
3061
|
+
* Scroll Margin Block Start
|
|
3062
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3063
|
+
*/
|
|
3064
|
+
"scroll-mbs": [{
|
|
3065
|
+
"scroll-mbs": scaleUnambiguousSpacing()
|
|
3066
|
+
}],
|
|
3067
|
+
/**
|
|
3068
|
+
* Scroll Margin Block End
|
|
3069
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3070
|
+
*/
|
|
3071
|
+
"scroll-mbe": [{
|
|
3072
|
+
"scroll-mbe": scaleUnambiguousSpacing()
|
|
3073
|
+
}],
|
|
3074
|
+
/**
|
|
3075
|
+
* Scroll Margin Top
|
|
3076
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3077
|
+
*/
|
|
3078
|
+
"scroll-mt": [{
|
|
3079
|
+
"scroll-mt": scaleUnambiguousSpacing()
|
|
3080
|
+
}],
|
|
3081
|
+
/**
|
|
3082
|
+
* Scroll Margin Right
|
|
3083
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3084
|
+
*/
|
|
3085
|
+
"scroll-mr": [{
|
|
3086
|
+
"scroll-mr": scaleUnambiguousSpacing()
|
|
3087
|
+
}],
|
|
3088
|
+
/**
|
|
3089
|
+
* Scroll Margin Bottom
|
|
3090
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3091
|
+
*/
|
|
3092
|
+
"scroll-mb": [{
|
|
3093
|
+
"scroll-mb": scaleUnambiguousSpacing()
|
|
3094
|
+
}],
|
|
3095
|
+
/**
|
|
3096
|
+
* Scroll Margin Left
|
|
3097
|
+
* @see https://tailwindcss.com/docs/scroll-margin
|
|
3098
|
+
*/
|
|
3099
|
+
"scroll-ml": [{
|
|
3100
|
+
"scroll-ml": scaleUnambiguousSpacing()
|
|
3101
|
+
}],
|
|
3102
|
+
/**
|
|
3103
|
+
* Scroll Padding
|
|
3104
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3105
|
+
*/
|
|
3106
|
+
"scroll-p": [{
|
|
3107
|
+
"scroll-p": scaleUnambiguousSpacing()
|
|
3108
|
+
}],
|
|
3109
|
+
/**
|
|
3110
|
+
* Scroll Padding Inline
|
|
3111
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3112
|
+
*/
|
|
3113
|
+
"scroll-px": [{
|
|
3114
|
+
"scroll-px": scaleUnambiguousSpacing()
|
|
3115
|
+
}],
|
|
3116
|
+
/**
|
|
3117
|
+
* Scroll Padding Block
|
|
3118
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3119
|
+
*/
|
|
3120
|
+
"scroll-py": [{
|
|
3121
|
+
"scroll-py": scaleUnambiguousSpacing()
|
|
3122
|
+
}],
|
|
3123
|
+
/**
|
|
3124
|
+
* Scroll Padding Inline Start
|
|
3125
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3126
|
+
*/
|
|
3127
|
+
"scroll-ps": [{
|
|
3128
|
+
"scroll-ps": scaleUnambiguousSpacing()
|
|
3129
|
+
}],
|
|
3130
|
+
/**
|
|
3131
|
+
* Scroll Padding Inline End
|
|
3132
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3133
|
+
*/
|
|
3134
|
+
"scroll-pe": [{
|
|
3135
|
+
"scroll-pe": scaleUnambiguousSpacing()
|
|
3136
|
+
}],
|
|
3137
|
+
/**
|
|
3138
|
+
* Scroll Padding Block Start
|
|
3139
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3140
|
+
*/
|
|
3141
|
+
"scroll-pbs": [{
|
|
3142
|
+
"scroll-pbs": scaleUnambiguousSpacing()
|
|
3143
|
+
}],
|
|
3144
|
+
/**
|
|
3145
|
+
* Scroll Padding Block End
|
|
3146
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3147
|
+
*/
|
|
3148
|
+
"scroll-pbe": [{
|
|
3149
|
+
"scroll-pbe": scaleUnambiguousSpacing()
|
|
3150
|
+
}],
|
|
3151
|
+
/**
|
|
3152
|
+
* Scroll Padding Top
|
|
3153
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3154
|
+
*/
|
|
3155
|
+
"scroll-pt": [{
|
|
3156
|
+
"scroll-pt": scaleUnambiguousSpacing()
|
|
3157
|
+
}],
|
|
3158
|
+
/**
|
|
3159
|
+
* Scroll Padding Right
|
|
3160
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3161
|
+
*/
|
|
3162
|
+
"scroll-pr": [{
|
|
3163
|
+
"scroll-pr": scaleUnambiguousSpacing()
|
|
3164
|
+
}],
|
|
3165
|
+
/**
|
|
3166
|
+
* Scroll Padding Bottom
|
|
3167
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3168
|
+
*/
|
|
3169
|
+
"scroll-pb": [{
|
|
3170
|
+
"scroll-pb": scaleUnambiguousSpacing()
|
|
3171
|
+
}],
|
|
3172
|
+
/**
|
|
3173
|
+
* Scroll Padding Left
|
|
3174
|
+
* @see https://tailwindcss.com/docs/scroll-padding
|
|
3175
|
+
*/
|
|
3176
|
+
"scroll-pl": [{
|
|
3177
|
+
"scroll-pl": scaleUnambiguousSpacing()
|
|
3178
|
+
}],
|
|
3179
|
+
/**
|
|
3180
|
+
* Scroll Snap Align
|
|
3181
|
+
* @see https://tailwindcss.com/docs/scroll-snap-align
|
|
3182
|
+
*/
|
|
3183
|
+
"snap-align": [{
|
|
3184
|
+
snap: ["start", "end", "center", "align-none"]
|
|
3185
|
+
}],
|
|
3186
|
+
/**
|
|
3187
|
+
* Scroll Snap Stop
|
|
3188
|
+
* @see https://tailwindcss.com/docs/scroll-snap-stop
|
|
3189
|
+
*/
|
|
3190
|
+
"snap-stop": [{
|
|
3191
|
+
snap: ["normal", "always"]
|
|
3192
|
+
}],
|
|
3193
|
+
/**
|
|
3194
|
+
* Scroll Snap Type
|
|
3195
|
+
* @see https://tailwindcss.com/docs/scroll-snap-type
|
|
3196
|
+
*/
|
|
3197
|
+
"snap-type": [{
|
|
3198
|
+
snap: ["none", "x", "y", "both"]
|
|
3199
|
+
}],
|
|
3200
|
+
/**
|
|
3201
|
+
* Scroll Snap Type Strictness
|
|
3202
|
+
* @see https://tailwindcss.com/docs/scroll-snap-type
|
|
3203
|
+
*/
|
|
3204
|
+
"snap-strictness": [{
|
|
3205
|
+
snap: ["mandatory", "proximity"]
|
|
3206
|
+
}],
|
|
3207
|
+
/**
|
|
3208
|
+
* Touch Action
|
|
3209
|
+
* @see https://tailwindcss.com/docs/touch-action
|
|
3210
|
+
*/
|
|
3211
|
+
touch: [{
|
|
3212
|
+
touch: ["auto", "none", "manipulation"]
|
|
3213
|
+
}],
|
|
3214
|
+
/**
|
|
3215
|
+
* Touch Action X
|
|
3216
|
+
* @see https://tailwindcss.com/docs/touch-action
|
|
3217
|
+
*/
|
|
3218
|
+
"touch-x": [{
|
|
3219
|
+
"touch-pan": ["x", "left", "right"]
|
|
3220
|
+
}],
|
|
3221
|
+
/**
|
|
3222
|
+
* Touch Action Y
|
|
3223
|
+
* @see https://tailwindcss.com/docs/touch-action
|
|
3224
|
+
*/
|
|
3225
|
+
"touch-y": [{
|
|
3226
|
+
"touch-pan": ["y", "up", "down"]
|
|
3227
|
+
}],
|
|
3228
|
+
/**
|
|
3229
|
+
* Touch Action Pinch Zoom
|
|
3230
|
+
* @see https://tailwindcss.com/docs/touch-action
|
|
3231
|
+
*/
|
|
3232
|
+
"touch-pz": ["touch-pinch-zoom"],
|
|
3233
|
+
/**
|
|
3234
|
+
* User Select
|
|
3235
|
+
* @see https://tailwindcss.com/docs/user-select
|
|
3236
|
+
*/
|
|
3237
|
+
select: [{
|
|
3238
|
+
select: ["none", "text", "all", "auto"]
|
|
3239
|
+
}],
|
|
3240
|
+
/**
|
|
3241
|
+
* Will Change
|
|
3242
|
+
* @see https://tailwindcss.com/docs/will-change
|
|
3243
|
+
*/
|
|
3244
|
+
"will-change": [{
|
|
3245
|
+
"will-change": ["auto", "scroll", "contents", "transform", isArbitraryVariable, isArbitraryValue]
|
|
3246
|
+
}],
|
|
3247
|
+
// -----------
|
|
3248
|
+
// --- SVG ---
|
|
3249
|
+
// -----------
|
|
3250
|
+
/**
|
|
3251
|
+
* Fill
|
|
3252
|
+
* @see https://tailwindcss.com/docs/fill
|
|
3253
|
+
*/
|
|
3254
|
+
fill: [{
|
|
3255
|
+
fill: ["none", ...scaleColor()]
|
|
3256
|
+
}],
|
|
3257
|
+
/**
|
|
3258
|
+
* Stroke Width
|
|
3259
|
+
* @see https://tailwindcss.com/docs/stroke-width
|
|
3260
|
+
*/
|
|
3261
|
+
"stroke-w": [{
|
|
3262
|
+
stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]
|
|
3263
|
+
}],
|
|
3264
|
+
/**
|
|
3265
|
+
* Stroke
|
|
3266
|
+
* @see https://tailwindcss.com/docs/stroke
|
|
3267
|
+
*/
|
|
3268
|
+
stroke: [{
|
|
3269
|
+
stroke: ["none", ...scaleColor()]
|
|
3270
|
+
}],
|
|
3271
|
+
// ---------------------
|
|
3272
|
+
// --- Accessibility ---
|
|
3273
|
+
// ---------------------
|
|
3274
|
+
/**
|
|
3275
|
+
* Forced Color Adjust
|
|
3276
|
+
* @see https://tailwindcss.com/docs/forced-color-adjust
|
|
3277
|
+
*/
|
|
3278
|
+
"forced-color-adjust": [{
|
|
3279
|
+
"forced-color-adjust": ["auto", "none"]
|
|
3280
|
+
}]
|
|
3281
|
+
},
|
|
3282
|
+
conflictingClassGroups: {
|
|
3283
|
+
overflow: ["overflow-x", "overflow-y"],
|
|
3284
|
+
overscroll: ["overscroll-x", "overscroll-y"],
|
|
3285
|
+
inset: ["inset-x", "inset-y", "inset-bs", "inset-be", "start", "end", "top", "right", "bottom", "left"],
|
|
3286
|
+
"inset-x": ["right", "left"],
|
|
3287
|
+
"inset-y": ["top", "bottom"],
|
|
3288
|
+
flex: ["basis", "grow", "shrink"],
|
|
3289
|
+
gap: ["gap-x", "gap-y"],
|
|
3290
|
+
p: ["px", "py", "ps", "pe", "pbs", "pbe", "pt", "pr", "pb", "pl"],
|
|
3291
|
+
px: ["pr", "pl"],
|
|
3292
|
+
py: ["pt", "pb"],
|
|
3293
|
+
m: ["mx", "my", "ms", "me", "mbs", "mbe", "mt", "mr", "mb", "ml"],
|
|
3294
|
+
mx: ["mr", "ml"],
|
|
3295
|
+
my: ["mt", "mb"],
|
|
3296
|
+
size: ["w", "h"],
|
|
3297
|
+
"font-size": ["leading"],
|
|
3298
|
+
"fvn-normal": ["fvn-ordinal", "fvn-slashed-zero", "fvn-figure", "fvn-spacing", "fvn-fraction"],
|
|
3299
|
+
"fvn-ordinal": ["fvn-normal"],
|
|
3300
|
+
"fvn-slashed-zero": ["fvn-normal"],
|
|
3301
|
+
"fvn-figure": ["fvn-normal"],
|
|
3302
|
+
"fvn-spacing": ["fvn-normal"],
|
|
3303
|
+
"fvn-fraction": ["fvn-normal"],
|
|
3304
|
+
"line-clamp": ["display", "overflow"],
|
|
3305
|
+
rounded: ["rounded-s", "rounded-e", "rounded-t", "rounded-r", "rounded-b", "rounded-l", "rounded-ss", "rounded-se", "rounded-ee", "rounded-es", "rounded-tl", "rounded-tr", "rounded-br", "rounded-bl"],
|
|
3306
|
+
"rounded-s": ["rounded-ss", "rounded-es"],
|
|
3307
|
+
"rounded-e": ["rounded-se", "rounded-ee"],
|
|
3308
|
+
"rounded-t": ["rounded-tl", "rounded-tr"],
|
|
3309
|
+
"rounded-r": ["rounded-tr", "rounded-br"],
|
|
3310
|
+
"rounded-b": ["rounded-br", "rounded-bl"],
|
|
3311
|
+
"rounded-l": ["rounded-tl", "rounded-bl"],
|
|
3312
|
+
"border-spacing": ["border-spacing-x", "border-spacing-y"],
|
|
3313
|
+
"border-w": ["border-w-x", "border-w-y", "border-w-s", "border-w-e", "border-w-bs", "border-w-be", "border-w-t", "border-w-r", "border-w-b", "border-w-l"],
|
|
3314
|
+
"border-w-x": ["border-w-r", "border-w-l"],
|
|
3315
|
+
"border-w-y": ["border-w-t", "border-w-b"],
|
|
3316
|
+
"border-color": ["border-color-x", "border-color-y", "border-color-s", "border-color-e", "border-color-bs", "border-color-be", "border-color-t", "border-color-r", "border-color-b", "border-color-l"],
|
|
3317
|
+
"border-color-x": ["border-color-r", "border-color-l"],
|
|
3318
|
+
"border-color-y": ["border-color-t", "border-color-b"],
|
|
3319
|
+
translate: ["translate-x", "translate-y", "translate-none"],
|
|
3320
|
+
"translate-none": ["translate", "translate-x", "translate-y", "translate-z"],
|
|
3321
|
+
"scroll-m": ["scroll-mx", "scroll-my", "scroll-ms", "scroll-me", "scroll-mbs", "scroll-mbe", "scroll-mt", "scroll-mr", "scroll-mb", "scroll-ml"],
|
|
3322
|
+
"scroll-mx": ["scroll-mr", "scroll-ml"],
|
|
3323
|
+
"scroll-my": ["scroll-mt", "scroll-mb"],
|
|
3324
|
+
"scroll-p": ["scroll-px", "scroll-py", "scroll-ps", "scroll-pe", "scroll-pbs", "scroll-pbe", "scroll-pt", "scroll-pr", "scroll-pb", "scroll-pl"],
|
|
3325
|
+
"scroll-px": ["scroll-pr", "scroll-pl"],
|
|
3326
|
+
"scroll-py": ["scroll-pt", "scroll-pb"],
|
|
3327
|
+
touch: ["touch-x", "touch-y", "touch-pz"],
|
|
3328
|
+
"touch-x": ["touch"],
|
|
3329
|
+
"touch-y": ["touch"],
|
|
3330
|
+
"touch-pz": ["touch"]
|
|
3331
|
+
},
|
|
3332
|
+
conflictingClassGroupModifiers: {
|
|
3333
|
+
"font-size": ["leading"]
|
|
3334
|
+
},
|
|
3335
|
+
orderSensitiveModifiers: ["*", "**", "after", "backdrop", "before", "details-content", "file", "first-letter", "first-line", "marker", "placeholder", "selection"]
|
|
3336
|
+
};
|
|
3337
|
+
};
|
|
3338
|
+
const twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
|
|
3339
|
+
function cn(...inputs) {
|
|
3340
|
+
return twMerge(clsx(inputs));
|
|
3341
|
+
}
|
|
3342
|
+
const MessageContext = React.createContext({
|
|
3343
|
+
direction: "in",
|
|
3344
|
+
top: false,
|
|
3345
|
+
group: false
|
|
3346
|
+
});
|
|
3347
|
+
function useMessage() {
|
|
3348
|
+
return React.useContext(MessageContext);
|
|
3349
|
+
}
|
|
3350
|
+
function StatusIcon({ status, className }) {
|
|
3351
|
+
if (status === "sending") {
|
|
3352
|
+
return /* @__PURE__ */ jsx(StatusSendingIcon, { className: cn("size-3.5", className) });
|
|
3353
|
+
}
|
|
3354
|
+
if (status === "sent") {
|
|
3355
|
+
return /* @__PURE__ */ jsx(StatusSentIcon, { className: cn("size-4", className) });
|
|
3356
|
+
}
|
|
3357
|
+
return /* @__PURE__ */ jsx(
|
|
3358
|
+
StatusDoubleCheckIcon,
|
|
3359
|
+
{
|
|
3360
|
+
className: cn("size-4", status === "read" && "text-wa-read", className)
|
|
3361
|
+
}
|
|
3362
|
+
);
|
|
3363
|
+
}
|
|
3364
|
+
function Message({
|
|
3365
|
+
direction,
|
|
3366
|
+
top = false,
|
|
3367
|
+
group = false,
|
|
3368
|
+
avatarUrl,
|
|
3369
|
+
senderName,
|
|
3370
|
+
children,
|
|
3371
|
+
className,
|
|
3372
|
+
mode = "custom",
|
|
3373
|
+
time,
|
|
3374
|
+
status
|
|
3375
|
+
}) {
|
|
3376
|
+
const isOut = direction === "out";
|
|
3377
|
+
const TimeRow = () => /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-0.5 text-xs font-medium text-wa-text-secondary", children: [
|
|
3378
|
+
time,
|
|
3379
|
+
isOut && status !== void 0 && /* @__PURE__ */ jsx(StatusIcon, { status })
|
|
3380
|
+
] });
|
|
3381
|
+
const Tail = () => top ? /* @__PURE__ */ jsx(
|
|
3382
|
+
"span",
|
|
3383
|
+
{
|
|
3384
|
+
"aria-hidden": "true",
|
|
3385
|
+
className: cn(
|
|
3386
|
+
"pointer-events-none absolute top-0",
|
|
3387
|
+
isOut ? "-right-2 text-wa-bubble-out" : "-left-2 scale-x-[-1] text-wa-bubble-in"
|
|
3388
|
+
),
|
|
3389
|
+
children: /* @__PURE__ */ jsx(BubbleTailIcon, {})
|
|
3390
|
+
}
|
|
3391
|
+
) : null;
|
|
3392
|
+
const renderNeutral = () => /* @__PURE__ */ jsxs(
|
|
3393
|
+
"div",
|
|
3394
|
+
{
|
|
3395
|
+
className: cn(
|
|
3396
|
+
"relative w-fit rounded-wa-bubble px-3 py-1.5 shadow-md",
|
|
3397
|
+
isOut ? "bg-wa-bubble-out text-wa-text-primary" : "bg-wa-bubble-in text-wa-text-primary",
|
|
3398
|
+
top && isOut && "rounded-tr-none",
|
|
3399
|
+
top && !isOut && "rounded-tl-none"
|
|
3400
|
+
),
|
|
3401
|
+
children: [
|
|
3402
|
+
/* @__PURE__ */ jsx(Tail, {}),
|
|
3403
|
+
children,
|
|
3404
|
+
/* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute bottom-1 right-2", children: /* @__PURE__ */ jsx(TimeRow, {}) })
|
|
3405
|
+
]
|
|
3406
|
+
}
|
|
3407
|
+
);
|
|
3408
|
+
const renderFree = () => /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
3409
|
+
children,
|
|
3410
|
+
/* @__PURE__ */ jsx(
|
|
3411
|
+
"div",
|
|
3412
|
+
{
|
|
3413
|
+
className: cn(
|
|
3414
|
+
"mt-[5px] self-end rounded-full px-1.5 py-0.5",
|
|
3415
|
+
isOut ? "bg-wa-bubble-out" : "bg-wa-bubble-in"
|
|
3416
|
+
),
|
|
3417
|
+
children: /* @__PURE__ */ jsx(TimeRow, {})
|
|
3418
|
+
}
|
|
3419
|
+
)
|
|
3420
|
+
] });
|
|
3421
|
+
return /* @__PURE__ */ jsx(
|
|
3422
|
+
MessageContext.Provider,
|
|
3423
|
+
{
|
|
3424
|
+
value: {
|
|
3425
|
+
direction,
|
|
3426
|
+
top,
|
|
3427
|
+
group,
|
|
3428
|
+
...senderName !== void 0 ? { senderName } : {},
|
|
3429
|
+
...avatarUrl !== void 0 ? { avatarUrl } : {},
|
|
3430
|
+
...time !== void 0 ? { time } : {},
|
|
3431
|
+
...status !== void 0 ? { status } : {}
|
|
3432
|
+
},
|
|
3433
|
+
children: /* @__PURE__ */ jsxs(
|
|
3434
|
+
"div",
|
|
3435
|
+
{
|
|
3436
|
+
className: cn(
|
|
3437
|
+
"@container relative flex px-2",
|
|
3438
|
+
top ? "pt-[10px] pb-0.5" : "pt-[1px] pb-0.5",
|
|
3439
|
+
isOut ? "justify-end" : "justify-start",
|
|
3440
|
+
className
|
|
3441
|
+
),
|
|
3442
|
+
children: [
|
|
3443
|
+
top && group && !isOut && /* @__PURE__ */ jsx(
|
|
3444
|
+
"span",
|
|
3445
|
+
{
|
|
3446
|
+
className: "absolute -left-10 top-2 flex size-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-wa-avatar",
|
|
3447
|
+
"aria-hidden": "true",
|
|
3448
|
+
children: avatarUrl ? /* @__PURE__ */ jsx("img", { src: avatarUrl, alt: "", className: "size-full object-cover" }) : /* @__PURE__ */ jsx(AvatarPlaceholderIcon, { className: "size-5 text-wa-text-secondary" })
|
|
3449
|
+
}
|
|
3450
|
+
),
|
|
3451
|
+
mode === "neutral" && renderNeutral(),
|
|
3452
|
+
mode === "free" && renderFree(),
|
|
3453
|
+
mode === "custom" && children
|
|
3454
|
+
]
|
|
3455
|
+
}
|
|
3456
|
+
)
|
|
3457
|
+
}
|
|
3458
|
+
);
|
|
3459
|
+
}
|
|
3460
|
+
const SENDER_COLORS = [
|
|
3461
|
+
"#e91e8c",
|
|
3462
|
+
"#9c27b0",
|
|
3463
|
+
"#673ab7",
|
|
3464
|
+
"#2196f3",
|
|
3465
|
+
"#009688",
|
|
3466
|
+
"#4caf50",
|
|
3467
|
+
"#ff9800",
|
|
3468
|
+
"#ff5722",
|
|
3469
|
+
"#00bcd4",
|
|
3470
|
+
"#f06292",
|
|
3471
|
+
"#ef5350",
|
|
3472
|
+
"#26c6da"
|
|
3473
|
+
];
|
|
3474
|
+
function senderColor(name) {
|
|
3475
|
+
let hash = 0;
|
|
3476
|
+
for (let i = 0; i < name.length; i++) {
|
|
3477
|
+
hash = hash * 31 + name.charCodeAt(i) & 65535;
|
|
3478
|
+
}
|
|
3479
|
+
return SENDER_COLORS[hash % SENDER_COLORS.length] ?? "#2196f3";
|
|
3480
|
+
}
|
|
3481
|
+
function Text({ content, className }) {
|
|
3482
|
+
const { direction, top, group, senderName, time, status } = useMessage();
|
|
3483
|
+
const isOut = direction === "out";
|
|
3484
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("max-w-[65cqw] text-sm", className), children: [
|
|
3485
|
+
top && group && !isOut && senderName && /* @__PURE__ */ jsx(
|
|
3486
|
+
"p",
|
|
3487
|
+
{
|
|
3488
|
+
className: "mb-0.5 text-xs font-semibold leading-tight",
|
|
3489
|
+
style: { color: senderColor(senderName) },
|
|
3490
|
+
children: senderName
|
|
3491
|
+
}
|
|
3492
|
+
),
|
|
3493
|
+
/* @__PURE__ */ jsxs("p", { className: "whitespace-pre-wrap break-words leading-relaxed", children: [
|
|
3494
|
+
content,
|
|
3495
|
+
/* @__PURE__ */ jsxs(
|
|
3496
|
+
"span",
|
|
3497
|
+
{
|
|
3498
|
+
className: "pointer-events-none invisible inline-flex select-none items-end gap-0.5 pl-1 text-xs",
|
|
3499
|
+
"aria-hidden": "true",
|
|
3500
|
+
children: [
|
|
3501
|
+
time,
|
|
3502
|
+
isOut && status && /* @__PURE__ */ jsx(StatusIcon, { status })
|
|
3503
|
+
]
|
|
3504
|
+
}
|
|
3505
|
+
)
|
|
3506
|
+
] })
|
|
3507
|
+
] });
|
|
3508
|
+
}
|
|
3509
|
+
function Emoji({ content, time, status, className }) {
|
|
3510
|
+
const { direction } = useMessage();
|
|
3511
|
+
const isOut = direction === "out";
|
|
3512
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("relative inline-block", className), children: [
|
|
3513
|
+
/* @__PURE__ */ jsx("p", { className: "select-none text-5xl leading-none [text-shadow:0_1px_3px_rgba(0,0,0,0.25)]", children: content }),
|
|
3514
|
+
/* @__PURE__ */ jsxs(
|
|
3515
|
+
"span",
|
|
3516
|
+
{
|
|
3517
|
+
className: cn(
|
|
3518
|
+
"absolute bottom-0 right-0 flex items-center gap-0.5 rounded-full px-1.5 py-0.5",
|
|
3519
|
+
"bg-black/40 text-[10px] leading-none text-white backdrop-blur-sm font-medium"
|
|
3520
|
+
),
|
|
3521
|
+
children: [
|
|
3522
|
+
time,
|
|
3523
|
+
isOut && status && /* @__PURE__ */ jsx(StatusIcon, { status, className: "text-white" })
|
|
3524
|
+
]
|
|
3525
|
+
}
|
|
3526
|
+
)
|
|
3527
|
+
] });
|
|
3528
|
+
}
|
|
3529
|
+
function useAudioPlayer(src) {
|
|
3530
|
+
const audioRef = useRef(null);
|
|
3531
|
+
const rafRef = useRef(0);
|
|
3532
|
+
const [playing, setPlaying] = useState(false);
|
|
3533
|
+
const [currentTime, setCurrentTime] = useState(0);
|
|
3534
|
+
const [totalDuration, setTotalDuration] = useState(0);
|
|
3535
|
+
useEffect(() => {
|
|
3536
|
+
if (!playing) {
|
|
3537
|
+
cancelAnimationFrame(rafRef.current);
|
|
3538
|
+
return;
|
|
3539
|
+
}
|
|
3540
|
+
const tick = () => {
|
|
3541
|
+
const el = audioRef.current;
|
|
3542
|
+
if (el) setCurrentTime(el.currentTime);
|
|
3543
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
3544
|
+
};
|
|
3545
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
3546
|
+
return () => {
|
|
3547
|
+
cancelAnimationFrame(rafRef.current);
|
|
3548
|
+
};
|
|
3549
|
+
}, [playing]);
|
|
3550
|
+
useEffect(() => {
|
|
3551
|
+
const el = audioRef.current;
|
|
3552
|
+
if (!el) return;
|
|
3553
|
+
const onMeta = () => {
|
|
3554
|
+
setTotalDuration(el.duration);
|
|
3555
|
+
};
|
|
3556
|
+
const onEnded = () => {
|
|
3557
|
+
setPlaying(false);
|
|
3558
|
+
cancelAnimationFrame(rafRef.current);
|
|
3559
|
+
setCurrentTime(0);
|
|
3560
|
+
el.currentTime = 0;
|
|
3561
|
+
};
|
|
3562
|
+
el.addEventListener("loadedmetadata", onMeta);
|
|
3563
|
+
el.addEventListener("ended", onEnded);
|
|
3564
|
+
return () => {
|
|
3565
|
+
el.removeEventListener("loadedmetadata", onMeta);
|
|
3566
|
+
el.removeEventListener("ended", onEnded);
|
|
3567
|
+
};
|
|
3568
|
+
}, [src]);
|
|
3569
|
+
const toggle = useCallback(() => {
|
|
3570
|
+
const el = audioRef.current;
|
|
3571
|
+
if (!el) return;
|
|
3572
|
+
if (playing) {
|
|
3573
|
+
el.pause();
|
|
3574
|
+
setPlaying(false);
|
|
3575
|
+
} else {
|
|
3576
|
+
void el.play().then(() => {
|
|
3577
|
+
setPlaying(true);
|
|
3578
|
+
}).catch(() => {
|
|
3579
|
+
});
|
|
3580
|
+
}
|
|
3581
|
+
}, [playing]);
|
|
3582
|
+
const seek = useCallback(
|
|
3583
|
+
(fraction) => {
|
|
3584
|
+
const el = audioRef.current;
|
|
3585
|
+
if (!el || !totalDuration) return;
|
|
3586
|
+
const t = Math.max(0, Math.min(fraction, 1)) * totalDuration;
|
|
3587
|
+
el.currentTime = t;
|
|
3588
|
+
setCurrentTime(t);
|
|
3589
|
+
},
|
|
3590
|
+
[totalDuration]
|
|
3591
|
+
);
|
|
3592
|
+
const progress = totalDuration > 0 ? Math.min(currentTime / totalDuration, 1) : 0;
|
|
3593
|
+
const remaining = totalDuration > 0 ? totalDuration - currentTime : 0;
|
|
3594
|
+
return { audioRef, playing, currentTime, totalDuration, progress, remaining, toggle, seek };
|
|
3595
|
+
}
|
|
3596
|
+
const BAR_COUNT = 44;
|
|
3597
|
+
async function analyzeAudio(url, count = BAR_COUNT) {
|
|
3598
|
+
const ZEROS = () => Array(count).fill(0);
|
|
3599
|
+
if (!url || typeof AudioContext === "undefined") return ZEROS();
|
|
3600
|
+
try {
|
|
3601
|
+
const response = await fetch(url);
|
|
3602
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
3603
|
+
const ctx = new AudioContext();
|
|
3604
|
+
const audioBuffer = await ctx.decodeAudioData(arrayBuffer);
|
|
3605
|
+
await ctx.close();
|
|
3606
|
+
const data = audioBuffer.getChannelData(0);
|
|
3607
|
+
const chunkSize = Math.floor(data.length / count);
|
|
3608
|
+
const rmsValues = [];
|
|
3609
|
+
for (let i = 0; i < count; i++) {
|
|
3610
|
+
const start = i * chunkSize;
|
|
3611
|
+
const end = Math.min(start + chunkSize, data.length);
|
|
3612
|
+
let sum = 0;
|
|
3613
|
+
for (let j = start; j < end; j++) {
|
|
3614
|
+
sum += (data[j] ?? 0) ** 2;
|
|
3615
|
+
}
|
|
3616
|
+
rmsValues.push(Math.sqrt(sum / (end - start)));
|
|
3617
|
+
}
|
|
3618
|
+
const max = Math.max(...rmsValues, 1e-4);
|
|
3619
|
+
return rmsValues.map((v) => Math.round(v / max * 10));
|
|
3620
|
+
} catch {
|
|
3621
|
+
return ZEROS();
|
|
3622
|
+
}
|
|
3623
|
+
}
|
|
3624
|
+
function fmtTime(seconds) {
|
|
3625
|
+
const m = Math.floor(seconds / 60);
|
|
3626
|
+
const s = Math.floor(seconds % 60);
|
|
3627
|
+
return `${String(m)}:${String(s).padStart(2, "0")}`;
|
|
3628
|
+
}
|
|
3629
|
+
function roundRect(ctx, x, y, w, h, r2) {
|
|
3630
|
+
const rr = Math.min(r2, w / 2, h / 2);
|
|
3631
|
+
ctx.beginPath();
|
|
3632
|
+
ctx.moveTo(x + rr, y);
|
|
3633
|
+
ctx.lineTo(x + w - rr, y);
|
|
3634
|
+
ctx.arcTo(x + w, y, x + w, y + rr, rr);
|
|
3635
|
+
ctx.lineTo(x + w, y + h - rr);
|
|
3636
|
+
ctx.arcTo(x + w, y + h, x + w - rr, y + h, rr);
|
|
3637
|
+
ctx.lineTo(x + rr, y + h);
|
|
3638
|
+
ctx.arcTo(x, y + h, x, y + h - rr, rr);
|
|
3639
|
+
ctx.lineTo(x, y + rr);
|
|
3640
|
+
ctx.arcTo(x, y, x + rr, y, rr);
|
|
3641
|
+
ctx.closePath();
|
|
3642
|
+
}
|
|
3643
|
+
function Audio({ src, duration, fileName }) {
|
|
3644
|
+
const { direction } = useMessage();
|
|
3645
|
+
const isOut = direction === "out";
|
|
3646
|
+
const { audioRef, playing, progress, remaining, totalDuration, toggle, seek } = useAudioPlayer(src);
|
|
3647
|
+
const [hasPlayed, setHasPlayed] = useState(false);
|
|
3648
|
+
useEffect(() => {
|
|
3649
|
+
if (progress > 0) setHasPlayed(true);
|
|
3650
|
+
}, [progress]);
|
|
3651
|
+
const displayDuration = totalDuration > 0 ? fmtTime(remaining) : duration ?? "0:00";
|
|
3652
|
+
const trackColor = isOut ? "bg-wa-waveform-out" : "bg-wa-waveform-in";
|
|
3653
|
+
const trackColorFaint = isOut ? "bg-wa-waveform-out/40" : "bg-wa-waveform-in/40";
|
|
3654
|
+
const dotColor = hasPlayed || isOut ? "bg-wa-waveform-out" : "bg-wa-waveform-in";
|
|
3655
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
3656
|
+
/* @__PURE__ */ jsx("audio", { ref: audioRef, src, preload: "metadata" }),
|
|
3657
|
+
/* @__PURE__ */ jsxs("div", { className: "flex h-13.75 w-84 min-w-84 shrink-0 items-center", children: [
|
|
3658
|
+
/* @__PURE__ */ jsx(
|
|
3659
|
+
"span",
|
|
3660
|
+
{
|
|
3661
|
+
"aria-hidden": "true",
|
|
3662
|
+
className: "flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-full",
|
|
3663
|
+
children: /* @__PURE__ */ jsx(AudioFileIcon, { title: fileName })
|
|
3664
|
+
}
|
|
3665
|
+
),
|
|
3666
|
+
/* @__PURE__ */ jsx("span", { className: "w-5.5 shrink-0" }),
|
|
3667
|
+
/* @__PURE__ */ jsx(
|
|
3668
|
+
"button",
|
|
3669
|
+
{
|
|
3670
|
+
type: "button",
|
|
3671
|
+
onClick: toggle,
|
|
3672
|
+
"aria-label": playing ? "Pause" : "Play",
|
|
3673
|
+
className: "shrink-0 text-wa-text-secondary transition-opacity hover:opacity-70",
|
|
3674
|
+
children: playing ? /* @__PURE__ */ jsx(PauseIcon, {}) : /* @__PURE__ */ jsx(PlayIcon, {})
|
|
3675
|
+
}
|
|
3676
|
+
),
|
|
3677
|
+
/* @__PURE__ */ jsx("span", { className: "w-6.25 shrink-0" }),
|
|
3678
|
+
/* @__PURE__ */ jsxs("div", { className: "relative h-6 flex-1", children: [
|
|
3679
|
+
/* @__PURE__ */ jsx(
|
|
3680
|
+
"div",
|
|
3681
|
+
{
|
|
3682
|
+
className: cn(
|
|
3683
|
+
"pointer-events-none absolute left-0 right-0 top-1/2 h-0.5 -translate-y-1/2 rounded-full",
|
|
3684
|
+
trackColorFaint
|
|
3685
|
+
)
|
|
3686
|
+
}
|
|
3687
|
+
),
|
|
3688
|
+
/* @__PURE__ */ jsx(
|
|
3689
|
+
"div",
|
|
3690
|
+
{
|
|
3691
|
+
className: cn(
|
|
3692
|
+
"pointer-events-none absolute left-0 top-1/2 h-0.5 -translate-y-1/2 rounded-full",
|
|
3693
|
+
trackColor
|
|
3694
|
+
),
|
|
3695
|
+
style: { width: `${progress * 100}%` }
|
|
3696
|
+
}
|
|
3697
|
+
),
|
|
3698
|
+
/* @__PURE__ */ jsx(
|
|
3699
|
+
"span",
|
|
3700
|
+
{
|
|
3701
|
+
"aria-hidden": "true",
|
|
3702
|
+
className: cn(
|
|
3703
|
+
"pointer-events-none absolute top-1/2 size-3 -translate-x-1/2 -translate-y-1/2 rounded-full",
|
|
3704
|
+
dotColor
|
|
3705
|
+
),
|
|
3706
|
+
style: { left: `${progress * 100}%` }
|
|
3707
|
+
}
|
|
3708
|
+
),
|
|
3709
|
+
/* @__PURE__ */ jsx(
|
|
3710
|
+
"input",
|
|
3711
|
+
{
|
|
3712
|
+
type: "range",
|
|
3713
|
+
min: 0,
|
|
3714
|
+
max: 1e3,
|
|
3715
|
+
step: 1,
|
|
3716
|
+
value: Math.round(progress * 1e3),
|
|
3717
|
+
onChange: (e) => {
|
|
3718
|
+
seek(Number(e.target.value) / 1e3);
|
|
3719
|
+
},
|
|
3720
|
+
className: "absolute inset-0 h-full w-full cursor-pointer opacity-0",
|
|
3721
|
+
"aria-label": "Seek"
|
|
3722
|
+
}
|
|
3723
|
+
)
|
|
3724
|
+
] })
|
|
3725
|
+
] }),
|
|
3726
|
+
/* @__PURE__ */ jsx(
|
|
3727
|
+
"span",
|
|
3728
|
+
{
|
|
3729
|
+
className: "pointer-events-none absolute bottom-1 left-28 text-xs font-medium text-wa-text-secondary",
|
|
3730
|
+
"aria-hidden": "true",
|
|
3731
|
+
children: displayDuration
|
|
3732
|
+
}
|
|
3733
|
+
)
|
|
3734
|
+
] });
|
|
3735
|
+
}
|
|
3736
|
+
const CANVAS_WIDTH = 200;
|
|
3737
|
+
const CANVAS_HEIGHT = 30;
|
|
3738
|
+
const BAR_MAX_HEIGHT = 26;
|
|
3739
|
+
const BAR_WIDTH = 3;
|
|
3740
|
+
const SLOT_WIDTH = CANVAS_WIDTH / BAR_COUNT;
|
|
3741
|
+
function readCssVar(name) {
|
|
3742
|
+
return getComputedStyle(document.documentElement).getPropertyValue(name).trim();
|
|
3743
|
+
}
|
|
3744
|
+
function Waveform({ bars, progress, isOut, hasPlayed, seek }) {
|
|
3745
|
+
const canvasRef = useRef(null);
|
|
3746
|
+
useEffect(() => {
|
|
3747
|
+
const canvas = canvasRef.current;
|
|
3748
|
+
if (!canvas) return;
|
|
3749
|
+
const ctx = canvas.getContext("2d");
|
|
3750
|
+
if (!ctx) return;
|
|
3751
|
+
ctx.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
|
|
3752
|
+
const colorPlayed = isOut ? readCssVar("--color-wa-waveform-out") : readCssVar("--color-wa-waveform-in");
|
|
3753
|
+
const colorUnplayed = isOut ? readCssVar("--color-wa-waveform-out-faint") : readCssVar("--color-wa-waveform-in-faint");
|
|
3754
|
+
bars.forEach((amplitude, i) => {
|
|
3755
|
+
const level = Math.max(1, amplitude);
|
|
3756
|
+
const barHeight = Math.round(level / 10 * BAR_MAX_HEIGHT);
|
|
3757
|
+
const x = i * SLOT_WIDTH + (SLOT_WIDTH - BAR_WIDTH) / 2;
|
|
3758
|
+
const y = (CANVAS_HEIGHT - barHeight) / 2;
|
|
3759
|
+
ctx.fillStyle = i / BAR_COUNT < progress ? colorPlayed : colorUnplayed;
|
|
3760
|
+
roundRect(ctx, x, y, BAR_WIDTH, barHeight, BAR_WIDTH / 2);
|
|
3761
|
+
ctx.fill();
|
|
3762
|
+
});
|
|
3763
|
+
}, [bars, progress, isOut]);
|
|
3764
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative h-7.5 w-50 shrink-0", children: [
|
|
3765
|
+
/* @__PURE__ */ jsx(
|
|
3766
|
+
"canvas",
|
|
3767
|
+
{
|
|
3768
|
+
ref: canvasRef,
|
|
3769
|
+
width: CANVAS_WIDTH,
|
|
3770
|
+
height: CANVAS_HEIGHT,
|
|
3771
|
+
"aria-hidden": "true",
|
|
3772
|
+
className: "h-7.5 w-50"
|
|
3773
|
+
}
|
|
3774
|
+
),
|
|
3775
|
+
/* @__PURE__ */ jsx(
|
|
3776
|
+
"span",
|
|
3777
|
+
{
|
|
3778
|
+
"aria-hidden": "true",
|
|
3779
|
+
className: cn(
|
|
3780
|
+
"pointer-events-none absolute top-1/2 size-3 -translate-x-1/2 -translate-y-1/2 rounded-full",
|
|
3781
|
+
hasPlayed || isOut ? "bg-wa-waveform-out" : "bg-wa-waveform-in"
|
|
3782
|
+
),
|
|
3783
|
+
style: { left: `${progress * 100}%` }
|
|
3784
|
+
}
|
|
3785
|
+
),
|
|
3786
|
+
/* @__PURE__ */ jsx(
|
|
3787
|
+
"input",
|
|
3788
|
+
{
|
|
3789
|
+
type: "range",
|
|
3790
|
+
min: 0,
|
|
3791
|
+
max: 1e3,
|
|
3792
|
+
step: 1,
|
|
3793
|
+
value: Math.round(progress * 1e3),
|
|
3794
|
+
onChange: (e) => {
|
|
3795
|
+
seek(Number(e.target.value) / 1e3);
|
|
3796
|
+
},
|
|
3797
|
+
className: "absolute inset-0 h-full w-full cursor-pointer opacity-0",
|
|
3798
|
+
"aria-label": "Seek"
|
|
3799
|
+
}
|
|
3800
|
+
)
|
|
3801
|
+
] });
|
|
3802
|
+
}
|
|
3803
|
+
function Voice({ src, duration, avatarUrl: avatarProp }) {
|
|
3804
|
+
const { direction, avatarUrl: ctxAvatar } = useMessage();
|
|
3805
|
+
const isOut = direction === "out";
|
|
3806
|
+
const avatar = avatarProp ?? ctxAvatar;
|
|
3807
|
+
const { audioRef, playing, progress, remaining, totalDuration, toggle, seek } = useAudioPlayer(src);
|
|
3808
|
+
const [bars, setBars] = useState(Array(BAR_COUNT).fill(0));
|
|
3809
|
+
const [hasPlayed, setHasPlayed] = useState(false);
|
|
3810
|
+
useEffect(() => {
|
|
3811
|
+
if (progress > 0) setHasPlayed(true);
|
|
3812
|
+
}, [progress]);
|
|
3813
|
+
useEffect(() => {
|
|
3814
|
+
setBars(Array(BAR_COUNT).fill(0));
|
|
3815
|
+
if (!src) return;
|
|
3816
|
+
analyzeAudio(src, BAR_COUNT).then((result) => {
|
|
3817
|
+
setBars(result);
|
|
3818
|
+
}).catch(() => {
|
|
3819
|
+
});
|
|
3820
|
+
}, [src]);
|
|
3821
|
+
const displayDuration = totalDuration > 0 ? fmtTime(remaining) : duration ?? "0:00";
|
|
3822
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
3823
|
+
/* @__PURE__ */ jsx("audio", { ref: audioRef, src, preload: "metadata" }),
|
|
3824
|
+
/* @__PURE__ */ jsxs("div", { className: "flex h-13.75 w-[336px] min-w-[336px] shrink-0 items-center", children: [
|
|
3825
|
+
/* @__PURE__ */ jsx(
|
|
3826
|
+
"span",
|
|
3827
|
+
{
|
|
3828
|
+
"aria-hidden": "true",
|
|
3829
|
+
className: "flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-full bg-wa-avatar",
|
|
3830
|
+
children: avatar ? /* @__PURE__ */ jsx("img", { src: avatar, alt: "", className: "size-full object-cover" }) : /* @__PURE__ */ jsx(AvatarPlaceholderIcon, { className: "size-6 text-wa-text-secondary" })
|
|
3831
|
+
}
|
|
3832
|
+
),
|
|
3833
|
+
/* @__PURE__ */ jsx("span", { className: "w-5.5 shrink-0" }),
|
|
3834
|
+
/* @__PURE__ */ jsx(
|
|
3835
|
+
"button",
|
|
3836
|
+
{
|
|
3837
|
+
type: "button",
|
|
3838
|
+
onClick: toggle,
|
|
3839
|
+
"aria-label": playing ? "Pause" : "Play",
|
|
3840
|
+
className: "shrink-0 text-wa-text-secondary transition-opacity hover:opacity-70",
|
|
3841
|
+
children: playing ? /* @__PURE__ */ jsx(PauseIcon, {}) : /* @__PURE__ */ jsx(PlayIcon, {})
|
|
3842
|
+
}
|
|
3843
|
+
),
|
|
3844
|
+
/* @__PURE__ */ jsx("span", { className: "w-6.25 shrink-0" }),
|
|
3845
|
+
src ? /* @__PURE__ */ jsx(
|
|
3846
|
+
Waveform,
|
|
3847
|
+
{
|
|
3848
|
+
bars,
|
|
3849
|
+
progress,
|
|
3850
|
+
isOut,
|
|
3851
|
+
hasPlayed,
|
|
3852
|
+
seek
|
|
3853
|
+
}
|
|
3854
|
+
) : /* @__PURE__ */ jsx("span", { className: "flex-1 text-xs text-wa-text-secondary", children: "No audio source" })
|
|
3855
|
+
] }),
|
|
3856
|
+
/* @__PURE__ */ jsx(
|
|
3857
|
+
"span",
|
|
3858
|
+
{
|
|
3859
|
+
className: "pointer-events-none absolute bottom-1 left-28 text-xs font-medium text-wa-text-secondary",
|
|
3860
|
+
"aria-hidden": "true",
|
|
3861
|
+
children: displayDuration
|
|
3862
|
+
}
|
|
3863
|
+
)
|
|
3864
|
+
] });
|
|
3865
|
+
}
|
|
3866
|
+
function Sticker({ src, alt = "", className }) {
|
|
3867
|
+
return /* @__PURE__ */ jsx("div", { className: cn("relative inline-block", className), children: /* @__PURE__ */ jsx(
|
|
3868
|
+
"img",
|
|
3869
|
+
{
|
|
3870
|
+
src,
|
|
3871
|
+
alt,
|
|
3872
|
+
className: "size-48 select-none object-contain drop-shadow-sm",
|
|
3873
|
+
draggable: false
|
|
3874
|
+
}
|
|
3875
|
+
) });
|
|
3876
|
+
}
|
|
3877
|
+
function Video({ className }) {
|
|
3878
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-[336px]", className) });
|
|
3879
|
+
}
|
|
3880
|
+
function File({ className }) {
|
|
3881
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-[336px]", className) });
|
|
3882
|
+
}
|
|
3883
|
+
function Location({ className }) {
|
|
3884
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-[336px]", className), children: "Location" });
|
|
3885
|
+
}
|
|
3886
|
+
function Contact({ className }) {
|
|
3887
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-[336px]", className) });
|
|
3888
|
+
}
|
|
3889
|
+
function Poll({ className }) {
|
|
3890
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-[336px]", className) });
|
|
3891
|
+
}
|
|
3892
|
+
function Event({ className }) {
|
|
3893
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-[336px]", className) });
|
|
3894
|
+
}
|
|
3895
|
+
function Gif({ className }) {
|
|
3896
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-[336px]", className) });
|
|
3897
|
+
}
|
|
3898
|
+
function Image({ src, alt = "", className }) {
|
|
3899
|
+
return /* @__PURE__ */ jsx("div", { className: cn("w-[336px]", className), children: /* @__PURE__ */ jsx("img", { src, alt, className: "w-full rounded-wa-bubble object-cover" }) });
|
|
3900
|
+
}
|
|
3901
|
+
let _counter = 0;
|
|
3902
|
+
function uid() {
|
|
3903
|
+
return `chat-${++_counter}`;
|
|
3904
|
+
}
|
|
3905
|
+
function nowTime() {
|
|
3906
|
+
const d = /* @__PURE__ */ new Date();
|
|
3907
|
+
return `${d.getHours().toString().padStart(2, "0")}:${d.getMinutes().toString().padStart(2, "0")}`;
|
|
3908
|
+
}
|
|
3909
|
+
const ChatReplyContext = React.createContext({
|
|
3910
|
+
messages: [],
|
|
3911
|
+
sendMessage: () => {
|
|
3912
|
+
},
|
|
3913
|
+
addMessage: () => {
|
|
3914
|
+
},
|
|
3915
|
+
provided: false
|
|
3916
|
+
});
|
|
3917
|
+
function getInitials(name) {
|
|
3918
|
+
return name.split(" ").slice(0, 2).map((w) => {
|
|
3919
|
+
var _a;
|
|
3920
|
+
return ((_a = w[0]) == null ? void 0 : _a.toUpperCase()) ?? "";
|
|
3921
|
+
}).join("");
|
|
3922
|
+
}
|
|
3923
|
+
function ChatHeader({ className, name, avatarUrl, subtitle }) {
|
|
3924
|
+
const initials = getInitials(name);
|
|
3925
|
+
return /* @__PURE__ */ jsxs(
|
|
3926
|
+
"div",
|
|
3927
|
+
{
|
|
3928
|
+
className: cn(
|
|
3929
|
+
"flex items-center gap-3 bg-wa-header px-4 py-3 shadow-[0_1px_4px_rgba(0,0,0,0.15)]",
|
|
3930
|
+
className
|
|
3931
|
+
),
|
|
3932
|
+
children: [
|
|
3933
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: avatarUrl ? /* @__PURE__ */ jsx("img", { src: avatarUrl, alt: name, className: "size-10 rounded-full object-cover" }) : /* @__PURE__ */ jsx("span", { className: "flex size-10 items-center justify-center rounded-full bg-wa-avatar text-sm font-medium text-wa-text-primary", children: initials }) }),
|
|
3934
|
+
/* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
3935
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-[15px] font-medium text-wa-text-primary", children: name }),
|
|
3936
|
+
subtitle && /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-wa-text-secondary", children: subtitle })
|
|
3937
|
+
] })
|
|
3938
|
+
]
|
|
3939
|
+
}
|
|
3940
|
+
);
|
|
3941
|
+
}
|
|
3942
|
+
function ActionButton({
|
|
3943
|
+
label,
|
|
3944
|
+
onClick,
|
|
3945
|
+
children
|
|
3946
|
+
}) {
|
|
3947
|
+
return /* @__PURE__ */ jsx(
|
|
3948
|
+
"button",
|
|
3949
|
+
{
|
|
3950
|
+
type: "button",
|
|
3951
|
+
onClick,
|
|
3952
|
+
"aria-label": label,
|
|
3953
|
+
className: "inline-flex size-8 shrink-0 items-center justify-center rounded-full text-wa-icon transition-colors hover:text-wa-text-primary",
|
|
3954
|
+
children
|
|
3955
|
+
}
|
|
3956
|
+
);
|
|
3957
|
+
}
|
|
3958
|
+
function InputfieldActions({
|
|
3959
|
+
className,
|
|
3960
|
+
hasValue = false,
|
|
3961
|
+
textareaSlot,
|
|
3962
|
+
onEmojiClick,
|
|
3963
|
+
onAttachClick,
|
|
3964
|
+
onCameraClick: _onCameraClick,
|
|
3965
|
+
onMicClick,
|
|
3966
|
+
onSendClick,
|
|
3967
|
+
sendDisabled = false
|
|
3968
|
+
}) {
|
|
3969
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex w-full items-end", className), children: /* @__PURE__ */ jsxs("div", { className: "flex min-h-10.5 flex-1 items-center gap-1 rounded-full bg-wa-input px-3", children: [
|
|
3970
|
+
/* @__PURE__ */ jsx(ActionButton, { label: "Attachments", ...onAttachClick ? { onClick: onAttachClick } : {}, children: /* @__PURE__ */ jsx(AttachIcon, { className: "size-6" }) }),
|
|
3971
|
+
/* @__PURE__ */ jsx(ActionButton, { label: "Sticker", ...onEmojiClick ? { onClick: onEmojiClick } : {}, children: /* @__PURE__ */ jsx(StickerIcon, { className: "size-6" }) }),
|
|
3972
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-1 items-center px-2", children: textareaSlot }),
|
|
3973
|
+
hasValue ? /* @__PURE__ */ jsx(
|
|
3974
|
+
"button",
|
|
3975
|
+
{
|
|
3976
|
+
type: "button",
|
|
3977
|
+
onClick: onSendClick,
|
|
3978
|
+
disabled: sendDisabled,
|
|
3979
|
+
"aria-label": "Send message",
|
|
3980
|
+
className: "inline-flex size-8 shrink-0 items-center justify-center rounded-full bg-wa-send text-white transition-colors hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50",
|
|
3981
|
+
children: /* @__PURE__ */ jsx(SendIcon, { className: "ml-0.5 size-4" })
|
|
3982
|
+
}
|
|
3983
|
+
) : /* @__PURE__ */ jsxs(
|
|
3984
|
+
"button",
|
|
3985
|
+
{
|
|
3986
|
+
type: "button",
|
|
3987
|
+
onClick: onMicClick,
|
|
3988
|
+
"aria-label": "Record voice message",
|
|
3989
|
+
className: "group inline-flex size-8 shrink-0 items-center justify-center rounded-full text-wa-icon transition-colors hover:bg-wa-teal hover:text-black",
|
|
3990
|
+
children: [
|
|
3991
|
+
/* @__PURE__ */ jsx(MicOutlineIcon, { className: "size-5 group-hover:hidden" }),
|
|
3992
|
+
/* @__PURE__ */ jsx(MicFillIcon, { className: "hidden size-5 group-hover:block" })
|
|
3993
|
+
]
|
|
3994
|
+
}
|
|
3995
|
+
)
|
|
3996
|
+
] }) });
|
|
3997
|
+
}
|
|
3998
|
+
function Inputfield({
|
|
3999
|
+
className,
|
|
4000
|
+
textareaClassName,
|
|
4001
|
+
actionsClassName,
|
|
4002
|
+
value,
|
|
4003
|
+
defaultValue,
|
|
4004
|
+
locked = false,
|
|
4005
|
+
onValueChange,
|
|
4006
|
+
onSend,
|
|
4007
|
+
onEmojiClick,
|
|
4008
|
+
onAttachClick,
|
|
4009
|
+
onCameraClick,
|
|
4010
|
+
onMicClick,
|
|
4011
|
+
onChange,
|
|
4012
|
+
onKeyDown,
|
|
4013
|
+
placeholder = "Enter a message.",
|
|
4014
|
+
...props
|
|
4015
|
+
}) {
|
|
4016
|
+
const [internalValue, setInternalValue] = React.useState(defaultValue ?? "");
|
|
4017
|
+
const isControlled = typeof value === "string";
|
|
4018
|
+
const currentValue = isControlled ? value : internalValue;
|
|
4019
|
+
const hasValue = currentValue.trim().length > 0;
|
|
4020
|
+
function updateValue(next) {
|
|
4021
|
+
if (!isControlled) {
|
|
4022
|
+
setInternalValue(next);
|
|
4023
|
+
}
|
|
4024
|
+
onValueChange == null ? void 0 : onValueChange(next);
|
|
4025
|
+
}
|
|
4026
|
+
function handleChange(event) {
|
|
4027
|
+
updateValue(event.target.value);
|
|
4028
|
+
onChange == null ? void 0 : onChange(event);
|
|
4029
|
+
}
|
|
4030
|
+
function sendCurrentValue() {
|
|
4031
|
+
if (locked) return;
|
|
4032
|
+
const trimmedValue = currentValue.trim();
|
|
4033
|
+
if (!trimmedValue) {
|
|
4034
|
+
return;
|
|
4035
|
+
}
|
|
4036
|
+
onSend == null ? void 0 : onSend(trimmedValue);
|
|
4037
|
+
updateValue("");
|
|
4038
|
+
}
|
|
4039
|
+
function handleKeyDown(event) {
|
|
4040
|
+
if (event.key === "Enter" && !event.shiftKey) {
|
|
4041
|
+
event.preventDefault();
|
|
4042
|
+
if (!locked) sendCurrentValue();
|
|
4043
|
+
}
|
|
4044
|
+
onKeyDown == null ? void 0 : onKeyDown(event);
|
|
4045
|
+
}
|
|
4046
|
+
return /* @__PURE__ */ jsx("div", { className: cn("px-3 pb-3 pt-1", className), children: /* @__PURE__ */ jsx(
|
|
4047
|
+
InputfieldActions,
|
|
4048
|
+
{
|
|
4049
|
+
hasValue,
|
|
4050
|
+
onSendClick: sendCurrentValue,
|
|
4051
|
+
...onEmojiClick ? { onEmojiClick } : {},
|
|
4052
|
+
...onAttachClick ? { onAttachClick } : {},
|
|
4053
|
+
...onCameraClick ? { onCameraClick } : {},
|
|
4054
|
+
...onMicClick ? { onMicClick } : {},
|
|
4055
|
+
sendDisabled: locked,
|
|
4056
|
+
...actionsClassName ? { className: actionsClassName } : {},
|
|
4057
|
+
textareaSlot: /* @__PURE__ */ jsx(
|
|
4058
|
+
"textarea",
|
|
4059
|
+
{
|
|
4060
|
+
...props,
|
|
4061
|
+
value: currentValue,
|
|
4062
|
+
onChange: handleChange,
|
|
4063
|
+
onKeyDown: handleKeyDown,
|
|
4064
|
+
placeholder,
|
|
4065
|
+
rows: 1,
|
|
4066
|
+
className: cn(
|
|
4067
|
+
"min-h-5 w-full resize-none bg-transparent px-1 py-0 text-sm text-wa-text-body outline-none placeholder:font-medium placeholder:text-wa-icon/70",
|
|
4068
|
+
textareaClassName
|
|
4069
|
+
)
|
|
4070
|
+
}
|
|
4071
|
+
)
|
|
4072
|
+
}
|
|
4073
|
+
) });
|
|
4074
|
+
}
|
|
4075
|
+
function toDate(value) {
|
|
4076
|
+
if (!value) return null;
|
|
4077
|
+
const parsed = value instanceof Date ? value : new Date(value);
|
|
4078
|
+
if (Number.isNaN(parsed.getTime())) return null;
|
|
4079
|
+
return parsed;
|
|
4080
|
+
}
|
|
4081
|
+
function isSameCalendarDay(a, b) {
|
|
4082
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
4083
|
+
}
|
|
4084
|
+
function groupMessagesByDay(messages) {
|
|
4085
|
+
return messages.reduce((groups, message) => {
|
|
4086
|
+
const lastGroup = groups[groups.length - 1];
|
|
4087
|
+
const currentDate = toDate(message.timestamp);
|
|
4088
|
+
const lastMessage = lastGroup == null ? void 0 : lastGroup.messages[lastGroup.messages.length - 1];
|
|
4089
|
+
const lastDate = toDate(lastMessage == null ? void 0 : lastMessage.timestamp);
|
|
4090
|
+
const isSameDayAsLast = currentDate && lastDate ? isSameCalendarDay(currentDate, lastDate) : true;
|
|
4091
|
+
if (lastGroup && lastGroup.senderId === message.senderId && isSameDayAsLast) {
|
|
4092
|
+
lastGroup.messages.push(message);
|
|
4093
|
+
return groups;
|
|
4094
|
+
}
|
|
4095
|
+
groups.push({ senderId: message.senderId, dayDate: currentDate, messages: [message] });
|
|
4096
|
+
return groups;
|
|
4097
|
+
}, []);
|
|
4098
|
+
}
|
|
4099
|
+
function getDisplayDate(date) {
|
|
4100
|
+
if (!date) return (/* @__PURE__ */ new Date()).toLocaleDateString();
|
|
4101
|
+
const d = new Date(date);
|
|
4102
|
+
const now = /* @__PURE__ */ new Date();
|
|
4103
|
+
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
4104
|
+
const msgDay = new Date(d.getFullYear(), d.getMonth(), d.getDate());
|
|
4105
|
+
const diffDays = Math.round((today.getTime() - msgDay.getTime()) / 864e5);
|
|
4106
|
+
if (diffDays === 0) return "Today";
|
|
4107
|
+
if (diffDays === 1) return "Yesterday";
|
|
4108
|
+
if (diffDays < 7) return d.toLocaleDateString("en-US", { weekday: "long" });
|
|
4109
|
+
const yy = d.getFullYear() % 100;
|
|
4110
|
+
return `${d.getDate()}.${d.getMonth() + 1}.${yy}`;
|
|
4111
|
+
}
|
|
4112
|
+
function DayDivider({ className, date }) {
|
|
4113
|
+
const displayDate = getDisplayDate(date.toISOString());
|
|
4114
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex justify-center py-3", className), children: /* @__PURE__ */ jsx("span", { className: "rounded-wa-divider bg-wa-divider px-3 py-1 text-[13px] font-medium text-wa-text-secondary shadow-sm", children: displayDate }) });
|
|
4115
|
+
}
|
|
4116
|
+
function MessageList({ className, messages }) {
|
|
4117
|
+
const dayGroups = groupMessagesByDay(messages);
|
|
4118
|
+
const content = dayGroups.map((group, index) => {
|
|
4119
|
+
const previousGroup = dayGroups[index - 1];
|
|
4120
|
+
const dayDate = group.dayDate;
|
|
4121
|
+
const shouldRenderDivider = dayDate !== null && (!(previousGroup == null ? void 0 : previousGroup.dayDate) || !isSameCalendarDay(dayDate, previousGroup.dayDate));
|
|
4122
|
+
return /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
4123
|
+
shouldRenderDivider && dayDate !== null && /* @__PURE__ */ jsx(DayDivider, { date: dayDate }),
|
|
4124
|
+
group.messages.map((message, msgIndex) => {
|
|
4125
|
+
const node = msgIndex === 0 ? React.cloneElement(message.node, {
|
|
4126
|
+
top: true
|
|
4127
|
+
}) : message.node;
|
|
4128
|
+
return /* @__PURE__ */ jsx(React.Fragment, { children: node }, message.id ?? `${message.senderId}-${msgIndex}`);
|
|
4129
|
+
})
|
|
4130
|
+
] }, `${group.senderId}-${index}`);
|
|
4131
|
+
});
|
|
4132
|
+
if (className) {
|
|
4133
|
+
return /* @__PURE__ */ jsx("div", { className: cn(className), children: content });
|
|
4134
|
+
}
|
|
4135
|
+
return /* @__PURE__ */ jsx(Fragment, { children: content });
|
|
4136
|
+
}
|
|
4137
|
+
const backgroundUrl = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhwAAAPACAMAAABJq1CuAAAASFBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////neHiwAAAAGHRSTlMAb+//v0Agz5/fYI9QoBCAcJCvMMB/sF+uI/OfAAFcAUlEQVR4AcRa4ZKlrq9k0xAIIiBcd9//TW+tR0pFdcbd/9avv8wpdRCSppME1bfwg6CNOoAtjHqEgdueFmH1T+AFw8PQotfHEJQaKapLpLaWQEhxWzVldcC0X3O00pkEbvuZ3qwBQ/s/PxQCIC6H01w55CIApEzhpTWL/J5w9YNeR98GiMiqWPWnMAJ9JkIUieoRCS42bhCrf4Q4Qfw9QX2by+IEvhmDFreyhq7tWrUo/LBmI7R/bTe8FvWIM+ma56zL5syLRpp28yUSohoAkJ587QYQpyb6U+MPEHNt+PTllIRXblT178AC17ux91GGUcrJrXcobkrRVh3OtnDI7T5s/85xZ+KMNz6MQgSQ7T23bne73HS5xvsRssusbhFQFf3ftd4Uud01psavZGNqT0Rj9k7WX/ItCEowM0lV/xTpRjw82uUoKPaezYzEGpr7VZ9Cabt6dX+UL8gRmW8VrvjTvWiys227f8UuCB4iN8Mrq+9kKzJ8l0ZY7ZJXAMjqIQVzOfRONmaNRdh4o6O5WKa2ftlZy3OcBGjy/A/B+ko8WGT7PVrt1S00dbJhrjKv7eqIzl0dIRxdWAYA3Wic2KOzQ3YCgMrkWT2jCSOTVregqQnbCR719+09CooWQJmQpmIJAPLTVmGBzsGEcXsuXv0HWQ2jlEabqnkRJDnnP+VRpk483mXBBjru9G6KV9Ks423G1cXZKO4ckWTyeRQM17rv4mNO+gytO+XqYbXK4HtV+XlcyTLJ7fGaYE+rJQqboc36q2DeUpkeHvx7Ih4543Us+XGiqHGD/1PxqE+ZTpyd5968bX22XseudU6+2a+HpjbkAN5E4OOddWGcYON1ZBz8Q076hLUO0/Yh5SVlEO5VRR7KMhWHs0nmXc4lwirOWjuj1AhzS46JFo2zshDyHRglsqW4nwER5m+LB2TmzfuQ+pTDCiR2wtzVrx0C8sdQMM1+HZjErMZMu4HnhS1+u3CpHVV31cQb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", import.meta.url).href;
|
|
4138
|
+
function Chat$1({
|
|
4139
|
+
name,
|
|
4140
|
+
avatarUrl,
|
|
4141
|
+
subtitle,
|
|
4142
|
+
children,
|
|
4143
|
+
className,
|
|
4144
|
+
messageHistory,
|
|
4145
|
+
showInputfield = true,
|
|
4146
|
+
locked = false,
|
|
4147
|
+
inputPlaceholder,
|
|
4148
|
+
inputValue,
|
|
4149
|
+
defaultInputValue,
|
|
4150
|
+
onInputValueChange,
|
|
4151
|
+
onSendMessage,
|
|
4152
|
+
onReply,
|
|
4153
|
+
onEmojiClick,
|
|
4154
|
+
onAttachClick,
|
|
4155
|
+
onCameraClick,
|
|
4156
|
+
onMicClick
|
|
4157
|
+
}) {
|
|
4158
|
+
const [messages, setMessages] = React.useState(messageHistory ?? []);
|
|
4159
|
+
const scrollRef = React.useRef(null);
|
|
4160
|
+
React.useEffect(() => {
|
|
4161
|
+
if (scrollRef.current) {
|
|
4162
|
+
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
4163
|
+
}
|
|
4164
|
+
}, [messages]);
|
|
4165
|
+
function sendMessage(text) {
|
|
4166
|
+
const trimmed = text.trim();
|
|
4167
|
+
if (!trimmed) return;
|
|
4168
|
+
const time = nowTime();
|
|
4169
|
+
setMessages((prev) => [
|
|
4170
|
+
...prev,
|
|
4171
|
+
{
|
|
4172
|
+
id: uid(),
|
|
4173
|
+
senderId: "me",
|
|
4174
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
4175
|
+
node: /* @__PURE__ */ jsx(Message, { direction: "out", mode: "neutral", time, status: "sent", children: /* @__PURE__ */ jsx(Text, { content: trimmed }) })
|
|
4176
|
+
}
|
|
4177
|
+
]);
|
|
4178
|
+
onSendMessage == null ? void 0 : onSendMessage(trimmed);
|
|
4179
|
+
}
|
|
4180
|
+
function addMessage({
|
|
4181
|
+
node,
|
|
4182
|
+
senderId = "me"
|
|
4183
|
+
}) {
|
|
4184
|
+
setMessages((prev) => [
|
|
4185
|
+
...prev,
|
|
4186
|
+
{
|
|
4187
|
+
id: uid(),
|
|
4188
|
+
senderId,
|
|
4189
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
4190
|
+
node
|
|
4191
|
+
}
|
|
4192
|
+
]);
|
|
4193
|
+
}
|
|
4194
|
+
return /* @__PURE__ */ jsx(ChatReplyContext.Provider, { value: { messages, sendMessage, addMessage, provided: true }, children: /* @__PURE__ */ jsxs("div", { className: cn("flex h-full min-h-0 flex-col bg-wa-bg", className), children: [
|
|
4195
|
+
/* @__PURE__ */ jsx(
|
|
4196
|
+
ChatHeader,
|
|
4197
|
+
{
|
|
4198
|
+
name,
|
|
4199
|
+
...avatarUrl ? { avatarUrl } : {},
|
|
4200
|
+
...subtitle ? { subtitle } : {}
|
|
4201
|
+
}
|
|
4202
|
+
),
|
|
4203
|
+
/* @__PURE__ */ jsxs("div", { className: "relative isolate flex min-h-0 flex-1 flex-col", children: [
|
|
4204
|
+
/* @__PURE__ */ jsx(
|
|
4205
|
+
"div",
|
|
4206
|
+
{
|
|
4207
|
+
className: "pointer-events-none absolute inset-0 -z-10 bg-repeat opacity-[0.06]",
|
|
4208
|
+
style: { backgroundImage: `url(${backgroundUrl})` }
|
|
4209
|
+
}
|
|
4210
|
+
),
|
|
4211
|
+
/* @__PURE__ */ jsx("div", { ref: scrollRef, className: "scrollbar-wa flex-1 overflow-y-auto py-2 px-12", children: messages.length > 0 ? /* @__PURE__ */ jsx(MessageList, { messages }) : children }),
|
|
4212
|
+
showInputfield && /* @__PURE__ */ jsx(
|
|
4213
|
+
Inputfield,
|
|
4214
|
+
{
|
|
4215
|
+
placeholder: inputPlaceholder,
|
|
4216
|
+
locked,
|
|
4217
|
+
...typeof inputValue === "string" ? { value: inputValue } : {},
|
|
4218
|
+
...typeof defaultInputValue === "string" ? { defaultValue: defaultInputValue } : {},
|
|
4219
|
+
...onInputValueChange ? { onValueChange: onInputValueChange } : {},
|
|
4220
|
+
onSend: sendMessage,
|
|
4221
|
+
...onEmojiClick ? { onEmojiClick } : {},
|
|
4222
|
+
...onAttachClick ? { onAttachClick } : {},
|
|
4223
|
+
...onCameraClick ? { onCameraClick } : {},
|
|
4224
|
+
...onMicClick ? { onMicClick } : {}
|
|
4225
|
+
}
|
|
4226
|
+
)
|
|
4227
|
+
] }),
|
|
4228
|
+
onReply
|
|
4229
|
+
] }) });
|
|
4230
|
+
}
|
|
4231
|
+
const ChatParts = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
4232
|
+
__proto__: null,
|
|
4233
|
+
Actions: InputfieldActions,
|
|
4234
|
+
DayDivider,
|
|
4235
|
+
Header: ChatHeader,
|
|
4236
|
+
Input: Inputfield,
|
|
4237
|
+
List: MessageList,
|
|
4238
|
+
Root: Chat$1
|
|
4239
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
4240
|
+
const Chat = Object.assign(Chat$1, ChatParts);
|
|
4241
|
+
function extractTextFromNode(node) {
|
|
4242
|
+
if (node === null || node === void 0) return "";
|
|
4243
|
+
if (typeof node === "string") return node;
|
|
4244
|
+
if (typeof node === "number" || typeof node === "boolean") return String(node);
|
|
4245
|
+
if (Array.isArray(node)) return node.map(extractTextFromNode).join("");
|
|
4246
|
+
if (!React.isValidElement(node)) return "";
|
|
4247
|
+
const el = node;
|
|
4248
|
+
if (typeof el.props["content"] === "string") return el.props["content"];
|
|
4249
|
+
return extractTextFromNode(el.props["children"]);
|
|
4250
|
+
}
|
|
4251
|
+
function useReply({ onMessage, replyMessage, from, once = false }) {
|
|
4252
|
+
const { messages, addMessage } = React.useContext(ChatReplyContext);
|
|
4253
|
+
const firedRef = React.useRef(false);
|
|
4254
|
+
const seenIdsRef = React.useRef(new Set(messages.map((m) => m.id)));
|
|
4255
|
+
React.useEffect(() => {
|
|
4256
|
+
if (once && firedRef.current) return;
|
|
4257
|
+
const newMessages = messages.filter((m) => !seenIdsRef.current.has(m.id));
|
|
4258
|
+
for (const m of newMessages) seenIdsRef.current.add(m.id);
|
|
4259
|
+
if (newMessages.length === 0) return;
|
|
4260
|
+
const triggerText = extractTextFromNode(onMessage).trim().toLowerCase();
|
|
4261
|
+
if (!triggerText) return;
|
|
4262
|
+
for (const msg of newMessages) {
|
|
4263
|
+
if (once && firedRef.current) break;
|
|
4264
|
+
if (from !== void 0 && msg.senderId !== from) continue;
|
|
4265
|
+
const msgText = extractTextFromNode(msg.node).trim().toLowerCase();
|
|
4266
|
+
if (msgText === triggerText) {
|
|
4267
|
+
if (once) firedRef.current = true;
|
|
4268
|
+
addMessage({ node: replyMessage });
|
|
4269
|
+
}
|
|
4270
|
+
}
|
|
4271
|
+
}, [messages]);
|
|
4272
|
+
}
|
|
4273
|
+
function Reply({ onMessage, replyMessage, from = "me", once }) {
|
|
4274
|
+
useReply({
|
|
4275
|
+
onMessage,
|
|
4276
|
+
replyMessage,
|
|
4277
|
+
from,
|
|
4278
|
+
...once !== void 0 ? { once } : {}
|
|
4279
|
+
});
|
|
4280
|
+
return null;
|
|
4281
|
+
}
|
|
4282
|
+
function useMessages(callback) {
|
|
4283
|
+
const { messages } = React.useContext(ChatReplyContext);
|
|
4284
|
+
const seenIdsRef = React.useRef(new Set(messages.map((m) => m.id)));
|
|
4285
|
+
const callbackRef = React.useRef(callback);
|
|
4286
|
+
callbackRef.current = callback;
|
|
4287
|
+
React.useEffect(() => {
|
|
4288
|
+
const newMessages = messages.filter((m) => !seenIdsRef.current.has(m.id));
|
|
4289
|
+
for (const m of newMessages) seenIdsRef.current.add(m.id);
|
|
4290
|
+
for (const m of newMessages) callbackRef.current(m);
|
|
4291
|
+
}, [messages]);
|
|
4292
|
+
}
|
|
4293
|
+
export {
|
|
4294
|
+
Audio,
|
|
4295
|
+
Chat,
|
|
4296
|
+
Contact,
|
|
4297
|
+
Emoji,
|
|
4298
|
+
Event,
|
|
4299
|
+
File,
|
|
4300
|
+
Gif,
|
|
4301
|
+
Image,
|
|
4302
|
+
Location,
|
|
4303
|
+
Message,
|
|
4304
|
+
Poll,
|
|
4305
|
+
Reply,
|
|
4306
|
+
Sticker,
|
|
4307
|
+
Text,
|
|
4308
|
+
Video,
|
|
4309
|
+
Voice,
|
|
4310
|
+
cn,
|
|
4311
|
+
useMessage,
|
|
4312
|
+
useMessages,
|
|
4313
|
+
useReply
|
|
4314
|
+
};
|
|
4315
|
+
//# sourceMappingURL=index.js.map
|