even-toolkit 1.4.2 → 1.5.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 (70) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +5 -3
  3. package/dist/glasses/action-bar.d.ts +3 -3
  4. package/dist/glasses/action-bar.js +7 -7
  5. package/dist/glasses/action-bar.js.map +1 -1
  6. package/dist/glasses/action-map.js +3 -3
  7. package/dist/glasses/action-map.js.map +1 -1
  8. package/dist/glasses/gestures.d.ts +4 -0
  9. package/dist/glasses/gestures.d.ts.map +1 -1
  10. package/dist/glasses/gestures.js +44 -0
  11. package/dist/glasses/gestures.js.map +1 -1
  12. package/dist/glasses/glass-chat-display.d.ts +43 -0
  13. package/dist/glasses/glass-chat-display.d.ts.map +1 -0
  14. package/dist/glasses/glass-chat-display.js +102 -0
  15. package/dist/glasses/glass-chat-display.js.map +1 -0
  16. package/dist/glasses/glass-format.d.ts +50 -0
  17. package/dist/glasses/glass-format.d.ts.map +1 -0
  18. package/dist/glasses/glass-format.js +65 -0
  19. package/dist/glasses/glass-format.js.map +1 -0
  20. package/dist/glasses/index.d.ts +2 -0
  21. package/dist/glasses/index.d.ts.map +1 -1
  22. package/dist/glasses/index.js +2 -0
  23. package/dist/glasses/index.js.map +1 -1
  24. package/dist/glasses/useGlasses.js +1 -1
  25. package/dist/glasses/useGlasses.js.map +1 -1
  26. package/dist/stt/providers/deepgram.d.ts +1 -0
  27. package/dist/stt/providers/deepgram.d.ts.map +1 -1
  28. package/dist/stt/providers/deepgram.js +25 -8
  29. package/dist/stt/providers/deepgram.js.map +1 -1
  30. package/dist/web/components/dialog.d.ts.map +1 -1
  31. package/dist/web/components/dialog.js +16 -1
  32. package/dist/web/components/dialog.js.map +1 -1
  33. package/dist/web/components/drawer-shell.d.ts.map +1 -1
  34. package/dist/web/components/drawer-shell.js +11 -1
  35. package/dist/web/components/drawer-shell.js.map +1 -1
  36. package/dist/web/components/list-item.d.ts +1 -1
  37. package/dist/web/components/list-item.d.ts.map +1 -1
  38. package/dist/web/components/list-item.js +20 -5
  39. package/dist/web/components/list-item.js.map +1 -1
  40. package/dist/web/components/multi-select.d.ts +22 -0
  41. package/dist/web/components/multi-select.d.ts.map +1 -0
  42. package/dist/web/components/multi-select.js +52 -0
  43. package/dist/web/components/multi-select.js.map +1 -0
  44. package/dist/web/components/select.d.ts +13 -3
  45. package/dist/web/components/select.d.ts.map +1 -1
  46. package/dist/web/components/select.js +36 -3
  47. package/dist/web/components/select.js.map +1 -1
  48. package/dist/web/icons/svg-icons.js +1 -1
  49. package/dist/web/icons/svg-icons.js.map +1 -1
  50. package/dist/web/index.d.ts +2 -0
  51. package/dist/web/index.d.ts.map +1 -1
  52. package/dist/web/index.js +1 -0
  53. package/dist/web/index.js.map +1 -1
  54. package/glasses/action-bar.ts +7 -7
  55. package/glasses/action-map.ts +3 -3
  56. package/glasses/gestures.ts +50 -0
  57. package/glasses/glass-chat-display.ts +152 -0
  58. package/glasses/glass-format.ts +75 -0
  59. package/glasses/index.ts +2 -0
  60. package/glasses/useGlasses.ts +1 -1
  61. package/package.json +10 -1
  62. package/stt/providers/deepgram.ts +23 -7
  63. package/web/components/dialog.tsx +20 -1
  64. package/web/components/drawer-shell.tsx +11 -5
  65. package/web/components/list-item.tsx +25 -10
  66. package/web/components/multi-select.tsx +118 -0
  67. package/web/components/select.tsx +90 -20
  68. package/web/icons/svg-icons.tsx +1 -2
  69. package/web/index.ts +3 -0
  70. package/web/theme/utilities.css +11 -0
@@ -1,4 +1,4 @@
1
- import * as React from 'react';
1
+ import { useState, useRef, useEffect, useCallback } from 'react';
2
2
  import { cn } from '../utils/cn';
3
3
 
4
4
  interface SelectOption {
@@ -6,30 +6,100 @@ interface SelectOption {
6
6
  label: string;
7
7
  }
8
8
 
9
- interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'onChange'> {
9
+ interface SelectProps {
10
+ value?: string;
10
11
  options: SelectOption[];
11
12
  onValueChange?: (value: string) => void;
13
+ placeholder?: string;
14
+ className?: string;
15
+ disabled?: boolean;
16
+ dropdownPosition?: 'top' | 'bottom';
12
17
  }
13
18
 
14
- const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
15
- ({ className, options, onValueChange, ...props }, ref) => (
16
- <select
17
- ref={ref}
18
- className={cn(
19
- 'h-9 w-full bg-input-bg text-text rounded-[6px] pl-4 pr-10 text-[17px] tracking-[-0.17px] outline-none transition-colors cursor-pointer',
20
- className,
19
+ /**
20
+ * Custom dropdown no native <select>. Fully styled, no browser arrow issues.
21
+ */
22
+ function Select({ value, options, onValueChange, placeholder, className, disabled, dropdownPosition = 'bottom' }: SelectProps) {
23
+ const [open, setOpen] = useState(false);
24
+ const ref = useRef<HTMLDivElement>(null);
25
+
26
+ const selected = options.find((o) => o.value === value);
27
+ const label = selected?.label ?? placeholder ?? 'Select...';
28
+
29
+ useEffect(() => {
30
+ if (!open) return;
31
+ const handler = (e: MouseEvent) => {
32
+ if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);
33
+ };
34
+ document.addEventListener('mousedown', handler);
35
+ return () => document.removeEventListener('mousedown', handler);
36
+ }, [open]);
37
+
38
+ useEffect(() => {
39
+ if (!open) return;
40
+ const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };
41
+ document.addEventListener('keydown', handler);
42
+ return () => document.removeEventListener('keydown', handler);
43
+ }, [open]);
44
+
45
+ const handleSelect = useCallback((v: string) => {
46
+ onValueChange?.(v);
47
+ setOpen(false);
48
+ }, [onValueChange]);
49
+
50
+ return (
51
+ <div ref={ref} className={cn('relative', className)} style={{ minWidth: 0 }}>
52
+ <button
53
+ type="button"
54
+ disabled={disabled}
55
+ onClick={() => !disabled && setOpen(!open)}
56
+ className={cn(
57
+ 'h-9 w-full bg-input-bg text-text rounded-[6px] pl-3 pr-8 text-[13px] tracking-[-0.13px] text-left cursor-pointer border-none flex items-center',
58
+ 'transition-colors hover:bg-surface-light',
59
+ disabled && 'opacity-50 cursor-default',
60
+ )}
61
+ >
62
+ <span className="truncate flex-1">{label}</span>
63
+ <svg
64
+ className="absolute right-3 top-1/2 text-text-dim shrink-0"
65
+ width="10"
66
+ height="10"
67
+ viewBox="0 0 10 10"
68
+ fill="none"
69
+ style={{ transform: open ? 'translateY(-50%) rotate(180deg)' : 'translateY(-50%)', transition: 'transform 150ms ease' }}
70
+ >
71
+ <path d="M2.5 3.75L5 6.25L7.5 3.75" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
72
+ </svg>
73
+ </button>
74
+
75
+ {open && (
76
+ <div
77
+ className={cn(
78
+ 'absolute z-50 left-0 right-0 bg-surface rounded-[6px] border border-border overflow-hidden',
79
+ dropdownPosition === 'top' ? 'bottom-full mb-1' : 'top-full mt-1',
80
+ )}
81
+ style={{ maxHeight: 200, overflowY: 'auto', boxShadow: '0 4px 12px rgba(0,0,0,0.1)' }}
82
+ >
83
+ {options.map((o) => (
84
+ <button
85
+ key={o.value}
86
+ type="button"
87
+ className={cn(
88
+ 'w-full text-left px-3 py-2 text-[13px] tracking-[-0.13px] cursor-pointer border-none transition-colors font-normal',
89
+ o.value === value
90
+ ? 'bg-accent text-text-highlight'
91
+ : 'bg-transparent text-text hover:bg-surface-light',
92
+ )}
93
+ onClick={() => handleSelect(o.value)}
94
+ >
95
+ {o.label}
96
+ </button>
97
+ ))}
98
+ </div>
21
99
  )}
22
- onChange={(e) => onValueChange?.(e.target.value)}
23
- {...props}
24
- >
25
- {options.map((o) => (
26
- <option key={o.value} value={o.value}>
27
- {o.label}
28
- </option>
29
- ))}
30
- </select>
31
- ),
32
- );
100
+ </div>
101
+ );
102
+ }
33
103
 
34
104
  Select.displayName = 'Select';
35
105
 
@@ -486,7 +486,7 @@ export const IcFeatMessage: SvgIcon = (props) => (
486
486
  export const IcFeatNavigate: SvgIcon = (props) => (
487
487
  <svg viewBox="0 0 32 32" fill="none" {...props}>
488
488
  <g clipPath="url(#clip0_10001_76324)">
489
- <path d="M6 30H4V12H6V30ZM22 20H20V18H22V20ZM24 18H22V16H24V18ZM26 16H24V14H26V16ZM28 14H26V12H28V14ZM26 12H6V10H26V12ZM30 12H28V10H30V12ZM28 10H26V8H28V10ZM26 8H24V6H26V8ZM24 6H22V4H24V6ZM22 2V4H20V2H22Z" fill="#232323"/>
489
+ <path d="M6 30H4V12H6V30ZM22 20H20V18H22V20ZM24 18H22V16H24V18ZM26 16H24V14H26V16ZM28 14H26V12H28V14ZM26 12H6V10H26V12ZM30 12H28V10H30V12ZM28 10H26V8H28V10ZM26 8H24V6H26V8ZM24 6H22V4H24V6ZM22 2V4H20V2H22Z" fill="currentColor"/>
490
490
  </g>
491
491
  <defs>
492
492
  <clipPath id="clip0_10001_76324">
@@ -2163,4 +2163,3 @@ export const IcShare = IcEditShare;
2163
2163
  export const IcCopy = IcEditCopy;
2164
2164
  export const IcCheck = IcStatusCheckmark;
2165
2165
  export const IcMore = IcStatusMore;
2166
-
package/web/index.ts CHANGED
@@ -40,6 +40,9 @@ export type { PillProps } from './components/pill';
40
40
  export { Toggle } from './components/toggle';
41
41
  export type { ToggleProps } from './components/toggle';
42
42
 
43
+ export { MultiSelect } from './components/multi-select';
44
+ export type { MultiSelectProps, MultiSelectOption } from './components/multi-select';
45
+
43
46
  export { SegmentedControl } from './components/segmented-control';
44
47
  export type { SegmentedControlProps, SegmentedControlOption } from './components/segmented-control';
45
48
 
@@ -23,6 +23,17 @@
23
23
  transition: stroke-dashoffset 0.5s ease;
24
24
  }
25
25
 
26
+ /* Force hide native select arrow on all browsers */
27
+ select {
28
+ -webkit-appearance: none !important;
29
+ -moz-appearance: none !important;
30
+ appearance: none !important;
31
+ background-image: none !important;
32
+ }
33
+ select::-ms-expand {
34
+ display: none;
35
+ }
36
+
26
37
  /* Bottom sheet slide-up animation */
27
38
  @keyframes slideUp {
28
39
  from { transform: translateY(100%); }