lecom-ui 5.2.85 → 5.2.87

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.
@@ -1,207 +0,0 @@
1
- import * as React from 'react';
2
- import { useFormContext, Controller } from 'react-hook-form';
3
- import { cn } from '../../lib/utils.js';
4
- import { Button } from '../Button/Button.js';
5
-
6
- function DividerLine({
7
- dashed,
8
- plain,
9
- isGroupDivider,
10
- isActive,
11
- className,
12
- style
13
- }) {
14
- return /* @__PURE__ */ React.createElement(
15
- "div",
16
- {
17
- className: cn(
18
- "w-full",
19
- isGroupDivider ? "my-4" : "my-2",
20
- isActive ? "opacity-100" : "opacity-50",
21
- className
22
- ),
23
- style
24
- },
25
- /* @__PURE__ */ React.createElement(
26
- "div",
27
- {
28
- className: cn(
29
- "w-full border-t",
30
- dashed ? "border-dashed" : "border-solid",
31
- plain ? "border-gray-200" : "border-gray-300"
32
- )
33
- }
34
- )
35
- );
36
- }
37
- function OptionButtons({
38
- value,
39
- onChange,
40
- isActive,
41
- plain,
42
- optionLabels,
43
- ButtonComponent,
44
- buttonSize,
45
- buttonClassName
46
- }) {
47
- const [labelAnd, labelOr] = optionLabels;
48
- const Btn = ButtonComponent;
49
- return /* @__PURE__ */ React.createElement(
50
- "div",
51
- {
52
- className: cn(
53
- "relative z-10 inline-flex overflow-hidden",
54
- plain ? "bg-white" : "rounded-md border border-gray-300 bg-white shadow-sm"
55
- )
56
- },
57
- /* @__PURE__ */ React.createElement(
58
- Btn,
59
- {
60
- type: "button",
61
- variant: "ghost",
62
- color: "grey",
63
- size: buttonSize,
64
- onClick: () => onChange("AND"),
65
- disabled: !isActive,
66
- className: cn(
67
- "px-4 py-1 text-sm transition !rounded-none",
68
- value === "AND" ? "bg-blue-600 text-white hover:bg-blue-500" : "bg-white text-gray-700 hover:bg-blue-50",
69
- buttonClassName
70
- )
71
- },
72
- labelAnd
73
- ),
74
- /* @__PURE__ */ React.createElement(
75
- Btn,
76
- {
77
- type: "button",
78
- variant: "ghost",
79
- color: "grey",
80
- size: buttonSize,
81
- onClick: () => onChange("OR"),
82
- disabled: !isActive,
83
- className: cn(
84
- "px-4 py-1 text-sm transition !rounded-none",
85
- value === "OR" ? "bg-blue-600 text-white hover:bg-blue-500" : "bg-white text-gray-700 hover:bg-blue-50",
86
- buttonClassName
87
- )
88
- },
89
- labelOr
90
- )
91
- );
92
- }
93
- function CustomDivider({
94
- name,
95
- control,
96
- isActive = true,
97
- isGroupDivider = false,
98
- orientation = "center",
99
- dashed = false,
100
- plain = false,
101
- lineOnly = false,
102
- optionLabels = ["E", "OU"],
103
- ButtonComponent = Button,
104
- buttonSize = "medium",
105
- buttonClassName,
106
- className,
107
- style,
108
- children
109
- }) {
110
- const formContext = useFormContext();
111
- const controlToUse = control ?? formContext?.control;
112
- const justifyMap = {
113
- left: "justify-start",
114
- center: "justify-center",
115
- right: "justify-end"
116
- };
117
- if (lineOnly && !children) {
118
- return /* @__PURE__ */ React.createElement(
119
- DividerLine,
120
- {
121
- dashed,
122
- plain,
123
- isGroupDivider,
124
- isActive,
125
- className,
126
- style
127
- }
128
- );
129
- }
130
- if (children) {
131
- return /* @__PURE__ */ React.createElement(
132
- "div",
133
- {
134
- className: cn(
135
- "relative w-full flex items-center",
136
- isGroupDivider ? "my-4" : "my-2",
137
- isActive ? "opacity-100" : "opacity-50",
138
- justifyMap[orientation],
139
- className
140
- ),
141
- style
142
- },
143
- /* @__PURE__ */ React.createElement(
144
- "div",
145
- {
146
- className: cn(
147
- "absolute inset-x-0 border-t",
148
- dashed ? "border-dashed" : "border-solid",
149
- plain ? "border-gray-200" : "border-gray-300"
150
- )
151
- }
152
- ),
153
- /* @__PURE__ */ React.createElement("span", { className: "relative z-10 px-2 bg-white" }, children)
154
- );
155
- }
156
- if (!name) {
157
- throw new Error(
158
- "CustomDivider: prop `name` \xE9 obrigat\xF3ria se `lineOnly` for false."
159
- );
160
- }
161
- return /* @__PURE__ */ React.createElement(
162
- "div",
163
- {
164
- className: cn(
165
- "relative w-full flex items-center",
166
- isGroupDivider ? "my-4" : "my-2",
167
- isActive ? "opacity-100" : "opacity-50",
168
- justifyMap[orientation],
169
- className
170
- ),
171
- style
172
- },
173
- /* @__PURE__ */ React.createElement(
174
- "div",
175
- {
176
- className: cn(
177
- "absolute inset-x-0 border-t",
178
- dashed ? "border-dashed" : "border-solid",
179
- plain ? "border-gray-200" : "border-gray-300"
180
- )
181
- }
182
- ),
183
- /* @__PURE__ */ React.createElement(
184
- Controller,
185
- {
186
- name,
187
- control: controlToUse,
188
- render: ({ field: { value, onChange } }) => /* @__PURE__ */ React.createElement(
189
- OptionButtons,
190
- {
191
- value,
192
- onChange,
193
- isActive,
194
- plain,
195
- optionLabels,
196
- ButtonComponent,
197
- buttonSize,
198
- buttonClassName
199
- }
200
- )
201
- }
202
- )
203
- );
204
- }
205
- CustomDivider.displayName = "CustomDivider";
206
-
207
- export { CustomDivider };
@@ -1,55 +0,0 @@
1
- import * as React from 'react';
2
- import { Button } from '../Button/Button.js';
3
- import { Calendar } from '../Calendar/Calendar.js';
4
- import { Popover, PopoverTrigger, PopoverContent } from '../Popover/Popover.js';
5
- import { cn } from '../../lib/utils.js';
6
- import { format } from 'date-fns';
7
- import { CalendarIcon } from 'lucide-react';
8
-
9
- function DatePicker({
10
- className,
11
- variant = "outlined",
12
- locale,
13
- placeholder = "Pick a date",
14
- value,
15
- onChange,
16
- format: format$1 = "PPP",
17
- status
18
- }) {
19
- const [internalDate, setInternalDate] = React.useState();
20
- const isControlled = value !== void 0 && onChange !== void 0;
21
- const date = isControlled ? value : internalDate;
22
- const handleSelect = (selected) => {
23
- if (isControlled && onChange) {
24
- onChange(selected);
25
- } else {
26
- setInternalDate(selected);
27
- }
28
- };
29
- return /* @__PURE__ */ React.createElement(Popover, null, /* @__PURE__ */ React.createElement(PopoverTrigger, { asChild: true }, /* @__PURE__ */ React.createElement(
30
- Button,
31
- {
32
- variant,
33
- className: cn(
34
- "w-[240px] justify-start text-left font-normal",
35
- !date && "text-muted-foreground",
36
- className,
37
- status
38
- )
39
- },
40
- /* @__PURE__ */ React.createElement(CalendarIcon, { className: "mr-2 h-4 w-4" }),
41
- date ? format(date, format$1, { locale }) : /* @__PURE__ */ React.createElement("span", null, placeholder)
42
- )), /* @__PURE__ */ React.createElement(PopoverContent, { className: "w-auto p-0", align: "start" }, /* @__PURE__ */ React.createElement(
43
- Calendar,
44
- {
45
- mode: "single",
46
- selected: date,
47
- onSelect: handleSelect,
48
- autoFocus: true,
49
- locale
50
- }
51
- )));
52
- }
53
- DatePicker.displayName = "DatePicker";
54
-
55
- export { DatePicker };
@@ -1,102 +0,0 @@
1
- import * as React from 'react';
2
- import { cn } from '../../lib/utils.js';
3
-
4
- const Steps = ({
5
- items,
6
- current = 0,
7
- className,
8
- dotSize = "medium",
9
- color = "blue"
10
- }) => {
11
- const getStepStatus = (index, item) => {
12
- if (item.status) return item.status;
13
- if (index < current) return "completed";
14
- if (index === current) return "current";
15
- return "pending";
16
- };
17
- const getDotSizeClasses = () => {
18
- const outerDotSizeClasses = {
19
- small: "w-[10px] h-[10px]",
20
- medium: "w-6 h-6",
21
- large: "w-8 h-8"
22
- };
23
- const innerDotSizeClasses = {
24
- small: "",
25
- medium: "w-2 h-2",
26
- large: "w-3 h-3"
27
- };
28
- return {
29
- outer: outerDotSizeClasses[dotSize],
30
- inner: innerDotSizeClasses[dotSize]
31
- };
32
- };
33
- const getStepIcon = () => dotSize !== "small" ? /* @__PURE__ */ React.createElement("div", { className: cn("rounded-full", getDotSizeClasses().inner) }) : null;
34
- const getStepColors = () => {
35
- const colorOptions = {
36
- blue: "bg-blue-600 border-blue-600",
37
- red: "bg-red-600 border-red-600",
38
- green: "bg-green-600 border-green-600",
39
- purple: "bg-purple-600 border-purple-600",
40
- orange: "bg-orange-500 border-orange-500"
41
- };
42
- return colorOptions[color] || colorOptions.blue;
43
- };
44
- return /* @__PURE__ */ React.createElement("div", { className: cn("relative", className) }, items.map((item, index) => {
45
- const status = getStepStatus(index, item);
46
- const isCurrent = index === current;
47
- const isLast = index === items.length - 1;
48
- return /* @__PURE__ */ React.createElement("div", { key: index, className: "relative flex items-baseline" }, !isLast && /* @__PURE__ */ React.createElement(
49
- "div",
50
- {
51
- className: cn("absolute border-l border-dashed -z-10", {
52
- "left-[4.5px]": dotSize === "small",
53
- "left-3": dotSize === "medium",
54
- "left-4": dotSize === "large",
55
- "border-blue-300": color === "blue",
56
- "border-red-300": color === "red",
57
- "border-green-300": color === "green",
58
- "border-purple-300": color === "purple",
59
- "border-orange-300": color === "orange"
60
- }),
61
- style: {
62
- top: dotSize === "small" ? "10px" : dotSize === "medium" ? "16px" : "24px",
63
- height: dotSize === "small" ? "calc(100% - 10px)" : dotSize === "medium" ? "calc(100% - 24px)" : "calc(100% - 32px)"
64
- }
65
- }
66
- ), /* @__PURE__ */ React.createElement(
67
- "div",
68
- {
69
- className: cn(
70
- "relative z-10 flex items-center justify-center rounded-full",
71
- getDotSizeClasses().outer,
72
- getStepColors(),
73
- dotSize === "small" ? "" : "border"
74
- )
75
- },
76
- getStepIcon()
77
- ), /* @__PURE__ */ React.createElement(
78
- "div",
79
- {
80
- className: cn("pb-6 flex-1 mt-0", {
81
- "ml-[14px]": dotSize === "small",
82
- "ml-4": dotSize === "medium",
83
- "ml-5": dotSize === "large"
84
- })
85
- },
86
- /* @__PURE__ */ React.createElement(
87
- "div",
88
- {
89
- className: cn(
90
- "text-sm font-medium",
91
- status === "completed" || isCurrent ? "text-gray-900" : "text-gray-500"
92
- )
93
- },
94
- item.title
95
- ),
96
- item.description && /* @__PURE__ */ React.createElement("div", { className: "mt-1" }, typeof item.description === "string" ? /* @__PURE__ */ React.createElement("div", { className: "text-sm text-gray-600" }, item.description) : item.description)
97
- ));
98
- }));
99
- };
100
- Steps.displayName = "Steps";
101
-
102
- export { Steps };
@@ -1,106 +0,0 @@
1
- import * as React from 'react';
2
- import { X } from 'lucide-react';
3
- import { cn } from '../../lib/utils.js';
4
- import { Tag } from '../Tag/Tag.js';
5
- import { textareaVariants } from '../Textarea/Textarea.js';
6
- import { Typography } from '../Typography/Typography.js';
7
-
8
- function TagInput({
9
- value,
10
- onRemove,
11
- placeholder = "Nenhum item selecionado",
12
- disabled = false,
13
- readOnly = false,
14
- className = "",
15
- variant = "default",
16
- radius = "default",
17
- ...props
18
- }) {
19
- const ref = React.useRef(null);
20
- const [maxVisibleCount, setMaxVisibleCount] = React.useState(
21
- null
22
- );
23
- const [hiddenCount, setHiddenCount] = React.useState(0);
24
- const calculateMaxVisible = React.useCallback(() => {
25
- const container = ref.current;
26
- if (!container) return;
27
- const children = Array.from(container.children).filter(
28
- (el) => el.dataset.tag === "true"
29
- );
30
- const lines = [];
31
- children.forEach((c) => {
32
- const t = c.offsetTop;
33
- if (!lines.includes(t)) lines.push(t);
34
- });
35
- if (lines.length <= 2) {
36
- setMaxVisibleCount(children.length);
37
- setHiddenCount(0);
38
- return;
39
- }
40
- const second = lines[1];
41
- let count = 0;
42
- for (const c of children) {
43
- if (c.offsetTop > second) break;
44
- count++;
45
- }
46
- setMaxVisibleCount(count);
47
- setHiddenCount(children.length - count);
48
- }, []);
49
- React.useLayoutEffect(() => {
50
- if (maxVisibleCount === null) {
51
- const id = window.requestAnimationFrame(calculateMaxVisible);
52
- return () => window.cancelAnimationFrame(id);
53
- }
54
- }, [maxVisibleCount, calculateMaxVisible]);
55
- const visibleCount = maxVisibleCount === null ? value.length : maxVisibleCount;
56
- const displayTags = value.slice(0, visibleCount);
57
- const currentHiddenCount = Math.max(value.length - visibleCount, 0);
58
- React.useEffect(() => {
59
- setHiddenCount(currentHiddenCount);
60
- }, [currentHiddenCount]);
61
- const textareaRadius = radius === "full" ? "large" : radius;
62
- return /* @__PURE__ */ React.createElement(
63
- "div",
64
- {
65
- ref,
66
- className: cn(
67
- textareaVariants({ variant, radius: textareaRadius }),
68
- "flex flex-wrap items-start min-h-10 gap-1 py-2 px-3",
69
- disabled && "opacity-50 pointer-events-none",
70
- className
71
- ),
72
- tabIndex: 0,
73
- "aria-disabled": disabled,
74
- style: { resize: "none", cursor: disabled ? "not-allowed" : "text" },
75
- ...props
76
- },
77
- value.length === 0 && /* @__PURE__ */ React.createElement(Typography, { variant: "body-small-400", className: "text-grey-400" }, placeholder),
78
- displayTags.map((item) => /* @__PURE__ */ React.createElement(Tag, { key: item.value, "data-tag": "true", color: "blue" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body-small-400", className: "text-blue-600" }, item.label), !readOnly && /* @__PURE__ */ React.createElement(
79
- X,
80
- {
81
- className: "w-4 h-4 cursor-pointer",
82
- onClick: (e) => {
83
- e.stopPropagation();
84
- onRemove(item.value);
85
- },
86
- "aria-label": `Remover ${item.label}`,
87
- tabIndex: 0
88
- }
89
- ))),
90
- hiddenCount > 0 && /* @__PURE__ */ React.createElement(Tag, { color: "grey", "data-tag": "true" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body-small-400", className: "text-grey-600" }, "+", hiddenCount), !readOnly && /* @__PURE__ */ React.createElement(
91
- X,
92
- {
93
- className: "w-4 h-4 cursor-pointer text-grey-500 hover:text-grey-700",
94
- onClick: (e) => {
95
- e.stopPropagation();
96
- const next = value[visibleCount]?.value;
97
- if (next) onRemove(next);
98
- },
99
- "aria-label": "Remover pr\xF3xima tag oculta",
100
- tabIndex: 0
101
- }
102
- ))
103
- );
104
- }
105
-
106
- export { TagInput };