@lidofinance/lido-app-ui 1.10.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.css +1 -1
- package/dist/cjs/pagination/Pagination.cjs +149 -0
- package/dist/cjs/pagination/Pagination.cjs.map +1 -0
- package/dist/cjs/pagination/Pagination.module.css.cjs +6 -0
- package/dist/cjs/pagination/Pagination.module.css.cjs.map +1 -0
- package/dist/cjs/rich-input/RichInput.cjs +2 -1
- package/dist/cjs/rich-input/RichInput.cjs.map +1 -1
- package/dist/esm/index.css +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/pagination/Pagination.mjs +145 -0
- package/dist/esm/pagination/Pagination.mjs.map +1 -0
- package/dist/esm/pagination/Pagination.module.css.mjs +4 -0
- package/dist/esm/pagination/Pagination.module.css.mjs.map +1 -0
- package/dist/esm/rich-input/RichInput.mjs +2 -1
- package/dist/esm/rich-input/RichInput.mjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/pagination/Pagination.d.ts +30 -0
- package/dist/types/pagination/Pagination.d.ts.map +1 -0
- package/dist/types/pagination/index.d.ts +3 -0
- package/dist/types/pagination/index.d.ts.map +1 -0
- package/dist/types/rich-input/RichInput.d.ts +3 -1
- package/dist/types/rich-input/RichInput.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import styles from './Pagination.module.css.mjs';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
import { TokenSelector } from '../token-selector/TokenSelector.mjs';
|
|
6
|
+
import { IconButton } from '../icon-button/IconButton.mjs';
|
|
7
|
+
import { IconChevronLeft } from '../icons/components/base/IconChevronLeft.mjs';
|
|
8
|
+
import { Input } from '../input/Input.mjs';
|
|
9
|
+
import { IconChevronRight } from '../icons/components/base/IconChevronRight.mjs';
|
|
10
|
+
|
|
11
|
+
const DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
|
|
12
|
+
const DEFAULT_LABELS = {
|
|
13
|
+
show: 'Show',
|
|
14
|
+
records: 'Records',
|
|
15
|
+
of: 'of',
|
|
16
|
+
page: 'Page number',
|
|
17
|
+
previous: 'Previous page',
|
|
18
|
+
next: 'Next page'
|
|
19
|
+
};
|
|
20
|
+
const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
21
|
+
const Pagination = _ref => {
|
|
22
|
+
let {
|
|
23
|
+
page,
|
|
24
|
+
pageCount,
|
|
25
|
+
onPageChange,
|
|
26
|
+
pageSize,
|
|
27
|
+
pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,
|
|
28
|
+
onPageSizeChange,
|
|
29
|
+
labels,
|
|
30
|
+
className,
|
|
31
|
+
dataTestId,
|
|
32
|
+
...rest
|
|
33
|
+
} = _ref;
|
|
34
|
+
const text = {
|
|
35
|
+
...DEFAULT_LABELS,
|
|
36
|
+
...labels
|
|
37
|
+
};
|
|
38
|
+
const lastPage = Math.max(pageCount, 1);
|
|
39
|
+
// `null` while the input is not being edited — it then mirrors `page`.
|
|
40
|
+
const [draft, setDraft] = useState(null);
|
|
41
|
+
const goTo = next => {
|
|
42
|
+
const target = clamp(next, 1, lastPage);
|
|
43
|
+
if (target !== page) onPageChange(target);
|
|
44
|
+
};
|
|
45
|
+
const commitDraft = () => {
|
|
46
|
+
if (draft !== null && draft !== '') goTo(Number(draft));
|
|
47
|
+
setDraft(null);
|
|
48
|
+
};
|
|
49
|
+
const handleInputChange = event => {
|
|
50
|
+
setDraft(event.target.value.replace(/\D/g, ''));
|
|
51
|
+
};
|
|
52
|
+
const handleInputKeyDown = event => {
|
|
53
|
+
if (event.key === 'Enter') {
|
|
54
|
+
commitDraft();
|
|
55
|
+
event.currentTarget.blur();
|
|
56
|
+
} else if (event.key === 'Escape') {
|
|
57
|
+
setDraft(null);
|
|
58
|
+
event.currentTarget.blur();
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const handleInputFocus = event => {
|
|
62
|
+
setDraft(String(page));
|
|
63
|
+
event.currentTarget.select();
|
|
64
|
+
};
|
|
65
|
+
const sizeOptions = (pageSize != null && !pageSizeOptions.includes(pageSize) ? [...pageSizeOptions, pageSize].sort((a, b) => a - b) : pageSizeOptions).map(size => ({
|
|
66
|
+
value: String(size),
|
|
67
|
+
label: /*#__PURE__*/jsx("span", {
|
|
68
|
+
className: styles.pageSizeLabel,
|
|
69
|
+
children: size
|
|
70
|
+
})
|
|
71
|
+
}));
|
|
72
|
+
const fieldStyle = {
|
|
73
|
+
'--local-digits': String(lastPage).length
|
|
74
|
+
};
|
|
75
|
+
return /*#__PURE__*/jsxs("div", {
|
|
76
|
+
className: cn(styles.pagination, className),
|
|
77
|
+
"data-testid": dataTestId?.root,
|
|
78
|
+
...rest,
|
|
79
|
+
children: [pageSize != null ? /*#__PURE__*/jsxs("div", {
|
|
80
|
+
className: styles.group,
|
|
81
|
+
children: [/*#__PURE__*/jsx("span", {
|
|
82
|
+
className: styles.text,
|
|
83
|
+
children: text.show
|
|
84
|
+
}), /*#__PURE__*/jsx("span", {
|
|
85
|
+
className: styles.pageSize,
|
|
86
|
+
children: /*#__PURE__*/jsx(TokenSelector, {
|
|
87
|
+
size: "small",
|
|
88
|
+
options: sizeOptions,
|
|
89
|
+
value: String(pageSize),
|
|
90
|
+
onChange: value => onPageSizeChange?.(Number(value)),
|
|
91
|
+
dataTestId: {
|
|
92
|
+
trigger: dataTestId?.pageSize
|
|
93
|
+
}
|
|
94
|
+
})
|
|
95
|
+
}), /*#__PURE__*/jsx("span", {
|
|
96
|
+
className: styles.text,
|
|
97
|
+
children: text.records
|
|
98
|
+
})]
|
|
99
|
+
}) : null, /*#__PURE__*/jsxs("div", {
|
|
100
|
+
className: styles.group,
|
|
101
|
+
children: [/*#__PURE__*/jsx(IconButton, {
|
|
102
|
+
variant: "ghost",
|
|
103
|
+
icon: /*#__PURE__*/jsx(IconChevronLeft, {}),
|
|
104
|
+
"aria-label": text.previous,
|
|
105
|
+
disabled: page <= 1,
|
|
106
|
+
onClick: () => goTo(page - 1),
|
|
107
|
+
dataTestId: {
|
|
108
|
+
root: dataTestId?.previous
|
|
109
|
+
}
|
|
110
|
+
}), /*#__PURE__*/jsx("span", {
|
|
111
|
+
className: styles.pageField,
|
|
112
|
+
style: fieldStyle,
|
|
113
|
+
children: /*#__PURE__*/jsx(Input, {
|
|
114
|
+
size: "small",
|
|
115
|
+
type: "text",
|
|
116
|
+
inputMode: "numeric",
|
|
117
|
+
"aria-label": text.page,
|
|
118
|
+
value: draft ?? String(page),
|
|
119
|
+
onChange: handleInputChange,
|
|
120
|
+
onFocus: handleInputFocus,
|
|
121
|
+
onBlur: commitDraft,
|
|
122
|
+
onKeyDown: handleInputKeyDown,
|
|
123
|
+
dataTestId: {
|
|
124
|
+
input: dataTestId?.pageInput
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
}), /*#__PURE__*/jsxs("span", {
|
|
128
|
+
className: styles.text,
|
|
129
|
+
children: [text.of, " ", lastPage]
|
|
130
|
+
}), /*#__PURE__*/jsx(IconButton, {
|
|
131
|
+
variant: "ghost",
|
|
132
|
+
icon: /*#__PURE__*/jsx(IconChevronRight, {}),
|
|
133
|
+
"aria-label": text.next,
|
|
134
|
+
disabled: page >= lastPage,
|
|
135
|
+
onClick: () => goTo(page + 1),
|
|
136
|
+
dataTestId: {
|
|
137
|
+
root: dataTestId?.next
|
|
138
|
+
}
|
|
139
|
+
})]
|
|
140
|
+
})]
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
export { Pagination };
|
|
145
|
+
//# sourceMappingURL=Pagination.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.mjs","sources":["../../../src/pagination/Pagination.tsx"],"sourcesContent":["import {\n useState,\n type ChangeEvent,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\n\nimport cn from 'classnames'\n\nimport { IconButton } from '../icon-button'\nimport { IconChevronLeft, IconChevronRight } from '../icons'\nimport { Input } from '../input'\nimport { TokenSelector } from '../token-selector'\nimport styles from './Pagination.module.css'\n\nexport type PaginationLabels = {\n show?: ReactNode\n records?: ReactNode\n of?: ReactNode\n page?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationDataTestId = {\n root?: string\n pageSize?: string\n pageInput?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'onChange'\n> & {\n /** Current page, 1-based. The component is controlled. */\n page: number\n pageCount: number\n onPageChange: (page: number) => void\n /** Current page size. The \"Show N Records\" block renders only when set. */\n pageSize?: number\n pageSizeOptions?: number[]\n onPageSizeChange?: (pageSize: number) => void\n labels?: PaginationLabels\n dataTestId?: PaginationDataTestId\n}\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100]\n\nconst DEFAULT_LABELS: Required<PaginationLabels> = {\n show: 'Show',\n records: 'Records',\n of: 'of',\n page: 'Page number',\n previous: 'Previous page',\n next: 'Next page',\n}\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max)\n\nexport const Pagination = ({\n page,\n pageCount,\n onPageChange,\n pageSize,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n onPageSizeChange,\n labels,\n className,\n dataTestId,\n ...rest\n}: PaginationProps) => {\n const text = { ...DEFAULT_LABELS, ...labels }\n const lastPage = Math.max(pageCount, 1)\n // `null` while the input is not being edited — it then mirrors `page`.\n const [draft, setDraft] = useState<string | null>(null)\n\n const goTo = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target !== page) onPageChange(target)\n }\n\n const commitDraft = () => {\n if (draft !== null && draft !== '') goTo(Number(draft))\n setDraft(null)\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setDraft(event.target.value.replace(/\\D/g, ''))\n }\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n commitDraft()\n event.currentTarget.blur()\n } else if (event.key === 'Escape') {\n setDraft(null)\n event.currentTarget.blur()\n }\n }\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n setDraft(String(page))\n event.currentTarget.select()\n }\n\n const sizeOptions = (\n pageSize != null && !pageSizeOptions.includes(pageSize)\n ? [...pageSizeOptions, pageSize].sort((a, b) => a - b)\n : pageSizeOptions\n ).map((size) => ({\n value: String(size),\n label: <span className={styles.pageSizeLabel}>{size}</span>,\n }))\n\n const fieldStyle = {\n '--local-digits': String(lastPage).length,\n } as CSSProperties\n\n return (\n <div\n className={cn(styles.pagination, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {pageSize != null ? (\n <div className={styles.group}>\n <span className={styles.text}>{text.show}</span>\n <span className={styles.pageSize}>\n <TokenSelector\n size='small'\n options={sizeOptions}\n value={String(pageSize)}\n onChange={(value) => onPageSizeChange?.(Number(value))}\n dataTestId={{ trigger: dataTestId?.pageSize }}\n />\n </span>\n <span className={styles.text}>{text.records}</span>\n </div>\n ) : null}\n <div className={styles.group}>\n <IconButton\n variant='ghost'\n icon={<IconChevronLeft />}\n aria-label={text.previous}\n disabled={page <= 1}\n onClick={() => goTo(page - 1)}\n dataTestId={{ root: dataTestId?.previous }}\n />\n <span className={styles.pageField} style={fieldStyle}>\n <Input\n size='small'\n type='text'\n inputMode='numeric'\n aria-label={text.page}\n value={draft ?? String(page)}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={commitDraft}\n onKeyDown={handleInputKeyDown}\n dataTestId={{ input: dataTestId?.pageInput }}\n />\n </span>\n <span className={styles.text}>\n {text.of} {lastPage}\n </span>\n <IconButton\n variant='ghost'\n icon={<IconChevronRight />}\n aria-label={text.next}\n disabled={page >= lastPage}\n onClick={() => goTo(page + 1)}\n dataTestId={{ root: dataTestId?.next }}\n />\n </div>\n </div>\n )\n}\n"],"names":["DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_LABELS","show","records","of","page","previous","next","clamp","value","min","max","Math","Pagination","_ref","pageCount","onPageChange","pageSize","pageSizeOptions","onPageSizeChange","labels","className","dataTestId","rest","text","lastPage","draft","setDraft","useState","goTo","target","commitDraft","Number","handleInputChange","event","replace","handleInputKeyDown","key","currentTarget","blur","handleInputFocus","String","select","sizeOptions","includes","sort","a","b","map","size","label","_jsx","styles","pageSizeLabel","children","fieldStyle","length","_jsxs","cn","pagination","root","group","TokenSelector","options","onChange","trigger","IconButton","variant","icon","IconChevronLeft","disabled","onClick","pageField","style","Input","type","inputMode","onFocus","onBlur","onKeyDown","input","pageInput","IconChevronRight"],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const styles = {"pagination":"Pagination-module_pagination__viYLy","group":"Pagination-module_group__8jotK","text":"Pagination-module_text__CQM2p","pageSize":"Pagination-module_pageSize__JMMiI","pageSizeLabel":"Pagination-module_pageSizeLabel__f6ZUk","pageField":"Pagination-module_pageField__K4-oG"};
|
|
2
|
+
|
|
3
|
+
export { styles as default };
|
|
4
|
+
//# sourceMappingURL=Pagination.module.css.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -52,6 +52,7 @@ const RichInput = _ref2 => {
|
|
|
52
52
|
onMaxClick,
|
|
53
53
|
maxDisabled,
|
|
54
54
|
maxTooltip,
|
|
55
|
+
maxTooltipPosition = 'bottom-left',
|
|
55
56
|
onChange,
|
|
56
57
|
className,
|
|
57
58
|
id,
|
|
@@ -143,7 +144,7 @@ const RichInput = _ref2 => {
|
|
|
143
144
|
children: balance
|
|
144
145
|
}) : null, showMax ? maxTooltip != null ? /*#__PURE__*/jsx(Tooltip, {
|
|
145
146
|
content: maxTooltip,
|
|
146
|
-
position:
|
|
147
|
+
position: maxTooltipPosition,
|
|
147
148
|
width: 240,
|
|
148
149
|
children: /*#__PURE__*/jsx(MaxTag, {
|
|
149
150
|
"data-testid": dataTestId?.maxButton,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichInput.mjs","sources":["../../../src/rich-input/RichInput.tsx"],"sourcesContent":["import {\n useId,\n useRef,\n type ChangeEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\n\nimport cn from 'classnames'\nimport { IconInfo } from '../icons'\nimport { Tag, type TagProps } from '../tag'\nimport { Tooltip } from '../tooltip'\n\nimport styles from './RichInput.module.css'\n\nexport type RichInputDataTestId = {\n root?: string\n label?: string\n input?: string\n secondaryValue?: string\n balance?: string\n maxButton?: string\n error?: string\n}\n\nexport type RichInputProps = InputHTMLAttributes<HTMLInputElement> & {\n label?: ReactNode\n labelTooltip?: ReactNode\n secondaryValue?: ReactNode\n balance?: ReactNode\n tokenSelector?: ReactNode\n error?: boolean\n errorText?: ReactNode\n showMaxButton?: boolean\n onMaxClick?: MouseEventHandler<HTMLSpanElement>\n maxDisabled?: boolean\n maxTooltip?: ReactNode\n dataTestId?: RichInputDataTestId\n}\n\nconst MaxTag = ({\n onClick,\n className,\n disabled,\n ...rest\n}: TagProps & { disabled?: boolean }) => (\n <Tag\n role='button'\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={cn(styles.maxTag, disabled && styles.maxTagDisabled, className)}\n onClick={disabled ? undefined : onClick}\n onKeyDown={(event: KeyboardEvent<HTMLSpanElement>) => {\n if (disabled) return\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n onClick?.(event as unknown as MouseEvent<HTMLSpanElement>)\n }}\n {...rest}\n />\n)\n\n// Keep only digits and a single decimal point; comma is treated as the\n// decimal separator and normalized to a dot (en-US canonical form).\nconst sanitizeDecimal = (raw: string): string => {\n const normalized = raw.replace(/,/g, '.').replace(/[^\\d.]/g, '')\n const firstDot = normalized.indexOf('.')\n if (firstDot === -1) return normalized\n const head = normalized.slice(0, firstDot + 1)\n const tail = normalized.slice(firstDot + 1).replace(/\\./g, '')\n return head + tail\n}\n\nexport const RichInput = ({\n label,\n labelTooltip,\n secondaryValue,\n balance,\n tokenSelector,\n error,\n errorText,\n showMaxButton = true,\n onMaxClick,\n maxDisabled,\n maxTooltip,\n onChange,\n className,\n id,\n disabled,\n dataTestId,\n ...inputProps\n}: RichInputProps) => {\n const inputRef = useRef<HTMLInputElement>(null)\n const fallbackId = useId()\n const inputId = id ?? fallbackId\n\n const hasError = !!error\n const showErrorMessage = !!errorText\n const errorId = `${inputId}-error`\n const showMax = showMaxButton && !disabled\n const hasBottomRow = secondaryValue != null || balance != null || showMax\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const { value: rawValue, selectionStart } = event.target\n const sanitized = sanitizeDecimal(rawValue)\n\n if (sanitized !== rawValue) {\n // Rewrite the DOM value before bubbling up so the parent (controlled\n // or not) only ever sees the clean value and no invalid char sticks.\n const removed = rawValue.length - sanitized.length\n event.target.value = sanitized\n if (selectionStart != null) {\n const caret = Math.max(0, selectionStart - removed)\n event.target.setSelectionRange(caret, caret)\n }\n }\n\n onChange?.(event)\n }\n\n const handleRootClick = (event: MouseEvent<HTMLDivElement>) => {\n if (!(event.target instanceof Element)) return\n if (event.target.closest('button, input, label, [role=\"listbox\"]')) {\n return\n }\n inputRef.current?.focus()\n }\n\n return (\n <div className={cn(styles.root, className)} data-testid={dataTestId?.root}>\n {/*\n Clicking the padding around the field focuses it — a pointer convenience\n on top of the real control. Keyboard users tab straight to the input.\n */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n className={cn(styles.card, hasError && styles.error)}\n onClick={handleRootClick}\n >\n {label != null ? (\n <span className={styles.labelRow}>\n <label\n data-testid={dataTestId?.label}\n className={styles.label}\n htmlFor={inputId}\n >\n {label}\n </label>\n {labelTooltip != null ? (\n <Tooltip content={labelTooltip}>\n <IconInfo\n className={styles.labelTooltipIcon}\n aria-hidden='true'\n />\n </Tooltip>\n ) : null}\n </span>\n ) : null}\n <div className={styles.amountRow}>\n <input\n ref={inputRef}\n id={inputId}\n className={styles.input}\n inputMode='decimal'\n disabled={disabled}\n aria-invalid={hasError || undefined}\n aria-describedby={showErrorMessage ? errorId : undefined}\n onChange={handleChange}\n data-testid={dataTestId?.input}\n {...inputProps}\n />\n {tokenSelector != null ? (\n <div className={styles.token}>{tokenSelector}</div>\n ) : null}\n </div>\n {hasBottomRow ? (\n <div className={styles.bottomRow}>\n {secondaryValue != null ? (\n <span\n data-testid={dataTestId?.secondaryValue}\n className={styles.secondary}\n >\n {secondaryValue}\n </span>\n ) : null}\n <div className={styles.balanceGroup}>\n {balance != null ? (\n <span\n className={styles.balance}\n data-testid={dataTestId?.balance}\n >\n {balance}\n </span>\n ) : null}\n {showMax ? (\n maxTooltip != null ? (\n <Tooltip\n content={maxTooltip}\n position='bottom-left'\n width={240}\n >\n <MaxTag\n data-testid={dataTestId?.maxButton}\n onClick={onMaxClick}\n disabled={maxDisabled}\n >\n Max\n </MaxTag>\n </Tooltip>\n ) : (\n <MaxTag\n data-testid={dataTestId?.maxButton}\n onClick={onMaxClick}\n disabled={maxDisabled}\n >\n Max\n </MaxTag>\n )\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n {showErrorMessage ? (\n <div\n id={errorId}\n className={styles.errorMessage}\n data-testid={dataTestId?.error}\n >\n {errorText}\n </div>\n ) : null}\n </div>\n )\n}\n"],"names":["MaxTag","_ref","onClick","className","disabled","rest","_jsx","Tag","role","tabIndex","undefined","cn","styles","maxTag","maxTagDisabled","onKeyDown","event","key","preventDefault","sanitizeDecimal","raw","normalized","replace","firstDot","indexOf","head","slice","tail","RichInput","_ref2","label","labelTooltip","secondaryValue","balance","tokenSelector","error","errorText","showMaxButton","onMaxClick","maxDisabled","maxTooltip","onChange","id","dataTestId","inputProps","inputRef","useRef","fallbackId","useId","inputId","hasError","showErrorMessage","errorId","showMax","hasBottomRow","handleChange","value","rawValue","selectionStart","target","sanitized","removed","length","caret","Math","max","setSelectionRange","handleRootClick","Element","closest","current","focus","_jsxs","root","children","card","labelRow","htmlFor","Tooltip","content","IconInfo","labelTooltipIcon","amountRow","ref","input","inputMode","token","bottomRow","secondary","balanceGroup","position","width","maxButton","errorMessage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RichInput.mjs","sources":["../../../src/rich-input/RichInput.tsx"],"sourcesContent":["import {\n useId,\n useRef,\n type ChangeEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\n\nimport cn from 'classnames'\nimport { IconInfo } from '../icons'\nimport { Tag, type TagProps } from '../tag'\nimport { Tooltip, type TooltipPosition } from '../tooltip'\n\nimport styles from './RichInput.module.css'\n\nexport type RichInputDataTestId = {\n root?: string\n label?: string\n input?: string\n secondaryValue?: string\n balance?: string\n maxButton?: string\n error?: string\n}\n\nexport type RichInputProps = InputHTMLAttributes<HTMLInputElement> & {\n label?: ReactNode\n labelTooltip?: ReactNode\n secondaryValue?: ReactNode\n balance?: ReactNode\n tokenSelector?: ReactNode\n error?: boolean\n errorText?: ReactNode\n showMaxButton?: boolean\n onMaxClick?: MouseEventHandler<HTMLSpanElement>\n maxDisabled?: boolean\n maxTooltip?: ReactNode\n maxTooltipPosition?: TooltipPosition\n dataTestId?: RichInputDataTestId\n}\n\nconst MaxTag = ({\n onClick,\n className,\n disabled,\n ...rest\n}: TagProps & { disabled?: boolean }) => (\n <Tag\n role='button'\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={cn(styles.maxTag, disabled && styles.maxTagDisabled, className)}\n onClick={disabled ? undefined : onClick}\n onKeyDown={(event: KeyboardEvent<HTMLSpanElement>) => {\n if (disabled) return\n if (event.key !== 'Enter' && event.key !== ' ') return\n event.preventDefault()\n onClick?.(event as unknown as MouseEvent<HTMLSpanElement>)\n }}\n {...rest}\n />\n)\n\n// Keep only digits and a single decimal point; comma is treated as the\n// decimal separator and normalized to a dot (en-US canonical form).\nconst sanitizeDecimal = (raw: string): string => {\n const normalized = raw.replace(/,/g, '.').replace(/[^\\d.]/g, '')\n const firstDot = normalized.indexOf('.')\n if (firstDot === -1) return normalized\n const head = normalized.slice(0, firstDot + 1)\n const tail = normalized.slice(firstDot + 1).replace(/\\./g, '')\n return head + tail\n}\n\nexport const RichInput = ({\n label,\n labelTooltip,\n secondaryValue,\n balance,\n tokenSelector,\n error,\n errorText,\n showMaxButton = true,\n onMaxClick,\n maxDisabled,\n maxTooltip,\n maxTooltipPosition = 'bottom-left',\n onChange,\n className,\n id,\n disabled,\n dataTestId,\n ...inputProps\n}: RichInputProps) => {\n const inputRef = useRef<HTMLInputElement>(null)\n const fallbackId = useId()\n const inputId = id ?? fallbackId\n\n const hasError = !!error\n const showErrorMessage = !!errorText\n const errorId = `${inputId}-error`\n const showMax = showMaxButton && !disabled\n const hasBottomRow = secondaryValue != null || balance != null || showMax\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const { value: rawValue, selectionStart } = event.target\n const sanitized = sanitizeDecimal(rawValue)\n\n if (sanitized !== rawValue) {\n // Rewrite the DOM value before bubbling up so the parent (controlled\n // or not) only ever sees the clean value and no invalid char sticks.\n const removed = rawValue.length - sanitized.length\n event.target.value = sanitized\n if (selectionStart != null) {\n const caret = Math.max(0, selectionStart - removed)\n event.target.setSelectionRange(caret, caret)\n }\n }\n\n onChange?.(event)\n }\n\n const handleRootClick = (event: MouseEvent<HTMLDivElement>) => {\n if (!(event.target instanceof Element)) return\n if (event.target.closest('button, input, label, [role=\"listbox\"]')) {\n return\n }\n inputRef.current?.focus()\n }\n\n return (\n <div className={cn(styles.root, className)} data-testid={dataTestId?.root}>\n {/*\n Clicking the padding around the field focuses it — a pointer convenience\n on top of the real control. Keyboard users tab straight to the input.\n */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n className={cn(styles.card, hasError && styles.error)}\n onClick={handleRootClick}\n >\n {label != null ? (\n <span className={styles.labelRow}>\n <label\n data-testid={dataTestId?.label}\n className={styles.label}\n htmlFor={inputId}\n >\n {label}\n </label>\n {labelTooltip != null ? (\n <Tooltip content={labelTooltip}>\n <IconInfo\n className={styles.labelTooltipIcon}\n aria-hidden='true'\n />\n </Tooltip>\n ) : null}\n </span>\n ) : null}\n <div className={styles.amountRow}>\n <input\n ref={inputRef}\n id={inputId}\n className={styles.input}\n inputMode='decimal'\n disabled={disabled}\n aria-invalid={hasError || undefined}\n aria-describedby={showErrorMessage ? errorId : undefined}\n onChange={handleChange}\n data-testid={dataTestId?.input}\n {...inputProps}\n />\n {tokenSelector != null ? (\n <div className={styles.token}>{tokenSelector}</div>\n ) : null}\n </div>\n {hasBottomRow ? (\n <div className={styles.bottomRow}>\n {secondaryValue != null ? (\n <span\n data-testid={dataTestId?.secondaryValue}\n className={styles.secondary}\n >\n {secondaryValue}\n </span>\n ) : null}\n <div className={styles.balanceGroup}>\n {balance != null ? (\n <span\n className={styles.balance}\n data-testid={dataTestId?.balance}\n >\n {balance}\n </span>\n ) : null}\n {showMax ? (\n maxTooltip != null ? (\n <Tooltip\n content={maxTooltip}\n position={maxTooltipPosition}\n width={240}\n >\n <MaxTag\n data-testid={dataTestId?.maxButton}\n onClick={onMaxClick}\n disabled={maxDisabled}\n >\n Max\n </MaxTag>\n </Tooltip>\n ) : (\n <MaxTag\n data-testid={dataTestId?.maxButton}\n onClick={onMaxClick}\n disabled={maxDisabled}\n >\n Max\n </MaxTag>\n )\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n {showErrorMessage ? (\n <div\n id={errorId}\n className={styles.errorMessage}\n data-testid={dataTestId?.error}\n >\n {errorText}\n </div>\n ) : null}\n </div>\n )\n}\n"],"names":["MaxTag","_ref","onClick","className","disabled","rest","_jsx","Tag","role","tabIndex","undefined","cn","styles","maxTag","maxTagDisabled","onKeyDown","event","key","preventDefault","sanitizeDecimal","raw","normalized","replace","firstDot","indexOf","head","slice","tail","RichInput","_ref2","label","labelTooltip","secondaryValue","balance","tokenSelector","error","errorText","showMaxButton","onMaxClick","maxDisabled","maxTooltip","maxTooltipPosition","onChange","id","dataTestId","inputProps","inputRef","useRef","fallbackId","useId","inputId","hasError","showErrorMessage","errorId","showMax","hasBottomRow","handleChange","value","rawValue","selectionStart","target","sanitized","removed","length","caret","Math","max","setSelectionRange","handleRootClick","Element","closest","current","focus","_jsxs","root","children","card","labelRow","htmlFor","Tooltip","content","IconInfo","labelTooltipIcon","amountRow","ref","input","inputMode","token","bottomRow","secondary","balanceGroup","position","width","maxButton","errorMessage"],"mappings":"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"}
|