@rovula/ui 0.1.27 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/bundle.css +513 -67
- package/dist/cjs/bundle.js +589 -589
- package/dist/cjs/bundle.js.map +1 -1
- package/dist/cjs/types/components/Avatar/Avatar.d.ts +1 -1
- package/dist/cjs/types/components/Avatar/Avatar.stories.d.ts +1 -1
- package/dist/cjs/types/components/Avatar/Avatar.styles.d.ts +1 -0
- package/dist/cjs/types/components/DataTable/DataTable.d.ts +195 -4
- package/dist/cjs/types/components/DataTable/DataTable.editing.d.ts +20 -0
- package/dist/cjs/types/components/DataTable/DataTable.editing.types.d.ts +145 -0
- package/dist/cjs/types/components/DataTable/DataTable.stories.d.ts +268 -6
- package/dist/cjs/types/components/Dropdown/Dropdown.d.ts +22 -0
- package/dist/cjs/types/components/Dropdown/Dropdown.stories.d.ts +4 -0
- package/dist/cjs/types/components/ScrollArea/ScrollArea.d.ts +3 -3
- package/dist/cjs/types/components/ScrollArea/ScrollArea.stories.d.ts +4 -0
- package/dist/cjs/types/components/Table/Table.d.ts +33 -3
- package/dist/cjs/types/components/Table/Table.stories.d.ts +86 -4
- package/dist/cjs/types/components/TextInput/TextInput.stories.d.ts +8 -0
- package/dist/cjs/types/components/TextInput/TextInput.styles.d.ts +1 -0
- package/dist/components/Avatar/Avatar.js +2 -1
- package/dist/components/Avatar/Avatar.styles.js +3 -0
- package/dist/components/Avatar/AvatarBase.js +1 -1
- package/dist/components/DataTable/DataTable.editing.js +385 -0
- package/dist/components/DataTable/DataTable.editing.types.js +1 -0
- package/dist/components/DataTable/DataTable.js +983 -50
- package/dist/components/DataTable/DataTable.stories.js +1077 -25
- package/dist/components/Dropdown/Dropdown.js +8 -6
- package/dist/components/ScrollArea/ScrollArea.js +2 -2
- package/dist/components/ScrollArea/ScrollArea.stories.js +68 -2
- package/dist/components/Table/Table.js +103 -13
- package/dist/components/Table/Table.stories.js +226 -9
- package/dist/components/TextInput/TextInput.js +6 -4
- package/dist/components/TextInput/TextInput.stories.js +8 -0
- package/dist/components/TextInput/TextInput.styles.js +7 -1
- package/dist/esm/bundle.css +513 -67
- package/dist/esm/bundle.js +1545 -1545
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/types/components/Avatar/Avatar.d.ts +1 -1
- package/dist/esm/types/components/Avatar/Avatar.stories.d.ts +1 -1
- package/dist/esm/types/components/Avatar/Avatar.styles.d.ts +1 -0
- package/dist/esm/types/components/DataTable/DataTable.d.ts +195 -4
- package/dist/esm/types/components/DataTable/DataTable.editing.d.ts +20 -0
- package/dist/esm/types/components/DataTable/DataTable.editing.types.d.ts +145 -0
- package/dist/esm/types/components/DataTable/DataTable.stories.d.ts +268 -6
- package/dist/esm/types/components/Dropdown/Dropdown.d.ts +22 -0
- package/dist/esm/types/components/Dropdown/Dropdown.stories.d.ts +4 -0
- package/dist/esm/types/components/ScrollArea/ScrollArea.d.ts +3 -3
- package/dist/esm/types/components/ScrollArea/ScrollArea.stories.d.ts +4 -0
- package/dist/esm/types/components/Table/Table.d.ts +33 -3
- package/dist/esm/types/components/Table/Table.stories.d.ts +86 -4
- package/dist/esm/types/components/TextInput/TextInput.stories.d.ts +8 -0
- package/dist/esm/types/components/TextInput/TextInput.styles.d.ts +1 -0
- package/dist/index.d.ts +493 -122
- package/dist/src/theme/global.css +762 -96
- package/package.json +14 -2
- package/src/components/Avatar/Avatar.styles.ts +4 -1
- package/src/components/Avatar/Avatar.tsx +3 -2
- package/src/components/Avatar/AvatarBase.tsx +3 -3
- package/src/components/DataTable/DataTable.editing.tsx +861 -0
- package/src/components/DataTable/DataTable.editing.types.ts +192 -0
- package/src/components/DataTable/DataTable.stories.tsx +2169 -31
- package/src/components/DataTable/DataTable.test.tsx +696 -0
- package/src/components/DataTable/DataTable.tsx +2260 -94
- package/src/components/Dropdown/Dropdown.tsx +22 -6
- package/src/components/ScrollArea/ScrollArea.stories.tsx +146 -3
- package/src/components/ScrollArea/ScrollArea.tsx +6 -6
- package/src/components/Table/Table.stories.tsx +789 -44
- package/src/components/Table/Table.tsx +294 -28
- package/src/components/TextInput/TextInput.stories.tsx +80 -0
- package/src/components/TextInput/TextInput.styles.ts +7 -1
- package/src/components/TextInput/TextInput.tsx +21 -14
- package/src/test/setup.ts +50 -0
- package/src/theme/global.css +81 -42
- package/src/theme/presets/colors.js +12 -0
- package/src/theme/themes/variable.css +27 -28
- package/src/theme/tokens/baseline.css +2 -1
- package/src/theme/tokens/components/scrollbar.css +9 -4
- package/src/theme/tokens/components/table.css +63 -0
|
@@ -16,7 +16,7 @@ import { helperTextVariant, iconActionVariant, inlineEndIconWrapperVariant, inli
|
|
|
16
16
|
import { CircleAlert, CircleX, Search } from "lucide-react";
|
|
17
17
|
import { cn } from "@/utils/cn";
|
|
18
18
|
export const TextInput = forwardRef((_a, ref) => {
|
|
19
|
-
var { id, label, size = "md", rounded = "normal", variant = "outline", type = "text", iconMode = "
|
|
19
|
+
var { id, label, size = "md", rounded = "normal", variant = "outline", type = "text", iconMode = "flat", helperText, errorMessage, warningMessage, status, fullwidth = true, disabled = false, error = false, warning = false, required = true, isFloatingLabel = true, keepCloseIconOnValue = false, keepFooterSpace = true, hasClearIcon = true, hasSearchIcon = false, startIcon, endIcon, labelClassName, onClickStartIcon, onClickEndIcon, renderStartIcon, renderEndIcon, classes, normalize, format, trimOnCommit, normalizeOnCommit, placeholder } = _a, props = __rest(_a, ["id", "label", "size", "rounded", "variant", "type", "iconMode", "helperText", "errorMessage", "warningMessage", "status", "fullwidth", "disabled", "error", "warning", "required", "isFloatingLabel", "keepCloseIconOnValue", "keepFooterSpace", "hasClearIcon", "hasSearchIcon", "startIcon", "endIcon", "labelClassName", "onClickStartIcon", "onClickEndIcon", "renderStartIcon", "renderEndIcon", "classes", "normalize", "format", "trimOnCommit", "normalizeOnCommit", "placeholder"]);
|
|
20
20
|
const inputRef = useRef(null);
|
|
21
21
|
const _id = id || `${type}-${label}-input`;
|
|
22
22
|
// Stable merged ref — identity never changes so Headless UI (or any library
|
|
@@ -49,6 +49,7 @@ export const TextInput = forwardRef((_a, ref) => {
|
|
|
49
49
|
hasClearIcon: (iconMode === "flat" && hasRightSectionIcon) || hasClearIcon,
|
|
50
50
|
leftSectionIcon: iconMode === "solid" ? hasLeftSectionIcon : false,
|
|
51
51
|
rightSectionIcon: iconMode === "solid" ? hasRightSectionIcon : false,
|
|
52
|
+
floatingLabelPlaceholder: isFloatingLabel,
|
|
52
53
|
});
|
|
53
54
|
const labelClassname = labelVariant({
|
|
54
55
|
size,
|
|
@@ -186,16 +187,17 @@ export const TextInput = forwardRef((_a, ref) => {
|
|
|
186
187
|
renderEndIcon,
|
|
187
188
|
handleOnClickRightSectionIcon,
|
|
188
189
|
]);
|
|
189
|
-
|
|
190
|
+
const showLabel = isFloatingLabel || (label != null && String(label) !== "");
|
|
191
|
+
return (_jsxs("div", { className: `inline-flex flex-col ${fullwidth ? "w-full" : ""}`, children: [_jsxs("div", { className: "relative", children: [_jsx("input", Object.assign({}, props, { placeholder: isFloatingLabel ? " " : placeholder !== null && placeholder !== void 0 ? placeholder : "", ref: stableRef, type: type, id: _id, disabled: disabled, value: displayValue, className: cn(inputClassname, props.className), onChange: normalize ? handleChange : props.onChange, onBlur: trimOnCommit || normalizeOnCommit ? handleBlur : props.onBlur, onKeyDown: trimOnCommit || normalizeOnCommit
|
|
190
192
|
? handleKeyDown
|
|
191
193
|
: props.onKeyDown })), hasSearchIcon && !hasLeftSectionIcon && (_jsx("div", { className: cn(inlineStartIconWrapperClassname, classes === null || classes === void 0 ? void 0 : classes.iconSearchWrapper), children: _jsx(Search, { className: cn(searchIconClassname, classes === null || classes === void 0 ? void 0 : classes.icon) }) })), startIconElement, hasClearIcon && !hasRightSectionIcon && (_jsx("div", { className: cn(inlineEndIconWrapperClassname, classes === null || classes === void 0 ? void 0 : classes.iconWrapper), style: {
|
|
192
194
|
display: keepCloseIconOnValue && props.value ? "flex" : undefined,
|
|
193
195
|
}, children: _jsx(CircleX, { className: cn(iconActionClassname,
|
|
194
196
|
// 'fill-none stroke-current',
|
|
195
197
|
// "fill-none stroke-input-default-text hover:stroke-input-filled-text active:stroke-input-filled-text",
|
|
196
|
-
classes === null || classes === void 0 ? void 0 : classes.icon), onMouseDown: handleClearInput }) })), endIconElement, _jsxs("label", { htmlFor: _id, className: cn(labelClassname), children: [label, " ", required && (_jsx("span", { className: cn("text-input-error", {
|
|
198
|
+
classes === null || classes === void 0 ? void 0 : classes.icon), onMouseDown: handleClearInput }) })), endIconElement, showLabel && (_jsxs("label", { htmlFor: _id, className: cn(labelClassname, labelClassName), children: [label, " ", required && (_jsx("span", { className: cn("text-input-error", {
|
|
197
199
|
"text-input-disable-text": disabled,
|
|
198
|
-
}), children: "*" }))] })] }), (feedbackMessage || keepFooterSpace) && (_jsxs("span", { className: helperTextClassname, children: [feedbackMessage && (_jsx("span", { className: "h-full shrink-0", children: _jsx(CircleAlert, { width: 14, height: 14, className: cn("fill-none stroke-current", isError
|
|
200
|
+
}), children: "*" }))] }))] }), (feedbackMessage || keepFooterSpace) && (_jsxs("span", { className: helperTextClassname, children: [feedbackMessage && (_jsx("span", { className: "h-full shrink-0", children: _jsx(CircleAlert, { width: 14, height: 14, className: cn("fill-none stroke-current", isError
|
|
199
201
|
? "text-input-error"
|
|
200
202
|
: isWarning
|
|
201
203
|
? "text-warning"
|
|
@@ -29,6 +29,14 @@ export const Default = {
|
|
|
29
29
|
return (_jsxs("div", { className: "flex flex-row gap-4 w-full", children: [_jsx(TextInput, Object.assign({ id: "1", size: "lg" }, args)), _jsx(TextInput, Object.assign({ id: "2", size: "md" }, args)), _jsx(TextInput, Object.assign({ id: "3", size: "sm" }, args))] }));
|
|
30
30
|
},
|
|
31
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* `isFloatingLabel={false}` — visible **`placeholder`**, no floating animation,
|
|
34
|
+
* and no inner `<label>` when `label` is empty (e.g. table cells, compact filters).
|
|
35
|
+
* Pair with `required={false}` + `hasClearIcon={false}` when mimicking inline fields.
|
|
36
|
+
*/
|
|
37
|
+
export const NonFloatingLabel = {
|
|
38
|
+
render: () => (_jsxs("div", { className: "flex w-full max-w-4xl flex-col gap-8", children: [_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("h4", { className: "typography-subtitle4 text-text-g-contrast-medium", children: ["Placeholder only \u2014 empty ", _jsx("code", { className: "typography-small2", children: "label" }), " ", "(no floating label, no label node)"] }), _jsx("p", { className: "typography-small2 text-text-g-contrast-low max-w-2xl", children: "Tab order follows DOM, like native inputs in a row." }), _jsxs("div", { className: "flex flex-row flex-wrap items-end gap-4", children: [_jsx(TextInput, { id: "nf-cell-lg", size: "lg", isFloatingLabel: false, label: "", required: false, hasClearIcon: false, keepFooterSpace: false, placeholder: "Column name", fullwidth: false, "aria-label": "Column name" }), _jsx(TextInput, { id: "nf-cell-md", size: "md", isFloatingLabel: false, label: "", required: false, hasClearIcon: false, keepFooterSpace: false, placeholder: "Column name", fullwidth: false, "aria-label": "Column name" }), _jsx(TextInput, { id: "nf-cell-sm", size: "sm", isFloatingLabel: false, label: "", required: false, hasClearIcon: false, keepFooterSpace: false, placeholder: "Column name", fullwidth: false, "aria-label": "Column name" })] })] }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("h4", { className: "typography-subtitle4 text-text-g-contrast-medium", children: "Static label inside field (non-floating layout)" }), _jsx("div", { className: "flex flex-row flex-wrap gap-4", children: _jsx(TextInput, { id: "nf-static-md", size: "md", isFloatingLabel: false, label: "Department", required: false, hasClearIcon: true, keepFooterSpace: true, placeholder: "e.g. Engineering", helperText: "Shown as fixed label + real placeholder.", fullwidth: false, className: "min-w-[240px]" }) })] })] })),
|
|
39
|
+
};
|
|
32
40
|
const InputWithRef = (props) => {
|
|
33
41
|
const inputRef = useRef(null);
|
|
34
42
|
return (_jsx(TextInput, Object.assign({ id: "1", size: "lg" }, props, { ref: inputRef, labelClassName: "peer-focus:bg-red-500", onKeyDown: (e) => {
|
|
@@ -3,9 +3,14 @@ export const inputVariant = cva([
|
|
|
3
3
|
"truncate",
|
|
4
4
|
"border-0 outline-none",
|
|
5
5
|
"flex w-auto box-border",
|
|
6
|
-
"peer text-input-filled-text
|
|
6
|
+
"peer text-input-filled-text bg-transparent caret-primary",
|
|
7
7
|
], {
|
|
8
8
|
variants: {
|
|
9
|
+
/** When `true`, placeholder is transparent — floating label uses a space placeholder. */
|
|
10
|
+
floatingLabelPlaceholder: {
|
|
11
|
+
true: "placeholder:text-transparent",
|
|
12
|
+
false: "placeholder:text-input-default-text",
|
|
13
|
+
},
|
|
9
14
|
size: {
|
|
10
15
|
sm: "p-2 px-3 typography-small1",
|
|
11
16
|
md: "py-2 px-3 typography-subtitle4",
|
|
@@ -140,6 +145,7 @@ export const inputVariant = cva([
|
|
|
140
145
|
hasSearchIcon: false,
|
|
141
146
|
leftSectionIcon: false, // TODO function style
|
|
142
147
|
rightSectionIcon: false,
|
|
148
|
+
floatingLabelPlaceholder: true,
|
|
143
149
|
},
|
|
144
150
|
});
|
|
145
151
|
export const labelVariant = cva([
|