@phpsoftbox/react-softbox 0.5.3 → 0.6.1

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>>;
@@ -10,6 +10,7 @@ html,
10
10
  body {
11
11
  margin: 0;
12
12
  padding: 0;
13
+ min-width: 320px;
13
14
  }
14
15
 
15
16
  body {
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/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.3",
3
+ "version": "0.6.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",