@phpsoftbox/react-softbox 0.5.2 → 0.6.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/README.md CHANGED
@@ -16,6 +16,7 @@ import {
16
16
  Button,
17
17
  Card,
18
18
  Checkbox,
19
+ Collapse,
19
20
  CollapseButton,
20
21
  Drawer,
21
22
  Dropdown,
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ type Props = React.HTMLAttributes<HTMLDivElement> & {
3
+ open: boolean;
4
+ duration?: number;
5
+ };
6
+ export default function Collapse({ open, duration, className, style, children, ...props }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import styles from './Collapse.module.css';
4
+ const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
5
+ export default function Collapse({ open, duration = 180, className, style, children, ...props }) {
6
+ const contentRef = React.useRef(null);
7
+ const [height, setHeight] = React.useState(open ? 'auto' : 0);
8
+ useIsomorphicLayoutEffect(() => {
9
+ const node = contentRef.current;
10
+ if (!node) {
11
+ return;
12
+ }
13
+ if (open) {
14
+ const nextHeight = node.scrollHeight;
15
+ setHeight(nextHeight);
16
+ return;
17
+ }
18
+ if (height === 'auto') {
19
+ const nextHeight = node.scrollHeight;
20
+ setHeight(nextHeight);
21
+ if (typeof window !== 'undefined') {
22
+ window.requestAnimationFrame(() => setHeight(0));
23
+ }
24
+ else {
25
+ setHeight(0);
26
+ }
27
+ return;
28
+ }
29
+ setHeight(0);
30
+ }, [open]);
31
+ const handleTransitionEnd = (event) => {
32
+ if (event.propertyName !== 'height') {
33
+ return;
34
+ }
35
+ if (open) {
36
+ setHeight('auto');
37
+ }
38
+ };
39
+ const resolvedStyle = {
40
+ ...style,
41
+ height: typeof height === 'number' ? `${height}px` : height,
42
+ transitionDuration: `${duration}ms`,
43
+ };
44
+ return (_jsx("div", { className: [styles.collapse, className].filter(Boolean).join(' '), style: resolvedStyle, "data-state": open ? 'open' : 'closed', "aria-hidden": !open, onTransitionEnd: handleTransitionEnd, ...props, children: _jsx("div", { ref: contentRef, className: styles.inner, children: children }) }));
45
+ }
46
+ //# sourceMappingURL=Collapse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collapse.js","sourceRoot":"","sources":["../../../src/components/Collapse/Collapse.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAO3C,MAAM,yBAAyB,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;AAE1G,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAS;IACpG,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAkB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/E,yBAAyB,CAAC,GAAG,EAAE;QAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;YACrC,SAAS,CAAC,UAAU,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;YACrC,SAAS,CAAC,UAAU,CAAC,CAAC;YACtB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;YACD,OAAO;QACT,CAAC;QAED,SAAS,CAAC,CAAC,CAAC,CAAC;IACf,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,mBAAmB,GAAG,CAAC,KAA4C,EAAE,EAAE;QAC3E,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAwB;QACzC,GAAG,KAAK;QACR,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM;QAC3D,kBAAkB,EAAE,GAAG,QAAQ,IAAI;KACpC,CAAC;IAEF,OAAO,CACL,cACE,SAAS,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EACjE,KAAK,EAAE,aAAa,gBACR,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,iBACvB,CAAC,IAAI,EAClB,eAAe,EAAE,mBAAmB,KAChC,KAAK,YAET,cAAK,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,YAC1C,QAAQ,GACL,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ .collapse {
2
+ --collapse-padding-y: var(--spacing-3);
3
+ --collapse-padding-x: var(--spacing-4);
4
+ overflow: hidden;
5
+ opacity: 0;
6
+ pointer-events: none;
7
+ transition: height var(--collapse-duration, 180ms) ease, opacity var(--collapse-duration, 180ms) ease;
8
+ will-change: height, opacity;
9
+ }
10
+
11
+ .collapse[data-state='open'] {
12
+ opacity: 1;
13
+ pointer-events: auto;
14
+ }
15
+
16
+ .inner {
17
+ display: block;
18
+ padding: var(--collapse-padding-y) var(--collapse-padding-x);
19
+ }
20
+
21
+ @media (prefers-reduced-motion: reduce) {
22
+ .collapse {
23
+ transition: none;
24
+ }
25
+ }
@@ -5,8 +5,8 @@
5
5
  border: 1px solid rgba(30, 99, 233, 0.3);
6
6
  background: var(--surface-control);
7
7
  color: var(--color-text);
8
- padding: 8px 12px;
9
- border-radius: 999px;
8
+ padding: var(--spacing-3) calc(var(--spacing-4) + var(--spacing-1) / 2);
9
+ border-radius: var(--radius-sm);
10
10
  cursor: pointer;
11
11
  }
12
12
 
@@ -15,7 +15,7 @@ declare const Input: import("react").FC<import("react").HTMLAttributes<HTMLDivEl
15
15
  layout?: "row" | "column";
16
16
  gap?: number | string;
17
17
  labelWidth?: number | string;
18
- align?: "start" | "center" | "end";
18
+ align?: "center" | "end" | "start";
19
19
  labelAlign?: "right" | "center" | "left";
20
20
  }> & {
21
21
  Label: React.FC<import("react").LabelHTMLAttributes<HTMLLabelElement>>;
@@ -50,7 +50,7 @@ declare const Input: import("react").FC<import("react").HTMLAttributes<HTMLDivEl
50
50
  layout?: "row" | "column";
51
51
  gap?: number | string;
52
52
  labelWidth?: number | string;
53
- align?: "start" | "center" | "end";
53
+ align?: "center" | "end" | "start";
54
54
  labelAlign?: "right" | "center" | "left";
55
55
  }> & {
56
56
  Label: React.FC<import("react").LabelHTMLAttributes<HTMLLabelElement>>;
@@ -4,6 +4,7 @@ type Props = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChan
4
4
  value?: string;
5
5
  onChange?: (value: string) => void;
6
6
  placeholderChar?: string;
7
+ escapeChar?: string;
7
8
  };
8
- export default function MaskedInput({ mask, value, onChange, placeholderChar, ...props }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export default function MaskedInput({ mask, value, onChange, placeholderChar, escapeChar, onPaste, ...props }: Props): import("react/jsx-runtime").JSX.Element;
9
10
  export {};
@@ -4,14 +4,23 @@ import InputField from './Field';
4
4
  const isDigit = (char) => /\d/.test(char);
5
5
  const isLetter = (char) => /[a-zA-Z]/.test(char);
6
6
  const isAlphaNum = (char) => /[a-zA-Z0-9]/.test(char);
7
- const stripRaw = (value) => value.replace(/[^a-zA-Z0-9]/g, '');
8
- const applyMask = (raw, mask, placeholderChar) => {
7
+ const isToken = (char) => char === '9' || char === 'A' || char === '*';
8
+ const applyMask = (raw, mask, placeholderChar, escapeChar = '\\') => {
9
9
  let rawIndex = 0;
10
10
  let output = '';
11
11
  for (let i = 0; i < mask.length; i += 1) {
12
12
  const maskChar = mask[i];
13
+ if (maskChar === escapeChar) {
14
+ if (i + 1 < mask.length) {
15
+ output += mask[i + 1];
16
+ i += 1;
17
+ continue;
18
+ }
19
+ output += maskChar;
20
+ continue;
21
+ }
13
22
  const rawChar = raw[rawIndex];
14
- if (maskChar === '9' || maskChar === 'A' || maskChar === '*') {
23
+ if (isToken(maskChar)) {
15
24
  if (!rawChar) {
16
25
  if (placeholderChar) {
17
26
  output += placeholderChar;
@@ -36,13 +45,24 @@ const applyMask = (raw, mask, placeholderChar) => {
36
45
  }
37
46
  return output;
38
47
  };
39
- const extractRaw = (masked, mask) => {
48
+ const extractRaw = (masked, mask, escapeChar = '\\') => {
40
49
  let raw = '';
41
50
  let maskIndex = 0;
42
51
  for (let i = 0; i < masked.length && maskIndex < mask.length; i += 1) {
43
52
  const maskChar = mask[maskIndex];
44
53
  const char = masked[i];
45
- if (maskChar === '9' || maskChar === 'A' || maskChar === '*') {
54
+ if (maskChar === escapeChar) {
55
+ const literal = maskIndex + 1 < mask.length ? mask[maskIndex + 1] : escapeChar;
56
+ if (char === literal) {
57
+ maskIndex += 2;
58
+ }
59
+ else {
60
+ maskIndex += 2;
61
+ i -= 1;
62
+ }
63
+ continue;
64
+ }
65
+ if (isToken(maskChar)) {
46
66
  const matches = (maskChar === '9' && isDigit(char)) ||
47
67
  (maskChar === 'A' && isLetter(char)) ||
48
68
  (maskChar === '*' && isAlphaNum(char));
@@ -62,21 +82,41 @@ const extractRaw = (masked, mask) => {
62
82
  }
63
83
  return raw;
64
84
  };
65
- export default function MaskedInput({ mask, value, onChange, placeholderChar, ...props }) {
85
+ export default function MaskedInput({ mask, value, onChange, placeholderChar, escapeChar = '\\', onPaste, ...props }) {
66
86
  const isControlled = value !== undefined;
67
87
  const [internal, setInternal] = React.useState('');
68
88
  const displayValue = React.useMemo(() => {
69
- const raw = stripRaw(String(isControlled ? value ?? '' : internal));
70
- return applyMask(raw, mask, placeholderChar);
71
- }, [value, internal, mask, placeholderChar, isControlled]);
89
+ const raw = extractRaw(String(isControlled ? value ?? '' : internal), mask, escapeChar);
90
+ return applyMask(raw, mask, placeholderChar, escapeChar);
91
+ }, [value, internal, mask, placeholderChar, isControlled, escapeChar]);
72
92
  const handleChange = (event) => {
73
93
  const rawInput = event.target.value;
74
- const raw = extractRaw(rawInput, mask);
94
+ const raw = extractRaw(rawInput, mask, escapeChar);
95
+ if (!isControlled) {
96
+ setInternal(raw);
97
+ }
98
+ onChange?.(raw);
99
+ };
100
+ const handlePaste = (event) => {
101
+ onPaste?.(event);
102
+ if (event.defaultPrevented) {
103
+ return;
104
+ }
105
+ const text = event.clipboardData?.getData('text');
106
+ if (!text) {
107
+ return;
108
+ }
109
+ const raw = extractRaw(text, mask, escapeChar);
110
+ console.log(raw);
111
+ if (!raw) {
112
+ return;
113
+ }
114
+ event.preventDefault();
75
115
  if (!isControlled) {
76
116
  setInternal(raw);
77
117
  }
78
118
  onChange?.(raw);
79
119
  };
80
- return _jsx(InputField, { ...props, value: displayValue, onChange: handleChange });
120
+ return _jsx(InputField, { ...props, value: displayValue, onChange: handleChange, onPaste: handlePaste });
81
121
  }
82
122
  //# sourceMappingURL=MaskedInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MaskedInput.js","sourceRoot":"","sources":["../../../src/components/Input/MaskedInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MaskedInput.js","sourceRoot":"","sources":["../../../src/components/Input/MaskedInput.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export { default as Button } from './components/Button/Button';
2
2
  export { default as Badge } from './components/Badge/Badge';
3
3
  export { default as Card } from './components/Card/Card';
4
4
  export { default as CollapseButton } from './components/CollapseButton/CollapseButton';
5
+ export { default as Collapse } from './components/Collapse/Collapse';
5
6
  export { default as FormField } from './components/Input/FormField/FormField';
6
7
  export { default as Input } from './components/Input/Input';
7
8
  export { default as Textarea } from './components/Input/Textarea/Textarea';
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ export { default as Button } from './components/Button/Button';
2
2
  export { default as Badge } from './components/Badge/Badge';
3
3
  export { default as Card } from './components/Card/Card';
4
4
  export { default as CollapseButton } from './components/CollapseButton/CollapseButton';
5
+ export { default as Collapse } from './components/Collapse/Collapse';
5
6
  export { default as FormField } from './components/Input/FormField/FormField';
6
7
  export { default as Input } from './components/Input/Input';
7
8
  export { default as Textarea } from './components/Input/Textarea/Textarea';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAY5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAY5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
package/docs/README.md CHANGED
@@ -27,7 +27,7 @@ import { Button, Card, Menu } from '@phpsoftbox/react-softbox';
27
27
 
28
28
  ## Разделы
29
29
 
30
- - `layout.md` — Grid, Flex, утилиты
30
+ - `layout.md` — Grid, Flex, утилиты, Collapse
31
31
  - `navigation.md` — Menu, Dropdown, CollapseButton
32
32
  - `forms.md` — Input (Field/Select/FloatLabel), Switch, Radio, Checkbox, FileUploader
33
33
  - `table.md` — Table, сортировка, футер
package/docs/forms.md CHANGED
@@ -177,6 +177,14 @@ const statusOptions = [
177
177
  </Input>
178
178
  ```
179
179
 
180
+ `value` можно передавать как в маске, так и в виде "сырых" символов — компонент сам нормализует.
181
+
182
+ Если нужно указать литеральный символ маски `9`/`A`/`*`, экранируйте его через `\`:
183
+
184
+ ```tsx
185
+ <Input.MaskedInput mask="+7 (\\9 99) 999-99-99" />
186
+ ```
187
+
180
188
  ## Number (money)
181
189
 
182
190
  ```tsx
package/docs/layout.md CHANGED
@@ -38,6 +38,24 @@
38
38
  - `align`, `justify` — соответствуют flex‑свойствам
39
39
  - `wrap` — управление переносом для `Row`
40
40
 
41
+ ## Collapse
42
+
43
+ `Collapse` — анимированное сворачивание контента. Обычно используется вместе с `CollapseButton`.
44
+
45
+ ```tsx
46
+ const [open, setOpen] = useState(false);
47
+
48
+ <CollapseButton targetId="filters-panel" open={open} onClick={() => setOpen((v) => !v)}>
49
+ Фильтры
50
+ </CollapseButton>
51
+
52
+ <Collapse id="filters-panel" open={open}>
53
+ <Card>
54
+ <Card.Body>Контент фильтров</Card.Body>
55
+ </Card>
56
+ </Collapse>
57
+ ```
58
+
41
59
  ## Утилитарные отступы
42
60
 
43
61
  Глобальные классы для отступов и gap основаны на `--spacing-1…10`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phpsoftbox/react-softbox",
3
- "version": "0.5.2",
3
+ "version": "0.6.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",