@wallarm-org/design-system 1.4.0 → 1.5.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/components/FilterInput/FilterInputMenu/FilterInputMenu.js +4 -2
- package/dist/components/FilterInput/FilterInputMenu/FilterInputValueMenu/FilterInputValueMenu.d.ts +2 -0
- package/dist/components/FilterInput/FilterInputMenu/FilterInputValueMenu/FlatValueMenu.js +10 -2
- package/dist/components/FilterInput/lib/applyKnownFieldHelpers.d.ts +1 -1
- package/dist/components/FilterInput/lib/applyKnownFieldHelpers.js +32 -5
- package/dist/components/FilterInput/types.d.ts +7 -0
- package/dist/components/FormatNumber/FormatNumber.d.ts +6 -0
- package/dist/components/FormatNumber/FormatNumber.js +41 -3
- package/dist/components/Indicator/Indicator.js +1 -1
- package/dist/components/Indicator/classes.js +1 -1
- package/dist/components/InlineEdit/InlineEditActions.js +6 -2
- package/dist/components/PasswordInput/PasswordInput.js +8 -2
- package/dist/metadata/components.json +21 -5
- package/package.json +1 -1
|
@@ -22,7 +22,8 @@ const FilterInputMenu = ({ fields, fieldGroups, autocomplete })=>{
|
|
|
22
22
|
editingMultiValues,
|
|
23
23
|
editingSingleValue
|
|
24
24
|
]);
|
|
25
|
-
const
|
|
25
|
+
const liveSelectedField = selectedField ? fields.find((f)=>f.name === selectedField.name) ?? selectedField : null;
|
|
26
|
+
const selectedFieldValues = liveSelectedField ? getFieldValues(liveSelectedField, currentTokenText, selectedContext) : [];
|
|
26
27
|
const menuValues = useMemo(()=>{
|
|
27
28
|
const selected = [
|
|
28
29
|
...editingMultiValues,
|
|
@@ -124,7 +125,8 @@ const FilterInputMenu = ({ fields, fieldGroups, autocomplete })=>{
|
|
|
124
125
|
inputRef: inputRef,
|
|
125
126
|
menuRef: menuRef,
|
|
126
127
|
filterText: valueFilterText,
|
|
127
|
-
blurCommitRef: blurCommitRef
|
|
128
|
+
blurCommitRef: blurCommitRef,
|
|
129
|
+
loading: liveSelectedField?.loadingOptions ?? false
|
|
128
130
|
}))
|
|
129
131
|
]
|
|
130
132
|
});
|
package/dist/components/FilterInput/FilterInputMenu/FilterInputValueMenu/FilterInputValueMenu.d.ts
CHANGED
|
@@ -43,6 +43,8 @@ export interface FilterInputValueMenuProps {
|
|
|
43
43
|
inputRef?: RefObject<HTMLInputElement | null>;
|
|
44
44
|
/** Filter values by label. */
|
|
45
45
|
filterText?: string;
|
|
46
|
+
/** Options are still loading — show a loading indicator instead of the list. */
|
|
47
|
+
loading?: boolean;
|
|
46
48
|
/** Menu content ref (shared across menus for focus management). */
|
|
47
49
|
menuRef?: RefObject<HTMLDivElement | null>;
|
|
48
50
|
/** Set here so blur handler can commit multi-select values. */
|
|
@@ -2,6 +2,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useMemo } from "react";
|
|
3
3
|
import { cn } from "../../../../utils/cn.js";
|
|
4
4
|
import { DropdownMenu, DropdownMenuContent, DropdownMenuFooter, DropdownMenuGroup } from "../../../DropdownMenu/index.js";
|
|
5
|
+
import { Loader } from "../../../Loader/index.js";
|
|
5
6
|
import { filterAndSort } from "../../lib/index.js";
|
|
6
7
|
import { MenuEmptyState } from "../MenuEmptyState.js";
|
|
7
8
|
import { useValueMenuDisplayValues } from "./useValueMenuDisplayValues.js";
|
|
@@ -9,7 +10,7 @@ import { useValueMenuState } from "./useValueMenuState.js";
|
|
|
9
10
|
import { ValueMenuFooterHints } from "./ValueMenuFooterHints.js";
|
|
10
11
|
import { ValueMenuItem } from "./ValueMenuItem.js";
|
|
11
12
|
import { valueOptionSearchText } from "./valueOptionSearchText.js";
|
|
12
|
-
const FlatValueMenu = ({ values, onSelect, onCommit, open = false, onOpenChange, onEscape, multiSelect = false, initialValues = [], highlightValue, width = 'standard', positioning, onBuildingValueChange, onItemToggle, inputRef, filterText = '', menuRef, blurCommitRef, className })=>{
|
|
13
|
+
const FlatValueMenu = ({ values, onSelect, onCommit, open = false, onOpenChange, onEscape, multiSelect = false, initialValues = [], highlightValue, width = 'standard', positioning, onBuildingValueChange, onItemToggle, inputRef, filterText = '', menuRef, blurCommitRef, className, loading = false })=>{
|
|
13
14
|
const filteredValues = useMemo(()=>filterAndSort(values, filterText, valueOptionSearchText), [
|
|
14
15
|
values,
|
|
15
16
|
filterText
|
|
@@ -54,7 +55,14 @@ const FlatValueMenu = ({ values, onSelect, onCommit, open = false, onOpenChange,
|
|
|
54
55
|
style: widthStyle,
|
|
55
56
|
"data-filter-input-menu": "true",
|
|
56
57
|
children: [
|
|
57
|
-
|
|
58
|
+
loading ? /*#__PURE__*/ jsx("div", {
|
|
59
|
+
className: "flex items-center justify-center pt-2 pb-4 text-text-secondary",
|
|
60
|
+
role: "status",
|
|
61
|
+
"aria-live": "polite",
|
|
62
|
+
children: /*#__PURE__*/ jsx(Loader, {
|
|
63
|
+
size: "sm"
|
|
64
|
+
})
|
|
65
|
+
}) : displayValues.length > 0 ? /*#__PURE__*/ jsx(DropdownMenuGroup, {
|
|
58
66
|
className: "flex flex-col gap-1",
|
|
59
67
|
children: displayValues.map((option)=>/*#__PURE__*/ jsx(ValueMenuItem, {
|
|
60
68
|
option: option,
|
|
@@ -8,7 +8,7 @@ import type { FieldMetadata } from '../types';
|
|
|
8
8
|
* | `name` | DS owns |
|
|
9
9
|
* | ------------- | -------------------------------------------------------- |
|
|
10
10
|
* | `status_code` | acceptChar, normalize, getSuggestions, validate, serializeValue |
|
|
11
|
-
* | `country` | values (bundled ISO
|
|
11
|
+
* | `country` | values/getSuggestions (consumer lead → "Most frequent" section, bundled ISO list → "Other countries") |
|
|
12
12
|
*
|
|
13
13
|
* Backend with a different name (e.g. `http_status_code`) must either rename or
|
|
14
14
|
* wire the pieces manually (`createStatusCode*`, `COUNTRY_OPTIONS`). Only the
|
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
import { COUNTRY_OPTIONS } from "./country/index.js";
|
|
2
2
|
import { createStatusCodeInputFilter, createStatusCodeNormalizer, createStatusCodeSerializer, createStatusCodeSuggestions, createStatusCodeValidator } from "./statusCode/index.js";
|
|
3
|
+
const FREQUENT_COUNTRY_SECTION = 'Most frequent';
|
|
4
|
+
const OTHER_COUNTRY_SECTION = 'Other countries';
|
|
5
|
+
const withBundledCountrySections = (lead)=>{
|
|
6
|
+
if (0 === lead.length) return COUNTRY_OPTIONS;
|
|
7
|
+
const seen = new Set(lead.map((option)=>option.value));
|
|
8
|
+
return [
|
|
9
|
+
...lead.map((option)=>({
|
|
10
|
+
...option,
|
|
11
|
+
section: FREQUENT_COUNTRY_SECTION
|
|
12
|
+
})),
|
|
13
|
+
...COUNTRY_OPTIONS.filter((option)=>!seen.has(option.value)).map((option)=>({
|
|
14
|
+
...option,
|
|
15
|
+
section: OTHER_COUNTRY_SECTION
|
|
16
|
+
}))
|
|
17
|
+
];
|
|
18
|
+
};
|
|
3
19
|
const KNOWN_FIELD_HELPERS = {
|
|
4
20
|
status_code: ()=>({
|
|
5
21
|
acceptChar: createStatusCodeInputFilter(),
|
|
@@ -8,10 +24,19 @@ const KNOWN_FIELD_HELPERS = {
|
|
|
8
24
|
validate: createStatusCodeValidator(),
|
|
9
25
|
serializeValue: createStatusCodeSerializer()
|
|
10
26
|
}),
|
|
11
|
-
country: ()=>
|
|
12
|
-
|
|
27
|
+
country: (field)=>{
|
|
28
|
+
if (field.getSuggestions) {
|
|
29
|
+
const consumerSuggest = field.getSuggestions;
|
|
30
|
+
return {
|
|
31
|
+
getSuggestions: (input, context)=>withBundledCountrySections(consumerSuggest(input, context) ?? []),
|
|
32
|
+
values: COUNTRY_OPTIONS
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
values: withBundledCountrySections(field.values ?? []),
|
|
13
37
|
getSuggestions: void 0
|
|
14
|
-
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
15
40
|
};
|
|
16
41
|
const applyKnownFieldHelpers = (fields)=>{
|
|
17
42
|
let changed = false;
|
|
@@ -21,10 +46,12 @@ const applyKnownFieldHelpers = (fields)=>{
|
|
|
21
46
|
changed = true;
|
|
22
47
|
return {
|
|
23
48
|
...field,
|
|
24
|
-
...factory()
|
|
49
|
+
...factory(field)
|
|
25
50
|
};
|
|
26
51
|
});
|
|
27
52
|
return changed ? out : fields;
|
|
28
53
|
};
|
|
29
|
-
const getKnownFieldSerializer = (fieldName)=>KNOWN_FIELD_HELPERS[fieldName]?.(
|
|
54
|
+
const getKnownFieldSerializer = (fieldName)=>KNOWN_FIELD_HELPERS[fieldName]?.({
|
|
55
|
+
name: fieldName
|
|
56
|
+
}).serializeValue;
|
|
30
57
|
export { applyKnownFieldHelpers, getKnownFieldSerializer };
|
|
@@ -192,6 +192,13 @@ export interface FieldMetadata {
|
|
|
192
192
|
* want users to pick manually.
|
|
193
193
|
*/
|
|
194
194
|
hidden?: boolean;
|
|
195
|
+
/**
|
|
196
|
+
* When `true`, this field's value options are still loading (e.g. fetched
|
|
197
|
+
* on demand). The value dropdown shows a loading indicator instead of the
|
|
198
|
+
* option list until it flips back to `false`. Consumer-owned and reactive —
|
|
199
|
+
* set it while an async options fetch is in flight.
|
|
200
|
+
*/
|
|
201
|
+
loadingOptions?: boolean;
|
|
195
202
|
}
|
|
196
203
|
/**
|
|
197
204
|
* A labeled group of filter fields for the field-selection menu, referenced by
|
|
@@ -24,6 +24,12 @@ interface FormatNumberBaseProps {
|
|
|
24
24
|
unit?: string;
|
|
25
25
|
/** Decimal places for percent. Default: 0. */
|
|
26
26
|
decimals?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Whether to show a tooltip with the full value on abbreviated numbers.
|
|
29
|
+
* When false, abbreviated values display without tooltip or dashed underline.
|
|
30
|
+
* Default: true.
|
|
31
|
+
*/
|
|
32
|
+
tooltip?: boolean;
|
|
27
33
|
ref?: Ref<HTMLSpanElement>;
|
|
28
34
|
}
|
|
29
35
|
type FormatNumberNativeProps = Omit<HTMLAttributes<HTMLSpanElement>, 'className'>;
|
|
@@ -4,13 +4,18 @@ import { cn } from "../../utils/cn.js";
|
|
|
4
4
|
import { Text } from "../Text/index.js";
|
|
5
5
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../Tooltip/index.js";
|
|
6
6
|
const DASHED_UNDERLINE = 'border-b-1 border-dashed border-border-strong-primary';
|
|
7
|
-
const
|
|
7
|
+
const TOOLTIP_POSITIONING = {
|
|
8
|
+
placement: 'top'
|
|
9
|
+
};
|
|
10
|
+
const FormatNumber = ({ value, type = 'decimal', notation = 'compact', unit, decimals = 0, tooltip: showTooltip = true, ref, ...props })=>{
|
|
8
11
|
if (null == value) return /*#__PURE__*/ jsxs(Tooltip, {
|
|
12
|
+
positioning: TOOLTIP_POSITIONING,
|
|
9
13
|
children: [
|
|
10
14
|
/*#__PURE__*/ jsx(TooltipTrigger, {
|
|
11
15
|
asChild: true,
|
|
12
16
|
children: /*#__PURE__*/ jsx("span", {
|
|
13
17
|
ref: ref,
|
|
18
|
+
className: "w-fit",
|
|
14
19
|
"data-slot": "format-number",
|
|
15
20
|
...props,
|
|
16
21
|
children: /*#__PURE__*/ jsx(Text, {
|
|
@@ -47,12 +52,14 @@ const FormatNumber = ({ value, type = 'decimal', notation = 'compact', unit, dec
|
|
|
47
52
|
if ('byte' === type) {
|
|
48
53
|
const { display, full } = formatBytes(value);
|
|
49
54
|
const isAbbreviated = 'compact' === notation && value >= 1000;
|
|
50
|
-
if (isAbbreviated) return /*#__PURE__*/ jsxs(Tooltip, {
|
|
55
|
+
if (isAbbreviated && showTooltip) return /*#__PURE__*/ jsxs(Tooltip, {
|
|
56
|
+
positioning: TOOLTIP_POSITIONING,
|
|
51
57
|
children: [
|
|
52
58
|
/*#__PURE__*/ jsx(TooltipTrigger, {
|
|
53
59
|
asChild: true,
|
|
54
60
|
children: /*#__PURE__*/ jsx("span", {
|
|
55
61
|
ref: ref,
|
|
62
|
+
className: "w-fit",
|
|
56
63
|
"data-slot": "format-number",
|
|
57
64
|
"aria-label": full,
|
|
58
65
|
...props,
|
|
@@ -70,6 +77,19 @@ const FormatNumber = ({ value, type = 'decimal', notation = 'compact', unit, dec
|
|
|
70
77
|
})
|
|
71
78
|
]
|
|
72
79
|
});
|
|
80
|
+
if (isAbbreviated) return /*#__PURE__*/ jsx("span", {
|
|
81
|
+
ref: ref,
|
|
82
|
+
"data-slot": "format-number",
|
|
83
|
+
"aria-label": full,
|
|
84
|
+
...props,
|
|
85
|
+
children: /*#__PURE__*/ jsx(Text, {
|
|
86
|
+
size: "sm",
|
|
87
|
+
children: /*#__PURE__*/ jsx("span", {
|
|
88
|
+
className: "whitespace-nowrap tabular-nums",
|
|
89
|
+
children: display
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
});
|
|
73
93
|
return /*#__PURE__*/ jsx("span", {
|
|
74
94
|
ref: ref,
|
|
75
95
|
"data-slot": "format-number",
|
|
@@ -84,12 +104,14 @@ const FormatNumber = ({ value, type = 'decimal', notation = 'compact', unit, dec
|
|
|
84
104
|
const fullValue = formatFullNumber(value);
|
|
85
105
|
const isAbbreviated = 'compact' === notation && Math.abs(value) >= 1000;
|
|
86
106
|
const fullWithUnit = unit ? `${fullValue}\u00A0${unit}` : fullValue;
|
|
87
|
-
if (isAbbreviated) return /*#__PURE__*/ jsxs(Tooltip, {
|
|
107
|
+
if (isAbbreviated && showTooltip) return /*#__PURE__*/ jsxs(Tooltip, {
|
|
108
|
+
positioning: TOOLTIP_POSITIONING,
|
|
88
109
|
children: [
|
|
89
110
|
/*#__PURE__*/ jsx(TooltipTrigger, {
|
|
90
111
|
asChild: true,
|
|
91
112
|
children: /*#__PURE__*/ jsx("span", {
|
|
92
113
|
ref: ref,
|
|
114
|
+
className: "w-fit",
|
|
93
115
|
"data-slot": "format-number",
|
|
94
116
|
"aria-label": fullWithUnit,
|
|
95
117
|
...props,
|
|
@@ -107,6 +129,22 @@ const FormatNumber = ({ value, type = 'decimal', notation = 'compact', unit, dec
|
|
|
107
129
|
})
|
|
108
130
|
]
|
|
109
131
|
});
|
|
132
|
+
if (isAbbreviated) {
|
|
133
|
+
const displayValue = unit ? `${abbreviated}\u00A0${unit}` : abbreviated;
|
|
134
|
+
return /*#__PURE__*/ jsx("span", {
|
|
135
|
+
ref: ref,
|
|
136
|
+
"data-slot": "format-number",
|
|
137
|
+
"aria-label": fullWithUnit,
|
|
138
|
+
...props,
|
|
139
|
+
children: /*#__PURE__*/ jsx(Text, {
|
|
140
|
+
size: "sm",
|
|
141
|
+
children: /*#__PURE__*/ jsx("span", {
|
|
142
|
+
className: "whitespace-nowrap tabular-nums",
|
|
143
|
+
children: displayValue
|
|
144
|
+
})
|
|
145
|
+
})
|
|
146
|
+
});
|
|
147
|
+
}
|
|
110
148
|
const displayValue = unit ? `${fullValue}\u00A0${unit}` : fullValue;
|
|
111
149
|
return /*#__PURE__*/ jsx("span", {
|
|
112
150
|
ref: ref,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "../../utils/cn.js";
|
|
3
3
|
import { indicatorVariants } from "./classes.js";
|
|
4
|
-
const Indicator = ({ ref, className, size = '
|
|
4
|
+
const Indicator = ({ ref, className, size = 'sm', color = 'info', ...props })=>/*#__PURE__*/ jsx("span", {
|
|
5
5
|
...props,
|
|
6
6
|
ref: ref,
|
|
7
7
|
className: cn(indicatorVariants({
|
|
@@ -21,7 +21,9 @@ const InlineEditActions = ({ onSubmit, onCancel })=>/*#__PURE__*/ jsxs("div", {
|
|
|
21
21
|
onClick: onSubmit,
|
|
22
22
|
"aria-label": "Save",
|
|
23
23
|
tabIndex: -1,
|
|
24
|
-
children: /*#__PURE__*/ jsx(Check, {
|
|
24
|
+
children: /*#__PURE__*/ jsx(Check, {
|
|
25
|
+
className: "text-slate-500"
|
|
26
|
+
})
|
|
25
27
|
})
|
|
26
28
|
}),
|
|
27
29
|
/*#__PURE__*/ jsxs(TooltipContent, {
|
|
@@ -47,7 +49,9 @@ const InlineEditActions = ({ onSubmit, onCancel })=>/*#__PURE__*/ jsxs("div", {
|
|
|
47
49
|
onClick: onCancel,
|
|
48
50
|
"aria-label": "Cancel",
|
|
49
51
|
tabIndex: -1,
|
|
50
|
-
children: /*#__PURE__*/ jsx(X, {
|
|
52
|
+
children: /*#__PURE__*/ jsx(X, {
|
|
53
|
+
className: "text-slate-500"
|
|
54
|
+
})
|
|
51
55
|
})
|
|
52
56
|
}),
|
|
53
57
|
/*#__PURE__*/ jsxs(TooltipContent, {
|
|
@@ -36,8 +36,14 @@ const PasswordInput = ({ disabled = false, size = 'default', error = false, clas
|
|
|
36
36
|
disabled: disabled,
|
|
37
37
|
"aria-label": visible ? 'Hide password' : 'Show password',
|
|
38
38
|
onClick: toggle,
|
|
39
|
-
className: "cursor-pointer disabled:cursor-not-allowed disabled:opacity-50",
|
|
40
|
-
children: visible ? /*#__PURE__*/ jsx(EyeOff, {
|
|
39
|
+
className: "cursor-pointer disabled:cursor-not-allowed disabled:opacity-50 flex",
|
|
40
|
+
children: visible ? /*#__PURE__*/ jsx(EyeOff, {
|
|
41
|
+
size: "md",
|
|
42
|
+
className: "text-slate-500"
|
|
43
|
+
}) : /*#__PURE__*/ jsx(Eye, {
|
|
44
|
+
size: "md",
|
|
45
|
+
className: "text-slate-500"
|
|
46
|
+
})
|
|
41
47
|
})
|
|
42
48
|
}),
|
|
43
49
|
/*#__PURE__*/ jsx(TooltipContent, {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
3
|
-
"generatedAt": "2026-08-
|
|
2
|
+
"version": "1.4.0",
|
|
3
|
+
"generatedAt": "2026-08-24T13:22:56.292Z",
|
|
4
4
|
"components": [
|
|
5
5
|
{
|
|
6
6
|
"name": "Accordion",
|
|
@@ -30664,6 +30664,12 @@
|
|
|
30664
30664
|
"required": false,
|
|
30665
30665
|
"description": "Filter values by label."
|
|
30666
30666
|
},
|
|
30667
|
+
{
|
|
30668
|
+
"name": "loading",
|
|
30669
|
+
"type": "boolean | undefined",
|
|
30670
|
+
"required": false,
|
|
30671
|
+
"description": "Options are still loading — show a loading indicator instead of the list."
|
|
30672
|
+
},
|
|
30667
30673
|
{
|
|
30668
30674
|
"name": "menuRef",
|
|
30669
30675
|
"type": "RefObject<HTMLDivElement | null> | undefined",
|
|
@@ -31810,6 +31816,12 @@
|
|
|
31810
31816
|
"required": false,
|
|
31811
31817
|
"description": "Decimal places for percent. Default: 0.",
|
|
31812
31818
|
"defaultValue": "0"
|
|
31819
|
+
},
|
|
31820
|
+
{
|
|
31821
|
+
"name": "tooltip",
|
|
31822
|
+
"type": "boolean | undefined",
|
|
31823
|
+
"required": false,
|
|
31824
|
+
"description": "Whether to show a tooltip with the full value on abbreviated numbers.\nWhen false, abbreviated values display without tooltip or dashed underline.\nDefault: true."
|
|
31813
31825
|
}
|
|
31814
31826
|
],
|
|
31815
31827
|
"variants": [],
|
|
@@ -31835,6 +31847,10 @@
|
|
|
31835
31847
|
"name": "Bytes",
|
|
31836
31848
|
"code": "() => (\n <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n <Text size='sm' color='secondary' align='right'>\n 512 (compact)\n </Text>\n <FormatNumber value={512} type='byte' />\n\n <Text size='sm' color='secondary' align='right'>\n 3,400 (compact)\n </Text>\n <FormatNumber value={3_400} type='byte' />\n\n <Text size='sm' color='secondary' align='right'>\n 12,700,000 (compact)\n </Text>\n <FormatNumber value={12_700_000} type='byte' />\n\n <Text size='sm' color='secondary' align='right'>\n 2,345,678,901 (compact)\n </Text>\n <FormatNumber value={2_345_678_901} type='byte' />\n\n <Text size='sm' color='secondary' align='right'>\n 1,100,000,000,000 (compact)\n </Text>\n <FormatNumber value={1_100_000_000_000} type='byte' />\n\n <Text size='sm' color='secondary' align='right'>\n 12,700,000 (standard)\n </Text>\n <FormatNumber value={12_700_000} type='byte' notation='standard' />\n </div>\n)"
|
|
31837
31849
|
},
|
|
31850
|
+
{
|
|
31851
|
+
"name": "NoTooltip",
|
|
31852
|
+
"code": "() => (\n <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n <Text size='sm' color='secondary' align='right'>\n 12,042 (decimal)\n </Text>\n <FormatNumber value={12_042} tooltip={false} />\n\n <Text size='sm' color='secondary' align='right'>\n 59,614,283 (decimal)\n </Text>\n <FormatNumber value={59_614_283} tooltip={false} />\n\n <Text size='sm' color='secondary' align='right'>\n 12,042 with unit\n </Text>\n <FormatNumber value={12_042} unit='requests' tooltip={false} />\n\n <Text size='sm' color='secondary' align='right'>\n 12,700,000 (byte)\n </Text>\n <FormatNumber value={12_700_000} type='byte' tooltip={false} />\n </div>\n)"
|
|
31853
|
+
},
|
|
31838
31854
|
{
|
|
31839
31855
|
"name": "NegativeValues",
|
|
31840
31856
|
"code": "() => (\n <div className='grid grid-cols-[1fr_1fr] items-center gap-x-16 gap-y-12'>\n <Text size='sm' color='secondary' align='right'>\n -42\n </Text>\n <FormatNumber value={-42} />\n\n <Text size='sm' color='secondary' align='right'>\n -12,042\n </Text>\n <FormatNumber value={-12_042} />\n\n <Text size='sm' color='secondary' align='right'>\n -59,614,283\n </Text>\n <FormatNumber value={-59_614_283} />\n </div>\n)"
|
|
@@ -32583,7 +32599,7 @@
|
|
|
32583
32599
|
"name": "size",
|
|
32584
32600
|
"type": "{ sm: string; md: string; }",
|
|
32585
32601
|
"required": false,
|
|
32586
|
-
"defaultValue": "
|
|
32602
|
+
"defaultValue": "sm"
|
|
32587
32603
|
}
|
|
32588
32604
|
],
|
|
32589
32605
|
"variants": [
|
|
@@ -32593,7 +32609,7 @@
|
|
|
32593
32609
|
"sm",
|
|
32594
32610
|
"md"
|
|
32595
32611
|
],
|
|
32596
|
-
"defaultValue": "
|
|
32612
|
+
"defaultValue": "sm"
|
|
32597
32613
|
},
|
|
32598
32614
|
{
|
|
32599
32615
|
"name": "color",
|
|
@@ -50046,7 +50062,7 @@
|
|
|
50046
50062
|
},
|
|
50047
50063
|
{
|
|
50048
50064
|
"name": "WithRequirements",
|
|
50049
|
-
"code": "() => {\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n\n const items: PasswordComplexityItem[] = [\n {\n id: 'length',\n label: 'At least 8 characters',\n met: passwordValidators.minLength(8)(password),\n },\n {\n id: 'uppercase',\n label: 'One uppercase letter (A\\u2013Z)',\n met: passwordValidators.hasUppercase(password),\n },\n {\n id: 'lowercase',\n label: 'One lowercase letter (a\\u2013z)',\n met: passwordValidators.hasLowercase(password),\n },\n { id: 'number', label: 'One number (0\\u20139)', met: passwordValidators.hasNumber(password) },\n {\n id: 'symbol',\n label: 'One symbol (e.g. ! ? @ #)',\n met: passwordValidators.hasSymbol(password),\n },\n {\n id: 'match',\n label: 'Both passwords match',\n met: passwordValidators.passwordsMatch(password, confirmPassword),\n },\n ];\n\n return (\n <
|
|
50065
|
+
"code": "() => {\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n\n const items: PasswordComplexityItem[] = [\n {\n id: 'length',\n label: 'At least 8 characters',\n met: passwordValidators.minLength(8)(password),\n },\n {\n id: 'uppercase',\n label: 'One uppercase letter (A\\u2013Z)',\n met: passwordValidators.hasUppercase(password),\n },\n {\n id: 'lowercase',\n label: 'One lowercase letter (a\\u2013z)',\n met: passwordValidators.hasLowercase(password),\n },\n { id: 'number', label: 'One number (0\\u20139)', met: passwordValidators.hasNumber(password) },\n {\n id: 'symbol',\n label: 'One symbol (e.g. ! ? @ #)',\n met: passwordValidators.hasSymbol(password),\n },\n {\n id: 'match',\n label: 'Both passwords match',\n met: passwordValidators.passwordsMatch(password, confirmPassword),\n },\n ];\n\n return (\n <VStack gap={16} className='w-[320px]'>\n <Field>\n <FieldLabel>New password</FieldLabel>\n <PasswordInput\n placeholder='New password...'\n value={password}\n onChange={e => setPassword(e.target.value)}\n />\n </Field>\n\n <VStack gap={6}>\n <Field>\n <FieldLabel>Confirm password</FieldLabel>\n <PasswordInput\n placeholder='Confirm password...'\n value={confirmPassword}\n onChange={e => setConfirmPassword(e.target.value)}\n />\n </Field>\n <PasswordComplexity items={items} />\n </VStack>\n </VStack>\n );\n}"
|
|
50050
50066
|
},
|
|
50051
50067
|
{
|
|
50052
50068
|
"name": "Disabled",
|