@toolpath/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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/dist/index.d.ts +1174 -0
  4. package/dist/index.js +5934 -0
  5. package/package.json +68 -0
  6. package/src/attribution/action.tsx +13 -0
  7. package/src/attribution/at.tsx +28 -0
  8. package/src/attribution/attribution.tsx +16 -0
  9. package/src/attribution/by.tsx +21 -0
  10. package/src/attribution/format-time.ts +48 -0
  11. package/src/attribution/index.ts +20 -0
  12. package/src/badge/badge.tsx +38 -0
  13. package/src/badge/index.ts +1 -0
  14. package/src/breadcrumbs/breadcrumbs-context.tsx +26 -0
  15. package/src/breadcrumbs/breadcrumbs.tsx +24 -0
  16. package/src/breadcrumbs/index.ts +12 -0
  17. package/src/breadcrumbs/item.tsx +85 -0
  18. package/src/button/animated-ellipsis.tsx +44 -0
  19. package/src/button/button.tsx +168 -0
  20. package/src/button/index.ts +1 -0
  21. package/src/callout/callout.tsx +202 -0
  22. package/src/callout/index.ts +2 -0
  23. package/src/callout/use-dismissed-callouts.ts +78 -0
  24. package/src/card/card.tsx +19 -0
  25. package/src/card/index.ts +2 -0
  26. package/src/checkbox/checkbox.tsx +76 -0
  27. package/src/checkbox/index.ts +1 -0
  28. package/src/combobox/button.tsx +99 -0
  29. package/src/combobox/combobox-context.tsx +42 -0
  30. package/src/combobox/combobox.tsx +60 -0
  31. package/src/combobox/empty.tsx +21 -0
  32. package/src/combobox/group-label.tsx +20 -0
  33. package/src/combobox/group.tsx +11 -0
  34. package/src/combobox/icon.tsx +11 -0
  35. package/src/combobox/index.tsx +64 -0
  36. package/src/combobox/input.tsx +77 -0
  37. package/src/combobox/item-indicator.tsx +16 -0
  38. package/src/combobox/item.tsx +58 -0
  39. package/src/combobox/list.tsx +19 -0
  40. package/src/combobox/popover.tsx +62 -0
  41. package/src/combobox/trigger.tsx +33 -0
  42. package/src/combobox/value.tsx +12 -0
  43. package/src/common/index.ts +1 -0
  44. package/src/common/svg.tsx +17 -0
  45. package/src/dialog/actions.tsx +17 -0
  46. package/src/dialog/confirm-button.tsx +25 -0
  47. package/src/dialog/dialog-context.tsx +21 -0
  48. package/src/dialog/dialog.tsx +37 -0
  49. package/src/dialog/dismiss-button.tsx +29 -0
  50. package/src/dialog/index.ts +37 -0
  51. package/src/dialog/message.tsx +20 -0
  52. package/src/dialog/provider.tsx +102 -0
  53. package/src/dialog/title.tsx +20 -0
  54. package/src/editable-cell/editable-cell.tsx +307 -0
  55. package/src/editable-cell/index.ts +7 -0
  56. package/src/editable-cell/use-editable-grid.tsx +296 -0
  57. package/src/field/field.tsx +22 -0
  58. package/src/field/index.ts +2 -0
  59. package/src/helpers/cn.ts +6 -0
  60. package/src/helpers/index.ts +1 -0
  61. package/src/icon-button/icon-button.tsx +126 -0
  62. package/src/icon-button/index.ts +2 -0
  63. package/src/index.ts +32 -0
  64. package/src/input/index.ts +1 -0
  65. package/src/input/input.tsx +276 -0
  66. package/src/link/index.ts +4 -0
  67. package/src/link/link-context.tsx +33 -0
  68. package/src/link/link.tsx +24 -0
  69. package/src/menu/divider.tsx +17 -0
  70. package/src/menu/index.ts +40 -0
  71. package/src/menu/item.tsx +149 -0
  72. package/src/menu/menu-context.tsx +24 -0
  73. package/src/menu/menu.tsx +14 -0
  74. package/src/menu/popover.tsx +69 -0
  75. package/src/menu/submenu-trigger.tsx +48 -0
  76. package/src/menu/submenu.tsx +20 -0
  77. package/src/menu/trigger.tsx +43 -0
  78. package/src/notification/index.ts +16 -0
  79. package/src/notification/list.tsx +123 -0
  80. package/src/notification/provider.tsx +75 -0
  81. package/src/page-header/index.ts +2 -0
  82. package/src/page-header/page-header.tsx +14 -0
  83. package/src/pagination/index.ts +1 -0
  84. package/src/pagination/pagination.tsx +136 -0
  85. package/src/panels/collapsed.tsx +32 -0
  86. package/src/panels/group.tsx +27 -0
  87. package/src/panels/index.ts +57 -0
  88. package/src/panels/layout-context.ts +5 -0
  89. package/src/panels/orientation-context.tsx +5 -0
  90. package/src/panels/panel.tsx +95 -0
  91. package/src/panels/separator.tsx +44 -0
  92. package/src/pin/index.ts +1 -0
  93. package/src/pin/pin.tsx +99 -0
  94. package/src/progress-bar/index.ts +1 -0
  95. package/src/progress-bar/progress-bar.tsx +48 -0
  96. package/src/quantity-input/index.ts +1 -0
  97. package/src/quantity-input/quantity-input.tsx +158 -0
  98. package/src/scroll-area/index.ts +1 -0
  99. package/src/scroll-area/scroll-area.tsx +82 -0
  100. package/src/slider/index.ts +1 -0
  101. package/src/slider/slider.tsx +75 -0
  102. package/src/star/index.ts +1 -0
  103. package/src/star/star.tsx +99 -0
  104. package/src/switch/index.ts +1 -0
  105. package/src/switch/switch.tsx +33 -0
  106. package/src/table/body.tsx +15 -0
  107. package/src/table/cell-context.tsx +48 -0
  108. package/src/table/cell.tsx +83 -0
  109. package/src/table/group-empty-state.tsx +28 -0
  110. package/src/table/group-header.tsx +62 -0
  111. package/src/table/header-cell.tsx +158 -0
  112. package/src/table/header-row.tsx +28 -0
  113. package/src/table/index.ts +56 -0
  114. package/src/table/is-group-empty-state.ts +17 -0
  115. package/src/table/is-group-header.ts +5 -0
  116. package/src/table/row-context.tsx +61 -0
  117. package/src/table/row-disabled-context.tsx +7 -0
  118. package/src/table/row.tsx +98 -0
  119. package/src/table/table-context.tsx +127 -0
  120. package/src/table/table-empty.tsx +57 -0
  121. package/src/table/table.tsx +547 -0
  122. package/src/table/tree-icon.tsx +147 -0
  123. package/src/table/use-checkbox.ts +200 -0
  124. package/src/table/use-column-layout.ts +117 -0
  125. package/src/table/use-groups.ts +134 -0
  126. package/src/table/use-keyboard-navigation.ts +274 -0
  127. package/src/table/use-sort-functions.ts +90 -0
  128. package/src/tabs/index.ts +20 -0
  129. package/src/tabs/list.tsx +29 -0
  130. package/src/tabs/tab.tsx +141 -0
  131. package/src/tabs/tabs-context.tsx +38 -0
  132. package/src/tabs/tabs.tsx +27 -0
  133. package/src/textarea/index.ts +1 -0
  134. package/src/textarea/textarea.tsx +88 -0
  135. package/src/toast/index.ts +19 -0
  136. package/src/toast/list.tsx +133 -0
  137. package/src/toast/provider.tsx +36 -0
  138. package/src/toggle/index.ts +17 -0
  139. package/src/toggle/indicator.tsx +27 -0
  140. package/src/toggle/item.tsx +54 -0
  141. package/src/toggle/toggle-context.tsx +68 -0
  142. package/src/toggle/toggle.tsx +124 -0
  143. package/src/toggle/use-indicator.tsx +69 -0
  144. package/src/tooltip/index.ts +1 -0
  145. package/src/tooltip/tooltip.tsx +122 -0
  146. package/theme.css +70 -0
@@ -0,0 +1,122 @@
1
+ import React, { ReactElement, memo, useCallback, useMemo, useState } from 'react'
2
+ import {
3
+ Tooltip as BaseTooltip,
4
+ TooltipPositionerProps,
5
+ TooltipProviderProps,
6
+ TooltipRootChangeEventDetails,
7
+ TooltipRootProps,
8
+ } from '@base-ui/react'
9
+ import { cn } from '../helpers'
10
+
11
+ export type TooltipProps = TooltipProviderProps &
12
+ TooltipRootProps &
13
+ Omit<TooltipPositionerProps, 'className'> & {
14
+ children: ReactElement
15
+ tip: ReactElement | string | null
16
+ disableFocusTrigger?: boolean
17
+ hoverable?: boolean
18
+ className?: string
19
+ }
20
+
21
+ // Memoized trigger span to avoid recreating on every render
22
+ const TriggerSpan = <span />
23
+
24
+ export const Tooltip = memo(
25
+ ({
26
+ children,
27
+ tip,
28
+ delay = 0,
29
+ closeDelay,
30
+ timeout,
31
+ defaultOpen,
32
+ open: controlledOpen,
33
+ onOpenChange,
34
+ onOpenChangeComplete,
35
+ trackCursorAxis,
36
+ disableFocusTrigger = false,
37
+ hoverable = false,
38
+ disabled,
39
+ sideOffset = 8,
40
+ className,
41
+ ...positionerProps
42
+ }: TooltipProps) => {
43
+ const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false)
44
+ const open = controlledOpen ?? internalOpen
45
+
46
+ const providerProps = useMemo<TooltipProviderProps>(
47
+ () => ({ delay, closeDelay, timeout }),
48
+ [delay, closeDelay, timeout],
49
+ )
50
+
51
+ const rootProps = useMemo<
52
+ Pick<
53
+ TooltipRootProps,
54
+ 'defaultOpen' | 'trackCursorAxis' | 'onOpenChangeComplete' | 'disabled'
55
+ >
56
+ >(
57
+ () => ({
58
+ defaultOpen,
59
+ trackCursorAxis,
60
+ onOpenChangeComplete,
61
+ disabled,
62
+ }),
63
+ [defaultOpen, trackCursorAxis, onOpenChangeComplete, disabled],
64
+ )
65
+
66
+ const handleOpenChange = useCallback(
67
+ (nextOpen: boolean, eventDetails: TooltipRootChangeEventDetails) => {
68
+ if (disableFocusTrigger && eventDetails.reason === 'trigger-focus') {
69
+ return
70
+ }
71
+ setInternalOpen(nextOpen)
72
+ onOpenChange?.(nextOpen, eventDetails)
73
+ },
74
+ [disableFocusTrigger, onOpenChange],
75
+ )
76
+
77
+ const positionerClassName = useMemo(
78
+ () => cn('z-50', { 'pointer-events-none': !hoverable }, className),
79
+ [hoverable, className],
80
+ )
81
+
82
+ if (!tip) {
83
+ return <span>{children}</span>
84
+ }
85
+
86
+ return (
87
+ <BaseTooltip.Provider {...providerProps}>
88
+ <BaseTooltip.Root open={open} onOpenChange={handleOpenChange} {...rootProps}>
89
+ <BaseTooltip.Trigger
90
+ data-trigger
91
+ delay={delay}
92
+ closeDelay={closeDelay}
93
+ render={TriggerSpan}
94
+ >
95
+ {children}
96
+ </BaseTooltip.Trigger>
97
+ <BaseTooltip.Portal>
98
+ <BaseTooltip.Positioner
99
+ className={positionerClassName}
100
+ sideOffset={sideOffset}
101
+ {...(positionerProps as TooltipPositionerProps)}
102
+ >
103
+ <BaseTooltip.Popup
104
+ className={cn(
105
+ 'bg-gray-800/90 text-white dark:bg-black/50 dark:backdrop-blur-sm dark:text-zinc-100 text-xs rounded-md break-words font-body font-medium',
106
+ 'dark:border dark:border-zinc-900',
107
+ 'px-3 py-1 transition duration-300 ease-in-out max-w-72',
108
+ 'data-[side=top]:origin-bottom data-[side=top]:-mb-1',
109
+ 'data-[side=bottom]:origin-top data-[side=bottom]:-mt-1',
110
+ 'data-[side=left]:origin-right',
111
+ 'data-[side=right]:origin-left',
112
+ )}
113
+ >
114
+ {tip}
115
+ </BaseTooltip.Popup>
116
+ </BaseTooltip.Positioner>
117
+ </BaseTooltip.Portal>
118
+ </BaseTooltip.Root>
119
+ </BaseTooltip.Provider>
120
+ )
121
+ },
122
+ )
package/theme.css ADDED
@@ -0,0 +1,70 @@
1
+ /*
2
+ * Toolpath's public Tailwind v4 theme.
3
+ *
4
+ * This is the canonical styling contract for every Toolpath application.
5
+ */
6
+ /* Importing the theme also makes every primitive's utility classes visible to
7
+ Tailwind's scanner. Consumers should not have to maintain a second source
8
+ list for this package. */
9
+ @source './src';
10
+
11
+ /* Every Toolpath app selects dark mode with the document's `.dark` class. */
12
+ @custom-variant dark (&:where(.dark, .dark *));
13
+
14
+ @theme {
15
+ --font-body: 'Open Sans', ui-sans-serif, system-ui, sans-serif;
16
+ --font-display: Nunito, ui-sans-serif, system-ui, sans-serif;
17
+ --font-mono: 'Roboto Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
18
+
19
+ --text-3xs: 8px;
20
+ --text-3xs--line-height: 12px;
21
+ --text-2xs: 10px;
22
+ --text-2xs--line-height: 14px;
23
+
24
+ --color-primary: #e07a48;
25
+ --color-primary-darken: #d6632a;
26
+ --color-danger: #ba5b4b;
27
+ --color-danger-darken: #843e32;
28
+ --color-warning: #ffe066;
29
+ --color-warning-darken: #cd8e04;
30
+ --color-info: #6bb0b3;
31
+ --color-info-lighten: #e5f6f7;
32
+ --color-success: #68b688;
33
+ --color-success-darken: #5da37a;
34
+ --color-yellow: #ffcc03;
35
+
36
+ --color-gray: #4d5168;
37
+ --color-gray-50: #f3f4f6;
38
+ --color-gray-100: #dcdee5;
39
+ --color-gray-200: #c4c7d4;
40
+ --color-gray-300: #959bb1;
41
+ --color-gray-400: #71768d;
42
+ --color-gray-500: #4d5168;
43
+ --color-gray-600: #3c4051;
44
+ --color-gray-700: #2b2e3a;
45
+ --color-gray-800: #23252f;
46
+ --color-gray-900: #1a1c23;
47
+
48
+ --color-zinc-50: #eeeeee;
49
+ --color-zinc-100: #e1e1e1;
50
+ --color-zinc-200: #c6c6c6;
51
+ --color-zinc-300: #aeaeae;
52
+ --color-zinc-400: #939393;
53
+ --color-zinc-500: #7b7b7b;
54
+ --color-zinc-600: #626262;
55
+ --color-zinc-700: #4b4b4b;
56
+ --color-zinc-800: #3d3d3d;
57
+ --color-zinc-900: #2f2f2f;
58
+ --color-zinc-950: #282828;
59
+
60
+ --color-tag: #c4c7d4;
61
+ --color-tag-blue: #80afff;
62
+ --color-tag-light-blue: #80d6ff;
63
+ --color-tag-sea-foam: #91ede4;
64
+ --color-tag-green: #75e67e;
65
+ --color-tag-yellow: #fddb81;
66
+ --color-tag-orange: #ffb080;
67
+ --color-tag-red: #f2627f;
68
+ --color-tag-pink: #f695fb;
69
+ --color-tag-lavender: #ae9efa;
70
+ }