@invopop/popui 0.1.75 → 0.1.77

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.
@@ -34,6 +34,7 @@
34
34
  </script>
35
35
 
36
36
  <DrawerContext
37
+ autofocus
37
38
  {items}
38
39
  onclick={(e) => {
39
40
  if (e === 'hide') {
@@ -41,6 +41,7 @@
41
41
  widthClass = 'w-60',
42
42
  collapsibleGroups = true,
43
43
  flagPosition = 'after',
44
+ autofocus = false,
44
45
  onclick,
45
46
  onselect,
46
47
  onreorder,
@@ -89,6 +90,7 @@
89
90
  let groupDndItems = $state<Record<string, DndItem[]>>({})
90
91
  let ungroupedDndItems = $state<DndItem[]>([])
91
92
  let mounted = $state(false)
93
+ let commandRootEl = $state<HTMLElement | null>(null)
92
94
  let itemsCache = $state<DrawerOption[]>([])
93
95
  let isDragging = $state(false)
94
96
  let draggedItemId = $state<string | null>(null)
@@ -178,6 +180,12 @@
178
180
  buildListIn()
179
181
  mounted = true
180
182
 
183
+ if (autofocus) {
184
+ setTimeout(() => {
185
+ commandRootEl?.focus()
186
+ }, 10)
187
+ }
188
+
181
189
  const autoScrollCleanup = autoScrollForElements({
182
190
  element: document.documentElement
183
191
  })
@@ -452,6 +460,7 @@
452
460
  shouldFilter={false}
453
461
  loop
454
462
  class={containerClasses}
463
+ bind:ref={commandRootEl}
455
464
  {...rest}
456
465
  >
457
466
  {@render children?.()}
@@ -137,6 +137,16 @@
137
137
  </span>
138
138
  {/snippet}
139
139
 
140
+ {#snippet triggerIcon()}
141
+ {#if typeof selectedIcon === 'string'}
142
+ <img src={selectedIcon} alt="" class="size-4 flex-shrink-0 text-icon" />
143
+ {:else if selectedIcon}
144
+ <Icon src={selectedIcon} {iconTheme} class="{selectedIconColor} size-4 flex-shrink-0" />
145
+ {:else if resolvedIcon}
146
+ <Icon src={resolvedIcon} {iconTheme} class="text-icon size-4 flex-shrink-0" />
147
+ {/if}
148
+ {/snippet}
149
+
140
150
  <BaseDropdown
141
151
  data-dropdown-select
142
152
  bind:isOpen
@@ -149,8 +159,8 @@
149
159
  >
150
160
  {#snippet trigger()}
151
161
  <div data-dropdown-select-trigger class={styles}>
152
- {#if hasMultipleColors}
153
- <div class="flex items-center gap-1 flex-1 min-w-0">
162
+ <div class="flex items-center gap-1 flex-1 min-w-0 whitespace-nowrap">
163
+ {#if hasMultipleColors}
154
164
  <div class="flex items-center -space-x-0.5">
155
165
  {#each selectedColors.slice(0, 3) as color}
156
166
  <span class="border-l border-background rounded-xs flex first:border-l-0">
@@ -159,40 +169,28 @@
159
169
  {/each}
160
170
  </div>
161
171
  {@render label()}
162
- </div>
163
- {:else if selectedColor}
164
- <div class="flex items-center gap-1 flex-1 min-w-0">
172
+ {:else if selectedColor}
165
173
  <TagStatus dot status={selectedColor} />
166
174
  {@render label()}
167
- </div>
168
- {:else if !multiple && selectedItem?.country}
169
- <div class="flex items-center gap-1 flex-1 min-w-0">
175
+ {:else if !multiple && selectedItem?.country}
170
176
  <BaseFlag country={selectedItem.country} />
171
177
  {@render label()}
172
- </div>
173
- {:else if !multiple && selectedItem?.content}
174
- <div class="flex items-center gap-1 flex-1 min-w-0">
178
+ {:else if !multiple && selectedItem?.content}
179
+ {@render triggerIcon()}
175
180
  {@render selectedItem.content(selectedItem)}
176
- </div>
177
- {:else if selectedIcon || resolvedIcon}
178
- <div class="flex items-center gap-1 flex-1 min-w-0">
179
- {#if typeof selectedIcon === 'string'}
180
- <img src={selectedIcon} alt="" class="size-4 flex-shrink-0 text-icon" />
181
- {:else if selectedIcon}
182
- <Icon src={selectedIcon} {iconTheme} class="{selectedIconColor} size-4 flex-shrink-0" />
183
- {:else if resolvedIcon}
184
- <Icon src={resolvedIcon} {iconTheme} class="text-icon size-4 flex-shrink-0" />
185
- {/if}
181
+ {:else if selectedIcon || resolvedIcon}
182
+ {@render triggerIcon()}
183
+ {@render label()}
184
+ {:else}
186
185
  {@render label()}
187
- </div>
188
- {:else}
189
- {@render label()}
190
- {/if}
186
+ {/if}
187
+ </div>
191
188
  </div>
192
189
  {/snippet}
193
190
  <DrawerContext
194
191
  data-dropdown-select-content
195
192
  widthClass="min-w-[256px]"
193
+ autofocus
196
194
  {multiple}
197
195
  {items}
198
196
  {flagPosition}
@@ -99,8 +99,13 @@ export function handleScrollEvent(event, lastScrollLeft, columnDropdowns) {
99
99
  }
100
100
  // Keyboard navigation helpers
101
101
  export function shouldIgnoreKeyEvent(event) {
102
- const targetTag = event.target.tagName;
103
- return targetTag === 'INPUT' || targetTag === 'TEXTAREA';
102
+ const target = event.target;
103
+ const targetTag = target.tagName;
104
+ if (targetTag === 'INPUT' || targetTag === 'TEXTAREA')
105
+ return true;
106
+ if (target.closest('[data-command-root]'))
107
+ return true;
108
+ return false;
104
109
  }
105
110
  export function handleArrowDown(currentIndex, rows, shiftKey, enableSelection, onScroll) {
106
111
  if (currentIndex === -1 && rows.length > 0) {
@@ -2,7 +2,7 @@ import { Tooltip as TooltipPrimitive } from 'bits-ui';
2
2
  import Trigger from './tooltip-trigger.svelte';
3
3
  import Content from './tooltip-content.svelte';
4
4
  import AutoHide from './tooltip-auto-hide.svelte';
5
- declare const Root: import("svelte").Component<TooltipPrimitive.RootProps, {}, "open">;
6
- declare const Provider: import("svelte").Component<TooltipPrimitive.ProviderProps, {}, "">;
7
- declare const Portal: import("svelte").Component<TooltipPrimitive.PortalProps, {}, "">;
5
+ declare const Root: typeof TooltipPrimitive.Root;
6
+ declare const Provider: typeof TooltipPrimitive.Provider;
7
+ declare const Portal: typeof TooltipPrimitive.Portal;
8
8
  export { Root, Trigger, Content, Provider, Portal, AutoHide, Root as Tooltip, Content as TooltipContent, Trigger as TooltipTrigger, Provider as TooltipProvider, Portal as TooltipPortal, AutoHide as TooltipAutoHide };
package/dist/types.d.ts CHANGED
@@ -345,6 +345,7 @@ export interface DrawerContextProps {
345
345
  widthClass?: string;
346
346
  collapsibleGroups?: boolean;
347
347
  flagPosition?: 'before' | 'after';
348
+ autofocus?: boolean;
348
349
  onclick?: (value: AnyProp) => void;
349
350
  onselect?: (selected: DrawerOption[]) => void;
350
351
  onreorder?: (items: DrawerOption[]) => void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@invopop/popui",
3
3
  "license": "MIT",
4
- "version": "0.1.75",
4
+ "version": "0.1.77",
5
5
  "repository": {
6
6
  "url": "https://github.com/invopop/popui"
7
7
  },