@phpsoftbox/react-softbox 0.2.0 → 0.3.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.
Files changed (30) hide show
  1. package/dist/components/Button/Button.d.ts +3 -1
  2. package/dist/components/Button/Button.js +16 -17
  3. package/dist/components/Button/Button.js.map +1 -1
  4. package/dist/components/FileUploader/FileUploader.d.ts +22 -0
  5. package/dist/components/FileUploader/FileUploader.js +156 -0
  6. package/dist/components/FileUploader/FileUploader.js.map +1 -0
  7. package/dist/components/FileUploader/FileUploader.module.css +142 -0
  8. package/dist/components/Input/Checkbox/Checkbox.d.ts +8 -0
  9. package/dist/components/Input/Checkbox/Checkbox.js +15 -0
  10. package/dist/components/Input/Checkbox/Checkbox.js.map +1 -0
  11. package/dist/components/Input/Checkbox/Checkbox.module.css +105 -0
  12. package/dist/components/Input/FloatLabel/FloatLabel.module.css +6 -6
  13. package/dist/components/Input/Input.d.ts +2 -0
  14. package/dist/components/Input/Input.js +2 -0
  15. package/dist/components/Input/Input.js.map +1 -1
  16. package/dist/components/Input/Select/Select.js +1 -1
  17. package/dist/components/Input/Select/Select.js.map +1 -1
  18. package/dist/components/Table/Table.d.ts +56 -0
  19. package/dist/components/Table/Table.js +199 -0
  20. package/dist/components/Table/Table.js.map +1 -0
  21. package/dist/components/Table/Table.module.css +203 -0
  22. package/dist/{components/Button/Button.module.css → foundations/buttons.css} +47 -19
  23. package/dist/foundations/index.css +1 -0
  24. package/dist/index.d.ts +4 -0
  25. package/dist/index.js +3 -0
  26. package/dist/index.js.map +1 -1
  27. package/docs/README.md +1 -1
  28. package/docs/forms.md +27 -0
  29. package/docs/layout.md +16 -0
  30. package/package.json +5 -1
@@ -1,45 +1,73 @@
1
- .button {
1
+ .btn {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ gap: var(--spacing-2);
2
6
  border: 1px solid var(--btn-border, rgba(30, 51, 85, 0.6));
3
7
  cursor: pointer;
4
8
  font-weight: 600;
9
+ font-family: inherit;
10
+ line-height: 1;
5
11
  padding: 12px 18px;
6
12
  border-radius: var(--radius-sm);
13
+ font-size: var(--font-size-3);
7
14
  background: var(--btn-bg, rgba(15, 30, 51, 0.9));
8
15
  color: var(--btn-color, var(--color-text));
9
16
  box-shadow: var(--btn-shadow, none);
10
17
  transition: transform 0.15s ease, box-shadow 0.2s ease, background 0.2s ease, border-color 0.2s ease,
11
18
  color 0.2s ease;
19
+ text-decoration: none;
12
20
  }
13
21
 
14
- .button:focus-visible {
22
+ .btn:focus-visible {
15
23
  outline: none;
16
24
  box-shadow: 0 0 0 3px rgba(20, 201, 214, 0.3);
17
25
  }
18
26
 
19
- .button:hover:not(:disabled) {
27
+ .btn:hover:not(.btn-disabled):not(:disabled) {
20
28
  background: var(--btn-bg-hover, var(--btn-bg));
21
29
  box-shadow: var(--btn-shadow-hover, var(--btn-shadow, none));
22
30
  }
23
31
 
24
- .button:active:not(:disabled) {
32
+ .btn:active:not(.btn-disabled):not(:disabled) {
25
33
  transform: translateY(1px);
26
34
  }
27
35
 
28
- .button:disabled {
36
+ .btn:disabled,
37
+ .btn.btn-disabled {
29
38
  opacity: 0.6;
30
39
  cursor: not-allowed;
40
+ pointer-events: none;
31
41
  }
32
42
 
33
- .solid {
43
+ .btn-solid {
34
44
  transform: translateY(0);
35
45
  }
36
46
 
37
- .solid:hover:not(:disabled) {
47
+ .btn-solid:hover:not(.btn-disabled):not(:disabled) {
38
48
  transform: translateY(-1px);
39
49
  }
40
50
 
41
- .outline,
42
- .ghost {
51
+ .btn-sm {
52
+ padding: 8px 14px;
53
+ font-size: var(--font-size-2);
54
+ border-radius: var(--radius-xs);
55
+ }
56
+
57
+ .btn-md {
58
+ padding: 12px 18px;
59
+ font-size: var(--font-size-3);
60
+ border-radius: var(--radius-sm);
61
+ }
62
+
63
+ .btn-lg {
64
+ padding: 14px 22px;
65
+ font-size: var(--font-size-4);
66
+ border-radius: var(--radius-md);
67
+ }
68
+
69
+ .btn-outline,
70
+ .btn-ghost {
43
71
  background: transparent;
44
72
  color: var(--btn-accent, var(--color-teal));
45
73
  border-color: var(--btn-accent, var(--color-teal));
@@ -48,16 +76,16 @@
48
76
  --btn-shadow-hover: none;
49
77
  }
50
78
 
51
- .ghost {
79
+ .btn-ghost {
52
80
  border-color: transparent;
53
81
  }
54
82
 
55
- .outline:hover:not(:disabled),
56
- .ghost:hover:not(:disabled) {
83
+ .btn-outline:hover:not(.btn-disabled):not(:disabled),
84
+ .btn-ghost:hover:not(.btn-disabled):not(:disabled) {
57
85
  background: var(--btn-accent-soft, rgba(20, 201, 214, 0.12));
58
86
  }
59
87
 
60
- .variantDefault {
88
+ .btn-default {
61
89
  --btn-accent: var(--btn-default-accent, rgba(158, 178, 204, 0.9));
62
90
  --btn-accent-soft: var(--btn-default-soft, rgba(30, 51, 85, 0.35));
63
91
  --btn-bg: linear-gradient(135deg, var(--btn-default-start, #2a3750), var(--btn-default-end, #1b263c));
@@ -68,7 +96,7 @@
68
96
  --btn-shadow-hover: 0 14px 30px rgba(10, 20, 35, 0.28);
69
97
  }
70
98
 
71
- .variantPrimary {
99
+ .btn-primary {
72
100
  --btn-accent: var(--btn-primary-accent, rgba(20, 201, 214, 0.9));
73
101
  --btn-accent-soft: var(--btn-primary-soft, rgba(20, 201, 214, 0.18));
74
102
  --btn-bg: linear-gradient(135deg, var(--btn-primary-start, #14c9d6), var(--btn-primary-end, #1e63e9));
@@ -79,7 +107,7 @@
79
107
  --btn-shadow-hover: 0 16px 36px rgba(20, 201, 214, 0.4);
80
108
  }
81
109
 
82
- .variantInfo {
110
+ .btn-info {
83
111
  --btn-accent: var(--btn-info-accent, rgba(30, 99, 233, 0.9));
84
112
  --btn-accent-soft: var(--btn-info-soft, rgba(30, 99, 233, 0.18));
85
113
  --btn-bg: linear-gradient(135deg, var(--btn-info-start, #4f7bff), var(--btn-info-end, #2e5be6));
@@ -90,7 +118,7 @@
90
118
  --btn-shadow-hover: 0 16px 36px rgba(30, 99, 233, 0.4);
91
119
  }
92
120
 
93
- .variantSuccess {
121
+ .btn-success {
94
122
  --btn-accent: var(--btn-success-accent, rgba(79, 230, 163, 0.9));
95
123
  --btn-accent-soft: var(--btn-success-soft, rgba(79, 230, 163, 0.16));
96
124
  --btn-bg: linear-gradient(135deg, var(--btn-success-start, #35d092), var(--btn-success-end, #1faf75));
@@ -101,7 +129,7 @@
101
129
  --btn-shadow-hover: 0 16px 36px rgba(79, 230, 163, 0.36);
102
130
  }
103
131
 
104
- .variantWarning {
132
+ .btn-warning {
105
133
  --btn-accent: var(--btn-warning-accent, rgba(246, 200, 106, 0.95));
106
134
  --btn-accent-soft: var(--btn-warning-soft, rgba(246, 200, 106, 0.2));
107
135
  --btn-bg: linear-gradient(135deg, var(--btn-warning-start, #ffd166), var(--btn-warning-end, #f4a62a));
@@ -112,7 +140,7 @@
112
140
  --btn-shadow-hover: 0 16px 36px rgba(246, 200, 106, 0.36);
113
141
  }
114
142
 
115
- .variantDanger {
143
+ .btn-danger {
116
144
  --btn-accent: var(--btn-danger-accent, rgba(255, 107, 107, 0.95));
117
145
  --btn-accent-soft: var(--btn-danger-soft, rgba(255, 107, 107, 0.2));
118
146
  --btn-bg: linear-gradient(135deg, var(--btn-danger-start, #ff8f8f), var(--btn-danger-end, #ff5b5b));
@@ -124,7 +152,7 @@
124
152
  }
125
153
 
126
154
  @media (prefers-reduced-motion: reduce) {
127
- .button {
155
+ .btn {
128
156
  transition: none;
129
157
  }
130
158
  }
@@ -1,4 +1,5 @@
1
1
  @import "./tokens.css";
2
2
  @import "./typography.css";
3
3
  @import "./layout.css";
4
+ @import "./buttons.css";
4
5
  @import "./utilities.css";
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export { default as Input } from './components/Input/Input';
7
7
  export { default as Textarea } from './components/Input/Textarea/Textarea';
8
8
  export { default as Radio } from './components/Input/Radio/Radio';
9
9
  export { default as Switch } from './components/Input/Switch/Switch';
10
+ export { default as Checkbox } from './components/Input/Checkbox/Checkbox';
10
11
  export { default as Select } from './components/Input/Select/Select';
11
12
  export { default as Alert } from './components/Alert/Alert';
12
13
  export { default as Notifier } from './components/Notifier/Notifier';
@@ -23,6 +24,9 @@ export { default as Tabs } from './components/Tabs/Tabs';
23
24
  export { default as Progress } from './components/Progress/Progress';
24
25
  export { default as Breadcrumbs } from './components/Breadcrumbs/Breadcrumbs';
25
26
  export { default as Image } from './components/Image/Image';
27
+ export { default as FileUploader } from './components/FileUploader/FileUploader';
28
+ export { default as Table } from './components/Table/Table';
29
+ export type { TableColumn, TableSortDirection, TableSortOptions, TableSortState } from './components/Table/Table';
26
30
  export { default as Text } from './components/Typography/Text';
27
31
  export { default as Heading } from './components/Typography/Heading';
28
32
  export { default as useMediaQuery } from './hooks/useMediaQuery';
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ export { default as Input } from './components/Input/Input';
7
7
  export { default as Textarea } from './components/Input/Textarea/Textarea';
8
8
  export { default as Radio } from './components/Input/Radio/Radio';
9
9
  export { default as Switch } from './components/Input/Switch/Switch';
10
+ export { default as Checkbox } from './components/Input/Checkbox/Checkbox';
10
11
  export { default as Select } from './components/Input/Select/Select';
11
12
  export { default as Alert } from './components/Alert/Alert';
12
13
  export { default as Notifier } from './components/Notifier/Notifier';
@@ -23,6 +24,8 @@ export { default as Tabs } from './components/Tabs/Tabs';
23
24
  export { default as Progress } from './components/Progress/Progress';
24
25
  export { default as Breadcrumbs } from './components/Breadcrumbs/Breadcrumbs';
25
26
  export { default as Image } from './components/Image/Image';
27
+ export { default as FileUploader } from './components/FileUploader/FileUploader';
28
+ export { default as Table } from './components/Table/Table';
26
29
  export { default as Text } from './components/Typography/Text';
27
30
  export { default as Heading } from './components/Typography/Heading';
28
31
  export { default as useMediaQuery } from './hooks/useMediaQuery';
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,MAAM,EAAE,MAAM,kCAAkC,CAAC;AACrE,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,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,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;AACrE,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,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAE5D,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
@@ -28,7 +28,7 @@ import { Button, Card, Menu } from '@phpsoftbox/react-softbox';
28
28
 
29
29
  - `layout.md` — Grid, Flex, утилиты
30
30
  - `navigation.md` — Menu, Dropdown, CollapseButton
31
- - `forms.md` — Input (Field/Select/FloatLabel), Switch, Radio
31
+ - `forms.md` — Input (Field/Select/FloatLabel), Switch, Radio, Checkbox, FileUploader
32
32
  - `overlays.md` — Modal, Drawer
33
33
  - `feedback.md` — Badge, Alert, Notifier
34
34
  - `card.md` — Card и его секции
package/docs/forms.md CHANGED
@@ -41,6 +41,13 @@
41
41
  <Input.Radio name="mode" label="Резервный" />
42
42
  ```
43
43
 
44
+ ## Checkbox
45
+
46
+ ```tsx
47
+ <Input.Checkbox label="Согласен с условиями" />
48
+ <Input.Checkbox label="Премиум" description="Расширенные права" />
49
+ ```
50
+
44
51
  ## Switch
45
52
 
46
53
  ```tsx
@@ -173,3 +180,23 @@ const options = [
173
180
  </Input.Group>
174
181
  </Input>
175
182
  ```
183
+
184
+ ## FileUploader
185
+
186
+ ```tsx
187
+ <FileUploader
188
+ allowedTypes={['.jpg', '.png', '.pdf']}
189
+ maxFileSizeKb={2048}
190
+ multiple
191
+ showPreview
192
+ onChange={(files) => console.log(files)}
193
+ onUpload={(files) => api.upload(files)}
194
+ />;
195
+ ```
196
+
197
+ Параметры:
198
+ - `allowedTypes` — допустимые типы (расширения `.png` или MIME `image/*`)
199
+ - `maxFileSizeKb` — ограничение размера
200
+ - `multiple` — разрешить множественный выбор
201
+ - `showPreview` — превью для изображений
202
+ - `onUpload` — колбэк загрузки (опционально)
package/docs/layout.md CHANGED
@@ -52,3 +52,19 @@
52
52
  - `p-`, `px-`, `py-`, `pt-`, `pr-`, `pb-`, `pl-`
53
53
  - `m-`, `mx-`, `my-`, `mt-`, `mr-`, `mb-`, `ml-`
54
54
  - `gap-`
55
+
56
+ ## Классы кнопок
57
+
58
+ Глобальные классы для кнопок, которые можно применять к `a`/`button`.
59
+
60
+ ```tsx
61
+ <a className="btn btn-primary btn-solid" href="/create">Создать</a>
62
+ <a className="btn btn-info btn-outline" href="/details">Подробнее</a>
63
+ <button className="btn btn-danger btn-ghost">Удалить</button>
64
+ ```
65
+
66
+ Доступны:
67
+ - базовый класс: `btn`
68
+ - варианты: `btn-default`, `btn-primary`, `btn-info`, `btn-success`, `btn-warning`, `btn-danger`
69
+ - внешность: `btn-solid`, `btn-outline`, `btn-ghost`
70
+ - размеры: `btn-sm`, `btn-md`, `btn-lg`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phpsoftbox/react-softbox",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -42,6 +42,10 @@
42
42
  "axios": "^1.12.2"
43
43
  },
44
44
  "devDependencies": {
45
+ "@testing-library/dom": "^10.4.1",
46
+ "@testing-library/jest-dom": "^6.9.1",
47
+ "@testing-library/react": "^16.3.2",
48
+ "@types/jest": "^30.0.0",
45
49
  "@types/react": "^19.2.0",
46
50
  "@types/react-dom": "^19.2.0",
47
51
  "typescript": "^5.9.3"