@tangible/ui 0.0.2 → 0.0.4

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 (64) hide show
  1. package/README.md +21 -13
  2. package/components/Accordion/Accordion.d.ts +1 -1
  3. package/components/Accordion/Accordion.js +3 -3
  4. package/components/Accordion/types.d.ts +8 -1
  5. package/components/Avatar/Avatar.js +16 -7
  6. package/components/Avatar/AvatarGroup.js +7 -5
  7. package/components/Avatar/types.d.ts +11 -0
  8. package/components/Button/Button.js +10 -3
  9. package/components/Button/types.d.ts +9 -1
  10. package/components/Card/Card.js +26 -13
  11. package/components/Checkbox/Checkbox.d.ts +1 -1
  12. package/components/Chip/Chip.d.ts +37 -1
  13. package/components/Chip/Chip.js +10 -8
  14. package/components/ChipGroup/ChipGroup.js +5 -4
  15. package/components/ChipGroup/types.d.ts +3 -0
  16. package/components/Dropdown/Dropdown.d.ts +19 -1
  17. package/components/Dropdown/Dropdown.js +84 -28
  18. package/components/Dropdown/index.d.ts +2 -2
  19. package/components/Dropdown/index.js +1 -1
  20. package/components/Dropdown/types.d.ts +15 -0
  21. package/components/IconButton/IconButton.js +5 -4
  22. package/components/IconButton/index.d.ts +1 -1
  23. package/components/IconButton/types.d.ts +24 -4
  24. package/components/Modal/Modal.d.ts +16 -2
  25. package/components/Modal/Modal.js +45 -20
  26. package/components/MoveHandle/MoveHandle.d.ts +2 -0
  27. package/components/MoveHandle/MoveHandle.js +84 -0
  28. package/components/MoveHandle/index.d.ts +2 -0
  29. package/components/MoveHandle/index.js +1 -0
  30. package/components/MoveHandle/types.d.ts +53 -0
  31. package/components/MoveHandle/types.js +1 -0
  32. package/components/Notice/Notice.js +32 -19
  33. package/components/Select/Select.js +6 -2
  34. package/components/Sidebar/Sidebar.d.ts +6 -1
  35. package/components/Sidebar/Sidebar.js +65 -11
  36. package/components/Sidebar/index.d.ts +1 -1
  37. package/components/Sidebar/types.d.ts +39 -14
  38. package/components/Tabs/Tabs.d.ts +1 -1
  39. package/components/Tabs/Tabs.js +12 -3
  40. package/components/Tabs/types.d.ts +20 -5
  41. package/components/TextInput/TextInput.js +10 -2
  42. package/components/Tooltip/Tooltip.d.ts +2 -2
  43. package/components/Tooltip/Tooltip.js +61 -40
  44. package/components/Tooltip/index.d.ts +1 -1
  45. package/components/Tooltip/types.d.ts +28 -1
  46. package/components/index.d.ts +4 -2
  47. package/components/index.js +2 -1
  48. package/icons/icons.svg +1 -0
  49. package/icons/manifest.json +8 -0
  50. package/icons/registry.d.ts +2 -0
  51. package/icons/registry.js +1 -0
  52. package/icons/system/index.d.ts +2 -0
  53. package/icons/system/index.js +11 -0
  54. package/package.json +1 -1
  55. package/styles/all.css +1 -1
  56. package/styles/all.expanded.css +961 -97
  57. package/styles/all.expanded.unlayered.css +961 -97
  58. package/styles/all.unlayered.css +1 -1
  59. package/styles/components/_bundle.scss +2 -0
  60. package/styles/index.scss +5 -0
  61. package/styles/system/_control.scss +18 -3
  62. package/styles/system/_tokens.scss +119 -2
  63. package/tui-manifest.json +526 -88
  64. package/utils/focus-trap.js +8 -1
@@ -1,6 +1,6 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useCallback, useEffect, useId, useMemo, useRef, useState, cloneElement, isValidElement, } from 'react';
3
- import { useFloating, offset, flip, shift, autoUpdate, FloatingPortal, } from '@floating-ui/react';
3
+ import { useFloating, offset, flip, shift, arrow, autoUpdate, FloatingPortal, FloatingArrow, } from '@floating-ui/react';
4
4
  import { cx } from '../../utils/cx.js';
5
5
  import { getPortalRootFor } from '../../utils/portal.js';
6
6
  import { TooltipContext, TooltipProviderContext, useTooltipContext, useTooltipProviderContext, } from './TooltipContext.js';
@@ -8,7 +8,7 @@ import { toPlacement } from './types.js';
8
8
  // =============================================================================
9
9
  // TooltipProvider
10
10
  // =============================================================================
11
- function TooltipProviderComponent({ delayDuration = 400, closeDelayDuration = 0, children, }) {
11
+ function TooltipProviderComponent({ delayDuration = 400, closeDelayDuration = 150, children, }) {
12
12
  const value = useMemo(() => ({ delayDuration, closeDelayDuration }), [delayDuration, closeDelayDuration]);
13
13
  return (_jsx(TooltipProviderContext.Provider, { value: value, children: children }));
14
14
  }
@@ -28,46 +28,63 @@ function TooltipRoot({ open: controlledOpen, onOpenChange, defaultOpen = false,
28
28
  }, [isControlled, onOpenChange]);
29
29
  const triggerRef = useRef(null);
30
30
  const contentId = useId();
31
- const contextValue = useMemo(() => ({
32
- open,
33
- setOpen,
34
- triggerRef,
35
- contentId,
36
- delayDuration: localDelay ?? providerContext.delayDuration,
37
- closeDelayDuration: providerContext.closeDelayDuration,
38
- }), [open, setOpen, contentId, localDelay, providerContext]);
39
- return (_jsx(TooltipContext.Provider, { value: contextValue, children: children }));
40
- }
41
- // =============================================================================
42
- // TooltipTrigger
43
- // =============================================================================
44
- function TooltipTriggerComponent({ asChild = false, children }) {
45
- const { open, setOpen, triggerRef, contentId, delayDuration, closeDelayDuration } = useTooltipContext();
31
+ // Shared timer refs lifted here so both Trigger and Content can
32
+ // cancel/schedule close for WCAG 1.4.13 hover persistence.
46
33
  const openTimeoutRef = useRef(null);
47
34
  const closeTimeoutRef = useRef(null);
48
- const clearTimeouts = useCallback(() => {
49
- if (openTimeoutRef.current)
35
+ const resolvedDelay = localDelay ?? providerContext.delayDuration;
36
+ const resolvedCloseDelay = providerContext.closeDelayDuration;
37
+ const clearAllTimeouts = useCallback(() => {
38
+ if (openTimeoutRef.current) {
50
39
  clearTimeout(openTimeoutRef.current);
51
- if (closeTimeoutRef.current)
40
+ openTimeoutRef.current = null;
41
+ }
42
+ if (closeTimeoutRef.current) {
52
43
  clearTimeout(closeTimeoutRef.current);
44
+ closeTimeoutRef.current = null;
45
+ }
46
+ }, []);
47
+ const cancelClose = useCallback(() => {
48
+ if (closeTimeoutRef.current) {
49
+ clearTimeout(closeTimeoutRef.current);
50
+ closeTimeoutRef.current = null;
51
+ }
53
52
  }, []);
54
53
  const handleOpen = useCallback(() => {
55
- clearTimeouts();
56
- openTimeoutRef.current = setTimeout(() => setOpen(true), delayDuration);
57
- }, [clearTimeouts, delayDuration, setOpen]);
54
+ clearAllTimeouts();
55
+ openTimeoutRef.current = setTimeout(() => setOpen(true), resolvedDelay);
56
+ }, [clearAllTimeouts, resolvedDelay, setOpen]);
58
57
  const handleClose = useCallback(() => {
59
- clearTimeouts();
60
- if (closeDelayDuration > 0) {
61
- closeTimeoutRef.current = setTimeout(() => setOpen(false), closeDelayDuration);
58
+ clearAllTimeouts();
59
+ if (resolvedCloseDelay > 0) {
60
+ closeTimeoutRef.current = setTimeout(() => setOpen(false), resolvedCloseDelay);
62
61
  }
63
62
  else {
64
63
  setOpen(false);
65
64
  }
66
- }, [clearTimeouts, closeDelayDuration, setOpen]);
65
+ }, [clearAllTimeouts, resolvedCloseDelay, setOpen]);
67
66
  // Cleanup on unmount
68
67
  useEffect(() => {
69
- return () => clearTimeouts();
70
- }, [clearTimeouts]);
68
+ return () => clearAllTimeouts();
69
+ }, [clearAllTimeouts]);
70
+ const contextValue = useMemo(() => ({
71
+ open,
72
+ setOpen,
73
+ triggerRef,
74
+ contentId,
75
+ delayDuration: resolvedDelay,
76
+ closeDelayDuration: resolvedCloseDelay,
77
+ handleOpen,
78
+ handleClose,
79
+ cancelClose,
80
+ }), [open, setOpen, contentId, resolvedDelay, resolvedCloseDelay, handleOpen, handleClose, cancelClose]);
81
+ return (_jsx(TooltipContext.Provider, { value: contextValue, children: children }));
82
+ }
83
+ // =============================================================================
84
+ // TooltipTrigger
85
+ // =============================================================================
86
+ function TooltipTriggerComponent({ asChild = false, 'aria-label': ariaLabel, children, }) {
87
+ const { open, triggerRef, contentId, handleOpen, handleClose } = useTooltipContext();
71
88
  // Merge child ref with our triggerRef
72
89
  const setRefs = useCallback((node) => {
73
90
  triggerRef.current = node;
@@ -97,20 +114,22 @@ function TooltipTriggerComponent({ asChild = false, children }) {
97
114
  });
98
115
  }
99
116
  // Wrapper needs tabIndex to be keyboard-focusable for non-interactive children
100
- return (_jsx("span", { ref: setRefs, ...triggerProps, tabIndex: 0, style: { display: 'inline-flex' }, children: children }));
117
+ return (_jsx("span", { ref: setRefs, ...triggerProps, tabIndex: 0, "aria-label": ariaLabel, style: { display: 'inline-flex' }, children: children }));
101
118
  }
102
119
  // =============================================================================
103
120
  // TooltipContent
104
121
  // =============================================================================
105
- function TooltipContentComponent({ side = 'top', align = 'center', sideOffset = 8, className, children, }) {
106
- const { open, setOpen, triggerRef, contentId } = useTooltipContext();
107
- const { refs, floatingStyles } = useFloating({
122
+ function TooltipContentComponent({ side = 'top', align = 'center', sideOffset = 8, theme = 'dark', className, children, }) {
123
+ const { open, setOpen, triggerRef, contentId, cancelClose, handleClose } = useTooltipContext();
124
+ const arrowRef = useRef(null);
125
+ const { refs, floatingStyles, context } = useFloating({
108
126
  placement: toPlacement(side, align),
109
127
  open,
110
128
  middleware: [
111
129
  offset(sideOffset),
112
130
  flip(),
113
131
  shift({ padding: 8 }),
132
+ arrow({ element: arrowRef }),
114
133
  ],
115
134
  whileElementsMounted: autoUpdate,
116
135
  });
@@ -121,17 +140,19 @@ function TooltipContentComponent({ side = 'top', align = 'center', sideOffset =
121
140
  refs.setReference(triggerRef.current);
122
141
  }
123
142
  }, [triggerRef, refs]);
124
- // Close on Escape — scoped to trigger focus to avoid closing modal + tooltip together
143
+ // Close on Escape
144
+ // - Focus on trigger: close + stopPropagation (avoid closing parent modal)
145
+ // - Hover-only (focus elsewhere): close without stopPropagation
125
146
  useEffect(() => {
126
147
  if (!open)
127
148
  return;
128
149
  const handleKeyDown = (e) => {
129
150
  if (e.key === 'Escape') {
130
- // Only close if focus is on or within the trigger element
131
151
  const activeEl = document.activeElement;
132
152
  const trigger = triggerRef.current;
133
- if (trigger && (trigger === activeEl || trigger.contains(activeEl))) {
134
- setOpen(false);
153
+ const focusIsOnTrigger = trigger && (trigger === activeEl || trigger.contains(activeEl));
154
+ setOpen(false);
155
+ if (focusIsOnTrigger) {
135
156
  e.stopPropagation(); // Prevent bubbling to modal's Escape handler
136
157
  }
137
158
  }
@@ -151,10 +172,10 @@ function TooltipContentComponent({ side = 'top', align = 'center', sideOffset =
151
172
  'Tooltips should only contain plain text. Use Popover for interactive content.');
152
173
  }
153
174
  }
154
- }, [open, refs.floating, children]);
175
+ }, [open, refs.floating]);
155
176
  if (!open)
156
177
  return null;
157
- return (_jsx(FloatingPortal, { root: portalRoot, children: _jsx("div", { ref: refs.setFloating, id: contentId, role: "tooltip", className: cx('tui-tooltip', className), style: floatingStyles, children: children }) }));
178
+ return (_jsx(FloatingPortal, { root: portalRoot, children: _jsxs("div", { ref: refs.setFloating, id: contentId, role: "tooltip", className: cx('tui-tooltip', theme === 'light' && 'is-theme-light', className), style: floatingStyles, onMouseEnter: cancelClose, onMouseLeave: handleClose, children: [children, _jsx(FloatingArrow, { ref: arrowRef, context: context, className: "tui-tooltip__arrow" })] }) }));
158
179
  }
159
180
  export const Tooltip = TooltipRoot;
160
181
  Tooltip.Provider = TooltipProviderComponent;
@@ -1,2 +1,2 @@
1
1
  export { Tooltip, TooltipProvider, TooltipTrigger, TooltipContent } from './Tooltip';
2
- export type { TooltipProviderProps, TooltipProps, TooltipTriggerProps, TooltipContentProps, Side, Align, } from './types';
2
+ export type { TooltipProviderProps, TooltipProps, TooltipTriggerProps, TooltipContentProps, TooltipTheme, Side, Align, } from './types';
@@ -15,7 +15,9 @@ export type TooltipProviderProps = {
15
15
  delayDuration?: number;
16
16
  /**
17
17
  * Delay in ms before tooltip closes after pointer leaves.
18
- * @default 0
18
+ * Provides a brief window for users to move their pointer to the tooltip
19
+ * content (partial WCAG 1.4.13 compliance).
20
+ * @default 150
19
21
  */
20
22
  closeDelayDuration?: number;
21
23
  children: React.ReactNode;
@@ -47,8 +49,22 @@ export type TooltipTriggerProps = {
47
49
  * @default false
48
50
  */
49
51
  asChild?: boolean;
52
+ /**
53
+ * Accessible label for the non-asChild wrapper span. When `asChild` is false,
54
+ * the trigger renders as a `<span>` with no semantic role — this label gives
55
+ * assistive technology a name for the focusable element. Omitting this when
56
+ * the span wraps non-descriptive content (e.g. an icon) means screen readers
57
+ * will announce the element with no accessible name.
58
+ */
59
+ 'aria-label'?: string;
50
60
  children: React.ReactNode;
51
61
  };
62
+ /**
63
+ * Visual theme for the tooltip.
64
+ * - `'dark'` (default): inverted background, high contrast against page content.
65
+ * - `'light'`: surface background with border, blends with surrounding UI.
66
+ */
67
+ export type TooltipTheme = 'dark' | 'light';
52
68
  export type TooltipContentProps = {
53
69
  /**
54
70
  * Preferred side of the trigger to place the tooltip.
@@ -65,6 +81,11 @@ export type TooltipContentProps = {
65
81
  * @default 8
66
82
  */
67
83
  sideOffset?: number;
84
+ /**
85
+ * Visual theme variant.
86
+ * @default 'dark'
87
+ */
88
+ theme?: TooltipTheme;
68
89
  /**
69
90
  * Additional CSS class names.
70
91
  */
@@ -78,6 +99,12 @@ export type TooltipContextValue = {
78
99
  contentId: string;
79
100
  delayDuration: number;
80
101
  closeDelayDuration: number;
102
+ /** Open tooltip after delayDuration. Cancels any pending close. */
103
+ handleOpen: () => void;
104
+ /** Close tooltip after closeDelayDuration. Cancels any pending open. */
105
+ handleClose: () => void;
106
+ /** Cancel any pending close timeout (for WCAG 1.4.13 hover persistence). */
107
+ cancelClose: () => void;
81
108
  };
82
109
  /**
83
110
  * Convert side + align to Floating UI placement.
@@ -11,13 +11,14 @@ export { ChipGroup } from './ChipGroup';
11
11
  export { Chips } from './Chips';
12
12
  export { ContentIndicator } from './ContentIndicator';
13
13
  export { Combobox, ComboboxContent, ComboboxOption, ComboboxGroup, ComboboxLabel, useCombobox } from './Combobox';
14
- export { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, useDropdown } from './Dropdown';
14
+ export { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownSeparator, DropdownHeader, useDropdown } from './Dropdown';
15
15
  export { Field } from './Field';
16
16
  export { MultiSelect, MultiSelectTrigger, MultiSelectContent, MultiSelectOption, MultiSelectGroup, MultiSelectLabel, useMultiSelect } from './MultiSelect';
17
17
  export { Select, SelectTrigger, SelectContent, SelectOption, SelectGroup, SelectLabel, useSelect } from './Select';
18
18
  export { Icon } from './Icon';
19
19
  export { IconButton } from './IconButton';
20
20
  export { Modal } from './Modal';
21
+ export { MoveHandle } from './MoveHandle';
21
22
  export { Notice } from './Notice';
22
23
  export { OverlapStack } from './OverlapStack';
23
24
  export { Pager } from './Pager';
@@ -45,7 +46,7 @@ export type { ChipProps } from './Chip';
45
46
  export type { ChipGroupProps, ChipGroupSingleProps, ChipGroupMultipleProps } from './ChipGroup';
46
47
  export type { ChipsProps, ChipOption } from './Chips';
47
48
  export type { ContentIndicatorProps } from './ContentIndicator';
48
- export type { DropdownProps, DropdownTriggerProps, DropdownContentProps, DropdownItemProps, } from './Dropdown';
49
+ export type { DropdownProps, DropdownTriggerProps, DropdownContentProps, DropdownItemProps, DropdownSeparatorProps, DropdownHeaderProps, } from './Dropdown';
49
50
  export type { ComboboxProps, ComboboxContentProps, ComboboxOptionProps, ComboboxGroupProps, ComboboxLabelProps, ComboboxRegisteredOption, } from './Combobox';
50
51
  export type { FieldProps } from './Field';
51
52
  export type { MultiSelectProps, MultiSelectTriggerProps, MultiSelectContentProps, MultiSelectOptionProps, MultiSelectGroupProps, MultiSelectLabelProps, MultiSelectValue, OptionValue as MultiSelectOptionValue, DisplayMode as MultiSelectDisplayMode, MultiSelectRegisteredOption, } from './MultiSelect';
@@ -53,6 +54,7 @@ export type { SelectProps, SelectTriggerProps, SelectContentProps, SelectOptionP
53
54
  export type { IconProps } from './Icon';
54
55
  export type { IconButtonProps } from './IconButton';
55
56
  export type { ModalProps } from './Modal';
57
+ export type { MoveHandleLabels, MoveHandleMode, MoveHandleProps, MoveHandleSize } from './MoveHandle';
56
58
  export type { NoticeProps } from './Notice';
57
59
  export type { OverlapStackProps, OverlapStackOverflowProps } from './OverlapStack';
58
60
  export type { PagerProps, PagerMode } from './Pager';
@@ -9,13 +9,14 @@ export { ChipGroup } from './ChipGroup/index.js';
9
9
  export { Chips } from './Chips/index.js';
10
10
  export { ContentIndicator } from './ContentIndicator/index.js';
11
11
  export { Combobox, ComboboxContent, ComboboxOption, ComboboxGroup, ComboboxLabel, useCombobox } from './Combobox/index.js';
12
- export { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, useDropdown } from './Dropdown/index.js';
12
+ export { Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownSeparator, DropdownHeader, useDropdown } from './Dropdown/index.js';
13
13
  export { Field } from './Field/index.js';
14
14
  export { MultiSelect, MultiSelectTrigger, MultiSelectContent, MultiSelectOption, MultiSelectGroup, MultiSelectLabel, useMultiSelect } from './MultiSelect/index.js';
15
15
  export { Select, SelectTrigger, SelectContent, SelectOption, SelectGroup, SelectLabel, useSelect } from './Select/index.js';
16
16
  export { Icon } from './Icon/index.js';
17
17
  export { IconButton } from './IconButton/index.js';
18
18
  export { Modal } from './Modal/index.js';
19
+ export { MoveHandle } from './MoveHandle/index.js';
19
20
  export { Notice } from './Notice/index.js';
20
21
  export { OverlapStack } from './OverlapStack/index.js';
21
22
  export { Pager } from './Pager/index.js';
package/icons/icons.svg CHANGED
@@ -109,6 +109,7 @@
109
109
  <symbol id="tui-system-cog" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M10.29 4.836A1 1 0 0 1 11.275 4h1.306a1 1 0 0 1 .986.836l.244 1.466c.788.26 1.503.679 2.108 1.218l1.393-.522a1 1 0 0 1 1.217.437l.653 1.13a1 1 0 0 1-.23 1.273l-1.148.944a6 6 0 0 1 0 2.435l1.148.946a1 1 0 0 1 .23 1.272l-.652 1.13a1 1 0 0 1-1.217.437l-1.394-.522c-.605.54-1.32.958-2.108 1.218l-.244 1.466a1 1 0 0 1-.986.836h-1.306a1 1 0 0 1-.987-.836l-.244-1.466a6 6 0 0 1-2.108-1.218l-1.394.522a1 1 0 0 1-1.217-.436l-.652-1.131a1 1 0 0 1 .23-1.272l1.148-.946a6 6 0 0 1 0-2.435l-1.147-.944a1 1 0 0 1-.23-1.272l.652-1.131a1 1 0 0 1 1.217-.437l1.393.522a6 6 0 0 1 2.108-1.218zM14.928 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0" clip-rule="evenodd"/></symbol>
110
110
  <symbol id="tui-system-copy" viewBox="0 0 24 24"><path d="M17 10.25h-7v1.5h7zm-7 2.5h7v1.5h-7zm7 2.5h-7v1.5h7z"/><path fill-rule="evenodd" d="M17 6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h1v1a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-1zm1 2.5a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5H9a.5.5 0 0 1-.5-.5V9a.5.5 0 0 1 .5-.5zm-12 7a.5.5 0 0 1-.5-.5V6a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 .5.5v1H9a2 2 0 0 0-2 2v6.5z" clip-rule="evenodd"/></symbol>
111
111
  <symbol id="tui-system-download" viewBox="0 0 24 24"><path d="M5.5 9a.5.5 0 0 1 .5-.5h3V7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8.75A1.75 1.75 0 0 0 18.25 7H15v1.5h3.25a.25.25 0 0 1 .25.25V18a.5.5 0 0 1-.5.5H6a.5.5 0 0 1-.5-.5z"/><path d="M12 17.004 7.002 12.56l.996-1.122 3.252 2.89V4h1.5v10.33l3.252-2.89.996 1.12z"/></symbol>
112
+ <symbol id="tui-system-drag" viewBox="0 0 24 24"><path d="M10 4.99976H8V6.99976H10V4.99976Z"/><path d="M10 10.9998H8V12.9998H10V10.9998Z"/><path d="M8 16.9998H10V18.9998H8V16.9998Z"/><path d="M16 4.99976H14V6.99976H16V4.99976Z"/><path d="M14 10.9998H16V12.9998H14V10.9998Z"/><path d="M16 16.9998H14V18.9998H16V16.9998Z"/></symbol>
112
113
  <symbol id="tui-system-duplicate" viewBox="0 0 24 24"><path d="M14.25 12.75H17v1.5h-2.75V17h-1.5v-2.75H10v-1.5h2.75V10h1.5z"/><path fill-rule="evenodd" d="M17 7h1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2v-1H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2zm-2-1.5H6a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h1V9a2 2 0 0 1 2-2h6.5V6a.5.5 0 0 0-.5-.5m-6 3h9a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5H9a.5.5 0 0 1-.5-.5V9a.5.5 0 0 1 .5-.5" clip-rule="evenodd"/></symbol>
113
114
  <symbol id="tui-system-edit" viewBox="0 0 24 24"><path d="M19.864 4.304a2 2 0 0 0-2.733.732l-.635 1.1 3.464 2 .636-1.1a2 2 0 0 0-.732-2.732m-.746 5.292-3.464-2-4.903 8.49.062 3.893 3.402-1.892zM4 5.25h9v1.5H4zm7 4H4v1.5h7zm-7 4h5v1.5H4zm5 4H4v1.5h5z"/></symbol>
114
115
  <symbol id="tui-system-ellipsis-h" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M5 11h2v2H5zm6 0h2v2h-2zm6 0h2v2h-2z" clip-rule="evenodd"/></symbol>
@@ -879,6 +879,14 @@
879
879
  "viewBox": "0 0 24 24",
880
880
  "sprite": true
881
881
  },
882
+ "system/drag": {
883
+ "id": "tui-system-drag",
884
+ "set": "system",
885
+ "name": "drag",
886
+ "file": "system/drag.svg",
887
+ "viewBox": "0 0 24 24",
888
+ "sprite": true
889
+ },
882
890
  "system/duplicate": {
883
891
  "id": "tui-system-duplicate",
884
892
  "set": "system",
@@ -113,6 +113,7 @@ export type IconName =
113
113
  | 'system/cog'
114
114
  | 'system/copy'
115
115
  | 'system/download'
116
+ | 'system/drag'
116
117
  | 'system/duplicate'
117
118
  | 'system/edit'
118
119
  | 'system/ellipsis-h'
@@ -269,6 +270,7 @@ export declare const iconRegistry: {
269
270
  'system/cog': IconComponent;
270
271
  'system/copy': IconComponent;
271
272
  'system/download': IconComponent;
273
+ 'system/drag': IconComponent;
272
274
  'system/duplicate': IconComponent;
273
275
  'system/edit': IconComponent;
274
276
  'system/ellipsis-h': IconComponent;
package/icons/registry.js CHANGED
@@ -115,6 +115,7 @@ export const iconRegistry = {
115
115
  'system/cog': systemIcons['cog'],
116
116
  'system/copy': systemIcons['copy'],
117
117
  'system/download': systemIcons['download'],
118
+ 'system/drag': systemIcons['drag'],
118
119
  'system/duplicate': systemIcons['duplicate'],
119
120
  'system/edit': systemIcons['edit'],
120
121
  'system/ellipsis-h': systemIcons['ellipsis-h'],
@@ -33,6 +33,7 @@ export declare const Close: IconComponent;
33
33
  export declare const Cog: IconComponent;
34
34
  export declare const Copy: IconComponent;
35
35
  export declare const Download: IconComponent;
36
+ export declare const Drag: IconComponent;
36
37
  export declare const Duplicate: IconComponent;
37
38
  export declare const Edit: IconComponent;
38
39
  export declare const EllipsisH: IconComponent;
@@ -110,6 +111,7 @@ export declare const systemIcons: {
110
111
  'cog': IconComponent;
111
112
  'copy': IconComponent;
112
113
  'download': IconComponent;
114
+ 'drag': IconComponent;
113
115
  'duplicate': IconComponent;
114
116
  'edit': IconComponent;
115
117
  'ellipsis-h': IconComponent;
@@ -310,6 +310,16 @@ export function Download(props) {
310
310
  }, props), [_c("path", {d:"M5.5 9a.5.5 0 0 1 .5-.5h3V7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8.75A1.75 1.75 0 0 0 18.25 7H15v1.5h3.25a.25.25 0 0 1 .25.25V18a.5.5 0 0 1-.5.5H6a.5.5 0 0 1-.5-.5z"}), _c("path", {d:"M12 17.004 7.002 12.56l.996-1.122 3.252 2.89V4h1.5v10.33l3.252-2.89.996 1.12z"})]);
311
311
  }
312
312
 
313
+ export function Drag(props) {
314
+ return _c("svg", Object.assign({
315
+ xmlns: "http://www.w3.org/2000/svg",
316
+ viewBox: "0 0 24 24",
317
+ width: "1em",
318
+ height: "1em",
319
+ fill: "currentColor"
320
+ }, props), [_c("path", {d:"M10 4.99976H8V6.99976H10V4.99976Z"}), _c("path", {d:"M10 10.9998H8V12.9998H10V10.9998Z"}), _c("path", {d:"M8 16.9998H10V18.9998H8V16.9998Z"}), _c("path", {d:"M16 4.99976H14V6.99976H16V4.99976Z"}), _c("path", {d:"M14 10.9998H16V12.9998H14V10.9998Z"}), _c("path", {d:"M16 16.9998H14V18.9998H16V16.9998Z"})]);
321
+ }
322
+
313
323
  export function Duplicate(props) {
314
324
  return _c("svg", Object.assign({
315
325
  xmlns: "http://www.w3.org/2000/svg",
@@ -782,6 +792,7 @@ export const systemIcons = {
782
792
  'cog': Cog,
783
793
  'copy': Copy,
784
794
  'download': Download,
795
+ 'drag': Drag,
785
796
  'duplicate': Duplicate,
786
797
  'edit': Edit,
787
798
  'ellipsis-h': EllipsisH,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangible/ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Tangible Design System",
5
5
  "type": "module",
6
6
  "main": "./components/index.js",