@granularjs/ui 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 (220) hide show
  1. package/README.md +116 -0
  2. package/dist/fonts/Arimo-400.ttf +0 -0
  3. package/dist/fonts/Arimo-500.ttf +1449 -0
  4. package/dist/fonts/Arimo-600.ttf +1449 -0
  5. package/dist/fonts/Arimo-700.ttf +0 -0
  6. package/dist/fonts/Inter-400.woff2 +0 -0
  7. package/dist/fonts/Inter-500.woff2 +0 -0
  8. package/dist/fonts/Inter-600.woff2 +0 -0
  9. package/dist/fonts/Inter-700.woff2 +0 -0
  10. package/dist/fonts/Poppins-400.ttf +0 -0
  11. package/dist/fonts/Poppins-500.ttf +0 -0
  12. package/dist/fonts/Poppins-600.ttf +0 -0
  13. package/dist/fonts/Poppins-700.ttf +0 -0
  14. package/dist/granular-ui.min.js +3605 -0
  15. package/dist/granular-ui.min.js.map +7 -0
  16. package/package.json +55 -0
  17. package/src/components/Accordion.js +25 -0
  18. package/src/components/ActionIcon.js +20 -0
  19. package/src/components/Affix.js +11 -0
  20. package/src/components/Alert.js +33 -0
  21. package/src/components/Anchor.js +8 -0
  22. package/src/components/AppBar.js +14 -0
  23. package/src/components/Avatar.js +13 -0
  24. package/src/components/AvatarGroup.js +8 -0
  25. package/src/components/Badge.js +22 -0
  26. package/src/components/BadgeGroup.js +8 -0
  27. package/src/components/Blockquote.js +8 -0
  28. package/src/components/BottomBar.js +43 -0
  29. package/src/components/Breadcrumbs.js +19 -0
  30. package/src/components/Burger.js +13 -0
  31. package/src/components/Button.js +37 -0
  32. package/src/components/Calendar.js +109 -0
  33. package/src/components/Card.js +40 -0
  34. package/src/components/Center.js +8 -0
  35. package/src/components/Checkbox.js +46 -0
  36. package/src/components/CheckboxGroup.js +8 -0
  37. package/src/components/Chip.js +35 -0
  38. package/src/components/Code.js +8 -0
  39. package/src/components/Col.js +8 -0
  40. package/src/components/Collapse.js +8 -0
  41. package/src/components/Container.js +19 -0
  42. package/src/components/CopyButton.js +30 -0
  43. package/src/components/DateInput.js +123 -0
  44. package/src/components/DatePicker.js +7 -0
  45. package/src/components/Divider.js +22 -0
  46. package/src/components/Drawer.js +32 -0
  47. package/src/components/EventCalendar.js +972 -0
  48. package/src/components/Fieldset.js +12 -0
  49. package/src/components/Flex.js +25 -0
  50. package/src/components/Grid.js +8 -0
  51. package/src/components/GridTable.js +99 -0
  52. package/src/components/Group.js +29 -0
  53. package/src/components/HoverCard.js +24 -0
  54. package/src/components/Icon.js +19 -0
  55. package/src/components/Image.js +8 -0
  56. package/src/components/Indicator.js +21 -0
  57. package/src/components/Kbd.js +8 -0
  58. package/src/components/List.js +77 -0
  59. package/src/components/Loading.js +29 -0
  60. package/src/components/LoadingOverlay.js +9 -0
  61. package/src/components/Menu.js +129 -0
  62. package/src/components/Modal.js +61 -0
  63. package/src/components/MultiSelect.js +153 -0
  64. package/src/components/NavLink.js +72 -0
  65. package/src/components/Notification.js +42 -0
  66. package/src/components/Notifications.js +59 -0
  67. package/src/components/NumberField.js +389 -0
  68. package/src/components/NumberInput.js +5 -0
  69. package/src/components/Pagination.js +56 -0
  70. package/src/components/Paper.js +20 -0
  71. package/src/components/PasswordInput.js +29 -0
  72. package/src/components/PinInput.js +218 -0
  73. package/src/components/Popover.js +38 -0
  74. package/src/components/Popper.js +25 -0
  75. package/src/components/Progress.js +27 -0
  76. package/src/components/ProgressRing.js +11 -0
  77. package/src/components/Radio.js +22 -0
  78. package/src/components/RadioGroup.js +8 -0
  79. package/src/components/RangePicker.js +45 -0
  80. package/src/components/RangeSlider.js +143 -0
  81. package/src/components/Rating.js +42 -0
  82. package/src/components/ScrollArea.js +11 -0
  83. package/src/components/SearchInput.js +17 -0
  84. package/src/components/SegmentedControl.js +39 -0
  85. package/src/components/Select.js +71 -0
  86. package/src/components/SelectSearch.js +37 -0
  87. package/src/components/Sidebar.js +136 -0
  88. package/src/components/SimpleGrid.js +11 -0
  89. package/src/components/Skeleton.js +24 -0
  90. package/src/components/Slider.js +126 -0
  91. package/src/components/Space.js +8 -0
  92. package/src/components/Stack.js +27 -0
  93. package/src/components/Stepper.js +20 -0
  94. package/src/components/Switch.js +16 -0
  95. package/src/components/SwitchGroup.js +8 -0
  96. package/src/components/Table.js +42 -0
  97. package/src/components/Tabs.js +194 -0
  98. package/src/components/Tag.js +8 -0
  99. package/src/components/Text.js +42 -0
  100. package/src/components/TextInput.js +74 -0
  101. package/src/components/Textarea.js +15 -0
  102. package/src/components/Timeline.js +22 -0
  103. package/src/components/Title.js +18 -0
  104. package/src/components/Toast.js +16 -0
  105. package/src/components/ToastStack.js +21 -0
  106. package/src/components/Tooltip.js +12 -0
  107. package/src/hooks/useDisclosure.js +13 -0
  108. package/src/index.js +98 -0
  109. package/src/theme/fonts/Arimo-400.ttf +0 -0
  110. package/src/theme/fonts/Arimo-500.ttf +1449 -0
  111. package/src/theme/fonts/Arimo-600.ttf +1449 -0
  112. package/src/theme/fonts/Arimo-700.ttf +0 -0
  113. package/src/theme/fonts/Inter-400.woff2 +0 -0
  114. package/src/theme/fonts/Inter-500.woff2 +0 -0
  115. package/src/theme/fonts/Inter-600.woff2 +0 -0
  116. package/src/theme/fonts/Inter-700.woff2 +0 -0
  117. package/src/theme/fonts/Poppins-400.ttf +0 -0
  118. package/src/theme/fonts/Poppins-500.ttf +0 -0
  119. package/src/theme/fonts/Poppins-600.ttf +0 -0
  120. package/src/theme/fonts/Poppins-700.ttf +0 -0
  121. package/src/theme/icons.js +10 -0
  122. package/src/theme/styles.js +3630 -0
  123. package/src/theme/theme.js +71 -0
  124. package/src/utils.js +75 -0
  125. package/types/components/Accordion.d.ts +1 -0
  126. package/types/components/ActionIcon.d.ts +1 -0
  127. package/types/components/Affix.d.ts +1 -0
  128. package/types/components/Alert.d.ts +1 -0
  129. package/types/components/Anchor.d.ts +1 -0
  130. package/types/components/AppBar.d.ts +1 -0
  131. package/types/components/Avatar.d.ts +1 -0
  132. package/types/components/AvatarGroup.d.ts +1 -0
  133. package/types/components/Badge.d.ts +1 -0
  134. package/types/components/BadgeGroup.d.ts +1 -0
  135. package/types/components/Blockquote.d.ts +1 -0
  136. package/types/components/BottomBar.d.ts +4 -0
  137. package/types/components/Breadcrumbs.d.ts +1 -0
  138. package/types/components/Burger.d.ts +1 -0
  139. package/types/components/Button.d.ts +1 -0
  140. package/types/components/Calendar.d.ts +1 -0
  141. package/types/components/Card.d.ts +1 -0
  142. package/types/components/Center.d.ts +1 -0
  143. package/types/components/Checkbox.d.ts +1 -0
  144. package/types/components/CheckboxGroup.d.ts +1 -0
  145. package/types/components/Chip.d.ts +1 -0
  146. package/types/components/Code.d.ts +1 -0
  147. package/types/components/Col.d.ts +1 -0
  148. package/types/components/Collapse.d.ts +1 -0
  149. package/types/components/Container.d.ts +1 -0
  150. package/types/components/CopyButton.d.ts +1 -0
  151. package/types/components/DateInput.d.ts +1 -0
  152. package/types/components/DatePicker.d.ts +1 -0
  153. package/types/components/Divider.d.ts +1 -0
  154. package/types/components/Drawer.d.ts +1 -0
  155. package/types/components/EventCalendar.d.ts +1 -0
  156. package/types/components/Fieldset.d.ts +1 -0
  157. package/types/components/Flex.d.ts +1 -0
  158. package/types/components/Grid.d.ts +1 -0
  159. package/types/components/GridTable.d.ts +5 -0
  160. package/types/components/Group.d.ts +1 -0
  161. package/types/components/HoverCard.d.ts +1 -0
  162. package/types/components/Icon.d.ts +1 -0
  163. package/types/components/Image.d.ts +1 -0
  164. package/types/components/Indicator.d.ts +1 -0
  165. package/types/components/Kbd.d.ts +1 -0
  166. package/types/components/List.d.ts +5 -0
  167. package/types/components/Loading.d.ts +1 -0
  168. package/types/components/LoadingOverlay.d.ts +1 -0
  169. package/types/components/Menu.d.ts +2 -0
  170. package/types/components/Modal.d.ts +1 -0
  171. package/types/components/MultiSelect.d.ts +1 -0
  172. package/types/components/NavLink.d.ts +1 -0
  173. package/types/components/Notification.d.ts +1 -0
  174. package/types/components/Notifications.d.ts +1 -0
  175. package/types/components/NumberField.d.ts +1 -0
  176. package/types/components/NumberInput.d.ts +1 -0
  177. package/types/components/Pagination.d.ts +1 -0
  178. package/types/components/Paper.d.ts +1 -0
  179. package/types/components/PasswordInput.d.ts +1 -0
  180. package/types/components/PinInput.d.ts +1 -0
  181. package/types/components/Popover.d.ts +1 -0
  182. package/types/components/Popper.d.ts +1 -0
  183. package/types/components/Progress.d.ts +1 -0
  184. package/types/components/ProgressRing.d.ts +1 -0
  185. package/types/components/Radio.d.ts +1 -0
  186. package/types/components/RadioGroup.d.ts +1 -0
  187. package/types/components/RangePicker.d.ts +1 -0
  188. package/types/components/RangeSlider.d.ts +1 -0
  189. package/types/components/Rating.d.ts +1 -0
  190. package/types/components/ScrollArea.d.ts +1 -0
  191. package/types/components/SearchInput.d.ts +1 -0
  192. package/types/components/SegmentedControl.d.ts +1 -0
  193. package/types/components/Select.d.ts +1 -0
  194. package/types/components/SelectSearch.d.ts +1 -0
  195. package/types/components/Sidebar.d.ts +1 -0
  196. package/types/components/SimpleGrid.d.ts +1 -0
  197. package/types/components/Skeleton.d.ts +1 -0
  198. package/types/components/Slider.d.ts +5 -0
  199. package/types/components/Space.d.ts +1 -0
  200. package/types/components/Stack.d.ts +1 -0
  201. package/types/components/Stepper.d.ts +1 -0
  202. package/types/components/Switch.d.ts +1 -0
  203. package/types/components/SwitchGroup.d.ts +1 -0
  204. package/types/components/Table.d.ts +1 -0
  205. package/types/components/Tabs.d.ts +1 -0
  206. package/types/components/Tag.d.ts +1 -0
  207. package/types/components/Text.d.ts +1 -0
  208. package/types/components/TextInput.d.ts +1 -0
  209. package/types/components/Textarea.d.ts +1 -0
  210. package/types/components/Timeline.d.ts +1 -0
  211. package/types/components/Title.d.ts +1 -0
  212. package/types/components/Toast.d.ts +1 -0
  213. package/types/components/ToastStack.d.ts +1 -0
  214. package/types/components/Tooltip.d.ts +1 -0
  215. package/types/hooks/useDisclosure.d.ts +1 -0
  216. package/types/index.d.ts +93 -0
  217. package/types/theme/icons.d.ts +10 -0
  218. package/types/theme/styles.d.ts +1 -0
  219. package/types/theme/theme.d.ts +2 -0
  220. package/types/utils.d.ts +12 -0
@@ -0,0 +1,30 @@
1
+ import { Button, after, when } from '@granularjs/core';
2
+ import { cx, splitPropsChildren } from '../utils.js';
3
+ import { state } from '@granularjs/core';
4
+
5
+ export function CopyButton(...args) {
6
+ const { props, children } = splitPropsChildren(args, { value: '', timeout: 1500 });
7
+ const { value, timeout, className, ...rest } = props;
8
+ const copied = state(false);
9
+ const buttonClass = after(copied).compute((next) =>
10
+ cx('g-ui-copy-button', next && 'g-ui-copy-button-done', className)
11
+ );
12
+
13
+ const copy = async () => {
14
+ try {
15
+ await navigator.clipboard.writeText(String(value));
16
+ copied.set(true);
17
+ setTimeout(() => copied.set(false), timeout);
18
+ } catch {}
19
+ };
20
+
21
+ return Button(
22
+ {
23
+ ...rest,
24
+ className: buttonClass,
25
+ onClick: copy,
26
+ type: 'button',
27
+ },
28
+ when(children?.length, () => children, () => when(copied, () => 'Copied', () => 'Copy'))
29
+ );
30
+ }
@@ -0,0 +1,123 @@
1
+ import { state, after } from '@granularjs/core';
2
+ import { cx, splitPropsChildren, classVar, resolveValue } from '../utils.js';
3
+ import { Calendar } from './Calendar.js';
4
+ import { Popover } from './Popover.js';
5
+ import { TextInput } from './TextInput.js';
6
+
7
+ export function DateInput(...args) {
8
+ const { props, rawProps } = splitPropsChildren(args, { size: 'md', format: { pattern: 'dddd-dd-dd' } });
9
+ const {
10
+ value,
11
+ size,
12
+ calendarSize,
13
+ leftSection,
14
+ rightSection,
15
+ className,
16
+ format,
17
+ minDate,
18
+ maxDate,
19
+ ...rest
20
+ } = props;
21
+ const { onChange } = rawProps;
22
+
23
+ const resolveDate = (next) => {
24
+ const resolved = resolveValue(next);
25
+ if (resolved instanceof Date) return resolved;
26
+ if (resolved == null || resolved === '') return null;
27
+ const parsed = new Date(resolved);
28
+ if (Number.isNaN(parsed.getTime())) return null;
29
+ return parsed;
30
+ };
31
+ const isSameDay = (left, right) =>
32
+ left &&
33
+ right &&
34
+ left.getFullYear() === right.getFullYear() &&
35
+ left.getMonth() === right.getMonth() &&
36
+ left.getDate() === right.getDate();
37
+
38
+ const formatDate = (date) => {
39
+ if (!date) return '';
40
+ const year = String(date.getFullYear()).padStart(4, '0');
41
+ const month = String(date.getMonth() + 1).padStart(2, '0');
42
+ const day = String(date.getDate()).padStart(2, '0');
43
+ return `${year}-${month}-${day}`;
44
+ };
45
+
46
+ const parseDate = (text) => {
47
+ const digits = String(text ?? '').replace(/\D/g, '');
48
+ if (digits.length < 8) return null;
49
+ const year = Number(digits.slice(0, 4));
50
+ const month = Number(digits.slice(4, 6));
51
+ const day = Number(digits.slice(6, 8));
52
+ if (!year || !month || !day) return null;
53
+ const candidate = new Date(year, month - 1, day);
54
+ if (
55
+ candidate.getFullYear() !== year ||
56
+ candidate.getMonth() !== month - 1 ||
57
+ candidate.getDate() !== day
58
+ ) {
59
+ return null;
60
+ }
61
+ const min = resolveDate(minDate);
62
+ if (min && candidate < min) return null;
63
+ const max = resolveDate(maxDate);
64
+ if (max && candidate > max) return null;
65
+ return candidate;
66
+ };
67
+
68
+ const currentDate = state(resolveDate(value));
69
+ const textValue = state(formatDate(currentDate.get()));
70
+ const opened = state(false);
71
+
72
+ after(value).change((next) => {
73
+ if (value.get() == next) return;
74
+ const resolved = resolveDate(next);
75
+ if (resolved == null) {
76
+ currentDate.set(null);
77
+ textValue.set('');
78
+ return;
79
+ }
80
+ currentDate.set(resolved);
81
+ textValue.set(formatDate(resolved));
82
+ });
83
+
84
+ after(textValue).change((next) => {
85
+ const parsed = parseDate(next);
86
+ console.log('parsed', parsed);
87
+ console.log('currentDate', currentDate.get());
88
+ if (!parsed) return;
89
+ if (isSameDay(parsed, currentDate.get())) return;
90
+ currentDate.set(parsed);
91
+ onChange?.(parsed);
92
+ });
93
+
94
+ const setDate = (next) => {
95
+ if (!next) return;
96
+ if (isSameDay(next, currentDate.get())) return;
97
+ currentDate.set(next);
98
+ textValue.set(formatDate(next));
99
+ onChange?.(next);
100
+ opened.set(false);
101
+ };
102
+
103
+ return Popover(
104
+ {
105
+ opened,
106
+ onChange: (next) => opened.set(!!next),
107
+ content: Calendar({ size: classVar('', calendarSize, 'xs'), value: currentDate, onChange: setDate }),
108
+ className: 'g-ui-date-input-popover',
109
+ },
110
+ TextInput({
111
+ ...rest,
112
+ size,
113
+ className: cx('g-ui-dateinput', className),
114
+ leftSection,
115
+ rightSection,
116
+ type: 'text',
117
+ inputMode: 'numeric',
118
+ format: format,
119
+ value: textValue,
120
+ onChange: (next) => textValue.set(next),
121
+ })
122
+ );
123
+ }
@@ -0,0 +1,7 @@
1
+ import { Calendar } from './Calendar.js';
2
+ import { splitPropsChildren } from '../utils.js';
3
+
4
+ export function DatePicker(...args) {
5
+ const { props } = splitPropsChildren(args);
6
+ return Calendar(props);
7
+ }
@@ -0,0 +1,22 @@
1
+ import { Div, when } from '@granularjs/core';
2
+ import { cx, splitPropsChildren, classFlag, classVar } from '../utils.js';
3
+ import { Text } from './Text.js';
4
+
5
+ export function Divider(...args) {
6
+ const { props } = splitPropsChildren(args, { labelPosition: 'center' });
7
+ const { label, labelPosition, vertical, className, ...rest } = props;
8
+
9
+ return Div(
10
+ {
11
+ ...rest,
12
+ className: cx(
13
+ 'g-ui-divider',
14
+ classFlag('label', label),
15
+ classVar('g-ui-divider-label-', labelPosition, 'center'),
16
+ classFlag('g-ui-divider-vertical', vertical),
17
+ className
18
+ ),
19
+ },
20
+ when(label, () => Text({ className: 'g-ui-divider-label-text', size: 'sm' }, label))
21
+ );
22
+ }
@@ -0,0 +1,32 @@
1
+ import { Div, portal, when } from '@granularjs/core';
2
+ import { cx, splitPropsChildren, classVar, classMap } from '../utils.js';
3
+
4
+ export function Drawer(...args) {
5
+ const { props, children } = splitPropsChildren(args, {
6
+ position: 'right',
7
+ size: 'md',
8
+ overlay: 'normal',
9
+ shadowed: true,
10
+ });
11
+ const { opened, onClose, position, size, overlay, shadowed, className, style } = props;
12
+ return when(opened, () =>
13
+ portal(
14
+ Div(
15
+ { className: cx('g-ui-drawer-overlay', classVar('g-ui-drawer-overlay-', overlay, 'normal')), onClick: onClose },
16
+ Div(
17
+ {
18
+ className: cx(
19
+ 'g-ui-drawer',
20
+ classMap(shadowed, { true: 'g-ui-drawer-shadowed' }, true),
21
+ classVar('g-ui-drawer-', position, 'right'),
22
+ classVar('g-ui-drawer-size-', size, 'md'),
23
+ className
24
+ ),
25
+ onClick: (ev) => ev.stopPropagation(),
26
+ },
27
+ children
28
+ )
29
+ )
30
+ )
31
+ );
32
+ }