@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.
@@ -22,7 +22,8 @@ const FilterInputMenu = ({ fields, fieldGroups, autocomplete })=>{
22
22
  editingMultiValues,
23
23
  editingSingleValue
24
24
  ]);
25
- const selectedFieldValues = selectedField ? getFieldValues(selectedField, currentTokenText, selectedContext) : [];
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
  });
@@ -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
- displayValues.length > 0 ? /*#__PURE__*/ jsx(DropdownMenuGroup, {
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 country allowlist) |
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
- values: COUNTRY_OPTIONS,
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]?.().serializeValue;
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 FormatNumber = ({ value, type = 'decimal', notation = 'compact', unit, decimals = 0, ref, ...props })=>{
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 = 'md', color = 'info', ...props })=>/*#__PURE__*/ jsx("span", {
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({
@@ -15,7 +15,7 @@ const indicatorVariants = cva('inline-block shrink-0 rounded-2', {
15
15
  }
16
16
  },
17
17
  defaultVariants: {
18
- size: 'md',
18
+ size: 'sm',
19
19
  color: 'info'
20
20
  }
21
21
  });
@@ -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, {}) : /*#__PURE__*/ jsx(Eye, {})
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.0",
3
- "generatedAt": "2026-08-20T21:26:32.176Z",
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": "md"
32602
+ "defaultValue": "sm"
32587
32603
  }
32588
32604
  ],
32589
32605
  "variants": [
@@ -32593,7 +32609,7 @@
32593
32609
  "sm",
32594
32610
  "md"
32595
32611
  ],
32596
- "defaultValue": "md"
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 <div className='flex flex-col gap-16 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 <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 </div>\n );\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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wallarm-org/design-system",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Core design system library with React components and Storybook documentation",
5
5
  "publishConfig": {
6
6
  "access": "public",