@phpsoftbox/react-softbox 0.1.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 (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +271 -0
  3. package/dist/components/Alert/Alert.d.ts +11 -0
  4. package/dist/components/Alert/Alert.js +15 -0
  5. package/dist/components/Alert/Alert.js.map +1 -0
  6. package/dist/components/Alert/Alert.module.css +73 -0
  7. package/dist/components/Badge/Badge.d.ts +8 -0
  8. package/dist/components/Badge/Badge.js +15 -0
  9. package/dist/components/Badge/Badge.js.map +1 -0
  10. package/dist/components/Badge/Badge.module.css +47 -0
  11. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +24 -0
  12. package/dist/components/Breadcrumbs/Breadcrumbs.js +15 -0
  13. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -0
  14. package/dist/components/Breadcrumbs/Breadcrumbs.module.css +55 -0
  15. package/dist/components/Button/Button.d.ts +10 -0
  16. package/dist/components/Button/Button.js +37 -0
  17. package/dist/components/Button/Button.js.map +1 -0
  18. package/dist/components/Button/Button.module.css +130 -0
  19. package/dist/components/Card/Card.d.ts +15 -0
  20. package/dist/components/Card/Card.js +26 -0
  21. package/dist/components/Card/Card.js.map +1 -0
  22. package/dist/components/Card/Card.module.css +55 -0
  23. package/dist/components/CollapseButton/CollapseButton.d.ts +9 -0
  24. package/dist/components/CollapseButton/CollapseButton.js +11 -0
  25. package/dist/components/CollapseButton/CollapseButton.js.map +1 -0
  26. package/dist/components/CollapseButton/CollapseButton.module.css +57 -0
  27. package/dist/components/Drawer/Drawer.d.ts +19 -0
  28. package/dist/components/Drawer/Drawer.js +42 -0
  29. package/dist/components/Drawer/Drawer.js.map +1 -0
  30. package/dist/components/Drawer/Drawer.module.css +104 -0
  31. package/dist/components/Flex/Flex.module.css +11 -0
  32. package/dist/components/Flex/Row.d.ts +9 -0
  33. package/dist/components/Flex/Row.js +14 -0
  34. package/dist/components/Flex/Row.js.map +1 -0
  35. package/dist/components/Flex/Stack.d.ts +8 -0
  36. package/dist/components/Flex/Stack.js +13 -0
  37. package/dist/components/Flex/Stack.js.map +1 -0
  38. package/dist/components/Grid/Grid.d.ts +11 -0
  39. package/dist/components/Grid/Grid.js +16 -0
  40. package/dist/components/Grid/Grid.js.map +1 -0
  41. package/dist/components/Grid/Grid.module.css +32 -0
  42. package/dist/components/Input/DatePicker.d.ts +6 -0
  43. package/dist/components/Input/DatePicker.js +6 -0
  44. package/dist/components/Input/DatePicker.js.map +1 -0
  45. package/dist/components/Input/DateRangePicker.d.ts +16 -0
  46. package/dist/components/Input/DateRangePicker.js +16 -0
  47. package/dist/components/Input/DateRangePicker.js.map +1 -0
  48. package/dist/components/Input/Field.d.ts +5 -0
  49. package/dist/components/Input/Field.js +25 -0
  50. package/dist/components/Input/Field.js.map +1 -0
  51. package/dist/components/Input/FloatLabel/FloatLabel.d.ts +9 -0
  52. package/dist/components/Input/FloatLabel/FloatLabel.js +22 -0
  53. package/dist/components/Input/FloatLabel/FloatLabel.js.map +1 -0
  54. package/dist/components/Input/FloatLabel/FloatLabel.module.css +41 -0
  55. package/dist/components/Input/FormField/FormField.d.ts +29 -0
  56. package/dist/components/Input/FormField/FormField.js +60 -0
  57. package/dist/components/Input/FormField/FormField.js.map +1 -0
  58. package/dist/components/Input/FormField/FormField.module.css +30 -0
  59. package/dist/components/Input/Input.d.ts +59 -0
  60. package/dist/components/Input/Input.js +34 -0
  61. package/dist/components/Input/Input.js.map +1 -0
  62. package/dist/components/Input/Input.module.css +31 -0
  63. package/dist/components/Input/InputGroup.d.ts +11 -0
  64. package/dist/components/Input/InputGroup.js +25 -0
  65. package/dist/components/Input/InputGroup.js.map +1 -0
  66. package/dist/components/Input/InputGroup.module.css +38 -0
  67. package/dist/components/Input/MaskedInput.d.ts +9 -0
  68. package/dist/components/Input/MaskedInput.js +82 -0
  69. package/dist/components/Input/MaskedInput.js.map +1 -0
  70. package/dist/components/Input/NumberInput.d.ts +10 -0
  71. package/dist/components/Input/NumberInput.js +44 -0
  72. package/dist/components/Input/NumberInput.js.map +1 -0
  73. package/dist/components/Input/Radio/Radio.d.ts +7 -0
  74. package/dist/components/Input/Radio/Radio.js +9 -0
  75. package/dist/components/Input/Radio/Radio.js.map +1 -0
  76. package/dist/components/Input/Radio/Radio.module.css +83 -0
  77. package/dist/components/Input/Select/Select.d.ts +38 -0
  78. package/dist/components/Input/Select/Select.js +200 -0
  79. package/dist/components/Input/Select/Select.js.map +1 -0
  80. package/dist/components/Input/Select/Select.module.css +194 -0
  81. package/dist/components/Input/Switch/Switch.d.ts +6 -0
  82. package/dist/components/Input/Switch/Switch.js +9 -0
  83. package/dist/components/Input/Switch/Switch.js.map +1 -0
  84. package/dist/components/Input/Switch/Switch.module.css +62 -0
  85. package/dist/components/Input/Textarea/Textarea.d.ts +6 -0
  86. package/dist/components/Input/Textarea/Textarea.js +21 -0
  87. package/dist/components/Input/Textarea/Textarea.js.map +1 -0
  88. package/dist/components/Input/Textarea/Textarea.module.css +39 -0
  89. package/dist/components/Input/TimePicker.d.ts +4 -0
  90. package/dist/components/Input/TimePicker.js +6 -0
  91. package/dist/components/Input/TimePicker.js.map +1 -0
  92. package/dist/components/Menu/Dropdown.d.ts +13 -0
  93. package/dist/components/Menu/Dropdown.js +58 -0
  94. package/dist/components/Menu/Dropdown.js.map +1 -0
  95. package/dist/components/Menu/Menu.d.ts +31 -0
  96. package/dist/components/Menu/Menu.js +161 -0
  97. package/dist/components/Menu/Menu.js.map +1 -0
  98. package/dist/components/Menu/Menu.module.css +240 -0
  99. package/dist/components/Modal/Modal.d.ts +12 -0
  100. package/dist/components/Modal/Modal.js +31 -0
  101. package/dist/components/Modal/Modal.js.map +1 -0
  102. package/dist/components/Modal/Modal.module.css +90 -0
  103. package/dist/components/Notifier/Notifier.d.ts +17 -0
  104. package/dist/components/Notifier/Notifier.js +210 -0
  105. package/dist/components/Notifier/Notifier.js.map +1 -0
  106. package/dist/components/Notifier/Notifier.module.css +182 -0
  107. package/dist/components/Pagination/Pagination.d.ts +28 -0
  108. package/dist/components/Pagination/Pagination.js +70 -0
  109. package/dist/components/Pagination/Pagination.js.map +1 -0
  110. package/dist/components/Pagination/Pagination.module.css +93 -0
  111. package/dist/components/Progress/Progress.d.ts +16 -0
  112. package/dist/components/Progress/Progress.js +32 -0
  113. package/dist/components/Progress/Progress.js.map +1 -0
  114. package/dist/components/Progress/Progress.module.css +110 -0
  115. package/dist/components/Tabs/Tabs.d.ts +20 -0
  116. package/dist/components/Tabs/Tabs.js +115 -0
  117. package/dist/components/Tabs/Tabs.js.map +1 -0
  118. package/dist/components/Tabs/Tabs.module.css +101 -0
  119. package/dist/components/Typography/Heading.d.ts +13 -0
  120. package/dist/components/Typography/Heading.js +38 -0
  121. package/dist/components/Typography/Heading.js.map +1 -0
  122. package/dist/components/Typography/Text.d.ts +20 -0
  123. package/dist/components/Typography/Text.js +43 -0
  124. package/dist/components/Typography/Text.js.map +1 -0
  125. package/dist/components/Typography/Typography.module.css +132 -0
  126. package/dist/foundations/index.css +3 -0
  127. package/dist/foundations/layout.css +78 -0
  128. package/dist/foundations/tokens.css +236 -0
  129. package/dist/foundations/typography.css +49 -0
  130. package/dist/hooks/useDropdownPosition.d.ts +14 -0
  131. package/dist/hooks/useDropdownPosition.js +61 -0
  132. package/dist/hooks/useDropdownPosition.js.map +1 -0
  133. package/dist/hooks/useMediaQuery.d.ts +1 -0
  134. package/dist/hooks/useMediaQuery.js +33 -0
  135. package/dist/hooks/useMediaQuery.js.map +1 -0
  136. package/dist/index.d.ts +30 -0
  137. package/dist/index.js +29 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/theme.d.ts +12 -0
  140. package/dist/theme.js +133 -0
  141. package/dist/theme.js.map +1 -0
  142. package/dist/types.d.ts +1 -0
  143. package/dist/types.js +2 -0
  144. package/dist/types.js.map +1 -0
  145. package/docs/README.md +40 -0
  146. package/docs/breadcrumbs.md +47 -0
  147. package/docs/card.md +18 -0
  148. package/docs/feedback.md +38 -0
  149. package/docs/forms.md +166 -0
  150. package/docs/layout.md +39 -0
  151. package/docs/navigation.md +80 -0
  152. package/docs/overlays.md +31 -0
  153. package/docs/pagination.md +50 -0
  154. package/docs/progress.md +18 -0
  155. package/docs/tabs.md +34 -0
  156. package/docs/theme.md +49 -0
  157. package/docs/typography.md +26 -0
  158. package/package.json +49 -0
@@ -0,0 +1,49 @@
1
+ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap");
2
+
3
+ *,
4
+ *::before,
5
+ *::after {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ html,
10
+ body {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ body {
16
+ font-family: var(--font-sans);
17
+ font-weight: 600;
18
+ font-size: 16px;
19
+ line-height: 1.6;
20
+ color: var(--color-text);
21
+ background: var(--color-body-bg);
22
+ min-height: 100vh;
23
+ }
24
+
25
+ h1,
26
+ h2,
27
+ h3,
28
+ h4 {
29
+ margin: 0 0 var(--spacing-4);
30
+ font-weight: 600;
31
+ letter-spacing: -0.02em;
32
+ }
33
+
34
+ p {
35
+ margin: 0 0 var(--spacing-4);
36
+ color: var(--color-muted);
37
+ }
38
+
39
+ a {
40
+ color: inherit;
41
+ text-decoration: none;
42
+ }
43
+
44
+ button,
45
+ input,
46
+ textarea,
47
+ select {
48
+ font-family: inherit;
49
+ }
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ type Options = {
3
+ gap?: number;
4
+ align?: 'left' | 'right';
5
+ placement?: 'auto' | 'down' | 'up';
6
+ anchorRef?: React.RefObject<HTMLElement | null>;
7
+ };
8
+ type Result = {
9
+ ref: React.RefObject<HTMLDivElement | null>;
10
+ style: React.CSSProperties;
11
+ placement: 'up' | 'down';
12
+ };
13
+ export default function useDropdownPosition(open: boolean, options?: Options): Result;
14
+ export {};
@@ -0,0 +1,61 @@
1
+ import React from 'react';
2
+ const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
3
+ export default function useDropdownPosition(open, options = {}) {
4
+ const { gap = 8, align = 'right', placement: requestedPlacement = 'auto', anchorRef } = options;
5
+ const ref = React.useRef(null);
6
+ const [style, setStyle] = React.useState({});
7
+ const [currentPlacement, setCurrentPlacement] = React.useState('down');
8
+ const compute = React.useCallback(() => {
9
+ if (!ref.current) {
10
+ return;
11
+ }
12
+ const rect = ref.current.getBoundingClientRect();
13
+ const anchorRect = anchorRef?.current?.getBoundingClientRect() ?? rect;
14
+ const padding = 12;
15
+ const availableWidth = window.innerWidth - padding * 2;
16
+ const availableBelow = window.innerHeight - padding - anchorRect.bottom - gap;
17
+ const availableAbove = anchorRect.top - padding - gap;
18
+ let offset = 0;
19
+ let maxWidth;
20
+ let maxHeight;
21
+ let nextPlacement = requestedPlacement === 'auto' ? 'down' : requestedPlacement;
22
+ if (rect.right > window.innerWidth - padding) {
23
+ offset = window.innerWidth - padding - rect.right;
24
+ }
25
+ if (rect.left + offset < padding) {
26
+ offset = padding - rect.left;
27
+ }
28
+ if (rect.width > availableWidth) {
29
+ maxWidth = availableWidth;
30
+ }
31
+ if (requestedPlacement === 'auto') {
32
+ if (rect.height > availableBelow && availableAbove > availableBelow) {
33
+ nextPlacement = 'up';
34
+ }
35
+ }
36
+ const availableSpace = nextPlacement === 'up' ? availableAbove : availableBelow;
37
+ if (availableSpace > 0 && rect.height > availableSpace) {
38
+ maxHeight = Math.max(140, availableSpace);
39
+ }
40
+ setCurrentPlacement(nextPlacement);
41
+ setStyle({
42
+ marginLeft: offset ? `${offset}px` : undefined,
43
+ maxWidth: maxWidth ? `${maxWidth}px` : undefined,
44
+ maxHeight: maxHeight ? `${maxHeight}px` : undefined,
45
+ overflowY: maxHeight ? 'auto' : undefined,
46
+ top: nextPlacement === 'down' ? `calc(100% + ${gap}px)` : 'auto',
47
+ bottom: nextPlacement === 'up' ? `calc(100% + ${gap}px)` : 'auto',
48
+ transformOrigin: `${nextPlacement === 'up' ? 'bottom' : 'top'} ${align}`,
49
+ });
50
+ }, [gap, align, requestedPlacement, anchorRef]);
51
+ useIsomorphicLayoutEffect(() => {
52
+ if (!open) {
53
+ setStyle({});
54
+ setCurrentPlacement('down');
55
+ return;
56
+ }
57
+ compute();
58
+ }, [open, compute]);
59
+ return { ref, style, placement: currentPlacement };
60
+ }
61
+ //# sourceMappingURL=useDropdownPosition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDropdownPosition.js","sourceRoot":"","sources":["../../src/hooks/useDropdownPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,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,mBAAmB,CAAC,IAAa,EAAE,UAAmB,EAAE;IAC9E,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,SAAS,EAAE,kBAAkB,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAChG,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsB,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAgB,MAAM,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,SAAS,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,IAAI,CAAC;QACvE,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC;QACvD,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;QAC9E,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;QACtD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,QAA4B,CAAC;QACjC,IAAI,SAA6B,CAAC;QAClC,IAAI,aAAa,GAAkB,kBAAkB,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAE/F,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC;YAC7C,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC;YACjC,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,GAAG,cAAc,EAAE,CAAC;YAChC,QAAQ,GAAG,cAAc,CAAC;QAC5B,CAAC;QAED,IAAI,kBAAkB,KAAK,MAAM,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc,IAAI,cAAc,GAAG,cAAc,EAAE,CAAC;gBACpE,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;QAChF,IAAI,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACvD,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC5C,CAAC;QAED,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACnC,QAAQ,CAAC;YACP,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS;YAC9C,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS;YAChD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS;YACnD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACzC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM;YAChE,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM;YACjE,eAAe,EAAE,GAAG,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE;SACzE,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC;IAEhD,yBAAyB,CAAC,GAAG,EAAE;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpB,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1 @@
1
+ export default function useMediaQuery(query: string): boolean;
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ export default function useMediaQuery(query) {
3
+ const [matches, setMatches] = React.useState(() => {
4
+ if (typeof window === 'undefined') {
5
+ return false;
6
+ }
7
+ return window.matchMedia(query).matches;
8
+ });
9
+ React.useEffect(() => {
10
+ if (typeof window === 'undefined') {
11
+ return;
12
+ }
13
+ const media = window.matchMedia(query);
14
+ const handler = () => setMatches(media.matches);
15
+ handler();
16
+ if (media.addEventListener) {
17
+ media.addEventListener('change', handler);
18
+ }
19
+ else {
20
+ media.addListener(handler);
21
+ }
22
+ return () => {
23
+ if (media.removeEventListener) {
24
+ media.removeEventListener('change', handler);
25
+ }
26
+ else {
27
+ media.removeListener(handler);
28
+ }
29
+ };
30
+ }, [query]);
31
+ return matches;
32
+ }
33
+ //# sourceMappingURL=useMediaQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaQuery.js","sourceRoot":"","sources":["../../src/hooks/useMediaQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAa;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;QAChD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEhD,OAAO,EAAE,CAAC;QAEV,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;gBAC9B,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,30 @@
1
+ export { default as Button } from './components/Button/Button';
2
+ export { default as Badge } from './components/Badge/Badge';
3
+ export { default as Card } from './components/Card/Card';
4
+ export { default as CollapseButton } from './components/CollapseButton/CollapseButton';
5
+ export { default as FormField } from './components/Input/FormField/FormField';
6
+ export { default as Input } from './components/Input/Input';
7
+ export { default as Textarea } from './components/Input/Textarea/Textarea';
8
+ export { default as Radio } from './components/Input/Radio/Radio';
9
+ export { default as Switch } from './components/Input/Switch/Switch';
10
+ export { default as Select } from './components/Input/Select/Select';
11
+ export { default as Alert } from './components/Alert/Alert';
12
+ export { default as Notifier } from './components/Notifier/Notifier';
13
+ export { default as FloatLabel } from './components/Input/FloatLabel/FloatLabel';
14
+ export { default as Grid } from './components/Grid/Grid';
15
+ export { default as Row } from './components/Flex/Row';
16
+ export { default as Stack } from './components/Flex/Stack';
17
+ export { default as Menu } from './components/Menu/Menu';
18
+ export { default as Dropdown } from './components/Menu/Dropdown';
19
+ export { default as Modal } from './components/Modal/Modal';
20
+ export { default as Drawer } from './components/Drawer/Drawer';
21
+ export { default as Pagination } from './components/Pagination/Pagination';
22
+ export { default as Tabs } from './components/Tabs/Tabs';
23
+ export { default as Progress } from './components/Progress/Progress';
24
+ export { default as Breadcrumbs } from './components/Breadcrumbs/Breadcrumbs';
25
+ export { default as Text } from './components/Typography/Text';
26
+ export { default as Heading } from './components/Typography/Heading';
27
+ export { default as useMediaQuery } from './hooks/useMediaQuery';
28
+ export type { UiVariant } from './types';
29
+ export { applyTheme, setThemeMode, getStoredThemeMode, initTheme } from './theme';
30
+ export type { ThemeMode, ThemeOptions } from './theme';
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ export { default as Button } from './components/Button/Button';
2
+ export { default as Badge } from './components/Badge/Badge';
3
+ export { default as Card } from './components/Card/Card';
4
+ export { default as CollapseButton } from './components/CollapseButton/CollapseButton';
5
+ export { default as FormField } from './components/Input/FormField/FormField';
6
+ export { default as Input } from './components/Input/Input';
7
+ export { default as Textarea } from './components/Input/Textarea/Textarea';
8
+ export { default as Radio } from './components/Input/Radio/Radio';
9
+ export { default as Switch } from './components/Input/Switch/Switch';
10
+ export { default as Select } from './components/Input/Select/Select';
11
+ export { default as Alert } from './components/Alert/Alert';
12
+ export { default as Notifier } from './components/Notifier/Notifier';
13
+ export { default as FloatLabel } from './components/Input/FloatLabel/FloatLabel';
14
+ export { default as Grid } from './components/Grid/Grid';
15
+ export { default as Row } from './components/Flex/Row';
16
+ export { default as Stack } from './components/Flex/Stack';
17
+ export { default as Menu } from './components/Menu/Menu';
18
+ export { default as Dropdown } from './components/Menu/Dropdown';
19
+ export { default as Modal } from './components/Modal/Modal';
20
+ export { default as Drawer } from './components/Drawer/Drawer';
21
+ export { default as Pagination } from './components/Pagination/Pagination';
22
+ export { default as Tabs } from './components/Tabs/Tabs';
23
+ export { default as Progress } from './components/Progress/Progress';
24
+ export { default as Breadcrumbs } from './components/Breadcrumbs/Breadcrumbs';
25
+ export { default as Text } from './components/Typography/Text';
26
+ export { default as Heading } from './components/Typography/Heading';
27
+ export { default as useMediaQuery } from './hooks/useMediaQuery';
28
+ export { applyTheme, setThemeMode, getStoredThemeMode, initTheme } from './theme';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,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"}
@@ -0,0 +1,12 @@
1
+ export type ThemeMode = 'light' | 'dark' | 'system' | 'auto';
2
+ export type ThemeOptions = {
3
+ storageKey?: string;
4
+ root?: HTMLElement;
5
+ defaultMode?: ThemeMode;
6
+ autoStartHour?: number;
7
+ autoEndHour?: number;
8
+ };
9
+ export declare const applyTheme: (mode: ThemeMode, options?: ThemeOptions) => void;
10
+ export declare const setThemeMode: (mode: ThemeMode, options?: ThemeOptions) => void;
11
+ export declare const getStoredThemeMode: (options?: ThemeOptions) => ThemeMode | null;
12
+ export declare const initTheme: (options?: ThemeOptions) => ThemeMode;
package/dist/theme.js ADDED
@@ -0,0 +1,133 @@
1
+ const DEFAULT_STORAGE_KEY = 'psb-theme-mode';
2
+ let cleanup = null;
3
+ let autoTimer = null;
4
+ const clearWatchers = () => {
5
+ if (cleanup) {
6
+ cleanup();
7
+ cleanup = null;
8
+ }
9
+ if (autoTimer) {
10
+ window.clearTimeout(autoTimer);
11
+ autoTimer = null;
12
+ }
13
+ };
14
+ const getRoot = (options) => options?.root ?? document.documentElement;
15
+ const resolveSystemTheme = () => {
16
+ if (typeof window === 'undefined' || !window.matchMedia) {
17
+ return 'dark';
18
+ }
19
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
20
+ };
21
+ const resolveAutoTheme = (options, now = new Date()) => {
22
+ const start = options?.autoStartHour ?? 7;
23
+ const end = options?.autoEndHour ?? 19;
24
+ const hour = now.getHours();
25
+ if (start === end) {
26
+ return 'dark';
27
+ }
28
+ if (start < end) {
29
+ return hour >= start && hour < end ? 'light' : 'dark';
30
+ }
31
+ return hour >= start || hour < end ? 'light' : 'dark';
32
+ };
33
+ const scheduleAuto = (options) => {
34
+ const now = new Date();
35
+ const start = options?.autoStartHour ?? 7;
36
+ const end = options?.autoEndHour ?? 19;
37
+ const next = new Date(now);
38
+ const hour = now.getHours();
39
+ if (start < end) {
40
+ if (hour < start) {
41
+ next.setHours(start, 0, 0, 0);
42
+ }
43
+ else if (hour < end) {
44
+ next.setHours(end, 0, 0, 0);
45
+ }
46
+ else {
47
+ next.setDate(now.getDate() + 1);
48
+ next.setHours(start, 0, 0, 0);
49
+ }
50
+ }
51
+ else {
52
+ if (hour < end) {
53
+ next.setHours(end, 0, 0, 0);
54
+ }
55
+ else if (hour < start) {
56
+ next.setHours(start, 0, 0, 0);
57
+ }
58
+ else {
59
+ next.setDate(now.getDate() + 1);
60
+ next.setHours(end, 0, 0, 0);
61
+ }
62
+ }
63
+ const delay = Math.max(next.getTime() - now.getTime(), 0) + 1000;
64
+ autoTimer = window.setTimeout(() => {
65
+ applyTheme('auto', options);
66
+ }, delay);
67
+ };
68
+ const setThemeAttrs = (mode, resolved, options) => {
69
+ const root = getRoot(options);
70
+ root.setAttribute('data-theme-mode', mode);
71
+ root.setAttribute('data-theme', resolved);
72
+ };
73
+ export const applyTheme = (mode, options) => {
74
+ if (typeof document === 'undefined') {
75
+ return;
76
+ }
77
+ clearWatchers();
78
+ if (mode === 'system') {
79
+ const resolved = resolveSystemTheme();
80
+ setThemeAttrs(mode, resolved, options);
81
+ if (typeof window !== 'undefined' && window.matchMedia) {
82
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
83
+ const handler = () => setThemeAttrs(mode, resolveSystemTheme(), options);
84
+ if (media.addEventListener) {
85
+ media.addEventListener('change', handler);
86
+ }
87
+ else {
88
+ media.addListener(handler);
89
+ }
90
+ cleanup = () => {
91
+ if (media.removeEventListener) {
92
+ media.removeEventListener('change', handler);
93
+ }
94
+ else {
95
+ media.removeListener(handler);
96
+ }
97
+ };
98
+ }
99
+ return;
100
+ }
101
+ if (mode === 'auto') {
102
+ const resolved = resolveAutoTheme(options);
103
+ setThemeAttrs(mode, resolved, options);
104
+ scheduleAuto(options);
105
+ return;
106
+ }
107
+ setThemeAttrs(mode, mode, options);
108
+ };
109
+ export const setThemeMode = (mode, options) => {
110
+ const storageKey = options?.storageKey ?? DEFAULT_STORAGE_KEY;
111
+ if (typeof window !== 'undefined' && window.localStorage) {
112
+ window.localStorage.setItem(storageKey, mode);
113
+ }
114
+ applyTheme(mode, options);
115
+ };
116
+ export const getStoredThemeMode = (options) => {
117
+ const storageKey = options?.storageKey ?? DEFAULT_STORAGE_KEY;
118
+ if (typeof window === 'undefined' || !window.localStorage) {
119
+ return null;
120
+ }
121
+ const saved = window.localStorage.getItem(storageKey);
122
+ if (saved === 'light' || saved === 'dark' || saved === 'system' || saved === 'auto') {
123
+ return saved;
124
+ }
125
+ return null;
126
+ };
127
+ export const initTheme = (options) => {
128
+ const saved = getStoredThemeMode(options);
129
+ const mode = saved ?? options?.defaultMode ?? 'system';
130
+ applyTheme(mode, options);
131
+ return mode;
132
+ };
133
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export type UiVariant = 'default' | 'primary' | 'info' | 'success' | 'warning' | 'danger';
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/docs/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # ReactSoftBox · Документация
2
+
3
+ ReactSoftBox — набор базовых компонентов для админ‑панели. Все стили построены на CSS‑модулях и общих токенах из `foundations/`.
4
+
5
+ ## Структура
6
+
7
+ - `foundations/` — токены, типографика, layout‑переменные
8
+ - `components/` — UI‑компоненты
9
+ - `docs/` — документация по компонентам
10
+
11
+ ## Принципы
12
+
13
+ - Все компоненты самодостаточны и не зависят от глобальных CSS.
14
+ - Адаптив — через `Grid`/`Row` и CSS‑модули компонентов.
15
+ - Состояния (hover, focus, disabled) задаются внутри компонента.
16
+
17
+ ## Быстрый старт
18
+
19
+ ```ts
20
+ import '@phpsoftbox/react-softbox/foundations/index.css';
21
+ ```
22
+
23
+ ```ts
24
+ import { Button, Card, Menu } from '@phpsoftbox/react-softbox';
25
+ ```
26
+
27
+ ## Разделы
28
+
29
+ - `layout.md` — Grid, Flex, утилиты
30
+ - `navigation.md` — Menu, Dropdown, CollapseButton
31
+ - `forms.md` — Input (Field/Select/FloatLabel), Switch, Radio
32
+ - `overlays.md` — Modal, Drawer
33
+ - `feedback.md` — Badge, Alert, Notifier
34
+ - `card.md` — Card и его секции
35
+ - `typography.md` — Тексты и заголовки
36
+ - `theme.md` — Темы и режимы
37
+ - `pagination.md` — Pagination и управление ссылками
38
+ - `tabs.md` — Tabs (горизонтальные и вертикальные)
39
+ - `progress.md` — Progress и его варианты
40
+ - `breadcrumbs.md` — Breadcrumbs и разделители
@@ -0,0 +1,47 @@
1
+ # Breadcrumbs
2
+
3
+ `Breadcrumbs` — цепочка навигации с поддержкой активного элемента и кастомного разделителя.
4
+
5
+ ## Базовое использование
6
+
7
+ ```tsx
8
+ <Breadcrumbs
9
+ items={[
10
+ { label: 'Главная', href: '/' },
11
+ { label: 'Проекты', href: '/projects' },
12
+ { label: 'Project', current: true },
13
+ ]}
14
+ />;
15
+ ```
16
+
17
+ ## Кастомный компонент ссылок
18
+
19
+ По умолчанию используется `<a href>`. Можно передать любой компонент через `as`:
20
+
21
+ ```tsx
22
+ import { Link } from '@inertiajs/react';
23
+
24
+ <Breadcrumbs
25
+ as={Link}
26
+ items={[
27
+ { label: 'Главная', href: '/' },
28
+ { label: 'Проекты', href: '/projects' },
29
+ { label: 'ReactSoftBox', current: true },
30
+ ]}
31
+ />
32
+ ```
33
+
34
+ ## Настройка разделителя
35
+
36
+ ```tsx
37
+ <Breadcrumbs
38
+ separator="/"
39
+ items={[
40
+ { label: 'Команда', href: '/team' },
41
+ { label: 'Дизайн‑система', href: '/team/ui' },
42
+ { label: 'ReactSoftBox', current: true },
43
+ ]}
44
+ />;
45
+ ```
46
+
47
+ Если `current` явно не указан, активным считается последний элемент.
package/docs/card.md ADDED
@@ -0,0 +1,18 @@
1
+ # Card
2
+
3
+ `Card` — базовый контейнер для секций.
4
+
5
+ ```tsx
6
+ <Card>
7
+ <Card.Header title="Заголовок" right={<Button appearance="ghost">...</Button>} />
8
+ <Card.Body>Контент</Card.Body>
9
+ <Card.Footer>
10
+ <Button appearance="ghost">Отмена</Button>
11
+ <Button>Сохранить</Button>
12
+ </Card.Footer>
13
+ </Card>
14
+ ```
15
+
16
+ `Card.Header` умеет принимать:
17
+ - `title` и `subtitle`
18
+ - `right` для иконок/кнопок
@@ -0,0 +1,38 @@
1
+ # Feedback
2
+
3
+ Все статусные компоненты используют единый набор вариантов: `default`, `primary`, `info`, `success`, `warning`, `danger`.
4
+
5
+ ## Badge
6
+
7
+ ```tsx
8
+ <Badge>Default</Badge>
9
+ <Badge variant="primary">Primary</Badge>
10
+ <Badge variant="info">Info</Badge>
11
+ <Badge variant="success">Success</Badge>
12
+ <Badge variant="warning">Warning</Badge>
13
+ <Badge variant="danger">Danger</Badge>
14
+ ```
15
+
16
+ ## Alert
17
+
18
+ ```tsx
19
+ <Alert title="Info">Синхронизация завершится через 3 минуты.</Alert>
20
+ <Alert variant="success" title="Success">Релиз опубликован успешно.</Alert>
21
+ <Alert variant="warning" title="Warning">Лимит запросов близок к максимуму.</Alert>
22
+ <Alert variant="danger" title="Danger" onClose={() => {}}>
23
+ Ошибка доступа к сервису хранения.
24
+ </Alert>
25
+ ```
26
+
27
+ ## Notifier
28
+
29
+ ```tsx
30
+ <Notifier
31
+ items={[
32
+ { id: '1', title: 'Оповещение', message: 'Проверка уведомления', variant: 'info', duration: 3000 },
33
+ ]}
34
+ onDismiss={(id) => console.log(id)}
35
+ />
36
+ ```
37
+
38
+ `duration` включает авто‑dismiss и отображает таймер‑полосу внизу уведомления. Таймер ставится на паузу при наведении и когда вкладка браузера неактивна.