@edo-w/flatline-solid 0.2.0 → 0.2.1

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.
package/README.md ADDED
@@ -0,0 +1,16 @@
1
+ ```
2
+ ===================================================================
3
+ = == ======== == ======== == ========
4
+ = ======== ======== ======== ======== ======== ======== ====
5
+ = ======== ======== ======== ======== ======== ======== ====
6
+ = ======== ======== ======== ======== ======== ======== ====
7
+ = ==== ======== ==== ======== ==== ========
8
+ = ======== ======== ======== ======== ======== ======== ====
9
+ = ======== ======== ======== ======== ======== ======== ====
10
+ = ======== ======== ======== ======== ======== ======== ====
11
+ = ======== == ======== == ======== == ====
12
+ ===================================================================
13
+ ```
14
+
15
+ # flatline
16
+ flatline is UI library for solid JS applications
@@ -3,6 +3,7 @@
3
3
  --fl-button-inner-gap: var(--fl-size-2);
4
4
  --fl-button-pad-x: var(--fl-size-2);
5
5
  --fl-button-pad-y: var(--fl-size-1-5);
6
+ --fl-button-active-translate-y: 1px;
6
7
  --fl-button-bg-color: var(--fl-color-gray-100);
7
8
  --fl-button-bg-hover-color: color-mix(in oklab, var(--fl-button-bg-color), black 5%);
8
9
  --fl-button-bg-active-color: color-mix(in oklab, var(--fl-button-bg-color), white 10%);
@@ -56,7 +57,7 @@
56
57
  /* active state */
57
58
  .fl-button:active:not(:disabled) {
58
59
  background: var(--fl-button-bg-active-color);
59
- transform: translateY(1px);
60
+ transform: translateY(var(--fl-button-active-translate-y));
60
61
  }
61
62
 
62
63
  /* disabled state */
@@ -22,6 +22,7 @@
22
22
  margin-inline: calc(var(--fl-size-2) * -1);
23
23
 
24
24
  /* background */
25
+ border: 0;
25
26
  border-top: var(--fl-border-size, 1px) solid var(--fl-border-color);
26
27
  }
27
28
 
@@ -12,7 +12,20 @@ export function ComboboxInput(props) {
12
12
  if (!(event.currentTarget instanceof HTMLInputElement)) {
13
13
  return;
14
14
  }
15
- context.setInputValue(event.currentTarget.value);
15
+ const input = event.currentTarget;
16
+ const nextValue = input.value;
17
+ const selectionStart = input.selectionStart;
18
+ const selectionEnd = input.selectionEnd;
19
+ context.setInputValue(nextValue);
20
+ queueMicrotask(() => {
21
+ if (document.activeElement !== input) {
22
+ return;
23
+ }
24
+ if (input.value !== nextValue || selectionStart === null || selectionEnd === null) {
25
+ return;
26
+ }
27
+ input.setSelectionRange(selectionStart, selectionEnd);
28
+ });
16
29
  };
17
30
  const handleFocus = (event) => {
18
31
  callEventHandler(local.onFocus, event);
@@ -31,6 +44,10 @@ export function ComboboxInput(props) {
31
44
  context.highlightNext();
32
45
  return;
33
46
  }
47
+ if (context.visibleItems().length === 0) {
48
+ context.openAllOptions('first');
49
+ return;
50
+ }
34
51
  context.openPopup('preserve');
35
52
  return;
36
53
  }
@@ -40,19 +57,13 @@ export function ComboboxInput(props) {
40
57
  context.highlightPrevious();
41
58
  return;
42
59
  }
60
+ if (context.visibleItems().length === 0) {
61
+ context.openAllOptions('last');
62
+ return;
63
+ }
43
64
  context.openPopup('preserve');
44
65
  return;
45
66
  }
46
- if (event.key === 'Home' && context.isOpen()) {
47
- event.preventDefault();
48
- context.highlightFirst();
49
- return;
50
- }
51
- if (event.key === 'End' && context.isOpen()) {
52
- event.preventDefault();
53
- context.highlightLast();
54
- return;
55
- }
56
67
  if (event.key === 'Enter' && context.isOpen()) {
57
68
  const activeItem = context.visibleItems().find((item) => item.key === context.highlightedKey());
58
69
  if (activeItem) {
@@ -1 +1 @@
1
- {"version":3,"file":"combobox-input.jsx","sourceRoot":"","sources":["../../../../src/components/combobox/combobox-input.tsx"],"names":[],"mappings":"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","sourcesContent":["import clsx from 'clsx/lite';\nimport { type JSX, splitProps } from 'solid-js';\nimport { comboboxClass } from './class';\nimport { useComboboxContext } from './context';\nimport type { ComboboxInputProps } from './types';\nimport { callEventHandler } from './util';\n\nexport function ComboboxInput(props: ComboboxInputProps) {\n\tconst context = useComboboxContext<any, any>();\n\tconst [local, rest] = splitProps(props, ['class', 'placeholder', 'onInput', 'onFocus', 'onKeyDown']);\n\tconst rootClass = () => clsx(comboboxClass.input, local.class);\n\n\tconst handleInput: JSX.EventHandlerUnion<HTMLInputElement, InputEvent> = (event) => {\n\t\tcallEventHandler(local.onInput, event);\n\n\t\tif (!(event.currentTarget instanceof HTMLInputElement)) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.setInputValue(event.currentTarget.value);\n\t};\n\n\tconst handleFocus: JSX.EventHandlerUnion<HTMLInputElement, FocusEvent> = (event) => {\n\t\tcallEventHandler(local.onFocus, event);\n\n\t\tif (context.disabled() || context.readOnly()) {\n\t\t\treturn;\n\t\t}\n\t};\n\n\tconst handleKeyDown: JSX.EventHandlerUnion<HTMLInputElement, KeyboardEvent> = (event) => {\n\t\tcallEventHandler(local.onKeyDown, event);\n\n\t\tif (context.disabled() || context.readOnly()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowDown') {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (context.isOpen()) {\n\t\t\t\tcontext.highlightNext();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcontext.openPopup('preserve');\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowUp') {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (context.isOpen()) {\n\t\t\t\tcontext.highlightPrevious();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcontext.openPopup('preserve');\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Home' && context.isOpen()) {\n\t\t\tevent.preventDefault();\n\t\t\tcontext.highlightFirst();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'End' && context.isOpen()) {\n\t\t\tevent.preventDefault();\n\t\t\tcontext.highlightLast();\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Enter' && context.isOpen()) {\n\t\t\tconst activeItem = context.visibleItems().find((item) => item.key === context.highlightedKey());\n\n\t\t\tif (activeItem) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tcontext.selectItem(activeItem);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Escape') {\n\t\t\tconst input = event.currentTarget;\n\t\t\tconst selectionStart = input.selectionStart ?? 0;\n\t\t\tconst selectionEnd = input.selectionEnd ?? 0;\n\n\t\t\tif (selectionStart !== selectionEnd) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tinput.setSelectionRange(selectionEnd, selectionEnd);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (context.selectedItem()) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tcontext.clearSelectedItem();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (context.isOpen()) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tcontext.closePopup(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Tab') {\n\t\t\tcontext.closePopup(true);\n\t\t}\n\t};\n\n\treturn (\n\t\t<input\n\t\t\tid={`${context.rootId}-input`}\n\t\t\tref={context.setInputRef}\n\t\t\tclass={rootClass()}\n\t\t\ttype=\"text\"\n\t\t\trole=\"combobox\"\n\t\t\tvalue={context.inputValue()}\n\t\t\tplaceholder={local.placeholder ?? context.placeholder()}\n\t\t\tdisabled={context.disabled()}\n\t\t\treadOnly={context.readOnly()}\n\t\t\trequired={context.required()}\n\t\t\taria-autocomplete=\"list\"\n\t\t\taria-expanded={context.isOpen()}\n\t\t\taria-controls={context.isOpen() ? `${context.rootId}-listbox` : undefined}\n\t\t\taria-activedescendant={context.highlightedKey() ? context.getItemId(context.highlightedKey()!) : undefined}\n\t\t\tonInput={handleInput}\n\t\t\tonFocus={handleFocus}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n"]}
1
+ {"version":3,"file":"combobox-input.jsx","sourceRoot":"","sources":["../../../../src/components/combobox/combobox-input.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAY,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE1C,MAAM,UAAU,aAAa,CAAC,KAAyB;IACtD,MAAM,OAAO,GAAG,kBAAkB,EAAY,CAAC;IAC/C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACrG,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAwD,CAAC,KAAK,EAAE,EAAE;QAClF,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEvC,IAAI,CAAC,CAAC,KAAK,CAAC,aAAa,YAAY,gBAAgB,CAAC,EAAE,CAAC;YACxD,OAAO;QACR,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QAC9B,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAExC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAEjC,cAAc,CAAC,GAAG,EAAE;YACnB,IAAI,QAAQ,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;gBACtC,OAAO;YACR,CAAC;YAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBACnF,OAAO;YACR,CAAC;YAED,KAAK,CAAC,iBAAiB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,WAAW,GAAwD,CAAC,KAAK,EAAE,EAAE;QAClF,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEvC,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC9C,OAAO;QACR,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,aAAa,GAA2D,CAAC,KAAK,EAAE,EAAE;QACvF,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEzC,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC9C,OAAO;QACR,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;YAEvB,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,aAAa,EAAE,CAAC;gBACxB,OAAO;YACR,CAAC;YAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBAChC,OAAO;YACR,CAAC;YAED,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC9B,OAAO;QACR,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,cAAc,EAAE,CAAC;YAEvB,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,OAAO;YACR,CAAC;YAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC/B,OAAO;YACR,CAAC;YAED,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC9B,OAAO;QACR,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;YAEhG,IAAI,UAAU,EAAE,CAAC;gBAChB,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC;YAED,OAAO;QACR,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YAClC,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;YAE7C,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;gBACrC,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,CAAC,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBACpD,OAAO;YACR,CAAC;YAED,IAAI,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;gBAC5B,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,OAAO;YACR,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtB,KAAK,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;YAED,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO;QACR,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACF,CAAC,CAAC;IAEF,OAAO,CACN,CAAC,KAAK,CACL,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,QAAQ,CAAC,CAC9B,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CACzB,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CACnB,IAAI,CAAC,MAAM,CACX,IAAI,CAAC,UAAU,CACf,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAC5B,WAAW,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CACxD,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC7B,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC7B,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC7B,iBAAiB,CAAC,MAAM,CACxB,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAChC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAC1E,qBAAqB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,EAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAC3G,OAAO,CAAC,CAAC,WAAW,CAAC,CACrB,OAAO,CAAC,CAAC,WAAW,CAAC,CACrB,SAAS,CAAC,CAAC,aAAa,CAAC,CACzB,IAAI,IAAI,CAAC,EACR,CACF,CAAC;AACH,CAAC","sourcesContent":["import clsx from 'clsx/lite';\nimport { type JSX, splitProps } from 'solid-js';\nimport { comboboxClass } from './class';\nimport { useComboboxContext } from './context';\nimport type { ComboboxInputProps } from './types';\nimport { callEventHandler } from './util';\n\nexport function ComboboxInput(props: ComboboxInputProps) {\n\tconst context = useComboboxContext<any, any>();\n\tconst [local, rest] = splitProps(props, ['class', 'placeholder', 'onInput', 'onFocus', 'onKeyDown']);\n\tconst rootClass = () => clsx(comboboxClass.input, local.class);\n\n\tconst handleInput: JSX.EventHandlerUnion<HTMLInputElement, InputEvent> = (event) => {\n\t\tcallEventHandler(local.onInput, event);\n\n\t\tif (!(event.currentTarget instanceof HTMLInputElement)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst input = event.currentTarget;\n\t\tconst nextValue = input.value;\n\t\tconst selectionStart = input.selectionStart;\n\t\tconst selectionEnd = input.selectionEnd;\n\n\t\tcontext.setInputValue(nextValue);\n\n\t\tqueueMicrotask(() => {\n\t\t\tif (document.activeElement !== input) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (input.value !== nextValue || selectionStart === null || selectionEnd === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tinput.setSelectionRange(selectionStart, selectionEnd);\n\t\t});\n\t};\n\n\tconst handleFocus: JSX.EventHandlerUnion<HTMLInputElement, FocusEvent> = (event) => {\n\t\tcallEventHandler(local.onFocus, event);\n\n\t\tif (context.disabled() || context.readOnly()) {\n\t\t\treturn;\n\t\t}\n\t};\n\n\tconst handleKeyDown: JSX.EventHandlerUnion<HTMLInputElement, KeyboardEvent> = (event) => {\n\t\tcallEventHandler(local.onKeyDown, event);\n\n\t\tif (context.disabled() || context.readOnly()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowDown') {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (context.isOpen()) {\n\t\t\t\tcontext.highlightNext();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (context.visibleItems().length === 0) {\n\t\t\t\tcontext.openAllOptions('first');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcontext.openPopup('preserve');\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'ArrowUp') {\n\t\t\tevent.preventDefault();\n\n\t\t\tif (context.isOpen()) {\n\t\t\t\tcontext.highlightPrevious();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (context.visibleItems().length === 0) {\n\t\t\t\tcontext.openAllOptions('last');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcontext.openPopup('preserve');\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Enter' && context.isOpen()) {\n\t\t\tconst activeItem = context.visibleItems().find((item) => item.key === context.highlightedKey());\n\n\t\t\tif (activeItem) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tcontext.selectItem(activeItem);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Escape') {\n\t\t\tconst input = event.currentTarget;\n\t\t\tconst selectionStart = input.selectionStart ?? 0;\n\t\t\tconst selectionEnd = input.selectionEnd ?? 0;\n\n\t\t\tif (selectionStart !== selectionEnd) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tinput.setSelectionRange(selectionEnd, selectionEnd);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (context.selectedItem()) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tcontext.clearSelectedItem();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (context.isOpen()) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tcontext.closePopup(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Tab') {\n\t\t\tcontext.closePopup(true);\n\t\t}\n\t};\n\n\treturn (\n\t\t<input\n\t\t\tid={`${context.rootId}-input`}\n\t\t\tref={context.setInputRef}\n\t\t\tclass={rootClass()}\n\t\t\ttype=\"text\"\n\t\t\trole=\"combobox\"\n\t\t\tvalue={context.inputValue()}\n\t\t\tplaceholder={local.placeholder ?? context.placeholder()}\n\t\t\tdisabled={context.disabled()}\n\t\t\treadOnly={context.readOnly()}\n\t\t\trequired={context.required()}\n\t\t\taria-autocomplete=\"list\"\n\t\t\taria-expanded={context.isOpen()}\n\t\t\taria-controls={context.isOpen() ? `${context.rootId}-listbox` : undefined}\n\t\t\taria-activedescendant={context.highlightedKey() ? context.getItemId(context.highlightedKey()!) : undefined}\n\t\t\tonInput={handleInput}\n\t\t\tonFocus={handleFocus}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\t{...rest}\n\t\t/>\n\t);\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import clsx from 'clsx/lite';
2
- import { splitProps } from 'solid-js';
2
+ import { createEffect, splitProps } from 'solid-js';
3
3
  import { comboboxClass } from './class';
4
4
  import { ComboboxItemContext, useComboboxContext } from './context';
5
5
  import { callEventHandler } from './util';
@@ -9,6 +9,13 @@ export function ComboboxItem(props) {
9
9
  const rootClass = () => clsx(comboboxClass.item, local.class);
10
10
  const selected = () => context.selectedItem()?.key === local.item.key;
11
11
  const highlighted = () => context.highlightedKey() === local.item.key;
12
+ let itemRef;
13
+ createEffect(() => {
14
+ if (!highlighted() || !itemRef || !context.shouldScrollHighlightedItem()) {
15
+ return;
16
+ }
17
+ itemRef.scrollIntoView({ block: 'nearest' });
18
+ });
12
19
  const handleMouseEnter = (event) => {
13
20
  callEventHandler(local.onMouseEnter, event);
14
21
  context.setHighlightedKey(local.item.key);
@@ -22,7 +29,7 @@ export function ComboboxItem(props) {
22
29
  context.selectItem(local.item);
23
30
  };
24
31
  return (<ComboboxItemContext.Provider value={{ item: local.item, selected: selected(), highlighted: highlighted() }}>
25
- <li id={context.getItemId(local.item.key)} class={rootClass()} role="option" aria-selected={selected()} data-selected={selected() ? '' : undefined} data-highlighted={highlighted() ? '' : undefined} data-disabled={local.item.disabled ? '' : undefined} onMouseEnter={handleMouseEnter} onMouseDown={handleMouseDown} onClick={handleClick} {...rest}>
32
+ <li id={context.getItemId(local.item.key)} ref={itemRef} class={rootClass()} role="option" aria-selected={selected()} data-selected={selected() ? '' : undefined} data-highlighted={highlighted() ? '' : undefined} data-disabled={local.item.disabled ? '' : undefined} onMouseEnter={handleMouseEnter} onMouseDown={handleMouseDown} onClick={handleClick} {...rest}>
26
33
  {local.children}
27
34
  </li>
28
35
  </ComboboxItemContext.Provider>);
@@ -1 +1 @@
1
- {"version":3,"file":"combobox-item.jsx","sourceRoot":"","sources":["../../../../src/components/combobox/combobox-item.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAY,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE1C,MAAM,UAAU,YAAY,CAAgB,KAAiC;IAC5E,MAAM,OAAO,GAAG,kBAAkB,EAAgB,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;IACjH,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACtE,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAEtE,MAAM,gBAAgB,GAAqD,CAAC,KAAK,EAAE,EAAE;QACpF,gBAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,MAAM,eAAe,GAAqD,CAAC,KAAK,EAAE,EAAE;QACnF,gBAAgB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC3C,KAAK,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAqD,CAAC,KAAK,EAAE,EAAE;QAC/E,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO,CACN,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAC3G;GAAA,CAAC,EAAE,CACF,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACtC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CACnB,IAAI,CAAC,QAAQ,CACb,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAC1B,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAC3C,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CACjD,aAAa,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CACpD,YAAY,CAAC,CAAC,gBAAgB,CAAC,CAC/B,WAAW,CAAC,CAAC,eAAe,CAAC,CAC7B,OAAO,CAAC,CAAC,WAAW,CAAC,CACrB,IAAI,IAAI,CAAC,CAET;IAAA,CAAC,KAAK,CAAC,QAAQ,CAChB;GAAA,EAAE,EAAE,CACL;EAAA,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAC/B,CAAC;AACH,CAAC","sourcesContent":["import clsx from 'clsx/lite';\nimport { type JSX, splitProps } from 'solid-js';\nimport { comboboxClass } from './class';\nimport { ComboboxItemContext, useComboboxContext } from './context';\nimport type { ComboboxItemProps } from './types';\nimport { callEventHandler } from './util';\n\nexport function ComboboxItem<TOption = any>(props: ComboboxItemProps<TOption>) {\n\tconst context = useComboboxContext<TOption, any>();\n\tconst [local, rest] = splitProps(props, ['class', 'item', 'children', 'onMouseEnter', 'onMouseDown', 'onClick']);\n\tconst rootClass = () => clsx(comboboxClass.item, local.class);\n\tconst selected = () => context.selectedItem()?.key === local.item.key;\n\tconst highlighted = () => context.highlightedKey() === local.item.key;\n\n\tconst handleMouseEnter: JSX.EventHandlerUnion<HTMLLIElement, MouseEvent> = (event) => {\n\t\tcallEventHandler(local.onMouseEnter, event);\n\t\tcontext.setHighlightedKey(local.item.key);\n\t};\n\n\tconst handleMouseDown: JSX.EventHandlerUnion<HTMLLIElement, MouseEvent> = (event) => {\n\t\tcallEventHandler(local.onMouseDown, event);\n\t\tevent.preventDefault();\n\t};\n\n\tconst handleClick: JSX.EventHandlerUnion<HTMLLIElement, MouseEvent> = (event) => {\n\t\tcallEventHandler(local.onClick, event);\n\t\tcontext.selectItem(local.item);\n\t};\n\n\treturn (\n\t\t<ComboboxItemContext.Provider value={{ item: local.item, selected: selected(), highlighted: highlighted() }}>\n\t\t\t<li\n\t\t\t\tid={context.getItemId(local.item.key)}\n\t\t\t\tclass={rootClass()}\n\t\t\t\trole=\"option\"\n\t\t\t\taria-selected={selected()}\n\t\t\t\tdata-selected={selected() ? '' : undefined}\n\t\t\t\tdata-highlighted={highlighted() ? '' : undefined}\n\t\t\t\tdata-disabled={local.item.disabled ? '' : undefined}\n\t\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonClick={handleClick}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{local.children}\n\t\t\t</li>\n\t\t</ComboboxItemContext.Provider>\n\t);\n}\n"]}
1
+ {"version":3,"file":"combobox-item.jsx","sourceRoot":"","sources":["../../../../src/components/combobox/combobox-item.tsx"],"names":[],"mappings":"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","sourcesContent":["import clsx from 'clsx/lite';\nimport { createEffect, type JSX, splitProps } from 'solid-js';\nimport { comboboxClass } from './class';\nimport { ComboboxItemContext, useComboboxContext } from './context';\nimport type { ComboboxItemProps } from './types';\nimport { callEventHandler } from './util';\n\nexport function ComboboxItem<TOption = any>(props: ComboboxItemProps<TOption>) {\n\tconst context = useComboboxContext<TOption, any>();\n\tconst [local, rest] = splitProps(props, ['class', 'item', 'children', 'onMouseEnter', 'onMouseDown', 'onClick']);\n\tconst rootClass = () => clsx(comboboxClass.item, local.class);\n\tconst selected = () => context.selectedItem()?.key === local.item.key;\n\tconst highlighted = () => context.highlightedKey() === local.item.key;\n\tlet itemRef: HTMLLIElement | undefined;\n\n\tcreateEffect(() => {\n\t\tif (!highlighted() || !itemRef || !context.shouldScrollHighlightedItem()) {\n\t\t\treturn;\n\t\t}\n\n\t\titemRef.scrollIntoView({ block: 'nearest' });\n\t});\n\n\tconst handleMouseEnter: JSX.EventHandlerUnion<HTMLLIElement, MouseEvent> = (event) => {\n\t\tcallEventHandler(local.onMouseEnter, event);\n\t\tcontext.setHighlightedKey(local.item.key);\n\t};\n\n\tconst handleMouseDown: JSX.EventHandlerUnion<HTMLLIElement, MouseEvent> = (event) => {\n\t\tcallEventHandler(local.onMouseDown, event);\n\t\tevent.preventDefault();\n\t};\n\n\tconst handleClick: JSX.EventHandlerUnion<HTMLLIElement, MouseEvent> = (event) => {\n\t\tcallEventHandler(local.onClick, event);\n\t\tcontext.selectItem(local.item);\n\t};\n\n\treturn (\n\t\t<ComboboxItemContext.Provider value={{ item: local.item, selected: selected(), highlighted: highlighted() }}>\n\t\t\t<li\n\t\t\t\tid={context.getItemId(local.item.key)}\n\t\t\t\tref={itemRef}\n\t\t\t\tclass={rootClass()}\n\t\t\t\trole=\"option\"\n\t\t\t\taria-selected={selected()}\n\t\t\t\tdata-selected={selected() ? '' : undefined}\n\t\t\t\tdata-highlighted={highlighted() ? '' : undefined}\n\t\t\t\tdata-disabled={local.item.disabled ? '' : undefined}\n\t\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonClick={handleClick}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{local.children}\n\t\t\t</li>\n\t\t</ComboboxItemContext.Provider>\n\t);\n}\n"]}
@@ -1,15 +1,18 @@
1
1
  @layer components {
2
2
  .fl-combobox_listbox {
3
+ --fl-combobox-listbox-pad: var(--fl-size-2);
4
+
3
5
  /* reset */
4
6
  list-style: none;
5
7
 
6
8
  /* layout */
7
9
  max-height: inherit;
8
10
  overflow-y: auto;
11
+ scroll-padding-block: var(--fl-combobox-listbox-pad);
9
12
 
10
13
  /* spacing */
11
14
  margin: 0;
12
- padding: var(--fl-size-2);
15
+ padding: var(--fl-combobox-listbox-pad);
13
16
  }
14
17
 
15
18
  .fl-combobox_listbox:focus {
@@ -50,6 +50,7 @@ export function ComboboxRoot(props) {
50
50
  const [internalInputValue, setInternalInputValue] = createSignal(local.defaultInputValue ?? '');
51
51
  const [filterValue, setFilterValue] = createSignal('');
52
52
  const [highlightedKey, setHighlightedKey] = createSignal(null);
53
+ const [shouldScrollHighlightedItem, setShouldScrollHighlightedItem] = createSignal(false);
53
54
  const isControlledValue = () => local.value !== undefined;
54
55
  const isControlledInputValue = () => local.inputValue !== undefined;
55
56
  const isControlledOpen = () => local.open !== undefined;
@@ -160,16 +161,18 @@ export function ComboboxRoot(props) {
160
161
  }
161
162
  };
162
163
  const restoreInputFromSelection = () => {
163
- setDisplayedInputValue(selectedItem()?.label ?? '');
164
+ setDisplayedInputValue(selectedItem()?.label ?? '', isControlledInputValue());
164
165
  setFilterValue('');
165
166
  };
166
167
  const highlightByIndex = (index) => {
167
168
  const items = visibleItems();
168
169
  if (items.length === 0) {
170
+ setShouldScrollHighlightedItem(false);
169
171
  setHighlightedKey(null);
170
172
  return;
171
173
  }
172
- const boundedIndex = (index + items.length) % items.length;
174
+ const boundedIndex = Math.min(Math.max(index, 0), items.length - 1);
175
+ setShouldScrollHighlightedItem(true);
173
176
  setHighlightedKey(items[boundedIndex]?.key ?? null);
174
177
  };
175
178
  const highlightFirst = () => highlightByIndex(0);
@@ -198,6 +201,29 @@ export function ComboboxRoot(props) {
198
201
  return;
199
202
  }
200
203
  if (selectedItem()) {
204
+ setShouldScrollHighlightedItem(true);
205
+ setHighlightedKey(selectedItem().key);
206
+ return;
207
+ }
208
+ }
209
+ highlightFirst();
210
+ };
211
+ const openAllOptions = (strategy = 'first') => {
212
+ if (local.disabled || local.readOnly || allItems().length === 0) {
213
+ return;
214
+ }
215
+ setFilterValue('');
216
+ setOpen(true);
217
+ if (strategy === 'last') {
218
+ highlightLast();
219
+ return;
220
+ }
221
+ if (strategy === 'preserve') {
222
+ if (highlightedKey() !== null) {
223
+ return;
224
+ }
225
+ if (selectedItem()) {
226
+ setShouldScrollHighlightedItem(true);
201
227
  setHighlightedKey(selectedItem().key);
202
228
  return;
203
229
  }
@@ -206,6 +232,7 @@ export function ComboboxRoot(props) {
206
232
  };
207
233
  const closePopup = (restoreInput = true) => {
208
234
  setOpen(false);
235
+ setShouldScrollHighlightedItem(false);
209
236
  setHighlightedKey(null);
210
237
  if (restoreInput) {
211
238
  restoreInputFromSelection();
@@ -218,6 +245,7 @@ export function ComboboxRoot(props) {
218
245
  setSelectedOption(item.rawValue);
219
246
  setDisplayedInputValue(item.label);
220
247
  setFilterValue('');
248
+ setShouldScrollHighlightedItem(false);
221
249
  setHighlightedKey(item.key);
222
250
  if (local.closeOnSelection) {
223
251
  setOpen(false);
@@ -226,7 +254,7 @@ export function ComboboxRoot(props) {
226
254
  };
227
255
  const clearPendingInput = () => {
228
256
  if (selectedItem() === null) {
229
- setDisplayedInputValue('');
257
+ setDisplayedInputValue('', isControlledInputValue());
230
258
  setFilterValue('');
231
259
  return;
232
260
  }
@@ -234,21 +262,31 @@ export function ComboboxRoot(props) {
234
262
  };
235
263
  const clearSelectedItem = () => {
236
264
  setSelectedOption(null);
237
- setDisplayedInputValue('');
265
+ setDisplayedInputValue('', true);
238
266
  setFilterValue('');
267
+ setShouldScrollHighlightedItem(false);
239
268
  setHighlightedKey(null);
240
269
  setOpen(false);
241
270
  inputRef()?.focus();
242
271
  };
243
272
  createEffect(() => {
244
- if (isControlledValue() && selectedItem() !== null) {
273
+ if (!isControlledValue()) {
274
+ return;
275
+ }
276
+ if (selectedItem() !== null) {
245
277
  restoreInputFromSelection();
278
+ return;
279
+ }
280
+ setFilterValue('');
281
+ if (!isControlledInputValue()) {
282
+ setDisplayedInputValue('');
246
283
  }
247
284
  });
248
285
  createEffect(() => {
249
286
  const items = visibleItems();
250
287
  const selected = selectedItem();
251
288
  if (items.length === 0) {
289
+ setShouldScrollHighlightedItem(false);
252
290
  setHighlightedKey(null);
253
291
  setOpen(false);
254
292
  return;
@@ -258,6 +296,7 @@ export function ComboboxRoot(props) {
258
296
  }
259
297
  if (isOpen()) {
260
298
  if (selected && items.some((item) => item.key === selected.key)) {
299
+ setShouldScrollHighlightedItem(true);
261
300
  setHighlightedKey(selected.key);
262
301
  return;
263
302
  }
@@ -286,11 +325,12 @@ export function ComboboxRoot(props) {
286
325
  setInputRef,
287
326
  inputValue,
288
327
  setInputValue: (value) => {
289
- setDisplayedInputValue(value, true);
290
- setFilterValue(value);
291
- if (selectedItem() && value !== selectedItem().label) {
328
+ const selected = selectedItem();
329
+ if (selected && value !== selected.label) {
292
330
  setSelectedOption(null);
293
331
  }
332
+ setDisplayedInputValue(value, true);
333
+ setFilterValue(value);
294
334
  if (value.trim() === '') {
295
335
  closePopup(false);
296
336
  return;
@@ -299,6 +339,7 @@ export function ComboboxRoot(props) {
299
339
  },
300
340
  isOpen,
301
341
  openPopup,
342
+ openAllOptions,
302
343
  closePopup,
303
344
  togglePopup: () => {
304
345
  if (isOpen()) {
@@ -311,7 +352,11 @@ export function ComboboxRoot(props) {
311
352
  visibleItems,
312
353
  selectedItem,
313
354
  highlightedKey,
314
- setHighlightedKey,
355
+ shouldScrollHighlightedItem,
356
+ setHighlightedKey: (key) => {
357
+ setShouldScrollHighlightedItem(false);
358
+ setHighlightedKey(key);
359
+ },
315
360
  highlightNext,
316
361
  highlightPrevious,
317
362
  highlightFirst,
@@ -1 +1 @@
1
- {"version":3,"file":"combobox-root.jsx","sourceRoot":"","sources":["../../../../src/components/combobox/combobox-root.tsx"],"names":[],"mappings":"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","sourcesContent":["import clsx from 'clsx/lite';\nimport {\n\tchildren,\n\tcreateEffect,\n\tcreateMemo,\n\tcreateSignal,\n\tcreateUniqueId,\n\ttype JSX,\n\tmergeProps,\n\tonCleanup,\n\tonMount,\n\tsplitProps,\n} from 'solid-js';\nimport { comboboxClass } from './class';\nimport { ComboboxContent } from './combobox-content';\nimport { ComboboxControl } from './combobox-control';\nimport { ComboboxInput } from './combobox-input';\nimport { ComboboxListbox } from './combobox-listbox';\nimport { ComboboxPortal } from './combobox-portal';\nimport { ComboboxTrigger } from './combobox-trigger';\nimport { ComboboxContext, type ComboboxContextValue } from './context';\nimport type { ComboboxGroupData, ComboboxItemData, ComboboxRootProps } from './types';\nimport {\n\tcallEventHandler,\n\tcreateContainsFilter,\n\tdefaultTextValue,\n\tresolveAccessor,\n\tresolveGroupChildren,\n} from './util';\n\nexport function ComboboxRoot<TOption, TOptionGroup = never>(props: ComboboxRootProps<TOption, TOptionGroup>) {\n\tconst merged = mergeProps(\n\t\t{\n\t\t\tcloseOnSelection: true,\n\t\t},\n\t\tprops,\n\t);\n\n\tconst [local, rest] = splitProps(merged, [\n\t\t'class',\n\t\t'children',\n\t\t'options',\n\t\t'optionValue',\n\t\t'optionTextValue',\n\t\t'optionLabel',\n\t\t'optionDisabled',\n\t\t'optionGroupChildren',\n\t\t'itemComponent',\n\t\t'groupComponent',\n\t\t'placeholder',\n\t\t'value',\n\t\t'defaultValue',\n\t\t'inputValue',\n\t\t'defaultInputValue',\n\t\t'onChange',\n\t\t'onInputChange',\n\t\t'open',\n\t\t'defaultOpen',\n\t\t'onOpenChange',\n\t\t'disabled',\n\t\t'readOnly',\n\t\t'required',\n\t\t'name',\n\t\t'closeOnSelection',\n\t\t'onFocusOut',\n\t]);\n\tconst resolvedChildren = children(() => local.children);\n\n\tconst rootId = createUniqueId();\n\tconst [rootRef, setRootRef] = createSignal<HTMLDivElement>();\n\tconst [inputRef, setInputRef] = createSignal<HTMLInputElement>();\n\tconst [internalValue, setInternalValue] = createSignal<TOption | null>(local.defaultValue ?? null);\n\tconst [internalOpen, setInternalOpen] = createSignal(Boolean(local.defaultOpen));\n\tconst [internalInputValue, setInternalInputValue] = createSignal(local.defaultInputValue ?? '');\n\tconst [filterValue, setFilterValue] = createSignal('');\n\tconst [highlightedKey, setHighlightedKey] = createSignal<string | null>(null);\n\tconst isControlledValue = () => local.value !== undefined;\n\tconst isControlledInputValue = () => local.inputValue !== undefined;\n\tconst isControlledOpen = () => local.open !== undefined;\n\tconst filter = createMemo(() => createContainsFilter<TOption>());\n\tconst inputValue = createMemo(() => {\n\t\tif (isControlledInputValue()) {\n\t\t\treturn local.inputValue ?? '';\n\t\t}\n\n\t\treturn internalInputValue();\n\t});\n\n\tconst normalizedGroups = createMemo<Array<ComboboxGroupData<TOptionGroup, TOption>>>(() => {\n\t\tconst groups: Array<ComboboxGroupData<TOptionGroup, TOption>> = [];\n\t\tconst looseItems: ComboboxItemData<TOption>[] = [];\n\t\tlet itemIndex = 0;\n\n\t\tfor (let index = 0; index < local.options.length; index += 1) {\n\t\t\tconst entry = local.options[index] as TOption | TOptionGroup;\n\t\t\tconst groupChildren = resolveGroupChildren(entry as TOptionGroup, local.optionGroupChildren);\n\n\t\t\tif (groupChildren !== undefined) {\n\t\t\t\tconst groupItems = groupChildren.map((option) => {\n\t\t\t\t\tconst value = String(resolveAccessor(option, local.optionValue, defaultTextValue));\n\t\t\t\t\tconst label = resolveAccessor(option, local.optionLabel, defaultTextValue);\n\t\t\t\t\tconst textValue = resolveAccessor(option, local.optionTextValue, () => label);\n\t\t\t\t\tconst disabled = Boolean(resolveAccessor(option, local.optionDisabled, () => false));\n\t\t\t\t\tconst item = {\n\t\t\t\t\t\tkey: `${value}-${itemIndex}`,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\ttextValue,\n\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\trawValue: option,\n\t\t\t\t\t};\n\n\t\t\t\t\titemIndex += 1;\n\n\t\t\t\t\treturn item;\n\t\t\t\t});\n\n\t\t\t\tgroups.push({\n\t\t\t\t\tkey: `group-${index}`,\n\t\t\t\t\ttextValue: defaultTextValue(entry),\n\t\t\t\t\trawValue: entry as TOptionGroup,\n\t\t\t\t\titems: groupItems,\n\t\t\t\t});\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst option = entry as TOption;\n\t\t\tconst value = String(resolveAccessor(option, local.optionValue, defaultTextValue));\n\t\t\tconst label = resolveAccessor(option, local.optionLabel, defaultTextValue);\n\t\t\tconst textValue = resolveAccessor(option, local.optionTextValue, () => label);\n\t\t\tconst disabled = Boolean(resolveAccessor(option, local.optionDisabled, () => false));\n\n\t\t\tlooseItems.push({\n\t\t\t\tkey: `${value}-${itemIndex}`,\n\t\t\t\tvalue,\n\t\t\t\tlabel,\n\t\t\t\ttextValue,\n\t\t\t\tdisabled,\n\t\t\t\trawValue: option,\n\t\t\t});\n\n\t\t\titemIndex += 1;\n\t\t}\n\n\t\tif (looseItems.length > 0) {\n\t\t\tgroups.unshift({\n\t\t\t\tkey: 'group-root',\n\t\t\t\ttextValue: '',\n\t\t\t\titems: looseItems,\n\t\t\t});\n\t\t}\n\n\t\treturn groups;\n\t});\n\n\tconst allItems = createMemo(() => normalizedGroups().flatMap((group) => group.items));\n\n\tconst selectedItem = createMemo(() => {\n\t\tlet selectedOption = internalValue();\n\n\t\tif (isControlledValue()) {\n\t\t\tselectedOption = local.value ?? null;\n\t\t}\n\n\t\tif (selectedOption == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst selectedValue = String(\n\t\t\tresolveAccessor<TOption, string | number>(\n\t\t\t\tselectedOption as TOption,\n\t\t\t\tlocal.optionValue,\n\t\t\t\tdefaultTextValue as (value: TOption) => string | number,\n\t\t\t),\n\t\t);\n\n\t\treturn allItems().find((item) => item.value === selectedValue) ?? null;\n\t});\n\n\tconst visibleGroups = createMemo(() => {\n\t\tconst currentInput = filterValue().trim();\n\n\t\treturn normalizedGroups()\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\titems: group.items.filter((item) => filter()(item.rawValue, currentInput)),\n\t\t\t}))\n\t\t\t.filter((group) => group.items.length > 0);\n\t});\n\n\tconst visibleItems = createMemo(() => visibleGroups().flatMap((group) => group.items));\n\tconst isOpen = createMemo(\n\t\t() => (isControlledOpen() ? Boolean(local.open) : internalOpen()) && visibleItems().length > 0,\n\t);\n\n\tconst setOpen = (value: boolean) => {\n\t\tif (!isControlledOpen()) {\n\t\t\tsetInternalOpen(value);\n\t\t}\n\n\t\tlocal.onOpenChange?.(value);\n\t};\n\n\tconst setSelectedOption = (value: TOption | null) => {\n\t\tif (!isControlledValue()) {\n\t\t\tsetInternalValue(() => value);\n\t\t}\n\n\t\tlocal.onChange?.(value);\n\t};\n\n\tconst setDisplayedInputValue = (value: string, emitChange = false) => {\n\t\tif (!isControlledInputValue()) {\n\t\t\tsetInternalInputValue(value);\n\t\t}\n\n\t\tif (emitChange) {\n\t\t\tlocal.onInputChange?.(value);\n\t\t}\n\t};\n\n\tconst restoreInputFromSelection = () => {\n\t\tsetDisplayedInputValue(selectedItem()?.label ?? '');\n\t\tsetFilterValue('');\n\t};\n\n\tconst highlightByIndex = (index: number) => {\n\t\tconst items = visibleItems();\n\n\t\tif (items.length === 0) {\n\t\t\tsetHighlightedKey(null);\n\t\t\treturn;\n\t\t}\n\n\t\tconst boundedIndex = (index + items.length) % items.length;\n\t\tsetHighlightedKey(items[boundedIndex]?.key ?? null);\n\t};\n\n\tconst highlightFirst = () => highlightByIndex(0);\n\tconst highlightLast = () => highlightByIndex(visibleItems().length - 1);\n\n\tconst highlightNext = () => {\n\t\tconst items = visibleItems();\n\t\tconst index = items.findIndex((item) => item.key === highlightedKey());\n\t\thighlightByIndex(index >= 0 ? index + 1 : 0);\n\t};\n\n\tconst highlightPrevious = () => {\n\t\tconst items = visibleItems();\n\t\tconst index = items.findIndex((item) => item.key === highlightedKey());\n\t\thighlightByIndex(index >= 0 ? index - 1 : items.length - 1);\n\t};\n\n\tconst openPopup = (strategy: 'first' | 'last' | 'preserve' = 'first') => {\n\t\tif (local.disabled || local.readOnly || visibleItems().length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetOpen(true);\n\n\t\tif (strategy === 'last') {\n\t\t\thighlightLast();\n\t\t\treturn;\n\t\t}\n\n\t\tif (strategy === 'preserve') {\n\t\t\tif (highlightedKey() !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (selectedItem()) {\n\t\t\t\tsetHighlightedKey(selectedItem()!.key);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\thighlightFirst();\n\t};\n\n\tconst closePopup = (restoreInput = true) => {\n\t\tsetOpen(false);\n\t\tsetHighlightedKey(null);\n\n\t\tif (restoreInput) {\n\t\t\trestoreInputFromSelection();\n\t\t}\n\t};\n\n\tconst selectItem = (item: ComboboxItemData<TOption>) => {\n\t\tif (item.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedOption(item.rawValue);\n\t\tsetDisplayedInputValue(item.label);\n\t\tsetFilterValue('');\n\t\tsetHighlightedKey(item.key);\n\n\t\tif (local.closeOnSelection) {\n\t\t\tsetOpen(false);\n\t\t}\n\n\t\tinputRef()?.focus();\n\t};\n\n\tconst clearPendingInput = () => {\n\t\tif (selectedItem() === null) {\n\t\t\tsetDisplayedInputValue('');\n\t\t\tsetFilterValue('');\n\t\t\treturn;\n\t\t}\n\n\t\trestoreInputFromSelection();\n\t};\n\n\tconst clearSelectedItem = () => {\n\t\tsetSelectedOption(null);\n\t\tsetDisplayedInputValue('');\n\t\tsetFilterValue('');\n\t\tsetHighlightedKey(null);\n\t\tsetOpen(false);\n\t\tinputRef()?.focus();\n\t};\n\n\tcreateEffect(() => {\n\t\tif (isControlledValue() && selectedItem() !== null) {\n\t\t\trestoreInputFromSelection();\n\t\t}\n\t});\n\n\tcreateEffect(() => {\n\t\tconst items = visibleItems();\n\t\tconst selected = selectedItem();\n\n\t\tif (items.length === 0) {\n\t\t\tsetHighlightedKey(null);\n\t\t\tsetOpen(false);\n\t\t\treturn;\n\t\t}\n\n\t\tif (highlightedKey() && items.some((item) => item.key === highlightedKey())) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (isOpen()) {\n\t\t\tif (selected && items.some((item) => item.key === selected.key)) {\n\t\t\t\tsetHighlightedKey(selected.key);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thighlightFirst();\n\t\t}\n\t});\n\n\tonMount(() => {\n\t\trestoreInputFromSelection();\n\n\t\tconst handlePointerDown = (event: PointerEvent) => {\n\t\t\tconst root = rootRef();\n\n\t\t\tif (!root || root.contains(event.target as Node)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclosePopup(true);\n\t\t};\n\n\t\tdocument.addEventListener('pointerdown', handlePointerDown);\n\n\t\tonCleanup(() => {\n\t\t\tdocument.removeEventListener('pointerdown', handlePointerDown);\n\t\t});\n\t});\n\n\tconst context: ComboboxContextValue<TOption, TOptionGroup> = {\n\t\trootId,\n\t\trootRef,\n\t\tsetRootRef,\n\t\tinputRef,\n\t\tsetInputRef,\n\t\tinputValue,\n\t\tsetInputValue: (value) => {\n\t\t\tsetDisplayedInputValue(value, true);\n\t\t\tsetFilterValue(value);\n\n\t\t\tif (selectedItem() && value !== selectedItem()!.label) {\n\t\t\t\tsetSelectedOption(null);\n\t\t\t}\n\n\t\t\tif (value.trim() === '') {\n\t\t\t\tclosePopup(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\topenPopup('first');\n\t\t},\n\t\tisOpen,\n\t\topenPopup,\n\t\tclosePopup,\n\t\ttogglePopup: () => {\n\t\t\tif (isOpen()) {\n\t\t\t\tclosePopup(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\topenPopup('first');\n\t\t},\n\t\tvisibleGroups,\n\t\tvisibleItems,\n\t\tselectedItem,\n\t\thighlightedKey,\n\t\tsetHighlightedKey,\n\t\thighlightNext,\n\t\thighlightPrevious,\n\t\thighlightFirst,\n\t\thighlightLast,\n\t\tselectItem,\n\t\tgetItemId: (key) => `${rootId}-item-${key}`,\n\t\titemComponent: local.itemComponent,\n\t\tgroupComponent: local.groupComponent,\n\t\tplaceholder: () => local.placeholder,\n\t\tdisabled: () => Boolean(local.disabled),\n\t\treadOnly: () => Boolean(local.readOnly),\n\t\trequired: () => Boolean(local.required),\n\t\tname: () => local.name,\n\t\tclearPendingInput,\n\t\tclearSelectedItem,\n\t};\n\n\tconst rootClass = () => clsx(comboboxClass.root, local.class);\n\n\tconst handleFocusOut: JSX.FocusEventHandlerUnion<HTMLDivElement, FocusEvent> = (event) => {\n\t\tcallEventHandler(local.onFocusOut, event);\n\n\t\tconst nextTarget = event.relatedTarget as Node | null;\n\n\t\tif (nextTarget && rootRef()?.contains(nextTarget)) {\n\t\t\treturn;\n\t\t}\n\n\t\tqueueMicrotask(() => {\n\t\t\tconst activeElement = document.activeElement;\n\n\t\t\tif (activeElement instanceof Node && rootRef()?.contains(activeElement)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclosePopup(true);\n\t\t});\n\t};\n\n\treturn (\n\t\t<ComboboxContext.Provider value={context}>\n\t\t\t<div\n\t\t\t\tclass={rootClass()}\n\t\t\t\tref={setRootRef}\n\t\t\t\tonFocusOut={handleFocusOut}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{local.children ? (\n\t\t\t\t\tresolvedChildren()\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ComboboxControl>\n\t\t\t\t\t\t\t<ComboboxInput aria-label={local.placeholder ?? 'Combobox'} />\n\t\t\t\t\t\t\t<ComboboxTrigger />\n\t\t\t\t\t\t</ComboboxControl>\n\t\t\t\t\t\t<ComboboxPortal>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxListbox />\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</ComboboxPortal>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</ComboboxContext.Provider>\n\t);\n}\n"]}
1
+ {"version":3,"file":"combobox-root.jsx","sourceRoot":"","sources":["../../../../src/components/combobox/combobox-root.tsx"],"names":[],"mappings":"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","sourcesContent":["import clsx from 'clsx/lite';\nimport {\n\tchildren,\n\tcreateEffect,\n\tcreateMemo,\n\tcreateSignal,\n\tcreateUniqueId,\n\ttype JSX,\n\tmergeProps,\n\tonCleanup,\n\tonMount,\n\tsplitProps,\n} from 'solid-js';\nimport { comboboxClass } from './class';\nimport { ComboboxContent } from './combobox-content';\nimport { ComboboxControl } from './combobox-control';\nimport { ComboboxInput } from './combobox-input';\nimport { ComboboxListbox } from './combobox-listbox';\nimport { ComboboxPortal } from './combobox-portal';\nimport { ComboboxTrigger } from './combobox-trigger';\nimport { ComboboxContext, type ComboboxContextValue } from './context';\nimport type { ComboboxGroupData, ComboboxItemData, ComboboxRootProps } from './types';\nimport {\n\tcallEventHandler,\n\tcreateContainsFilter,\n\tdefaultTextValue,\n\tresolveAccessor,\n\tresolveGroupChildren,\n} from './util';\n\nexport function ComboboxRoot<TOption, TOptionGroup = never>(props: ComboboxRootProps<TOption, TOptionGroup>) {\n\tconst merged = mergeProps(\n\t\t{\n\t\t\tcloseOnSelection: true,\n\t\t},\n\t\tprops,\n\t);\n\n\tconst [local, rest] = splitProps(merged, [\n\t\t'class',\n\t\t'children',\n\t\t'options',\n\t\t'optionValue',\n\t\t'optionTextValue',\n\t\t'optionLabel',\n\t\t'optionDisabled',\n\t\t'optionGroupChildren',\n\t\t'itemComponent',\n\t\t'groupComponent',\n\t\t'placeholder',\n\t\t'value',\n\t\t'defaultValue',\n\t\t'inputValue',\n\t\t'defaultInputValue',\n\t\t'onChange',\n\t\t'onInputChange',\n\t\t'open',\n\t\t'defaultOpen',\n\t\t'onOpenChange',\n\t\t'disabled',\n\t\t'readOnly',\n\t\t'required',\n\t\t'name',\n\t\t'closeOnSelection',\n\t\t'onFocusOut',\n\t]);\n\tconst resolvedChildren = children(() => local.children);\n\n\tconst rootId = createUniqueId();\n\tconst [rootRef, setRootRef] = createSignal<HTMLDivElement>();\n\tconst [inputRef, setInputRef] = createSignal<HTMLInputElement>();\n\tconst [internalValue, setInternalValue] = createSignal<TOption | null>(local.defaultValue ?? null);\n\tconst [internalOpen, setInternalOpen] = createSignal(Boolean(local.defaultOpen));\n\tconst [internalInputValue, setInternalInputValue] = createSignal(local.defaultInputValue ?? '');\n\tconst [filterValue, setFilterValue] = createSignal('');\n\tconst [highlightedKey, setHighlightedKey] = createSignal<string | null>(null);\n\tconst [shouldScrollHighlightedItem, setShouldScrollHighlightedItem] = createSignal(false);\n\tconst isControlledValue = () => local.value !== undefined;\n\tconst isControlledInputValue = () => local.inputValue !== undefined;\n\tconst isControlledOpen = () => local.open !== undefined;\n\tconst filter = createMemo(() => createContainsFilter<TOption>());\n\tconst inputValue = createMemo(() => {\n\t\tif (isControlledInputValue()) {\n\t\t\treturn local.inputValue ?? '';\n\t\t}\n\n\t\treturn internalInputValue();\n\t});\n\n\tconst normalizedGroups = createMemo<Array<ComboboxGroupData<TOptionGroup, TOption>>>(() => {\n\t\tconst groups: Array<ComboboxGroupData<TOptionGroup, TOption>> = [];\n\t\tconst looseItems: ComboboxItemData<TOption>[] = [];\n\t\tlet itemIndex = 0;\n\n\t\tfor (let index = 0; index < local.options.length; index += 1) {\n\t\t\tconst entry = local.options[index] as TOption | TOptionGroup;\n\t\t\tconst groupChildren = resolveGroupChildren(entry as TOptionGroup, local.optionGroupChildren);\n\n\t\t\tif (groupChildren !== undefined) {\n\t\t\t\tconst groupItems = groupChildren.map((option) => {\n\t\t\t\t\tconst value = String(resolveAccessor(option, local.optionValue, defaultTextValue));\n\t\t\t\t\tconst label = resolveAccessor(option, local.optionLabel, defaultTextValue);\n\t\t\t\t\tconst textValue = resolveAccessor(option, local.optionTextValue, () => label);\n\t\t\t\t\tconst disabled = Boolean(resolveAccessor(option, local.optionDisabled, () => false));\n\t\t\t\t\tconst item = {\n\t\t\t\t\t\tkey: `${value}-${itemIndex}`,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\ttextValue,\n\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\trawValue: option,\n\t\t\t\t\t};\n\n\t\t\t\t\titemIndex += 1;\n\n\t\t\t\t\treturn item;\n\t\t\t\t});\n\n\t\t\t\tgroups.push({\n\t\t\t\t\tkey: `group-${index}`,\n\t\t\t\t\ttextValue: defaultTextValue(entry),\n\t\t\t\t\trawValue: entry as TOptionGroup,\n\t\t\t\t\titems: groupItems,\n\t\t\t\t});\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst option = entry as TOption;\n\t\t\tconst value = String(resolveAccessor(option, local.optionValue, defaultTextValue));\n\t\t\tconst label = resolveAccessor(option, local.optionLabel, defaultTextValue);\n\t\t\tconst textValue = resolveAccessor(option, local.optionTextValue, () => label);\n\t\t\tconst disabled = Boolean(resolveAccessor(option, local.optionDisabled, () => false));\n\n\t\t\tlooseItems.push({\n\t\t\t\tkey: `${value}-${itemIndex}`,\n\t\t\t\tvalue,\n\t\t\t\tlabel,\n\t\t\t\ttextValue,\n\t\t\t\tdisabled,\n\t\t\t\trawValue: option,\n\t\t\t});\n\n\t\t\titemIndex += 1;\n\t\t}\n\n\t\tif (looseItems.length > 0) {\n\t\t\tgroups.unshift({\n\t\t\t\tkey: 'group-root',\n\t\t\t\ttextValue: '',\n\t\t\t\titems: looseItems,\n\t\t\t});\n\t\t}\n\n\t\treturn groups;\n\t});\n\n\tconst allItems = createMemo(() => normalizedGroups().flatMap((group) => group.items));\n\n\tconst selectedItem = createMemo(() => {\n\t\tlet selectedOption = internalValue();\n\n\t\tif (isControlledValue()) {\n\t\t\tselectedOption = local.value ?? null;\n\t\t}\n\n\t\tif (selectedOption == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst selectedValue = String(\n\t\t\tresolveAccessor<TOption, string | number>(\n\t\t\t\tselectedOption as TOption,\n\t\t\t\tlocal.optionValue,\n\t\t\t\tdefaultTextValue as (value: TOption) => string | number,\n\t\t\t),\n\t\t);\n\n\t\treturn allItems().find((item) => item.value === selectedValue) ?? null;\n\t});\n\n\tconst visibleGroups = createMemo(() => {\n\t\tconst currentInput = filterValue().trim();\n\n\t\treturn normalizedGroups()\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\titems: group.items.filter((item) => filter()(item.rawValue, currentInput)),\n\t\t\t}))\n\t\t\t.filter((group) => group.items.length > 0);\n\t});\n\n\tconst visibleItems = createMemo(() => visibleGroups().flatMap((group) => group.items));\n\tconst isOpen = createMemo(\n\t\t() => (isControlledOpen() ? Boolean(local.open) : internalOpen()) && visibleItems().length > 0,\n\t);\n\n\tconst setOpen = (value: boolean) => {\n\t\tif (!isControlledOpen()) {\n\t\t\tsetInternalOpen(value);\n\t\t}\n\n\t\tlocal.onOpenChange?.(value);\n\t};\n\n\tconst setSelectedOption = (value: TOption | null) => {\n\t\tif (!isControlledValue()) {\n\t\t\tsetInternalValue(() => value);\n\t\t}\n\n\t\tlocal.onChange?.(value);\n\t};\n\n\tconst setDisplayedInputValue = (value: string, emitChange = false) => {\n\t\tif (!isControlledInputValue()) {\n\t\t\tsetInternalInputValue(value);\n\t\t}\n\n\t\tif (emitChange) {\n\t\t\tlocal.onInputChange?.(value);\n\t\t}\n\t};\n\n\tconst restoreInputFromSelection = () => {\n\t\tsetDisplayedInputValue(selectedItem()?.label ?? '', isControlledInputValue());\n\t\tsetFilterValue('');\n\t};\n\n\tconst highlightByIndex = (index: number) => {\n\t\tconst items = visibleItems();\n\n\t\tif (items.length === 0) {\n\t\t\tsetShouldScrollHighlightedItem(false);\n\t\t\tsetHighlightedKey(null);\n\t\t\treturn;\n\t\t}\n\n\t\tconst boundedIndex = Math.min(Math.max(index, 0), items.length - 1);\n\t\tsetShouldScrollHighlightedItem(true);\n\t\tsetHighlightedKey(items[boundedIndex]?.key ?? null);\n\t};\n\n\tconst highlightFirst = () => highlightByIndex(0);\n\tconst highlightLast = () => highlightByIndex(visibleItems().length - 1);\n\n\tconst highlightNext = () => {\n\t\tconst items = visibleItems();\n\t\tconst index = items.findIndex((item) => item.key === highlightedKey());\n\t\thighlightByIndex(index >= 0 ? index + 1 : 0);\n\t};\n\n\tconst highlightPrevious = () => {\n\t\tconst items = visibleItems();\n\t\tconst index = items.findIndex((item) => item.key === highlightedKey());\n\t\thighlightByIndex(index >= 0 ? index - 1 : items.length - 1);\n\t};\n\n\tconst openPopup = (strategy: 'first' | 'last' | 'preserve' = 'first') => {\n\t\tif (local.disabled || local.readOnly || visibleItems().length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetOpen(true);\n\n\t\tif (strategy === 'last') {\n\t\t\thighlightLast();\n\t\t\treturn;\n\t\t}\n\n\t\tif (strategy === 'preserve') {\n\t\t\tif (highlightedKey() !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (selectedItem()) {\n\t\t\t\tsetShouldScrollHighlightedItem(true);\n\t\t\t\tsetHighlightedKey(selectedItem()!.key);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\thighlightFirst();\n\t};\n\n\tconst openAllOptions = (strategy: 'first' | 'last' | 'preserve' = 'first') => {\n\t\tif (local.disabled || local.readOnly || allItems().length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetFilterValue('');\n\t\tsetOpen(true);\n\n\t\tif (strategy === 'last') {\n\t\t\thighlightLast();\n\t\t\treturn;\n\t\t}\n\n\t\tif (strategy === 'preserve') {\n\t\t\tif (highlightedKey() !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (selectedItem()) {\n\t\t\t\tsetShouldScrollHighlightedItem(true);\n\t\t\t\tsetHighlightedKey(selectedItem()!.key);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\thighlightFirst();\n\t};\n\n\tconst closePopup = (restoreInput = true) => {\n\t\tsetOpen(false);\n\t\tsetShouldScrollHighlightedItem(false);\n\t\tsetHighlightedKey(null);\n\n\t\tif (restoreInput) {\n\t\t\trestoreInputFromSelection();\n\t\t}\n\t};\n\n\tconst selectItem = (item: ComboboxItemData<TOption>) => {\n\t\tif (item.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedOption(item.rawValue);\n\t\tsetDisplayedInputValue(item.label);\n\t\tsetFilterValue('');\n\t\tsetShouldScrollHighlightedItem(false);\n\t\tsetHighlightedKey(item.key);\n\n\t\tif (local.closeOnSelection) {\n\t\t\tsetOpen(false);\n\t\t}\n\n\t\tinputRef()?.focus();\n\t};\n\n\tconst clearPendingInput = () => {\n\t\tif (selectedItem() === null) {\n\t\t\tsetDisplayedInputValue('', isControlledInputValue());\n\t\t\tsetFilterValue('');\n\t\t\treturn;\n\t\t}\n\n\t\trestoreInputFromSelection();\n\t};\n\n\tconst clearSelectedItem = () => {\n\t\tsetSelectedOption(null);\n\t\tsetDisplayedInputValue('', true);\n\t\tsetFilterValue('');\n\t\tsetShouldScrollHighlightedItem(false);\n\t\tsetHighlightedKey(null);\n\t\tsetOpen(false);\n\t\tinputRef()?.focus();\n\t};\n\n\tcreateEffect(() => {\n\t\tif (!isControlledValue()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (selectedItem() !== null) {\n\t\t\trestoreInputFromSelection();\n\t\t\treturn;\n\t\t}\n\n\t\tsetFilterValue('');\n\n\t\tif (!isControlledInputValue()) {\n\t\t\tsetDisplayedInputValue('');\n\t\t}\n\t});\n\n\tcreateEffect(() => {\n\t\tconst items = visibleItems();\n\t\tconst selected = selectedItem();\n\n\t\tif (items.length === 0) {\n\t\t\tsetShouldScrollHighlightedItem(false);\n\t\t\tsetHighlightedKey(null);\n\t\t\tsetOpen(false);\n\t\t\treturn;\n\t\t}\n\n\t\tif (highlightedKey() && items.some((item) => item.key === highlightedKey())) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (isOpen()) {\n\t\t\tif (selected && items.some((item) => item.key === selected.key)) {\n\t\t\t\tsetShouldScrollHighlightedItem(true);\n\t\t\t\tsetHighlightedKey(selected.key);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thighlightFirst();\n\t\t}\n\t});\n\n\tonMount(() => {\n\t\trestoreInputFromSelection();\n\n\t\tconst handlePointerDown = (event: PointerEvent) => {\n\t\t\tconst root = rootRef();\n\n\t\t\tif (!root || root.contains(event.target as Node)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclosePopup(true);\n\t\t};\n\n\t\tdocument.addEventListener('pointerdown', handlePointerDown);\n\n\t\tonCleanup(() => {\n\t\t\tdocument.removeEventListener('pointerdown', handlePointerDown);\n\t\t});\n\t});\n\n\tconst context: ComboboxContextValue<TOption, TOptionGroup> = {\n\t\trootId,\n\t\trootRef,\n\t\tsetRootRef,\n\t\tinputRef,\n\t\tsetInputRef,\n\t\tinputValue,\n\t\tsetInputValue: (value) => {\n\t\t\tconst selected = selectedItem();\n\n\t\t\tif (selected && value !== selected.label) {\n\t\t\t\tsetSelectedOption(null);\n\t\t\t}\n\n\t\t\tsetDisplayedInputValue(value, true);\n\t\t\tsetFilterValue(value);\n\n\t\t\tif (value.trim() === '') {\n\t\t\t\tclosePopup(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\topenPopup('first');\n\t\t},\n\t\tisOpen,\n\t\topenPopup,\n\t\topenAllOptions,\n\t\tclosePopup,\n\t\ttogglePopup: () => {\n\t\t\tif (isOpen()) {\n\t\t\t\tclosePopup(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\topenPopup('first');\n\t\t},\n\t\tvisibleGroups,\n\t\tvisibleItems,\n\t\tselectedItem,\n\t\thighlightedKey,\n\t\tshouldScrollHighlightedItem,\n\t\tsetHighlightedKey: (key) => {\n\t\t\tsetShouldScrollHighlightedItem(false);\n\t\t\tsetHighlightedKey(key);\n\t\t},\n\t\thighlightNext,\n\t\thighlightPrevious,\n\t\thighlightFirst,\n\t\thighlightLast,\n\t\tselectItem,\n\t\tgetItemId: (key) => `${rootId}-item-${key}`,\n\t\titemComponent: local.itemComponent,\n\t\tgroupComponent: local.groupComponent,\n\t\tplaceholder: () => local.placeholder,\n\t\tdisabled: () => Boolean(local.disabled),\n\t\treadOnly: () => Boolean(local.readOnly),\n\t\trequired: () => Boolean(local.required),\n\t\tname: () => local.name,\n\t\tclearPendingInput,\n\t\tclearSelectedItem,\n\t};\n\n\tconst rootClass = () => clsx(comboboxClass.root, local.class);\n\n\tconst handleFocusOut: JSX.FocusEventHandlerUnion<HTMLDivElement, FocusEvent> = (event) => {\n\t\tcallEventHandler(local.onFocusOut, event);\n\n\t\tconst nextTarget = event.relatedTarget as Node | null;\n\n\t\tif (nextTarget && rootRef()?.contains(nextTarget)) {\n\t\t\treturn;\n\t\t}\n\n\t\tqueueMicrotask(() => {\n\t\t\tconst activeElement = document.activeElement;\n\n\t\t\tif (activeElement instanceof Node && rootRef()?.contains(activeElement)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclosePopup(true);\n\t\t});\n\t};\n\n\treturn (\n\t\t<ComboboxContext.Provider value={context}>\n\t\t\t<div\n\t\t\t\tclass={rootClass()}\n\t\t\t\tref={setRootRef}\n\t\t\t\tonFocusOut={handleFocusOut}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{local.children ? (\n\t\t\t\t\tresolvedChildren()\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ComboboxControl>\n\t\t\t\t\t\t\t<ComboboxInput aria-label={local.placeholder ?? 'Combobox'} />\n\t\t\t\t\t\t\t<ComboboxTrigger />\n\t\t\t\t\t\t</ComboboxControl>\n\t\t\t\t\t\t<ComboboxPortal>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxListbox />\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</ComboboxPortal>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</ComboboxContext.Provider>\n\t);\n}\n"]}
@@ -15,12 +15,14 @@ export interface ComboboxContextValue<TOption, TOptionGroup> {
15
15
  setInputValue: (value: string) => void;
16
16
  isOpen: Accessor<boolean>;
17
17
  openPopup: (strategy?: 'first' | 'last' | 'preserve') => void;
18
+ openAllOptions: (strategy?: 'first' | 'last' | 'preserve') => void;
18
19
  closePopup: (restoreInput?: boolean) => void;
19
20
  togglePopup: () => void;
20
21
  visibleGroups: Accessor<Array<ComboboxGroupData<TOptionGroup, TOption>>>;
21
22
  visibleItems: Accessor<Array<ComboboxItemData<TOption>>>;
22
23
  selectedItem: Accessor<ComboboxItemData<TOption> | null>;
23
24
  highlightedKey: Accessor<string | null>;
25
+ shouldScrollHighlightedItem: Accessor<boolean>;
24
26
  setHighlightedKey: (key: string | null) => void;
25
27
  highlightNext: () => void;
26
28
  highlightPrevious: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/components/combobox/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,aAAa,EAAe,UAAU,EAAE,MAAM,UAAU,CAAC;AA2CjG,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,EAAkC,CAAC;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,EAA0B,CAAC;AAE3E,MAAM,UAAU,kBAAkB;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAsD,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,OAAqC,CAAC;AAC9C,CAAC","sourcesContent":["import { type Accessor, type Component, createContext, type Setter, useContext } from 'solid-js';\nimport type { ComboboxGroupData, ComboboxItemData, ComboboxRenderGroupProps, ComboboxRenderItemProps } from './types';\n\ninterface ComboboxItemState<TOption> {\n\titem: ComboboxItemData<TOption>;\n\tselected: boolean;\n\thighlighted: boolean;\n}\n\nexport interface ComboboxContextValue<TOption, TOptionGroup> {\n\trootId: string;\n\trootRef: Accessor<HTMLDivElement | undefined>;\n\tsetRootRef: Setter<HTMLDivElement | undefined>;\n\tinputRef: Accessor<HTMLInputElement | undefined>;\n\tsetInputRef: Setter<HTMLInputElement | undefined>;\n\tinputValue: Accessor<string>;\n\tsetInputValue: (value: string) => void;\n\tisOpen: Accessor<boolean>;\n\topenPopup: (strategy?: 'first' | 'last' | 'preserve') => void;\n\tclosePopup: (restoreInput?: boolean) => void;\n\ttogglePopup: () => void;\n\tvisibleGroups: Accessor<Array<ComboboxGroupData<TOptionGroup, TOption>>>;\n\tvisibleItems: Accessor<Array<ComboboxItemData<TOption>>>;\n\tselectedItem: Accessor<ComboboxItemData<TOption> | null>;\n\thighlightedKey: Accessor<string | null>;\n\tsetHighlightedKey: (key: string | null) => void;\n\thighlightNext: () => void;\n\thighlightPrevious: () => void;\n\thighlightFirst: () => void;\n\thighlightLast: () => void;\n\tselectItem: (item: ComboboxItemData<TOption>) => void;\n\tgetItemId: (key: string) => string;\n\titemComponent?: Component<ComboboxRenderItemProps<TOption>>;\n\tgroupComponent?: Component<ComboboxRenderGroupProps<TOptionGroup, TOption>>;\n\tplaceholder: Accessor<string | undefined>;\n\tdisabled: Accessor<boolean>;\n\treadOnly: Accessor<boolean>;\n\trequired: Accessor<boolean>;\n\tname: Accessor<string | undefined>;\n\tclearPendingInput: () => void;\n\tclearSelectedItem: () => void;\n}\n\nexport const ComboboxContext = createContext<ComboboxContextValue<any, any>>();\nexport const ComboboxItemContext = createContext<ComboboxItemState<any>>();\n\nexport function useComboboxContext<TOption, TOptionGroup>() {\n\tconst context = useContext(ComboboxContext);\n\n\tif (!context) {\n\t\tthrow new Error('Combobox components must be used within Combobox.');\n\t}\n\n\treturn context as ComboboxContextValue<TOption, TOptionGroup>;\n}\n\nexport function useComboboxItemContext<TOption>() {\n\tconst context = useContext(ComboboxItemContext);\n\n\tif (!context) {\n\t\tthrow new Error('Combobox item parts must be used within Combobox.Item.');\n\t}\n\n\treturn context as ComboboxItemState<TOption>;\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/components/combobox/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,aAAa,EAAe,UAAU,EAAE,MAAM,UAAU,CAAC;AA6CjG,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,EAAkC,CAAC;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,EAA0B,CAAC;AAE3E,MAAM,UAAU,kBAAkB;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAsD,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,OAAqC,CAAC;AAC9C,CAAC","sourcesContent":["import { type Accessor, type Component, createContext, type Setter, useContext } from 'solid-js';\nimport type { ComboboxGroupData, ComboboxItemData, ComboboxRenderGroupProps, ComboboxRenderItemProps } from './types';\n\ninterface ComboboxItemState<TOption> {\n\titem: ComboboxItemData<TOption>;\n\tselected: boolean;\n\thighlighted: boolean;\n}\n\nexport interface ComboboxContextValue<TOption, TOptionGroup> {\n\trootId: string;\n\trootRef: Accessor<HTMLDivElement | undefined>;\n\tsetRootRef: Setter<HTMLDivElement | undefined>;\n\tinputRef: Accessor<HTMLInputElement | undefined>;\n\tsetInputRef: Setter<HTMLInputElement | undefined>;\n\tinputValue: Accessor<string>;\n\tsetInputValue: (value: string) => void;\n\tisOpen: Accessor<boolean>;\n\topenPopup: (strategy?: 'first' | 'last' | 'preserve') => void;\n\topenAllOptions: (strategy?: 'first' | 'last' | 'preserve') => void;\n\tclosePopup: (restoreInput?: boolean) => void;\n\ttogglePopup: () => void;\n\tvisibleGroups: Accessor<Array<ComboboxGroupData<TOptionGroup, TOption>>>;\n\tvisibleItems: Accessor<Array<ComboboxItemData<TOption>>>;\n\tselectedItem: Accessor<ComboboxItemData<TOption> | null>;\n\thighlightedKey: Accessor<string | null>;\n\tshouldScrollHighlightedItem: Accessor<boolean>;\n\tsetHighlightedKey: (key: string | null) => void;\n\thighlightNext: () => void;\n\thighlightPrevious: () => void;\n\thighlightFirst: () => void;\n\thighlightLast: () => void;\n\tselectItem: (item: ComboboxItemData<TOption>) => void;\n\tgetItemId: (key: string) => string;\n\titemComponent?: Component<ComboboxRenderItemProps<TOption>>;\n\tgroupComponent?: Component<ComboboxRenderGroupProps<TOptionGroup, TOption>>;\n\tplaceholder: Accessor<string | undefined>;\n\tdisabled: Accessor<boolean>;\n\treadOnly: Accessor<boolean>;\n\trequired: Accessor<boolean>;\n\tname: Accessor<string | undefined>;\n\tclearPendingInput: () => void;\n\tclearSelectedItem: () => void;\n}\n\nexport const ComboboxContext = createContext<ComboboxContextValue<any, any>>();\nexport const ComboboxItemContext = createContext<ComboboxItemState<any>>();\n\nexport function useComboboxContext<TOption, TOptionGroup>() {\n\tconst context = useContext(ComboboxContext);\n\n\tif (!context) {\n\t\tthrow new Error('Combobox components must be used within Combobox.');\n\t}\n\n\treturn context as ComboboxContextValue<TOption, TOptionGroup>;\n}\n\nexport function useComboboxItemContext<TOption>() {\n\tconst context = useContext(ComboboxItemContext);\n\n\tif (!context) {\n\t\tthrow new Error('Combobox item parts must be used within Combobox.Item.');\n\t}\n\n\treturn context as ComboboxItemState<TOption>;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  @layer components {
2
2
  .fl-dropdown-menu_trigger {
3
3
  /* layout */
4
+ --fl-button-active-translate-y: 0;
4
5
  --fl-button-pad-x: var(--fl-size-2);
5
6
  }
6
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edo-w/flatline-solid",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/edo-w/flatline.git"