entangle-ui 0.8.2 → 0.9.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 (203) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/dist/esm/assets/src/components/controls/Combobox/Combobox.css.ts.vanilla-B7B5ttkq.css +210 -0
  3. package/dist/esm/assets/src/components/controls/FileUploader/FileUploader.css.ts.vanilla-T4nRiI7s.css +194 -0
  4. package/dist/esm/assets/src/components/controls/MultiSelect/MultiSelect.css.ts.vanilla-CdYayqaF.css +311 -0
  5. package/dist/esm/assets/src/components/controls/TagInput/TagInput.css.ts.vanilla-hnkMOPp1.css +141 -0
  6. package/dist/esm/assets/src/components/data/DataTable/DataTable.css.ts.vanilla-CmRgtjIW.css +231 -0
  7. package/dist/esm/assets/src/components/feedback/Alert/{Alert.css.ts.vanilla-CRAI-xHx.css → Alert.css.ts.vanilla-CfCDsIEg.css} +2 -0
  8. package/dist/esm/assets/src/components/feedback/CommandPalette/CommandPalette.css.ts.vanilla-DGdrLKYZ.css +160 -0
  9. package/dist/esm/assets/src/components/feedback/Drawer/Drawer.css.ts.vanilla-CLPTOUrA.css +247 -0
  10. package/dist/esm/assets/src/components/feedback/Skeleton/SkeletonLayout.css.ts.vanilla-Db7bpqiI.css +75 -0
  11. package/dist/esm/assets/src/components/feedback/Stat/Stat.css.ts.vanilla-GBk3JAMB.css +69 -0
  12. package/dist/esm/assets/src/components/layout/Card/Card.css.ts.vanilla-Ducn1gUX.css +124 -0
  13. package/dist/esm/assets/src/components/navigation/Pagination/Pagination.css.ts.vanilla-CmlFyyjh.css +103 -0
  14. package/dist/esm/assets/src/components/primitives/HoverCard/HoverCard.css.ts.vanilla-BYT0qbLp.css +41 -0
  15. package/dist/esm/components/Icons/CloudUploadIcon.js +24 -0
  16. package/dist/esm/components/Icons/CloudUploadIcon.js.map +1 -0
  17. package/dist/esm/components/Icons/ExternalLinkIcon.js +26 -0
  18. package/dist/esm/components/Icons/ExternalLinkIcon.js.map +1 -0
  19. package/dist/esm/components/Icons/FirstIcon.js +23 -0
  20. package/dist/esm/components/Icons/FirstIcon.js.map +1 -0
  21. package/dist/esm/components/Icons/LastIcon.js +23 -0
  22. package/dist/esm/components/Icons/LastIcon.js.map +1 -0
  23. package/dist/esm/components/Icons/UnlinkIcon.js +26 -0
  24. package/dist/esm/components/Icons/UnlinkIcon.js.map +1 -0
  25. package/dist/esm/components/controls/Combobox/Combobox.css.js +20 -0
  26. package/dist/esm/components/controls/Combobox/Combobox.css.js.map +1 -0
  27. package/dist/esm/components/controls/Combobox/Combobox.js +354 -0
  28. package/dist/esm/components/controls/Combobox/Combobox.js.map +1 -0
  29. package/dist/esm/components/controls/FileUploader/FileUploader.css.js +20 -0
  30. package/dist/esm/components/controls/FileUploader/FileUploader.css.js.map +1 -0
  31. package/dist/esm/components/controls/FileUploader/FileUploader.js +264 -0
  32. package/dist/esm/components/controls/FileUploader/FileUploader.js.map +1 -0
  33. package/dist/esm/components/controls/MultiSelect/MultiSelect.css.js +23 -0
  34. package/dist/esm/components/controls/MultiSelect/MultiSelect.css.js.map +1 -0
  35. package/dist/esm/components/controls/MultiSelect/MultiSelect.js +269 -0
  36. package/dist/esm/components/controls/MultiSelect/MultiSelect.js.map +1 -0
  37. package/dist/esm/components/controls/Select/Select.js +5 -4
  38. package/dist/esm/components/controls/Select/Select.js.map +1 -1
  39. package/dist/esm/components/controls/TagInput/TagInput.css.js +12 -0
  40. package/dist/esm/components/controls/TagInput/TagInput.css.js.map +1 -0
  41. package/dist/esm/components/controls/TagInput/TagInput.js +189 -0
  42. package/dist/esm/components/controls/TagInput/TagInput.js.map +1 -0
  43. package/dist/esm/components/controls/TreeView/TreeNode.js +87 -1
  44. package/dist/esm/components/controls/TreeView/TreeNode.js.map +1 -1
  45. package/dist/esm/components/controls/VectorInput/VectorInput.js +87 -4
  46. package/dist/esm/components/controls/VectorInput/VectorInput.js.map +1 -1
  47. package/dist/esm/components/data/DataTable/DataTable.css.js +25 -0
  48. package/dist/esm/components/data/DataTable/DataTable.css.js.map +1 -0
  49. package/dist/esm/components/data/DataTable/DataTable.js +502 -0
  50. package/dist/esm/components/data/DataTable/DataTable.js.map +1 -0
  51. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js +87 -5
  52. package/dist/esm/components/editor/ChatPanel/ChatCodeBlock.js.map +1 -1
  53. package/dist/esm/components/editor/ChatPanel/ChatInput.js +87 -5
  54. package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
  55. package/dist/esm/components/editor/ChatPanel/ChatMessage.js +87 -2
  56. package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
  57. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js +87 -3
  58. package/dist/esm/components/editor/PropertyInspector/PropertyRow.js.map +1 -1
  59. package/dist/esm/components/editor/PropertyInspector/PropertySection.js +87 -3
  60. package/dist/esm/components/editor/PropertyInspector/PropertySection.js.map +1 -1
  61. package/dist/esm/components/feedback/Alert/Alert.css.js +1 -1
  62. package/dist/esm/components/feedback/Alert/Alert.js +3 -2
  63. package/dist/esm/components/feedback/Alert/Alert.js.map +1 -1
  64. package/dist/esm/components/feedback/CommandPalette/CommandPalette.css.js +20 -0
  65. package/dist/esm/components/feedback/CommandPalette/CommandPalette.css.js.map +1 -0
  66. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js +261 -0
  67. package/dist/esm/components/feedback/CommandPalette/CommandPalette.js.map +1 -0
  68. package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js +86 -0
  69. package/dist/esm/components/feedback/CommandPalette/fuzzySearch.js.map +1 -0
  70. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js +63 -0
  71. package/dist/esm/components/feedback/CommandPalette/useRecentItems.js.map +1 -0
  72. package/dist/esm/components/feedback/Dialog/DialogHeader.js +2 -1
  73. package/dist/esm/components/feedback/Dialog/DialogHeader.js.map +1 -1
  74. package/dist/esm/components/feedback/Drawer/Drawer.css.js +17 -0
  75. package/dist/esm/components/feedback/Drawer/Drawer.css.js.map +1 -0
  76. package/dist/esm/components/feedback/Drawer/Drawer.js +120 -0
  77. package/dist/esm/components/feedback/Drawer/Drawer.js.map +1 -0
  78. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js +74 -0
  79. package/dist/esm/components/feedback/Drawer/useDrawerAnimation.js.map +1 -0
  80. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.css.js +18 -0
  81. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.css.js.map +1 -0
  82. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js +95 -0
  83. package/dist/esm/components/feedback/Skeleton/SkeletonLayout.js.map +1 -0
  84. package/dist/esm/components/feedback/Stat/Stat.css.js +15 -0
  85. package/dist/esm/components/feedback/Stat/Stat.css.js.map +1 -0
  86. package/dist/esm/components/feedback/Stat/Stat.js +55 -0
  87. package/dist/esm/components/feedback/Stat/Stat.js.map +1 -0
  88. package/dist/esm/components/feedback/Toast/ToastItem.js +12 -15
  89. package/dist/esm/components/feedback/Toast/ToastItem.js.map +1 -1
  90. package/dist/esm/components/layout/Accordion/Accordion.js +2 -1
  91. package/dist/esm/components/layout/Accordion/Accordion.js.map +1 -1
  92. package/dist/esm/components/layout/Accordion/AccordionTrigger.js +2 -3
  93. package/dist/esm/components/layout/Accordion/AccordionTrigger.js.map +1 -1
  94. package/dist/esm/components/layout/Card/Card.css.js +18 -0
  95. package/dist/esm/components/layout/Card/Card.css.js.map +1 -0
  96. package/dist/esm/components/layout/Card/Card.js +66 -0
  97. package/dist/esm/components/layout/Card/Card.js.map +1 -0
  98. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js +1 -0
  99. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbEllipsis.js.map +1 -1
  100. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js +1 -0
  101. package/dist/esm/components/navigation/Breadcrumbs/BreadcrumbItem.js.map +1 -1
  102. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js +5 -0
  103. package/dist/esm/components/navigation/Breadcrumbs/Breadcrumbs.js.map +1 -1
  104. package/dist/esm/components/navigation/Pagination/Pagination.css.js +12 -0
  105. package/dist/esm/components/navigation/Pagination/Pagination.css.js.map +1 -0
  106. package/dist/esm/components/navigation/Pagination/Pagination.js +107 -0
  107. package/dist/esm/components/navigation/Pagination/Pagination.js.map +1 -0
  108. package/dist/esm/components/navigation/Pagination/usePagination.js +143 -0
  109. package/dist/esm/components/navigation/Pagination/usePagination.js.map +1 -0
  110. package/dist/esm/components/primitives/Avatar/Avatar.js +87 -1
  111. package/dist/esm/components/primitives/Avatar/Avatar.js.map +1 -1
  112. package/dist/esm/components/primitives/Badge/Badge.js +87 -1
  113. package/dist/esm/components/primitives/Badge/Badge.js.map +1 -1
  114. package/dist/esm/components/primitives/Checkbox/Checkbox.js +5 -2
  115. package/dist/esm/components/primitives/Checkbox/Checkbox.js.map +1 -1
  116. package/dist/esm/components/primitives/Collapsible/Collapsible.js +2 -3
  117. package/dist/esm/components/primitives/Collapsible/Collapsible.js.map +1 -1
  118. package/dist/esm/components/primitives/HoverCard/HoverCard.css.js +7 -0
  119. package/dist/esm/components/primitives/HoverCard/HoverCard.css.js.map +1 -0
  120. package/dist/esm/components/primitives/HoverCard/HoverCard.js +169 -0
  121. package/dist/esm/components/primitives/HoverCard/HoverCard.js.map +1 -0
  122. package/dist/esm/components/primitives/Icon/Icon.js +16 -2
  123. package/dist/esm/components/primitives/Icon/Icon.js.map +1 -1
  124. package/dist/esm/components/primitives/Link/Link.js +3 -3
  125. package/dist/esm/components/primitives/Link/Link.js.map +1 -1
  126. package/dist/esm/components/primitives/Popover/PopoverClose.js +2 -3
  127. package/dist/esm/components/primitives/Popover/PopoverClose.js.map +1 -1
  128. package/dist/esm/components/primitives/Radio/Radio.js +1 -1
  129. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js +44 -0
  130. package/dist/esm/hooks/useBreakpoint/useBreakpoint.js.map +1 -0
  131. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js +97 -0
  132. package/dist/esm/hooks/useDebounced/useDebouncedCallback.js.map +1 -0
  133. package/dist/esm/hooks/useDebounced/useDebouncedValue.js +35 -0
  134. package/dist/esm/hooks/useDebounced/useDebouncedValue.js.map +1 -0
  135. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js +73 -0
  136. package/dist/esm/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -0
  137. package/dist/esm/hooks/useListboxNav/useListboxNav.js +181 -0
  138. package/dist/esm/hooks/useListboxNav/useListboxNav.js.map +1 -0
  139. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js +54 -0
  140. package/dist/esm/hooks/useMediaQuery/useMediaQuery.js.map +1 -0
  141. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js +78 -0
  142. package/dist/esm/hooks/useThrottledCallback/useThrottledCallback.js.map +1 -0
  143. package/dist/esm/index.js +25 -0
  144. package/dist/esm/index.js.map +1 -1
  145. package/dist/esm/theme/breakpoints.js +27 -0
  146. package/dist/esm/theme/breakpoints.js.map +1 -0
  147. package/dist/esm/theme/index.js +1 -0
  148. package/dist/esm/theme/index.js.map +1 -1
  149. package/dist/tokens/tokens.dark.css +1 -1
  150. package/dist/tokens/tokens.json +1 -1
  151. package/dist/tokens/tokens.light.css +1 -1
  152. package/dist/types/components/Icons/CloudUploadIcon.d.ts +27 -0
  153. package/dist/types/components/Icons/ExternalLinkIcon.d.ts +29 -0
  154. package/dist/types/components/Icons/FirstIcon.d.ts +26 -0
  155. package/dist/types/components/Icons/LastIcon.d.ts +26 -0
  156. package/dist/types/components/Icons/UnlinkIcon.d.ts +29 -0
  157. package/dist/types/components/controls/Combobox/Combobox.d.ts +29 -0
  158. package/dist/types/components/controls/Combobox/Combobox.types.d.ts +109 -0
  159. package/dist/types/components/controls/FileUploader/FileUploader.d.ts +34 -0
  160. package/dist/types/components/controls/FileUploader/FileUploader.types.d.ts +94 -0
  161. package/dist/types/components/controls/MultiSelect/MultiSelect.d.ts +31 -0
  162. package/dist/types/components/controls/MultiSelect/MultiSelect.types.d.ts +85 -0
  163. package/dist/types/components/controls/TagInput/TagInput.d.ts +24 -0
  164. package/dist/types/components/controls/TagInput/TagInput.types.d.ts +100 -0
  165. package/dist/types/components/data/DataTable/DataTable.d.ts +8 -0
  166. package/dist/types/components/data/DataTable/DataTable.types.d.ts +159 -0
  167. package/dist/types/components/feedback/Alert/Alert.d.ts +1 -0
  168. package/dist/types/components/feedback/Alert/Alert.types.d.ts +7 -0
  169. package/dist/types/components/feedback/CommandPalette/CommandPalette.d.ts +29 -0
  170. package/dist/types/components/feedback/CommandPalette/CommandPalette.types.d.ts +61 -0
  171. package/dist/types/components/feedback/CommandPalette/fuzzySearch.d.ts +6 -0
  172. package/dist/types/components/feedback/Drawer/Drawer.d.ts +12 -0
  173. package/dist/types/components/feedback/Drawer/Drawer.types.d.ts +70 -0
  174. package/dist/types/components/feedback/Skeleton/Skeleton.types.d.ts +44 -1
  175. package/dist/types/components/feedback/Skeleton/SkeletonLayout.d.ts +314 -0
  176. package/dist/types/components/feedback/Stat/Stat.d.ts +23 -0
  177. package/dist/types/components/feedback/Stat/Stat.types.d.ts +38 -0
  178. package/dist/types/components/layout/Accordion/Accordion.types.d.ts +7 -0
  179. package/dist/types/components/layout/Card/Card.d.ts +12 -0
  180. package/dist/types/components/layout/Card/Card.types.d.ts +54 -0
  181. package/dist/types/components/navigation/Pagination/Pagination.d.ts +22 -0
  182. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +49 -0
  183. package/dist/types/components/primitives/Button/Button.d.ts +1 -1
  184. package/dist/types/components/primitives/HoverCard/HoverCard.d.ts +10 -0
  185. package/dist/types/components/primitives/HoverCard/HoverCard.types.d.ts +64 -0
  186. package/dist/types/components/primitives/Icon/Icon.d.ts +14 -1
  187. package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
  188. package/dist/types/hooks/useBreakpoint/useBreakpoint.d.ts +19 -0
  189. package/dist/types/hooks/useBreakpoint/useBreakpoint.types.d.ts +20 -0
  190. package/dist/types/hooks/useDebounced/useDebounced.types.d.ts +15 -0
  191. package/dist/types/hooks/useDebounced/useDebouncedCallback.d.ts +22 -0
  192. package/dist/types/hooks/useDebounced/useDebouncedValue.d.ts +16 -0
  193. package/dist/types/hooks/useIntersectionObserver/useIntersectionObserver.d.ts +22 -0
  194. package/dist/types/hooks/useIntersectionObserver/useIntersectionObserver.types.d.ts +22 -0
  195. package/dist/types/hooks/useListboxNav/useListboxNav.d.ts +75 -0
  196. package/dist/types/hooks/useMediaQuery/useMediaQuery.d.ts +19 -0
  197. package/dist/types/hooks/useMediaQuery/useMediaQuery.types.d.ts +6 -0
  198. package/dist/types/hooks/useThrottledCallback/useThrottledCallback.d.ts +23 -0
  199. package/dist/types/hooks/useThrottledCallback/useThrottledCallback.types.d.ts +13 -0
  200. package/dist/types/index.d.ts +43 -1
  201. package/dist/types/theme/breakpoints.d.ts +22 -0
  202. package/dist/types/theme/index.d.ts +1 -0
  203. package/package.json +3 -1
@@ -0,0 +1,181 @@
1
+ "use client";
2
+ import { useState, useRef, useEffect, useCallback } from 'react';
3
+
4
+ /**
5
+ * Shared keyboard navigation for listbox-like surfaces (Select, MultiSelect,
6
+ * Combobox, CommandPalette). Tracks an `activeIndex`, skips disabled items,
7
+ * and exposes a single `handleKeyDown` covering Arrow / Home / End / Enter /
8
+ * Escape semantics.
9
+ *
10
+ * The hook is purely logical — consumers render the list and bind the handler
11
+ * to an input or the listbox container. Scroll-into-view is the consumer's
12
+ * concern.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const { activeIndex, handleKeyDown } = useListboxNav({
17
+ * items: filtered,
18
+ * isItemDisabled: o => o.disabled ?? false,
19
+ * onSelect: (item) => commit(item),
20
+ * onEscape: () => close(),
21
+ * });
22
+ * ```
23
+ */
24
+ function useListboxNav(options) {
25
+ const { items, isItemDisabled, defaultActiveIndex = -1, loop = true, resetOnItemsChange = true, onSelect, onEscape, } = options;
26
+ const [activeIndex, setActiveIndex] = useState(defaultActiveIndex);
27
+ // Stable refs so handlers don't churn when callers pass inline closures.
28
+ const itemsRef = useRef(items);
29
+ const isItemDisabledRef = useRef(isItemDisabled);
30
+ const onSelectRef = useRef(onSelect);
31
+ const onEscapeRef = useRef(onEscape);
32
+ const loopRef = useRef(loop);
33
+ useEffect(() => {
34
+ itemsRef.current = items;
35
+ }, [items]);
36
+ useEffect(() => {
37
+ isItemDisabledRef.current = isItemDisabled;
38
+ }, [isItemDisabled]);
39
+ useEffect(() => {
40
+ onSelectRef.current = onSelect;
41
+ }, [onSelect]);
42
+ useEffect(() => {
43
+ onEscapeRef.current = onEscape;
44
+ }, [onEscape]);
45
+ useEffect(() => {
46
+ loopRef.current = loop;
47
+ }, [loop]);
48
+ // Reset active index when items reference changes (e.g. filter).
49
+ const prevItemsRef = useRef(items);
50
+ useEffect(() => {
51
+ if (!resetOnItemsChange)
52
+ return;
53
+ if (prevItemsRef.current !== items) {
54
+ setActiveIndex(defaultActiveIndex);
55
+ prevItemsRef.current = items;
56
+ }
57
+ }, [items, resetOnItemsChange, defaultActiveIndex]);
58
+ const getNavigableIndices = useCallback(() => {
59
+ const list = itemsRef.current;
60
+ const disabled = isItemDisabledRef.current;
61
+ if (!disabled)
62
+ return list.map((_, i) => i);
63
+ const out = [];
64
+ for (let i = 0; i < list.length; i += 1) {
65
+ const item = list[i];
66
+ if (!disabled(item, i))
67
+ out.push(i);
68
+ }
69
+ return out;
70
+ }, []);
71
+ const move = useCallback((direction) => {
72
+ const navigable = getNavigableIndices();
73
+ if (navigable.length === 0) {
74
+ setActiveIndex(-1);
75
+ return;
76
+ }
77
+ setActiveIndex(current => {
78
+ const currentNavIdx = navigable.indexOf(current);
79
+ switch (direction) {
80
+ case 'first':
81
+ return navigable[0] ?? -1;
82
+ case 'last':
83
+ return navigable[navigable.length - 1] ?? -1;
84
+ case 'next': {
85
+ if (currentNavIdx === -1)
86
+ return navigable[0] ?? -1;
87
+ const nextIdx = currentNavIdx + 1;
88
+ if (nextIdx >= navigable.length) {
89
+ return loopRef.current
90
+ ? (navigable[0] ?? -1)
91
+ : (navigable[navigable.length - 1] ?? -1);
92
+ }
93
+ return navigable[nextIdx] ?? -1;
94
+ }
95
+ case 'prev': {
96
+ if (currentNavIdx === -1)
97
+ return navigable[navigable.length - 1] ?? -1;
98
+ const prevIdx = currentNavIdx - 1;
99
+ if (prevIdx < 0) {
100
+ return loopRef.current
101
+ ? (navigable[navigable.length - 1] ?? -1)
102
+ : (navigable[0] ?? -1);
103
+ }
104
+ return navigable[prevIdx] ?? -1;
105
+ }
106
+ }
107
+ });
108
+ }, [getNavigableIndices]);
109
+ const next = useCallback(() => {
110
+ move('next');
111
+ }, [move]);
112
+ const prev = useCallback(() => {
113
+ move('prev');
114
+ }, [move]);
115
+ const first = useCallback(() => {
116
+ move('first');
117
+ }, [move]);
118
+ const last = useCallback(() => {
119
+ move('last');
120
+ }, [move]);
121
+ const selectActive = useCallback(() => {
122
+ const list = itemsRef.current;
123
+ const disabled = isItemDisabledRef.current;
124
+ setActiveIndex(current => {
125
+ if (current < 0 || current >= list.length)
126
+ return current;
127
+ const item = list[current];
128
+ if (disabled?.(item, current))
129
+ return current;
130
+ onSelectRef.current?.(item, current);
131
+ return current;
132
+ });
133
+ }, []);
134
+ const handleKeyDown = useCallback((event) => {
135
+ switch (event.key) {
136
+ case 'ArrowDown':
137
+ event.preventDefault();
138
+ next();
139
+ return true;
140
+ case 'ArrowUp':
141
+ event.preventDefault();
142
+ prev();
143
+ return true;
144
+ case 'Home':
145
+ event.preventDefault();
146
+ first();
147
+ return true;
148
+ case 'End':
149
+ event.preventDefault();
150
+ last();
151
+ return true;
152
+ case 'Enter':
153
+ event.preventDefault();
154
+ selectActive();
155
+ return true;
156
+ case 'Escape':
157
+ if (onEscapeRef.current) {
158
+ event.preventDefault();
159
+ onEscapeRef.current();
160
+ return true;
161
+ }
162
+ return false;
163
+ default:
164
+ return false;
165
+ }
166
+ }, [next, prev, first, last, selectActive]);
167
+ return {
168
+ activeIndex,
169
+ setActiveIndex,
170
+ next,
171
+ prev,
172
+ first,
173
+ last,
174
+ selectActive,
175
+ handleKeyDown,
176
+ navigableIndices: getNavigableIndices(),
177
+ };
178
+ }
179
+
180
+ export { useListboxNav };
181
+ //# sourceMappingURL=useListboxNav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useListboxNav.js","sources":["../../../../../src/hooks/useListboxNav/useListboxNav.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AA8DA;;;;;;;;;;;;;;;;;;;AAmBG;AACG;;;;AAgBJ;AACA;AACA;AACA;AACA;;AAGE;AACF;;AAEE;AACF;;AAEE;AACF;;AAEE;AACF;;AAEE;AACF;;AAGA;;AAEE;;AACA;;AAEE;;;AAIJ;AACE;AACA;AACA;AAAe;;AAEf;AACE;AACA;AAAwB;;AAE1B;;AAGF;AAEI;AACA;AACE;;;;;;AAOE;AACE;AACF;;;;AAG4B;AAC1B;AACA;;;AAGI;;AAEJ;;;;;AAKA;AACA;;AAEI;;;AAGJ;;;AAGN;AACF;AAIF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AAEA;AACE;AACA;;;AAE6C;AAC3C;AACA;AAA+B;;AAE/B;AACF;;AAGF;AAEI;AACE;;AAEE;AACA;AACF;;AAEE;AACA;AACF;;AAEE;AACA;AACF;;AAEE;AACA;AACF;;AAEE;AACA;AACF;AACE;;;AAGE;;AAEF;AACF;AACE;;AAEN;;;;;;;;;;;;AAeJ;;"}
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { useState, useEffect } from 'react';
3
+
4
+ function getInitialMatch(query, fallback) {
5
+ if (typeof window === 'undefined' ||
6
+ typeof window.matchMedia !== 'function') {
7
+ return fallback;
8
+ }
9
+ return window.matchMedia(query).matches;
10
+ }
11
+ /**
12
+ * Reactive media query matching.
13
+ *
14
+ * Returns `true` when the current viewport matches the query and updates as
15
+ * the viewport changes. SSR-safe — returns `defaultMatches` when `matchMedia`
16
+ * is unavailable. Uses the modern `addEventListener('change')` API with a
17
+ * fallback to the legacy `addListener` for older browsers.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * const isWide = useMediaQuery('(min-width: 768px)');
22
+ * return isWide ? <DesktopLayout /> : <MobileLayout />;
23
+ * ```
24
+ */
25
+ function useMediaQuery(query, options = {}) {
26
+ const { defaultMatches = false } = options;
27
+ const [matches, setMatches] = useState(() => getInitialMatch(query, defaultMatches));
28
+ useEffect(() => {
29
+ if (typeof window === 'undefined' ||
30
+ typeof window.matchMedia !== 'function') {
31
+ return;
32
+ }
33
+ const mql = window.matchMedia(query);
34
+ setMatches(mql.matches);
35
+ const handler = (event) => {
36
+ setMatches(event.matches);
37
+ };
38
+ if (typeof mql.addEventListener === 'function') {
39
+ mql.addEventListener('change', handler);
40
+ return () => {
41
+ mql.removeEventListener('change', handler);
42
+ };
43
+ }
44
+ // Legacy Safari fallback.
45
+ mql.addListener(handler);
46
+ return () => {
47
+ mql.removeListener(handler);
48
+ };
49
+ }, [query]);
50
+ return matches;
51
+ }
52
+
53
+ export { useMediaQuery };
54
+ //# sourceMappingURL=useMediaQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaQuery.js","sources":["../../../../../src/hooks/useMediaQuery/useMediaQuery.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAKA;;AAGI;AAEA;;;AAGJ;AAEA;;;;;;;;;;;;;AAaG;;AAKD;AAEA;;;AAOI;;;;AAMF;AAEA;AACE;AACF;AAEA;AACE;AACA;AACE;AACF;;;AAIF;AACA;AACE;AACF;AACF;AAEA;AACF;;"}
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ import { useRef, useMemo, useEffect } from 'react';
3
+
4
+ /**
5
+ * Wrap a function so it fires at most once per `delay` ms. With both
6
+ * `leading` and `trailing` enabled (the default), the first call fires
7
+ * immediately and the most recent call inside the window fires at its
8
+ * end. Set `leading: false` to defer the first call; set
9
+ * `trailing: false` to drop calls inside the window.
10
+ *
11
+ * Typical use: drag handlers, scroll listeners, resize observers — places
12
+ * where the input rate exceeds the work rate and you want to bound the
13
+ * latter.
14
+ *
15
+ * The wrapper identity is stable across renders.
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * const onPointerMove = useThrottledCallback(updateGuide, 16);
20
+ * ```
21
+ */
22
+ function useThrottledCallback(fn, delay, options = {}) {
23
+ const { leading = true, trailing = true } = options;
24
+ const fnRef = useRef(fn);
25
+ fnRef.current = fn;
26
+ const lastCallRef = useRef(0);
27
+ const timerRef = useRef(null);
28
+ const lastArgsRef = useRef(null);
29
+ const throttled = useMemo(() => {
30
+ const invoke = (now) => {
31
+ lastCallRef.current = now;
32
+ const args = lastArgsRef.current;
33
+ lastArgsRef.current = null;
34
+ if (args)
35
+ fnRef.current(...args);
36
+ };
37
+ const wrapper = (...args) => {
38
+ const now = Date.now();
39
+ if (lastCallRef.current === 0 && !leading) {
40
+ // Skip the leading fire by anchoring the window to "now".
41
+ lastCallRef.current = now;
42
+ }
43
+ const elapsed = now - lastCallRef.current;
44
+ lastArgsRef.current = args;
45
+ if (elapsed >= delay) {
46
+ if (timerRef.current !== null) {
47
+ clearTimeout(timerRef.current);
48
+ timerRef.current = null;
49
+ }
50
+ invoke(now);
51
+ return;
52
+ }
53
+ if (trailing && timerRef.current === null) {
54
+ timerRef.current = setTimeout(() => {
55
+ timerRef.current = null;
56
+ invoke(Date.now());
57
+ }, delay - elapsed);
58
+ }
59
+ };
60
+ wrapper.cancel = () => {
61
+ if (timerRef.current !== null) {
62
+ clearTimeout(timerRef.current);
63
+ timerRef.current = null;
64
+ }
65
+ lastArgsRef.current = null;
66
+ lastCallRef.current = 0;
67
+ };
68
+ return wrapper;
69
+ }, [delay, leading, trailing]);
70
+ useEffect(() => () => {
71
+ if (timerRef.current !== null)
72
+ clearTimeout(timerRef.current);
73
+ }, []);
74
+ return throttled;
75
+ }
76
+
77
+ export { useThrottledCallback };
78
+ //# sourceMappingURL=useThrottledCallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useThrottledCallback.js","sources":["../../../../../src/hooks/useThrottledCallback/useThrottledCallback.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAQA;;;;;;;;;;;;;;;;;AAiBG;AACG;;AAOJ;AACA;AAEA;AACA;AACA;AAEA;AACE;AACE;AACA;AACA;AACA;AAAU;AACZ;AAEA;AACE;;;AAGE;;AAGF;AACA;AAEA;AACE;AACE;AACA;;;;;;AAOF;AACE;AACA;AACF;;AAEJ;AAEA;AACE;AACE;AACA;;AAEF;AACA;AACF;AAEA;;AAGF;AAEI;AAA+B;;AAKnC;AACF;;"}
package/dist/esm/index.js CHANGED
@@ -7,10 +7,12 @@ export { createLightTheme } from './theme/createLightTheme.js';
7
7
  export { VanillaThemeProvider } from './theme/VanillaThemeProvider.js';
8
8
  export { ThemeProvider } from './theme/ThemeProvider.js';
9
9
  import './assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css';
10
+ export { BREAKPOINT_ORDER, breakpoints } from './theme/breakpoints.js';
10
11
  export { Accordion } from './components/layout/Accordion/Accordion.js';
11
12
  export { AccordionItem } from './components/layout/Accordion/AccordionItem.js';
12
13
  export { AccordionTrigger } from './components/layout/Accordion/AccordionTrigger.js';
13
14
  export { AccordionContent } from './components/layout/Accordion/AccordionContent.js';
15
+ export { Card } from './components/layout/Card/Card.js';
14
16
  export { Divider } from './components/layout/Divider/Divider.js';
15
17
  export { Flex } from './components/layout/Flex/Flex.js';
16
18
  export { Grid } from './components/layout/Grid/Grid.js';
@@ -30,6 +32,7 @@ export { Checkbox } from './components/primitives/Checkbox/Checkbox.js';
30
32
  export { CheckboxGroup } from './components/primitives/Checkbox/CheckboxGroup.js';
31
33
  export { Code } from './components/primitives/Code/Code.js';
32
34
  export { Collapsible } from './components/primitives/Collapsible/Collapsible.js';
35
+ export { HoverCard } from './components/primitives/HoverCard/HoverCard.js';
33
36
  export { Icon } from './components/primitives/Icon/Icon.js';
34
37
  export { IconButton } from './components/primitives/IconButton/IconButton.js';
35
38
  export { Input } from './components/primitives/Input/Input.js';
@@ -56,12 +59,16 @@ export { ColorPalette } from './components/controls/ColorPicker/ColorPalette.js'
56
59
  export { MATERIAL_PALETTE } from './components/controls/ColorPicker/palettes/material.js';
57
60
  export { TAILWIND_PALETTE } from './components/controls/ColorPicker/palettes/tailwind.js';
58
61
  export { EARTH_PALETTE, MONOCHROME_PALETTE, NEON_PALETTE, PASTEL_PALETTE, PROFESSIONAL_PALETTES, SKIN_TONES_PALETTE, VINTAGE_PALETTE } from './components/controls/ColorPicker/palettes/professional.js';
62
+ export { Combobox } from './components/controls/Combobox/Combobox.js';
63
+ export { FileUploader } from './components/controls/FileUploader/FileUploader.js';
64
+ export { MultiSelect } from './components/controls/MultiSelect/MultiSelect.js';
59
65
  export { NumberInput } from './components/controls/NumberInput/NumberInput.js';
60
66
  export { KeyboardContextProvider, useEffectsOnKeyboard, useKeyboardContext } from './context/KeyboardContext.js';
61
67
  import './utils/mathExpression.js';
62
68
  import './utils/devWarn.js';
63
69
  export { Select } from './components/controls/Select/Select.js';
64
70
  export { Slider } from './components/controls/Slider/Slider.js';
71
+ export { TagInput } from './components/controls/TagInput/TagInput.js';
65
72
  export { VectorInput } from './components/controls/VectorInput/VectorInput.js';
66
73
  export { TreeView } from './components/controls/TreeView/TreeView.js';
67
74
  export { CurveEditor } from './components/controls/CurveEditor/CurveEditor.js';
@@ -76,12 +83,14 @@ export { ContextMenu } from './components/navigation/ContextMenu/ContextMenu.js'
76
83
  export { useContextMenuTarget } from './components/navigation/ContextMenu/useContextMenuTarget.js';
77
84
  export { Menu } from './components/navigation/Menu/Menu.js';
78
85
  export { useMenu } from './components/navigation/Menu/useMenu.js';
86
+ export { Pagination } from './components/navigation/Pagination/Pagination.js';
79
87
  export { SegmentedControl } from './components/navigation/SegmentedControl/SegmentedControl.js';
80
88
  export { SegmentedControlItem } from './components/navigation/SegmentedControl/SegmentedControlItem.js';
81
89
  export { Tabs } from './components/navigation/Tabs/Tabs.js';
82
90
  export { TabList } from './components/navigation/Tabs/TabList.js';
83
91
  export { Tab } from './components/navigation/Tabs/Tab.js';
84
92
  export { TabPanel } from './components/navigation/Tabs/TabPanel.js';
93
+ export { DataTable } from './components/data/DataTable/DataTable.js';
85
94
  export { FormLabel } from './components/form/FormLabel.js';
86
95
  export { FormHelperText } from './components/form/FormHelperText.js';
87
96
  export { InputWrapper } from './components/form/InputWrapper.js';
@@ -94,12 +103,16 @@ export { DialogHeader } from './components/feedback/Dialog/DialogHeader.js';
94
103
  export { DialogBody } from './components/feedback/Dialog/DialogBody.js';
95
104
  export { DialogFooter } from './components/feedback/Dialog/DialogFooter.js';
96
105
  export { DialogClose } from './components/feedback/Dialog/DialogClose.js';
106
+ export { CommandPalette } from './components/feedback/CommandPalette/CommandPalette.js';
107
+ export { Drawer } from './components/feedback/Drawer/Drawer.js';
97
108
  export { EmptyState } from './components/feedback/EmptyState/EmptyState.js';
98
109
  export { ProgressBar } from './components/feedback/ProgressBar/ProgressBar.js';
99
110
  export { CircularProgress } from './components/feedback/ProgressBar/CircularProgress.js';
100
111
  export { Skeleton } from './components/feedback/Skeleton/Skeleton.js';
101
112
  export { SkeletonGroup } from './components/feedback/Skeleton/SkeletonGroup.js';
113
+ export { SkeletonLayout } from './components/feedback/Skeleton/SkeletonLayout.js';
102
114
  export { Spinner } from './components/feedback/Spinner/Spinner.js';
115
+ export { Stat } from './components/feedback/Stat/Stat.js';
103
116
  export { ToastProvider } from './components/feedback/Toast/ToastProvider.js';
104
117
  export { useToast } from './components/feedback/Toast/useToast.js';
105
118
  export { PropertyPanel } from './components/editor/PropertyInspector/PropertyPanel.js';
@@ -145,15 +158,18 @@ export { ChevronDownIcon } from './components/Icons/ChevronDownIcon.js';
145
158
  export { ChevronUpIcon } from './components/Icons/ChevronUpIcon.js';
146
159
  export { ClockIcon } from './components/Icons/ClockIcon.js';
147
160
  export { CloseIcon } from './components/Icons/CloseIcon.js';
161
+ export { CloudUploadIcon } from './components/Icons/CloudUploadIcon.js';
148
162
  export { CodeIcon } from './components/Icons/CodeIcon.js';
149
163
  export { CopyIcon } from './components/Icons/CopyIcon.js';
150
164
  export { CutIcon } from './components/Icons/CutIcon.js';
151
165
  export { DownloadIcon } from './components/Icons/DownloadIcon.js';
152
166
  export { EditIcon } from './components/Icons/EditIcon.js';
153
167
  export { ErrorIcon } from './components/Icons/ErrorIcon.js';
168
+ export { ExternalLinkIcon } from './components/Icons/ExternalLinkIcon.js';
154
169
  export { EyeDropperIcon } from './components/Icons/EyeDropperIcon.js';
155
170
  export { EyeIcon } from './components/Icons/EyeIcon.js';
156
171
  export { FilterIcon } from './components/Icons/FilterIcon.js';
172
+ export { FirstIcon } from './components/Icons/FirstIcon.js';
157
173
  export { FolderIcon } from './components/Icons/FolderIcon.js';
158
174
  export { FullscreenIcon } from './components/Icons/FullscreenIcon.js';
159
175
  export { GridIcon } from './components/Icons/GridIcon.js';
@@ -161,6 +177,7 @@ export { HeartIcon } from './components/Icons/HeartIcon.js';
161
177
  export { HelpIcon } from './components/Icons/HelpIcon.js';
162
178
  export { HomeIcon } from './components/Icons/HomeIcon.js';
163
179
  export { InfoIcon } from './components/Icons/InfoIcon.js';
180
+ export { LastIcon } from './components/Icons/LastIcon.js';
164
181
  export { LinkIcon } from './components/Icons/LinkIcon.js';
165
182
  export { ListIcon } from './components/Icons/ListIcon.js';
166
183
  export { LockIcon } from './components/Icons/LockIcon.js';
@@ -181,6 +198,7 @@ export { SuccessIcon } from './components/Icons/SuccessIcon.js';
181
198
  export { TagIcon } from './components/Icons/TagIcon.js';
182
199
  export { TrashIcon } from './components/Icons/TrashIcon.js';
183
200
  export { UndoIcon } from './components/Icons/UndoIcon.js';
201
+ export { UnlinkIcon } from './components/Icons/UnlinkIcon.js';
184
202
  export { UnlockIcon } from './components/Icons/UnlockIcon.js';
185
203
  export { UploadIcon } from './components/Icons/UploadIcon.js';
186
204
  export { UserIcon } from './components/Icons/UserIcon.js';
@@ -222,6 +240,13 @@ export { useDisclosure } from './hooks/useDisclosure/useDisclosure.js';
222
240
  export { useClipboard } from './hooks/useClipboard/useClipboard.js';
223
241
  export { useClickOutside } from './hooks/useClickOutside/useClickOutside.js';
224
242
  export { useHotkey } from './hooks/useHotkey/useHotkey.js';
243
+ export { useMediaQuery } from './hooks/useMediaQuery/useMediaQuery.js';
244
+ export { useBreakpoint } from './hooks/useBreakpoint/useBreakpoint.js';
245
+ export { useDebouncedValue } from './hooks/useDebounced/useDebouncedValue.js';
246
+ export { useDebouncedCallback } from './hooks/useDebounced/useDebouncedCallback.js';
247
+ export { useThrottledCallback } from './hooks/useThrottledCallback/useThrottledCallback.js';
248
+ export { useIntersectionObserver } from './hooks/useIntersectionObserver/useIntersectionObserver.js';
249
+ export { useListboxNav } from './hooks/useListboxNav/useListboxNav.js';
225
250
  export { useTheme } from './hooks/useTheme/useTheme.js';
226
251
  export { cx as cn, cx } from './utils/cx.js';
227
252
  export { getKeyGlyph, getPlatform, parseShortcut } from './utils/platform.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Library breakpoint values (px) — used by responsive components like
3
+ * `Stack` and exposed via `useBreakpoint`.
4
+ *
5
+ * Values follow the same scale Stack already uses (576/768/992/1200) and
6
+ * are part of the public API.
7
+ *
8
+ * `xs` is always `0` and effectively means "no minimum"; every viewport
9
+ * matches `xs`.
10
+ */
11
+ const breakpoints = {
12
+ xs: 0,
13
+ sm: 576,
14
+ md: 768,
15
+ lg: 992,
16
+ xl: 1200,
17
+ };
18
+ const BREAKPOINT_ORDER = [
19
+ 'xs',
20
+ 'sm',
21
+ 'md',
22
+ 'lg',
23
+ 'xl',
24
+ ];
25
+
26
+ export { BREAKPOINT_ORDER, breakpoints };
27
+ //# sourceMappingURL=breakpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breakpoints.js","sources":["../../../../src/theme/breakpoints.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;AASG;AACI,MAAM,WAAW,GAAG;AACzB,IAAA,EAAE,EAAE,CAAC;AACL,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,IAAI;;AAKH,MAAM,gBAAgB,GAA8B;IACzD,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;;;;;"}
@@ -7,4 +7,5 @@ export { createLightTheme } from './createLightTheme.js';
7
7
  export { VanillaThemeProvider } from './VanillaThemeProvider.js';
8
8
  export { ThemeProvider } from './ThemeProvider.js';
9
9
  export { GLOBAL_SCROLLBARS_CLASS } from './globalScrollbars.css.js';
10
+ export { BREAKPOINT_ORDER, breakpoints } from './breakpoints.js';
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- /* Entangle UI dark theme — token export (v0.8.2) */
1
+ /* Entangle UI dark theme — token export (v0.9.0) */
2
2
  /* Generated by scripts/export-tokens.ts — do not edit by hand. */
3
3
  :root {
4
4
  --etui-color-accent-error: #f44336;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://design-tokens.org/schema.json",
3
3
  "$description": "Entangle UI design tokens",
4
- "$version": "0.8.2",
4
+ "$version": "0.9.0",
5
5
  "themes": {
6
6
  "dark": {
7
7
  "colors": {
@@ -1,4 +1,4 @@
1
- /* Entangle UI light theme — token export (v0.8.2) */
1
+ /* Entangle UI light theme — token export (v0.9.0) */
2
2
  /* Generated by scripts/export-tokens.ts — do not edit by hand. */
3
3
  .etui-theme-light {
4
4
  --etui-color-accent-error: #d32f2f;
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { IconSize, IconColor } from '../primitives/Icon/Icon.js';
3
+
4
+ /**
5
+ * Cloud upload icon — a cloud silhouette with an upward arrow inside.
6
+ *
7
+ * Use for file-upload drop zones, "send to cloud" actions, and any other
8
+ * upload-to-remote affordance. For a generic up-arrow without the cloud,
9
+ * use `UploadIcon` instead.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <CloudUploadIcon size="lg" color="muted" />
14
+ * ```
15
+ */
16
+ declare const CloudUploadIcon: React.NamedExoticComponent<Omit<{
17
+ children: React.ReactNode;
18
+ size?: IconSize | undefined;
19
+ color?: IconColor | undefined;
20
+ className?: string | undefined;
21
+ title?: string | undefined;
22
+ decorative?: boolean | undefined;
23
+ testId?: string | undefined;
24
+ ref?: React.Ref<SVGSVGElement> | undefined;
25
+ }, "children">>;
26
+
27
+ export { CloudUploadIcon };
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import { IconSize, IconColor } from '../primitives/Icon/Icon.js';
3
+
4
+ /**
5
+ * External link icon — a box with an arrow exiting the top-right corner.
6
+ *
7
+ * Use for links that open in a new tab/window or otherwise navigate
8
+ * outside the current surface. For an in-app link (chain shape) use
9
+ * `LinkIcon` instead.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <Link href="https://example.com" target="_blank">
14
+ * Docs <ExternalLinkIcon size="sm" decorative />
15
+ * </Link>
16
+ * ```
17
+ */
18
+ declare const ExternalLinkIcon: React.NamedExoticComponent<Omit<{
19
+ children: React.ReactNode;
20
+ size?: IconSize | undefined;
21
+ color?: IconColor | undefined;
22
+ className?: string | undefined;
23
+ title?: string | undefined;
24
+ decorative?: boolean | undefined;
25
+ testId?: string | undefined;
26
+ ref?: React.Ref<SVGSVGElement> | undefined;
27
+ }, "children">>;
28
+
29
+ export { ExternalLinkIcon };
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { IconSize, IconColor } from '../primitives/Icon/Icon.js';
3
+
4
+ /**
5
+ * Skip to first icon — vertical bar plus a leftward chevron.
6
+ *
7
+ * Used by Pagination's "first page" button and similar
8
+ * jump-to-start controls.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <IconButton aria-label="First page"><FirstIcon /></IconButton>
13
+ * ```
14
+ */
15
+ declare const FirstIcon: React.NamedExoticComponent<Omit<{
16
+ children: React.ReactNode;
17
+ size?: IconSize | undefined;
18
+ color?: IconColor | undefined;
19
+ className?: string | undefined;
20
+ title?: string | undefined;
21
+ decorative?: boolean | undefined;
22
+ testId?: string | undefined;
23
+ ref?: React.Ref<SVGSVGElement> | undefined;
24
+ }, "children">>;
25
+
26
+ export { FirstIcon };
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { IconSize, IconColor } from '../primitives/Icon/Icon.js';
3
+
4
+ /**
5
+ * Skip to last icon — rightward chevron plus a vertical bar.
6
+ *
7
+ * Used by Pagination's "last page" button and similar
8
+ * jump-to-end controls.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <IconButton aria-label="Last page"><LastIcon /></IconButton>
13
+ * ```
14
+ */
15
+ declare const LastIcon: React.NamedExoticComponent<Omit<{
16
+ children: React.ReactNode;
17
+ size?: IconSize | undefined;
18
+ color?: IconColor | undefined;
19
+ className?: string | undefined;
20
+ title?: string | undefined;
21
+ decorative?: boolean | undefined;
22
+ testId?: string | undefined;
23
+ ref?: React.Ref<SVGSVGElement> | undefined;
24
+ }, "children">>;
25
+
26
+ export { LastIcon };
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import { IconSize, IconColor } from '../primitives/Icon/Icon.js';
3
+
4
+ /**
5
+ * Unlink icon — a broken chain.
6
+ *
7
+ * Indicates that two values are decoupled (no longer linked). Pair with
8
+ * `LinkIcon` to render a toggle: link → unlink. Common in coordinate
9
+ * inputs, transform locks, color-channel groups.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <IconButton aria-label="Unlink axes">
14
+ * <UnlinkIcon />
15
+ * </IconButton>
16
+ * ```
17
+ */
18
+ declare const UnlinkIcon: React.NamedExoticComponent<Omit<{
19
+ children: React.ReactNode;
20
+ size?: IconSize | undefined;
21
+ color?: IconColor | undefined;
22
+ className?: string | undefined;
23
+ title?: string | undefined;
24
+ decorative?: boolean | undefined;
25
+ testId?: string | undefined;
26
+ ref?: React.Ref<SVGSVGElement> | undefined;
27
+ }, "children">>;
28
+
29
+ export { UnlinkIcon };