react-next-select 0.1.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.
- package/LICENSE +21 -0
- package/README.md +380 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +597 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +59 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yogesh Gabani
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
# react-next-select
|
|
2
|
+
|
|
3
|
+
> Accessible, SSR-safe React Select component for Next.js — single/multi, async, fully customizable.
|
|
4
|
+
|
|
5
|
+
Built in JavaScript (ES6+) with no external runtime dependencies, ships ESM + CJS, and works out of the box with the Next.js App Router and Pages Router.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- Single select and multi-select
|
|
10
|
+
- Searchable dropdown (inline or a separate in-menu search input)
|
|
11
|
+
- Async options loading with race-condition-safe requests
|
|
12
|
+
- Custom option / control / menu / indicator rendering
|
|
13
|
+
- Full keyboard navigation (Arrow / Home / End / Enter / Esc / Tab)
|
|
14
|
+
- Clearable input
|
|
15
|
+
- Disabled and loading states
|
|
16
|
+
- Controlled and uncontrolled support (`value`, `inputValue`, `menuIsOpen`)
|
|
17
|
+
- Hidden `<input name>` for native form submission
|
|
18
|
+
- SSR-safe behavior for Next.js (no `window`/`document` access on render)
|
|
19
|
+
- Zero runtime dependencies; React 18 and React 19 both supported
|
|
20
|
+
|
|
21
|
+
## Requirements
|
|
22
|
+
|
|
23
|
+
- React `^18.0.0` or `^19.0.0`
|
|
24
|
+
- React DOM `^18.0.0` or `^19.0.0`
|
|
25
|
+
- Node `>=16` (for build tooling only)
|
|
26
|
+
|
|
27
|
+
## Installation
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install react-next-select
|
|
31
|
+
# or
|
|
32
|
+
yarn add react-next-select
|
|
33
|
+
# or
|
|
34
|
+
pnpm add react-next-select
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Import the default stylesheet once in your app:
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
import 'react-next-select/style.css'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Next.js Usage
|
|
44
|
+
|
|
45
|
+
### App Router (`app/page.js`)
|
|
46
|
+
|
|
47
|
+
```jsx
|
|
48
|
+
'use client'
|
|
49
|
+
|
|
50
|
+
import { useState } from 'react'
|
|
51
|
+
import { Select } from 'react-next-select'
|
|
52
|
+
import 'react-next-select/style.css'
|
|
53
|
+
|
|
54
|
+
const options = [
|
|
55
|
+
{ value: 'next', label: 'Next.js' },
|
|
56
|
+
{ value: 'vite', label: 'Vite' },
|
|
57
|
+
{ value: 'rollup', label: 'Rollup' },
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
export default function Page() {
|
|
61
|
+
const [value, setValue] = useState(null)
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<Select
|
|
65
|
+
options={options}
|
|
66
|
+
value={value}
|
|
67
|
+
onChange={setValue}
|
|
68
|
+
isClearable
|
|
69
|
+
placeholder="Pick one..."
|
|
70
|
+
/>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
> The `'use client'` directive is required because `Select` is a client component (it manages local state and DOM focus).
|
|
76
|
+
|
|
77
|
+
### Pages Router (`pages/index.js`)
|
|
78
|
+
|
|
79
|
+
```jsx
|
|
80
|
+
import { useState } from 'react'
|
|
81
|
+
import { Select } from 'react-next-select'
|
|
82
|
+
import 'react-next-select/style.css'
|
|
83
|
+
|
|
84
|
+
const options = [
|
|
85
|
+
{ value: 'next', label: 'Next.js' },
|
|
86
|
+
{ value: 'vite', label: 'Vite' },
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
export default function Home() {
|
|
90
|
+
const [value, setValue] = useState(null)
|
|
91
|
+
return <Select options={options} value={value} onChange={setValue} />
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Multi-select
|
|
96
|
+
|
|
97
|
+
```jsx
|
|
98
|
+
<Select
|
|
99
|
+
isMulti
|
|
100
|
+
options={options}
|
|
101
|
+
value={value}
|
|
102
|
+
onChange={setValue}
|
|
103
|
+
isClearable
|
|
104
|
+
/>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Async options
|
|
108
|
+
|
|
109
|
+
```jsx
|
|
110
|
+
<Select
|
|
111
|
+
loadOptions={async (input) => {
|
|
112
|
+
const res = await fetch(`/api/search?q=${encodeURIComponent(input)}`)
|
|
113
|
+
return res.json()
|
|
114
|
+
}}
|
|
115
|
+
defaultOptions
|
|
116
|
+
placeholder="Search users..."
|
|
117
|
+
/>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## API
|
|
121
|
+
|
|
122
|
+
### Exports
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
import {
|
|
126
|
+
Select, // main component
|
|
127
|
+
defaultComponents, // default subcomponent map (Control, Option, Menu, ...)
|
|
128
|
+
mergeStyles, // helper to merge styles from the `styles` prop
|
|
129
|
+
SelectContext, // React context exposing internal state
|
|
130
|
+
useSelectContext, // hook to read SelectContext from custom components
|
|
131
|
+
} from 'react-next-select'
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Props
|
|
135
|
+
|
|
136
|
+
| Prop | Type | Default | Description |
|
|
137
|
+
| --- | --- | --- | --- |
|
|
138
|
+
| `options` | `Option[]` | `[]` | List of selectable options. |
|
|
139
|
+
| `value` | `Option \| Option[]` | — | Controlled selected value. |
|
|
140
|
+
| `defaultValue` | `Option \| Option[]` | `null` / `[]` | Uncontrolled initial value. |
|
|
141
|
+
| `onChange` | `(value, meta) => void` | — | Selection change callback. `meta.action` is one of `select-option`, `remove-value`, `clear`. |
|
|
142
|
+
| `isMulti` | `boolean` | `false` | Allow multiple values. |
|
|
143
|
+
| `isSearchable` | `boolean` | `true` | Enable search input. |
|
|
144
|
+
| `isClearable` | `boolean` | `false` | Show clear icon when a value is selected. |
|
|
145
|
+
| `isDisabled` | `boolean` | `false` | Disable the control. |
|
|
146
|
+
| `isLoading` | `boolean` | `false` | Show loading message in the menu. |
|
|
147
|
+
| `loadOptions` | `(inputValue) => Promise<Option[]>` | — | Async loader. Enables async mode. |
|
|
148
|
+
| `defaultOptions` | `boolean \| Option[]` | `false` | Preload options for async mode. |
|
|
149
|
+
| `filterOption` | `(option, input) => boolean` | — | Custom option filter for sync mode. |
|
|
150
|
+
| `getOptionValue` | `(option) => string` | `o => o.value` | Extract value from an option. |
|
|
151
|
+
| `getOptionLabel` | `(option) => string` | `o => o.label` | Extract label from an option. |
|
|
152
|
+
| `placeholder` | `string` | `'Select...'` | Placeholder text. |
|
|
153
|
+
| `noOptionsMessage` | `({ inputValue }) => string` | `() => 'No options'` | Message when filter returns nothing. |
|
|
154
|
+
| `loadingMessage` | `({ inputValue }) => string` | `() => 'Loading...'` | Message while async loading. |
|
|
155
|
+
| `inputValue` | `string` | — | Controlled search input. |
|
|
156
|
+
| `defaultInputValue` | `string` | `''` | Uncontrolled initial input value. |
|
|
157
|
+
| `onInputChange` | `(value, meta) => void` | — | Search input callback. |
|
|
158
|
+
| `menuIsOpen` | `boolean` | — | Controlled menu open state. |
|
|
159
|
+
| `onMenuOpen` / `onMenuClose` | `() => void` | — | Menu lifecycle callbacks. |
|
|
160
|
+
| `closeMenuOnSelect` | `boolean` | `!isMulti` | Close menu after selecting an option. |
|
|
161
|
+
| `blurInputOnSelect` | `boolean` | `true` | Blur the input after selecting. |
|
|
162
|
+
| `menuPlacement` | `'bottom' \| 'top'` | `'bottom'` | Menu placement relative to control. |
|
|
163
|
+
| `showMenuSearchInput` | `boolean` | `false` | Render a separate search input inside the menu. |
|
|
164
|
+
| `menuSearchPlaceholder` | `string` | `'Search...'` | Placeholder for the in-menu search input. |
|
|
165
|
+
| `menuSearchInputProps` | `object` | `{}` | Extra props for the in-menu search `<input>`. |
|
|
166
|
+
| `components` | `object` | — | Override internal subcomponents (`Control`, `Option`, `Menu`, `MenuList`, `Input`, `DropdownIndicator`, `ClearIndicator`, `SingleValue`, `MultiValue`, `LoadingMessage`, `NoOptionsMessage`). |
|
|
167
|
+
| `styles` | `object` | `{}` | Style override map (see Styling). |
|
|
168
|
+
| `formatOptionLabel` | `(option, { context }) => ReactNode` | — | Custom label renderer. `context` is `'menu'` or `'value'`. |
|
|
169
|
+
| `className` | `string` | — | Extra class on the wrapper. |
|
|
170
|
+
| `classNamePrefix` | `string` | `'rns'` | Prefix for inner element classNames. |
|
|
171
|
+
| `style` | `object` | — | Inline style on the wrapper. |
|
|
172
|
+
| `name` | `string` | — | Render a hidden `<input>` with the serialized value for form submission. |
|
|
173
|
+
| `id` | `string` | auto | Base id; used for the listbox and option ids. |
|
|
174
|
+
| `aria-label` / `aria-labelledby` | `string` | — | Accessibility labels. |
|
|
175
|
+
| `tabIndex` | `number` | `0` | Tab index on the control. |
|
|
176
|
+
|
|
177
|
+
`Option` is any object — `{ value, label }` by default — or anything else if you provide `getOptionValue` / `getOptionLabel`.
|
|
178
|
+
|
|
179
|
+
## Styling
|
|
180
|
+
|
|
181
|
+
Two styling strategies are supported and can be combined.
|
|
182
|
+
|
|
183
|
+
### 1) CSS override (recommended)
|
|
184
|
+
|
|
185
|
+
```jsx
|
|
186
|
+
import { Select } from 'react-next-select'
|
|
187
|
+
import 'react-next-select/style.css'
|
|
188
|
+
import './my-select-theme.css'
|
|
189
|
+
|
|
190
|
+
export default function Demo() {
|
|
191
|
+
return (
|
|
192
|
+
<Select
|
|
193
|
+
options={[
|
|
194
|
+
{ value: 'next', label: 'Next.js' },
|
|
195
|
+
{ value: 'vite', label: 'Vite' },
|
|
196
|
+
]}
|
|
197
|
+
className="mySelect"
|
|
198
|
+
classNamePrefix="mySelect"
|
|
199
|
+
isClearable
|
|
200
|
+
showMenuSearchInput
|
|
201
|
+
menuSearchPlaceholder="Search options..."
|
|
202
|
+
/>
|
|
203
|
+
)
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
`my-select-theme.css`
|
|
208
|
+
|
|
209
|
+
```css
|
|
210
|
+
.mySelect__wrapper .rns__control {
|
|
211
|
+
border: 1px solid #7c3aed;
|
|
212
|
+
border-radius: 10px;
|
|
213
|
+
background: #faf5ff;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.mySelect__wrapper .rns__control:focus-within {
|
|
217
|
+
border-color: #6d28d9;
|
|
218
|
+
box-shadow: 0 0 0 2px rgba(109, 40, 217, 0.25);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.mySelect__wrapper .rns__multi-value {
|
|
222
|
+
background: #ede9fe;
|
|
223
|
+
color: #4c1d95;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.mySelect__wrapper .rns__menu-inner {
|
|
227
|
+
border: 1px solid #ddd6fe;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.mySelect__wrapper .rns__option:hover {
|
|
231
|
+
background: #f5f3ff;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.mySelect__wrapper .rns__option[aria-selected='true'] {
|
|
235
|
+
background: #ede9fe;
|
|
236
|
+
color: #5b21b6;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.mySelect__wrapper .rns__menu-search-input-wrap {
|
|
240
|
+
border-color: #c4b5fd;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.mySelect__wrapper .rns__menu-search-input {
|
|
244
|
+
color: #1f2937;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.mySelect__wrapper .rns__menu-search-input::placeholder {
|
|
248
|
+
color: #8b5cf6;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.mySelect__wrapper .rns__menu-search-icon {
|
|
252
|
+
color: #7c3aed;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.mySelect__wrapper .rns__menu-search-clear {
|
|
256
|
+
color: #7c3aed;
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 2) `styles` prop
|
|
261
|
+
|
|
262
|
+
```jsx
|
|
263
|
+
<Select
|
|
264
|
+
options={options}
|
|
265
|
+
styles={{
|
|
266
|
+
control: (base, state) => ({
|
|
267
|
+
...base,
|
|
268
|
+
borderColor: state.isFocused ? '#6d28d9' : '#c4b5fd',
|
|
269
|
+
background: '#faf5ff',
|
|
270
|
+
boxShadow: state.isFocused ? '0 0 0 2px rgba(109,40,217,0.25)' : 'none',
|
|
271
|
+
borderRadius: 10,
|
|
272
|
+
}),
|
|
273
|
+
menu: (base) => ({
|
|
274
|
+
...base,
|
|
275
|
+
border: '1px solid #ddd6fe',
|
|
276
|
+
borderRadius: 10,
|
|
277
|
+
}),
|
|
278
|
+
option: (base, state) => ({
|
|
279
|
+
...base,
|
|
280
|
+
background: state.isSelected ? '#ede9fe' : state.isFocused ? '#f5f3ff' : '#fff',
|
|
281
|
+
color: state.isSelected ? '#5b21b6' : '#111827',
|
|
282
|
+
}),
|
|
283
|
+
multiValue: (base) => ({
|
|
284
|
+
...base,
|
|
285
|
+
background: '#ede9fe',
|
|
286
|
+
color: '#4c1d95',
|
|
287
|
+
}),
|
|
288
|
+
}}
|
|
289
|
+
/>
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Custom Components
|
|
293
|
+
|
|
294
|
+
Override any subcomponent through the `components` prop.
|
|
295
|
+
|
|
296
|
+
```jsx
|
|
297
|
+
function MyOption({ innerProps, data, isFocused }) {
|
|
298
|
+
return (
|
|
299
|
+
<div
|
|
300
|
+
{...innerProps}
|
|
301
|
+
style={{
|
|
302
|
+
padding: '10px 12px',
|
|
303
|
+
background: isFocused ? '#eff6ff' : '#fff',
|
|
304
|
+
}}
|
|
305
|
+
>
|
|
306
|
+
<strong>{data.label}</strong>
|
|
307
|
+
</div>
|
|
308
|
+
)
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
<Select
|
|
312
|
+
options={options}
|
|
313
|
+
components={{
|
|
314
|
+
Option: MyOption,
|
|
315
|
+
}}
|
|
316
|
+
/>
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Overridable component keys: `Control`, `ValueContainer`, `IndicatorsContainer`, `DropdownIndicator`, `ClearIndicator`, `Input`, `Menu`, `MenuList`, `Option`, `LoadingMessage`, `NoOptionsMessage`, `SingleValue`, `MultiValue`.
|
|
320
|
+
|
|
321
|
+
## Accessibility
|
|
322
|
+
|
|
323
|
+
- Control exposes `role="combobox"` with `aria-expanded`, `aria-controls`, `aria-haspopup="listbox"`.
|
|
324
|
+
- Each option exposes `role="option"` with `aria-selected`.
|
|
325
|
+
- The active option is tracked through `aria-activedescendant`.
|
|
326
|
+
- Pass `aria-label` or `aria-labelledby` to label the control when no visible label is associated.
|
|
327
|
+
|
|
328
|
+
## Build Output
|
|
329
|
+
|
|
330
|
+
- Bundler: Vite (library mode)
|
|
331
|
+
- Formats:
|
|
332
|
+
- ESM: `dist/index.js`
|
|
333
|
+
- CommonJS: `dist/index.cjs`
|
|
334
|
+
- Stylesheet: `dist/style.css`
|
|
335
|
+
- Sourcemaps included
|
|
336
|
+
- Peer dependencies: `react`, `react-dom` (kept external)
|
|
337
|
+
|
|
338
|
+
Build locally:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
npm install
|
|
342
|
+
npm run build
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
Watch mode while developing:
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
npm run dev
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
## Publishing to npm
|
|
352
|
+
|
|
353
|
+
The `prepublishOnly` script runs `npm run build` automatically, so a fresh `dist/` is produced before each publish.
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# 1. Bump the version
|
|
357
|
+
npm version patch # or: minor / major
|
|
358
|
+
|
|
359
|
+
# 2. Login (first time only)
|
|
360
|
+
npm login
|
|
361
|
+
|
|
362
|
+
# 3. Publish
|
|
363
|
+
npm publish --access public
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
## Local Example App
|
|
367
|
+
|
|
368
|
+
A Next.js example app is included at `examples/next-example`:
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
cd examples/next-example
|
|
372
|
+
npm install
|
|
373
|
+
npm run dev
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
## License
|
|
377
|
+
|
|
378
|
+
[MIT](./LICENSE) © 2026 **Yogesh Gabani**
|
|
379
|
+
|
|
380
|
+
Built by **Yogesh Gabani**.
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),a=require("react"),ee=a.createContext(null);function xe(){const n=a.useContext(ee);if(!n)throw new Error("Select subcomponents must be used within <Select />");return n}const vn=a.forwardRef(function(t,r){const{innerProps:i,children:h,style:c}=t;return s.jsx("div",{ref:r,className:"rns__control",style:c,...i,children:h})});function gn(n){const{innerProps:t,children:r}=n;return s.jsx("div",{className:"rns__value-container",...t,children:r})}function yn(n){const{innerProps:t,children:r}=n;return s.jsx("div",{className:"rns__indicators",...t,children:r})}function _n(n){const{innerProps:t}=n,r=xe();return s.jsx("button",{type:"button",className:"rns__indicator rns__dropdown-indicator","aria-hidden":!0,tabIndex:-1,...t,children:s.jsx("span",{className:"rns__dropdown-chevron","aria-hidden":!0,children:r.isOpen?"▲":"▼"})})}function Sn(n){const{innerProps:t}=n;return s.jsx("button",{type:"button",className:"rns__indicator rns__clear-indicator","aria-label":"Clear value",...t,children:"×"})}const Cn=a.forwardRef(function(t,r){const{innerProps:i}=t;return s.jsx("input",{ref:r,className:"rns__input",...i})});function bn(n){const{innerProps:t={},children:r}=n,{ref:i,className:h,...c}=t;return s.jsx("div",{ref:i,className:h??"rns__menu",...c,children:r})}function Pn(n){const{innerProps:t,children:r}=n;return s.jsx("div",{className:"rns__menu-list",role:"listbox",...t,children:r})}function Mn(n){const{innerProps:t,children:r,data:i}=n;return s.jsx("div",{className:"rns__option",role:"option",...t,children:r??(i==null?void 0:i.label)})}function jn(n){const{children:t}=n;return s.jsx("div",{className:"rns__loading-message",children:t??"Loading..."})}function In(n){const{children:t}=n;return s.jsx("div",{className:"rns__no-options",children:t??"No options"})}function Dn(n){const{children:t,data:r}=n;return s.jsx("div",{className:"rns__single-value",children:t??(r==null?void 0:r.label)})}function wn(n){const{children:t,data:r,removeProps:i}=n;return s.jsxs("div",{className:"rns__multi-value",children:[s.jsx("span",{className:"rns__multi-value__label",children:t??(r==null?void 0:r.label)}),s.jsx("button",{type:"button",className:"rns__multi-value__remove",...i,children:"×"})]})}const ve={Control:vn,ValueContainer:gn,IndicatorsContainer:yn,DropdownIndicator:_n,ClearIndicator:Sn,Input:Cn,Menu:bn,MenuList:Pn,Option:Mn,LoadingMessage:jn,NoOptionsMessage:In,SingleValue:Dn,MultiValue:wn},Nn=(n,t)=>{const r=t(n);return String(r??"").toLowerCase()};function On(n,t,r,i){if(!t)return n;const h=t.trim().toLowerCase();return h?typeof r=="function"?n.filter(c=>r(c,t)):n.filter(c=>Nn(c,i).includes(h)):n}function y(n,t,r,i){const h=n==null?void 0:n[t];return typeof h=="function"?h(r,i)||r:h&&typeof h=="object"?{...r,...h}:r}function Ln(n,t,r){return n===t?!0:!n||!t?!1:r(n)===r(t)}function Vn(n,t,r,i){return n?r&&Array.isArray(t)?t.some(h=>i(h)===i(n)):Ln(n,t,i):!1}function An(n={}){return{...ve,...n}}function kn(n){const{options:t=[],value:r,defaultValue:i,onChange:h,isMulti:c=!1,isSearchable:S=!0,showMenuSearchInput:O=!1,menuSearchPlaceholder:ge="Search...",menuSearchInputProps:ye={},isClearable:_e=!1,isDisabled:u=!1,isLoading:Se=!1,loadOptions:R,defaultOptions:F=!1,filterOption:ne,getOptionValue:g=e=>e==null?void 0:e.value,getOptionLabel:j=e=>e==null?void 0:e.label,placeholder:Ce="Select...",noOptionsMessage:be=()=>"No options",loadingMessage:Pe=()=>"Loading...",components:te,className:Me,classNamePrefix:A="rns",style:je,styles:_={},inputValue:re,defaultInputValue:Ie="",onInputChange:E,onMenuOpen:$,onMenuClose:q,menuIsOpen:se,closeMenuOnSelect:oe,blurInputOnSelect:ae=!0,menuPlacement:le="bottom",id:De,"aria-label":we,"aria-labelledby":Ne,name:ce,tabIndex:Oe=0,formatOptionLabel:L}=n,ie=oe!==void 0?oe:!c,Le=a.useId(),B=De??`rns-${Le.replace(/:/g,"")}`,K=`${B}-listbox`,T=r!==void 0,U=re!==void 0,G=se!==void 0,[Ve,Ae]=a.useState(i??(c?[]:null)),p=T?r:Ve,[ke,Re]=a.useState(Ie),m=U?re:ke,[Fe,Ee]=a.useState(!1),l=G?!!se:Fe,[V,I]=a.useState(0),[$e,J]=a.useState([]),[qe,ue]=a.useState(!1),[Q,de]=a.useState(!1),fe=a.useRef(null),k=a.useRef(null),pe=a.useRef(null),X=a.useRef(null),W=a.useRef(0),x=a.useMemo(()=>An(te),[te]),D=typeof R=="function",Be=Se||qe,We=a.useMemo(()=>D?[]:On(t,m,ne,j),[D,t,m,ne,j]),P=D?$e:We,M=a.useMemo(()=>c?Array.isArray(p)?p:[]:p?[p]:[],[c,p]),w=a.useCallback((e,o)=>{T||Ae(e),h==null||h(e,o)},[T,h]),z=a.useCallback(e=>{u||(G||Ee(e),e?$==null||$():q==null||q())},[u,G,$,q]),C=a.useCallback((e,o)=>{U||Re(e),E==null||E(e,{action:o,prevInputValue:m})},[U,E,m]),N=a.useCallback(()=>{l||z(!0)},[l,z]),b=a.useCallback(()=>{l&&(z(!1),C("","menu-close"),I(0))},[l,z,C]),H=a.useCallback(e=>{if(!R)return;const o=++W.current;ue(!0),Promise.resolve(R(e)).then(d=>{o===W.current&&J(Array.isArray(d)?d:[])}).catch(()=>{o===W.current&&J([])}).finally(()=>{o===W.current&&ue(!1)})},[R]);a.useEffect(()=>{D&&(F===!0?H(""):Array.isArray(F)&&J(F))},[D,F,H]),a.useEffect(()=>{!D||!l||H(m)},[D,l,m,H]),a.useEffect(()=>{if(typeof document>"u"||!l)return;const e=o=>{var f,v;const d=o.target;(f=fe.current)!=null&&f.contains(d)||(v=pe.current)!=null&&v.contains(d)||b()};return document.addEventListener("pointerdown",e,!0),()=>document.removeEventListener("pointerdown",e,!0)},[l,b]),a.useEffect(()=>{I(0)},[m,P.length,l]),a.useEffect(()=>{if(!(!l||!S||typeof document>"u")){if(O&&X.current){X.current.focus();return}k.current&&k.current.focus()}},[l,S,O]);const Y=a.useCallback(e=>{if(!(!e||u)){if(c){const o=Array.isArray(p)?p:[],d=o.some(v=>g(v)===g(e)),f=d?o.filter(v=>g(v)!==g(e)):[...o,e];w(f,{action:d?"remove-value":"select-option",option:e})}else w(e,{action:"select-option",option:e});ie?b():C("","input-change"),ae&&k.current&&typeof document<"u"&&k.current.blur()}},[u,c,p,g,w,ie,b,C,ae]),ze=a.useCallback(e=>{var f,v;(f=e==null?void 0:e.preventDefault)==null||f.call(e),(v=e==null?void 0:e.stopPropagation)==null||v.call(e);const o=p;w(c?[]:null,{action:"clear",removedValues:c?o:o?[o]:[]}),C("","clear")},[c,p,w,C]),me=a.useCallback(e=>{if(u)return;const{key:o}=e,d=P.length-1;if(o==="ArrowDown"){e.preventDefault(),l?I(f=>d<0?0:Math.min(f+1,d)):N();return}if(o==="ArrowUp"){e.preventDefault(),l?I(f=>d<0?0:Math.max(f-1,0)):N();return}if(o==="Home"&&l){e.preventDefault(),I(0);return}if(o==="End"&&l){e.preventDefault(),I(d<0?0:d);return}if(o==="Enter"&&l){e.preventDefault();const f=P[V];f&&Y(f);return}if(o==="Escape"&&l){e.preventDefault(),b();return}o==="Tab"&&l&&b()},[u,P,V,l,N,b,Y]),He=y(_,"container",{},{isDisabled:u}),Ke=y(_,"control",{},{isDisabled:u,isFocused:l}),Te=y(_,"menu",{},{placement:le}),Ue=y(_,"menuSearchWrap",{},{isDisabled:u,inputValue:m}),Ge=y(_,"menuSearchInputWrap",{},{isDisabled:u,inputValue:m,isFocused:Q}),Je=y(_,"menuSearchInput",{},{isDisabled:u,inputValue:m,isFocused:Q}),Qe=y(_,"menuSearchIcon",{},{isDisabled:u,inputValue:m,isFocused:Q}),Xe=y(_,"menuSearchClear",{},{isDisabled:u,hasValue:!!m}),Ye=a.useMemo(()=>({isOpen:l,isDisabled:u,isMulti:c,isSearchable:S,inputValue:m,highlightedIndex:V,displayOptions:P,value:p,getOptionValue:g,getOptionLabel:j,classNamePrefix:A}),[l,u,c,S,m,V,P,p,g,j,A]),Ze=x.Control,en=x.ValueContainer,nn=x.IndicatorsContainer,tn=x.DropdownIndicator,rn=x.ClearIndicator,sn=x.Input,on=x.Menu,an=x.MenuList,ln=x.Option,cn=x.LoadingMessage,un=x.NoOptionsMessage,dn=x.SingleValue,fn=x.MultiValue,pn=_e&&!u&&(c?M.length>0:p!=null),mn={onKeyDown:me,onMouseDown:e=>{u||(e.preventDefault(),l?b():N())},role:"combobox","aria-expanded":l,"aria-controls":K,"aria-haspopup":"listbox","aria-label":we,"aria-labelledby":Ne,tabIndex:S&&!O?-1:Oe},hn={ref:k,id:`${B}-input`,disabled:u,readOnly:!S||O,value:S&&!O?m:"",placeholder:!c&&p||c&&M.length>0?"":Ce,onChange:e=>{if(!S||u)return;const o=e.target.value;C(o,"input-change"),l||N()},onFocus:()=>N(),onKeyDown:e=>{if(e.key==="Backspace"&&c&&!m&&M.length){const o=M.slice(0,-1);w(o,{action:"remove-value",removedValue:M[M.length-1]})}},autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list","aria-controls":K,"aria-activedescendant":l?`${B}-opt-${V}`:void 0},xn=["rns__wrapper",A&&`${A}__wrapper`,u&&"rns--is-disabled",Me].filter(Boolean).join(" ");return s.jsx(ee.Provider,{value:Ye,children:s.jsxs("div",{className:xn,style:{...He,...je},children:[s.jsxs(Ze,{ref:fe,innerProps:mn,selectProps:n,isDisabled:u,isFocused:l,style:Ke,children:[s.jsxs(en,{innerProps:{},selectProps:n,isDisabled:u,children:[c&&M.map((e,o)=>{const d=y(_,"multiValue",{},{});return s.jsx("span",{style:d,children:s.jsx(fn,{data:e,selectProps:n,removeProps:{onMouseDown:f=>f.stopPropagation(),onClick:f=>{f.stopPropagation();const v=M.filter((he,Z)=>Z!==o);w(v,{action:"remove-value",removedValue:e})}},children:L?L(e,{context:"value"}):j(e)})},`${g(e)}-${o}`)}),!c&&p&&s.jsx(dn,{data:p,selectProps:n,children:L?L(p,{context:"value"}):j(p)}),s.jsx(sn,{innerProps:hn,selectProps:n})]}),s.jsxs(nn,{innerProps:{},selectProps:n,children:[pn&&s.jsx(rn,{innerProps:{onMouseDown:e=>e.stopPropagation(),onClick:ze},selectProps:n}),s.jsx(tn,{innerProps:{onMouseDown:e=>{e.preventDefault(),e.stopPropagation()},onClick:e=>{e.stopPropagation(),l?b():N()}},selectProps:n})]})]}),l&&s.jsx(on,{innerProps:{ref:pe,id:K,className:`rns__menu rns__menu--${le}`},selectProps:n,children:s.jsxs("div",{style:Te,className:`${A}__menu-inner`,children:[S&&O&&s.jsx("div",{className:"rns__menu-search-wrap",style:Ue,children:s.jsxs("div",{className:"rns__menu-search-input-wrap",style:Ge,children:[s.jsx("input",{ref:X,className:"rns__menu-search-input",style:Je,value:m,placeholder:ge,onChange:e=>C(e.target.value,"input-change"),onFocus:()=>de(!0),onBlur:()=>de(!1),onKeyDown:me,...ye}),!!m&&s.jsx("button",{type:"button",className:"rns__menu-search-clear",style:Xe,"aria-label":"Clear search",onMouseDown:e=>e.preventDefault(),onClick:()=>C("","clear"),children:"×"}),s.jsx("span",{className:"rns__menu-search-icon",style:Qe,"aria-hidden":!0,children:s.jsx("svg",{viewBox:"0 0 20 20",width:"16",height:"16",fill:"currentColor",children:s.jsx("path",{d:"M13.5 12h-.79l-.28-.27A5.49 5.49 0 0 0 13.75 8a5.5 5.5 0 1 0-5.5 5.5 5.49 5.49 0 0 0 3.73-1.32l.27.28v.79l5 4.99L18.49 17l-4.99-5zM8.25 12A4 4 0 1 1 8.25 4a4 4 0 0 1 0 8z"})})})]})}),s.jsx(an,{innerProps:{},selectProps:n,children:Be?s.jsx(cn,{selectProps:n,children:Pe({inputValue:m})}):P.length===0?s.jsx(un,{selectProps:n,children:be({inputValue:m})}):P.map((e,o)=>{const d=Vn(e,p,c,g),f=o===V,v=y(_,"option",{},{isSelected:d,isFocused:f}),he=L?L(e,{context:"menu"}):j(e);return s.jsx("div",{style:v,role:"presentation",children:s.jsx(ln,{data:e,isSelected:d,isFocused:f,innerProps:{id:`${B}-opt-${o}`,role:"option","aria-selected":d,onMouseMove:()=>I(o),onMouseDown:Z=>Z.preventDefault(),onClick:()=>Y(e)},selectProps:n,children:he})},String(g(e)))})})]})}),ce&&s.jsx("input",{type:"hidden",name:ce,value:Rn(p,c,g)})]})})}function Rn(n,t,r){return t?!Array.isArray(n)||n.length===0?"":n.map(i=>r(i)).join(","):n?String(r(n)):""}exports.Select=kn;exports.SelectContext=ee;exports.defaultComponents=ve;exports.mergeStyles=y;exports.useSelectContext=xe;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/SelectContext.jsx","../src/defaultComponents.jsx","../src/utils/filterOptions.js","../src/utils/mergeStyles.js","../src/Select.jsx"],"sourcesContent":["import { createContext, useContext } from 'react'\r\n\r\nexport const SelectContext = createContext(null)\r\n\r\nexport function useSelectContext() {\r\n const ctx = useContext(SelectContext)\r\n if (!ctx) {\r\n throw new Error('Select subcomponents must be used within <Select />')\r\n }\r\n return ctx\r\n}\r\n","import { forwardRef } from 'react'\r\nimport { useSelectContext } from './SelectContext.jsx'\r\n\r\nexport const DefaultControl = forwardRef(function DefaultControl(props, ref) {\r\n const { innerProps, children, style } = props\r\n return (\r\n <div ref={ref} className=\"rns__control\" style={style} {...innerProps}>\r\n {children}\r\n </div>\r\n )\r\n})\r\n\r\nexport function DefaultValueContainer(props) {\r\n const { innerProps, children } = props\r\n return (\r\n <div className=\"rns__value-container\" {...innerProps}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultIndicatorsContainer(props) {\r\n const { innerProps, children } = props\r\n return (\r\n <div className=\"rns__indicators\" {...innerProps}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultDropdownIndicator(props) {\r\n const { innerProps } = props\r\n const ctx = useSelectContext()\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"rns__indicator rns__dropdown-indicator\"\r\n aria-hidden\r\n tabIndex={-1}\r\n {...innerProps}\r\n >\r\n <span className=\"rns__dropdown-chevron\" aria-hidden>\r\n {ctx.isOpen ? '▲' : '▼'}\r\n </span>\r\n </button>\r\n )\r\n}\r\n\r\nexport function DefaultClearIndicator(props) {\r\n const { innerProps } = props\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"rns__indicator rns__clear-indicator\"\r\n aria-label=\"Clear value\"\r\n {...innerProps}\r\n >\r\n ×\r\n </button>\r\n )\r\n}\r\n\r\nexport const DefaultInput = forwardRef(function DefaultInput(props, ref) {\r\n const { innerProps } = props\r\n return <input ref={ref} className=\"rns__input\" {...innerProps} />\r\n})\r\n\r\nexport function DefaultMenu(props) {\r\n const { innerProps = {}, children } = props\r\n const { ref: menuRef, className, ...rest } = innerProps\r\n return (\r\n <div\r\n ref={menuRef}\r\n className={className ?? 'rns__menu'}\r\n {...rest}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultMenuList(props) {\r\n const { innerProps, children } = props\r\n return (\r\n <div className=\"rns__menu-list\" role=\"listbox\" {...innerProps}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultOption(props) {\r\n const { innerProps, children, data } = props\r\n return (\r\n <div className=\"rns__option\" role=\"option\" {...innerProps}>\r\n {children ?? data?.label}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultLoadingMessage(props) {\r\n const { children } = props\r\n return <div className=\"rns__loading-message\">{children ?? 'Loading...'}</div>\r\n}\r\n\r\nexport function DefaultNoOptionsMessage(props) {\r\n const { children } = props\r\n return <div className=\"rns__no-options\">{children ?? 'No options'}</div>\r\n}\r\n\r\nexport function DefaultSingleValue(props) {\r\n const { children, data } = props\r\n return <div className=\"rns__single-value\">{children ?? data?.label}</div>\r\n}\r\n\r\nexport function DefaultMultiValue(props) {\r\n const { children, data, removeProps } = props\r\n return (\r\n <div className=\"rns__multi-value\">\r\n <span className=\"rns__multi-value__label\">{children ?? data?.label}</span>\r\n <button type=\"button\" className=\"rns__multi-value__remove\" {...removeProps}>\r\n ×\r\n </button>\r\n </div>\r\n )\r\n}\r\n\r\nexport const defaultComponents = {\r\n Control: DefaultControl,\r\n ValueContainer: DefaultValueContainer,\r\n IndicatorsContainer: DefaultIndicatorsContainer,\r\n DropdownIndicator: DefaultDropdownIndicator,\r\n ClearIndicator: DefaultClearIndicator,\r\n Input: DefaultInput,\r\n Menu: DefaultMenu,\r\n MenuList: DefaultMenuList,\r\n Option: DefaultOption,\r\n LoadingMessage: DefaultLoadingMessage,\r\n NoOptionsMessage: DefaultNoOptionsMessage,\r\n SingleValue: DefaultSingleValue,\r\n MultiValue: DefaultMultiValue,\r\n}\r\n","const defaultStringify = (option, getOptionLabel) => {\r\n const label = getOptionLabel(option)\r\n return String(label ?? '').toLowerCase()\r\n}\r\n\r\n/**\r\n * @param {object[]} options\r\n * @param {string} inputValue\r\n * @param {(option: object, input: string) => boolean} [filterOption]\r\n * @param {(option: object) => string} getOptionLabel\r\n */\r\nexport function filterOptions(options, inputValue, filterOption, getOptionLabel) {\r\n if (!inputValue) return options\r\n const q = inputValue.trim().toLowerCase()\r\n if (!q) return options\r\n\r\n if (typeof filterOption === 'function') {\r\n return options.filter((o) => filterOption(o, inputValue))\r\n }\r\n\r\n return options.filter((o) => defaultStringify(o, getOptionLabel).includes(q))\r\n}\r\n","/**\r\n * @param {Record<string, (base: object, state: object) => object | object>} stylesProp\r\n * @param {string} key\r\n * @param {object} baseStyle\r\n * @param {object} state\r\n */\r\nexport function mergeStyles(stylesProp, key, baseStyle, state) {\r\n const custom = stylesProp?.[key]\r\n if (typeof custom === 'function') {\r\n return custom(baseStyle, state) || baseStyle\r\n }\r\n if (custom && typeof custom === 'object') {\r\n return { ...baseStyle, ...custom }\r\n }\r\n return baseStyle\r\n}\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useId,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react'\r\nimport { SelectContext } from './SelectContext.jsx'\r\nimport { defaultComponents } from './defaultComponents.jsx'\r\nimport { filterOptions as applyFilter } from './utils/filterOptions.js'\r\nimport { mergeStyles } from './utils/mergeStyles.js'\r\nimport './styles/default.css'\r\n\r\nfunction shallowEqualOptions(a, b, getOptionValue) {\r\n if (a === b) return true\r\n if (!a || !b) return false\r\n return getOptionValue(a) === getOptionValue(b)\r\n}\r\n\r\nfunction isOptionSelected(option, value, isMulti, getOptionValue) {\r\n if (!option) return false\r\n if (isMulti && Array.isArray(value)) {\r\n return value.some((v) => getOptionValue(v) === getOptionValue(option))\r\n }\r\n return shallowEqualOptions(option, value, getOptionValue)\r\n}\r\n\r\nfunction mergeComponentMap(user = {}) {\r\n return { ...defaultComponents, ...user }\r\n}\r\n\r\n/**\r\n * @param {object} props\r\n */\r\nexport function Select(props) {\r\n const {\r\n options: optionsProp = [],\r\n value: valueProp,\r\n defaultValue,\r\n onChange,\r\n isMulti = false,\r\n isSearchable = true,\r\n showMenuSearchInput = false,\r\n menuSearchPlaceholder = 'Search...',\r\n menuSearchInputProps = {},\r\n isClearable = false,\r\n isDisabled = false,\r\n isLoading: isLoadingProp = false,\r\n loadOptions,\r\n defaultOptions = false,\r\n filterOption,\r\n getOptionValue = (o) => o?.value,\r\n getOptionLabel = (o) => o?.label,\r\n placeholder = 'Select...',\r\n noOptionsMessage = () => 'No options',\r\n loadingMessage = () => 'Loading...',\r\n components: componentsProp,\r\n className,\r\n classNamePrefix = 'rns',\r\n style,\r\n styles: stylesProp = {},\r\n inputValue: inputValueProp,\r\n defaultInputValue = '',\r\n onInputChange,\r\n onMenuOpen,\r\n onMenuClose,\r\n menuIsOpen: menuIsOpenProp,\r\n closeMenuOnSelect,\r\n blurInputOnSelect = true,\r\n menuPlacement = 'bottom',\r\n id,\r\n 'aria-label': ariaLabel,\r\n 'aria-labelledby': ariaLabelledBy,\r\n name,\r\n tabIndex = 0,\r\n formatOptionLabel,\r\n } = props\r\n\r\n const resolvedCloseMenuOnSelect =\r\n closeMenuOnSelect !== undefined ? closeMenuOnSelect : !isMulti\r\n\r\n const autoId = useId()\r\n const baseId = id ?? `rns-${autoId.replace(/:/g, '')}`\r\n const listboxId = `${baseId}-listbox`\r\n\r\n const isValueControlled = valueProp !== undefined\r\n const isInputControlled = inputValueProp !== undefined\r\n const isMenuControlled = menuIsOpenProp !== undefined\r\n\r\n const [uncontrolledValue, setUncontrolledValue] = useState(\r\n defaultValue ?? (isMulti ? [] : null),\r\n )\r\n const value = isValueControlled ? valueProp : uncontrolledValue\r\n\r\n const [internalInput, setInternalInput] = useState(defaultInputValue)\r\n const inputValue = isInputControlled ? inputValueProp : internalInput\r\n\r\n const [internalMenuOpen, setInternalMenuOpen] = useState(false)\r\n const isOpen = isMenuControlled ? !!menuIsOpenProp : internalMenuOpen\r\n\r\n const [highlightedIndex, setHighlightedIndex] = useState(0)\r\n const [asyncOptions, setAsyncOptions] = useState([])\r\n const [asyncLoading, setAsyncLoading] = useState(false)\r\n const [menuSearchFocused, setMenuSearchFocused] = useState(false)\r\n\r\n const controlRef = useRef(null)\r\n const inputRef = useRef(null)\r\n const menuRef = useRef(null)\r\n const menuSearchInputRef = useRef(null)\r\n const loadRequestRef = useRef(0)\r\n\r\n const components = useMemo(\r\n () => mergeComponentMap(componentsProp),\r\n [componentsProp],\r\n )\r\n\r\n const isAsync = typeof loadOptions === 'function'\r\n const isLoading = isLoadingProp || asyncLoading\r\n\r\n const syncFilteredOptions = useMemo(() => {\r\n if (isAsync) return []\r\n return applyFilter(optionsProp, inputValue, filterOption, getOptionLabel)\r\n }, [isAsync, optionsProp, inputValue, filterOption, getOptionLabel])\r\n\r\n const displayOptions = isAsync ? asyncOptions : syncFilteredOptions\r\n\r\n const selectedValues = useMemo(() => {\r\n if (isMulti) return Array.isArray(value) ? value : []\r\n return value ? [value] : []\r\n }, [isMulti, value])\r\n\r\n const setValue = useCallback(\r\n (next, meta) => {\r\n if (!isValueControlled) {\r\n setUncontrolledValue(next)\r\n }\r\n onChange?.(next, meta)\r\n },\r\n [isValueControlled, onChange],\r\n )\r\n\r\n const setMenuOpen = useCallback(\r\n (open) => {\r\n if (isDisabled) return\r\n if (!isMenuControlled) {\r\n setInternalMenuOpen(open)\r\n }\r\n if (open) onMenuOpen?.()\r\n else onMenuClose?.()\r\n },\r\n [isDisabled, isMenuControlled, onMenuOpen, onMenuClose],\r\n )\r\n\r\n const commitInput = useCallback(\r\n (next, action) => {\r\n if (!isInputControlled) {\r\n setInternalInput(next)\r\n }\r\n onInputChange?.(next, { action, prevInputValue: inputValue })\r\n },\r\n [isInputControlled, onInputChange, inputValue],\r\n )\r\n\r\n const openMenu = useCallback(() => {\r\n if (!isOpen) setMenuOpen(true)\r\n }, [isOpen, setMenuOpen])\r\n\r\n const closeMenu = useCallback(() => {\r\n if (isOpen) {\r\n setMenuOpen(false)\r\n commitInput('', 'menu-close')\r\n setHighlightedIndex(0)\r\n }\r\n }, [isOpen, setMenuOpen, commitInput])\r\n\r\n const runLoadOptions = useCallback(\r\n (search) => {\r\n if (!loadOptions) return\r\n const req = ++loadRequestRef.current\r\n setAsyncLoading(true)\r\n Promise.resolve(loadOptions(search))\r\n .then((loaded) => {\r\n if (req !== loadRequestRef.current) return\r\n setAsyncOptions(Array.isArray(loaded) ? loaded : [])\r\n })\r\n .catch(() => {\r\n if (req !== loadRequestRef.current) return\r\n setAsyncOptions([])\r\n })\r\n .finally(() => {\r\n if (req !== loadRequestRef.current) return\r\n setAsyncLoading(false)\r\n })\r\n },\r\n [loadOptions],\r\n )\r\n\r\n useEffect(() => {\r\n if (!isAsync) return\r\n if (defaultOptions === true) {\r\n runLoadOptions('')\r\n } else if (Array.isArray(defaultOptions)) {\r\n setAsyncOptions(defaultOptions)\r\n }\r\n }, [isAsync, defaultOptions, runLoadOptions])\r\n\r\n useEffect(() => {\r\n if (!isAsync || !isOpen) return\r\n runLoadOptions(inputValue)\r\n }, [isAsync, isOpen, inputValue, runLoadOptions])\r\n\r\n useEffect(() => {\r\n if (typeof document === 'undefined') return\r\n if (!isOpen) return\r\n const onPointerDown = (e) => {\r\n const t = e.target\r\n if (controlRef.current?.contains(t)) return\r\n if (menuRef.current?.contains(t)) return\r\n closeMenu()\r\n }\r\n document.addEventListener('pointerdown', onPointerDown, true)\r\n return () => document.removeEventListener('pointerdown', onPointerDown, true)\r\n }, [isOpen, closeMenu])\r\n\r\n useEffect(() => {\r\n setHighlightedIndex(0)\r\n }, [inputValue, displayOptions.length, isOpen])\r\n\r\n useEffect(() => {\r\n if (!isOpen || !isSearchable || typeof document === 'undefined') return\r\n if (showMenuSearchInput && menuSearchInputRef.current) {\r\n menuSearchInputRef.current.focus()\r\n return\r\n }\r\n if (inputRef.current) {\r\n inputRef.current.focus()\r\n }\r\n }, [isOpen, isSearchable, showMenuSearchInput])\r\n\r\n const selectOption = useCallback(\r\n (option) => {\r\n if (!option || isDisabled) return\r\n if (isMulti) {\r\n const current = Array.isArray(value) ? value : []\r\n const exists = current.some(\r\n (v) => getOptionValue(v) === getOptionValue(option),\r\n )\r\n const next = exists\r\n ? current.filter((v) => getOptionValue(v) !== getOptionValue(option))\r\n : [...current, option]\r\n setValue(next, { action: exists ? 'remove-value' : 'select-option', option })\r\n } else {\r\n setValue(option, { action: 'select-option', option })\r\n }\r\n if (resolvedCloseMenuOnSelect) {\r\n closeMenu()\r\n } else {\r\n commitInput('', 'input-change')\r\n }\r\n if (blurInputOnSelect && inputRef.current && typeof document !== 'undefined') {\r\n inputRef.current.blur()\r\n }\r\n },\r\n [\r\n isDisabled,\r\n isMulti,\r\n value,\r\n getOptionValue,\r\n setValue,\r\n resolvedCloseMenuOnSelect,\r\n closeMenu,\r\n commitInput,\r\n blurInputOnSelect,\r\n ],\r\n )\r\n\r\n const clearValue = useCallback(\r\n (e) => {\r\n e?.preventDefault?.()\r\n e?.stopPropagation?.()\r\n const prev = value\r\n const next = isMulti ? [] : null\r\n setValue(next, { action: 'clear', removedValues: isMulti ? prev : prev ? [prev] : [] })\r\n commitInput('', 'clear')\r\n },\r\n [isMulti, value, setValue, commitInput],\r\n )\r\n\r\n const onKeyDown = useCallback(\r\n (e) => {\r\n if (isDisabled) return\r\n const { key } = e\r\n const max = displayOptions.length - 1\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault()\r\n if (!isOpen) openMenu()\r\n else setHighlightedIndex((i) => (max < 0 ? 0 : Math.min(i + 1, max)))\r\n return\r\n }\r\n if (key === 'ArrowUp') {\r\n e.preventDefault()\r\n if (!isOpen) openMenu()\r\n else setHighlightedIndex((i) => (max < 0 ? 0 : Math.max(i - 1, 0)))\r\n return\r\n }\r\n if (key === 'Home' && isOpen) {\r\n e.preventDefault()\r\n setHighlightedIndex(0)\r\n return\r\n }\r\n if (key === 'End' && isOpen) {\r\n e.preventDefault()\r\n setHighlightedIndex(max < 0 ? 0 : max)\r\n return\r\n }\r\n if (key === 'Enter' && isOpen) {\r\n e.preventDefault()\r\n const opt = displayOptions[highlightedIndex]\r\n if (opt) selectOption(opt)\r\n return\r\n }\r\n if (key === 'Escape' && isOpen) {\r\n e.preventDefault()\r\n closeMenu()\r\n return\r\n }\r\n if (key === 'Tab' && isOpen) {\r\n closeMenu()\r\n }\r\n },\r\n [\r\n isDisabled,\r\n displayOptions,\r\n highlightedIndex,\r\n isOpen,\r\n openMenu,\r\n closeMenu,\r\n selectOption,\r\n ],\r\n )\r\n\r\n const containerStyle = mergeStyles(stylesProp, 'container', {}, { isDisabled })\r\n const controlStyle = mergeStyles(stylesProp, 'control', {}, { isDisabled, isFocused: isOpen })\r\n const menuStyle = mergeStyles(\r\n stylesProp,\r\n 'menu',\r\n {},\r\n { placement: menuPlacement },\r\n )\r\n const menuSearchWrapStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchWrap',\r\n {},\r\n { isDisabled, inputValue },\r\n )\r\n const menuSearchInputWrapStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchInputWrap',\r\n {},\r\n { isDisabled, inputValue, isFocused: menuSearchFocused },\r\n )\r\n const menuSearchInputStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchInput',\r\n {},\r\n { isDisabled, inputValue, isFocused: menuSearchFocused },\r\n )\r\n const menuSearchIconStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchIcon',\r\n {},\r\n { isDisabled, inputValue, isFocused: menuSearchFocused },\r\n )\r\n const menuSearchClearStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchClear',\r\n {},\r\n { isDisabled, hasValue: !!inputValue },\r\n )\r\n\r\n const ctx = useMemo(\r\n () => ({\r\n isOpen,\r\n isDisabled,\r\n isMulti,\r\n isSearchable,\r\n inputValue,\r\n highlightedIndex,\r\n displayOptions,\r\n value,\r\n getOptionValue,\r\n getOptionLabel,\r\n classNamePrefix,\r\n }),\r\n [\r\n isOpen,\r\n isDisabled,\r\n isMulti,\r\n isSearchable,\r\n inputValue,\r\n highlightedIndex,\r\n displayOptions,\r\n value,\r\n getOptionValue,\r\n getOptionLabel,\r\n classNamePrefix,\r\n ],\r\n )\r\n\r\n const Control = components.Control\r\n const ValueContainer = components.ValueContainer\r\n const IndicatorsContainer = components.IndicatorsContainer\r\n const DropdownIndicator = components.DropdownIndicator\r\n const ClearIndicator = components.ClearIndicator\r\n const Input = components.Input\r\n const Menu = components.Menu\r\n const MenuList = components.MenuList\r\n const Option = components.Option\r\n const LoadingMessage = components.LoadingMessage\r\n const NoOptionsMessage = components.NoOptionsMessage\r\n const SingleValue = components.SingleValue\r\n const MultiValue = components.MultiValue\r\n\r\n const showClear =\r\n isClearable &&\r\n !isDisabled &&\r\n (isMulti ? selectedValues.length > 0 : value != null)\r\n\r\n const controlInnerProps = {\r\n onKeyDown,\r\n onMouseDown: (e) => {\r\n if (isDisabled) return\r\n e.preventDefault()\r\n if (isOpen) closeMenu()\r\n else openMenu()\r\n },\r\n role: 'combobox',\r\n 'aria-expanded': isOpen,\r\n 'aria-controls': listboxId,\r\n 'aria-haspopup': 'listbox',\r\n 'aria-label': ariaLabel,\r\n 'aria-labelledby': ariaLabelledBy,\r\n tabIndex: isSearchable && !showMenuSearchInput ? -1 : tabIndex,\r\n }\r\n\r\n const inputInnerProps = {\r\n ref: inputRef,\r\n id: `${baseId}-input`,\r\n disabled: isDisabled,\r\n readOnly: !isSearchable || showMenuSearchInput,\r\n value: isSearchable && !showMenuSearchInput ? inputValue : '',\r\n placeholder:\r\n (!isMulti && value) || (isMulti && selectedValues.length > 0)\r\n ? ''\r\n : placeholder,\r\n onChange: (e) => {\r\n if (!isSearchable || isDisabled) return\r\n const v = e.target.value\r\n commitInput(v, 'input-change')\r\n if (!isOpen) openMenu()\r\n },\r\n onFocus: () => openMenu(),\r\n onKeyDown: (e) => {\r\n if (e.key === 'Backspace' && isMulti && !inputValue && selectedValues.length) {\r\n const next = selectedValues.slice(0, -1)\r\n setValue(next, {\r\n action: 'remove-value',\r\n removedValue: selectedValues[selectedValues.length - 1],\r\n })\r\n }\r\n },\r\n autoComplete: 'off',\r\n autoCorrect: 'off',\r\n spellCheck: false,\r\n 'aria-autocomplete': 'list',\r\n 'aria-controls': listboxId,\r\n 'aria-activedescendant': isOpen\r\n ? `${baseId}-opt-${highlightedIndex}`\r\n : undefined,\r\n }\r\n\r\n const rootClass = [\r\n 'rns__wrapper',\r\n classNamePrefix && `${classNamePrefix}__wrapper`,\r\n isDisabled && 'rns--is-disabled',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <SelectContext.Provider value={ctx}>\r\n <div className={rootClass} style={{ ...containerStyle, ...style }}>\r\n <Control\r\n ref={controlRef}\r\n innerProps={controlInnerProps}\r\n selectProps={props}\r\n isDisabled={isDisabled}\r\n isFocused={isOpen}\r\n style={controlStyle}\r\n >\r\n <ValueContainer\r\n innerProps={{}}\r\n selectProps={props}\r\n isDisabled={isDisabled}\r\n >\r\n {isMulti &&\r\n selectedValues.map((v, i) => {\r\n const mvStyle = mergeStyles(stylesProp, 'multiValue', {}, {})\r\n return (\r\n <span key={`${getOptionValue(v)}-${i}`} style={mvStyle}>\r\n <MultiValue\r\n data={v}\r\n selectProps={props}\r\n removeProps={{\r\n onMouseDown: (e) => e.stopPropagation(),\r\n onClick: (e) => {\r\n e.stopPropagation()\r\n const next = selectedValues.filter(\r\n (_, j) => j !== i,\r\n )\r\n setValue(next, { action: 'remove-value', removedValue: v })\r\n },\r\n }}\r\n >\r\n {formatOptionLabel\r\n ? formatOptionLabel(v, { context: 'value' })\r\n : getOptionLabel(v)}\r\n </MultiValue>\r\n </span>\r\n )\r\n })}\r\n {!isMulti && value && (\r\n <SingleValue data={value} selectProps={props}>\r\n {formatOptionLabel\r\n ? formatOptionLabel(value, { context: 'value' })\r\n : getOptionLabel(value)}\r\n </SingleValue>\r\n )}\r\n <Input innerProps={inputInnerProps} selectProps={props} />\r\n </ValueContainer>\r\n <IndicatorsContainer innerProps={{}} selectProps={props}>\r\n {showClear && (\r\n <ClearIndicator\r\n innerProps={{\r\n onMouseDown: (e) => e.stopPropagation(),\r\n onClick: clearValue,\r\n }}\r\n selectProps={props}\r\n />\r\n )}\r\n <DropdownIndicator\r\n innerProps={{\r\n onMouseDown: (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n },\r\n onClick: (e) => {\r\n e.stopPropagation()\r\n if (isOpen) closeMenu()\r\n else openMenu()\r\n },\r\n }}\r\n selectProps={props}\r\n />\r\n </IndicatorsContainer>\r\n </Control>\r\n\r\n {isOpen && (\r\n <Menu\r\n innerProps={{\r\n ref: menuRef,\r\n id: listboxId,\r\n className: `rns__menu rns__menu--${menuPlacement}`,\r\n }}\r\n selectProps={props}\r\n >\r\n <div\r\n style={menuStyle}\r\n className={`${classNamePrefix}__menu-inner`}\r\n >\r\n {isSearchable && showMenuSearchInput && (\r\n <div className=\"rns__menu-search-wrap\" style={menuSearchWrapStyle}>\r\n <div\r\n className=\"rns__menu-search-input-wrap\"\r\n style={menuSearchInputWrapStyle}\r\n >\r\n <input\r\n ref={menuSearchInputRef}\r\n className=\"rns__menu-search-input\"\r\n style={menuSearchInputStyle}\r\n value={inputValue}\r\n placeholder={menuSearchPlaceholder}\r\n onChange={(e) => commitInput(e.target.value, 'input-change')}\r\n onFocus={() => setMenuSearchFocused(true)}\r\n onBlur={() => setMenuSearchFocused(false)}\r\n onKeyDown={onKeyDown}\r\n {...menuSearchInputProps}\r\n />\r\n {!!inputValue && (\r\n <button\r\n type=\"button\"\r\n className=\"rns__menu-search-clear\"\r\n style={menuSearchClearStyle}\r\n aria-label=\"Clear search\"\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={() => commitInput('', 'clear')}\r\n >\r\n ×\r\n </button>\r\n )}\r\n <span\r\n className=\"rns__menu-search-icon\"\r\n style={menuSearchIconStyle}\r\n aria-hidden\r\n >\r\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M13.5 12h-.79l-.28-.27A5.49 5.49 0 0 0 13.75 8a5.5 5.5 0 1 0-5.5 5.5 5.49 5.49 0 0 0 3.73-1.32l.27.28v.79l5 4.99L18.49 17l-4.99-5zM8.25 12A4 4 0 1 1 8.25 4a4 4 0 0 1 0 8z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n <MenuList innerProps={{}} selectProps={props}>\r\n {isLoading ? (\r\n <LoadingMessage selectProps={props}>\r\n {loadingMessage({ inputValue })}\r\n </LoadingMessage>\r\n ) : displayOptions.length === 0 ? (\r\n <NoOptionsMessage selectProps={props}>\r\n {noOptionsMessage({ inputValue })}\r\n </NoOptionsMessage>\r\n ) : (\r\n displayOptions.map((opt, index) => {\r\n const selected = isOptionSelected(\r\n opt,\r\n value,\r\n isMulti,\r\n getOptionValue,\r\n )\r\n const focused = index === highlightedIndex\r\n const optStyle = mergeStyles(\r\n stylesProp,\r\n 'option',\r\n {},\r\n { isSelected: selected, isFocused: focused },\r\n )\r\n const label = formatOptionLabel\r\n ? formatOptionLabel(opt, { context: 'menu' })\r\n : getOptionLabel(opt)\r\n return (\r\n <div\r\n key={String(getOptionValue(opt))}\r\n style={optStyle}\r\n role=\"presentation\"\r\n >\r\n <Option\r\n data={opt}\r\n isSelected={selected}\r\n isFocused={focused}\r\n innerProps={{\r\n id: `${baseId}-opt-${index}`,\r\n role: 'option',\r\n 'aria-selected': selected,\r\n onMouseMove: () => setHighlightedIndex(index),\r\n onMouseDown: (e) => e.preventDefault(),\r\n onClick: () => selectOption(opt),\r\n }}\r\n selectProps={props}\r\n >\r\n {label}\r\n </Option>\r\n </div>\r\n )\r\n })\r\n )}\r\n </MenuList>\r\n </div>\r\n </Menu>\r\n )}\r\n\r\n {name && (\r\n <input type=\"hidden\" name={name} value={serializeForForm(value, isMulti, getOptionValue)} />\r\n )}\r\n </div>\r\n </SelectContext.Provider>\r\n )\r\n}\r\n\r\nfunction serializeForForm(value, isMulti, getOptionValue) {\r\n if (isMulti) {\r\n if (!Array.isArray(value) || value.length === 0) return ''\r\n return value.map((v) => getOptionValue(v)).join(',')\r\n }\r\n if (!value) return ''\r\n return String(getOptionValue(value))\r\n}\r\n"],"names":["SelectContext","createContext","useSelectContext","ctx","useContext","DefaultControl","forwardRef","props","ref","innerProps","children","style","jsx","DefaultValueContainer","DefaultIndicatorsContainer","DefaultDropdownIndicator","DefaultClearIndicator","DefaultInput","DefaultMenu","menuRef","className","rest","DefaultMenuList","DefaultOption","data","DefaultLoadingMessage","DefaultNoOptionsMessage","DefaultSingleValue","DefaultMultiValue","removeProps","jsxs","defaultComponents","defaultStringify","option","getOptionLabel","label","filterOptions","options","inputValue","filterOption","q","o","mergeStyles","stylesProp","key","baseStyle","state","custom","shallowEqualOptions","a","b","getOptionValue","isOptionSelected","value","isMulti","v","mergeComponentMap","user","Select","optionsProp","valueProp","defaultValue","onChange","isSearchable","showMenuSearchInput","menuSearchPlaceholder","menuSearchInputProps","isClearable","isDisabled","isLoadingProp","loadOptions","defaultOptions","placeholder","noOptionsMessage","loadingMessage","componentsProp","classNamePrefix","inputValueProp","defaultInputValue","onInputChange","onMenuOpen","onMenuClose","menuIsOpenProp","closeMenuOnSelect","blurInputOnSelect","menuPlacement","id","ariaLabel","ariaLabelledBy","name","tabIndex","formatOptionLabel","resolvedCloseMenuOnSelect","autoId","useId","baseId","listboxId","isValueControlled","isInputControlled","isMenuControlled","uncontrolledValue","setUncontrolledValue","useState","internalInput","setInternalInput","internalMenuOpen","setInternalMenuOpen","isOpen","highlightedIndex","setHighlightedIndex","asyncOptions","setAsyncOptions","asyncLoading","setAsyncLoading","menuSearchFocused","setMenuSearchFocused","controlRef","useRef","inputRef","menuSearchInputRef","loadRequestRef","components","useMemo","isAsync","isLoading","syncFilteredOptions","applyFilter","displayOptions","selectedValues","setValue","useCallback","next","meta","setMenuOpen","open","commitInput","action","openMenu","closeMenu","runLoadOptions","search","req","loaded","useEffect","onPointerDown","e","t","_a","_b","selectOption","current","exists","clearValue","prev","onKeyDown","max","i","opt","containerStyle","controlStyle","menuStyle","menuSearchWrapStyle","menuSearchInputWrapStyle","menuSearchInputStyle","menuSearchIconStyle","menuSearchClearStyle","Control","ValueContainer","IndicatorsContainer","DropdownIndicator","ClearIndicator","Input","Menu","MenuList","Option","LoadingMessage","NoOptionsMessage","SingleValue","MultiValue","showClear","controlInnerProps","inputInnerProps","rootClass","mvStyle","_","j","index","selected","focused","optStyle","serializeForForm"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
import { jsxs as V, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { createContext as In, useContext as Sn, forwardRef as Pe, useId as bn, useState as L, useRef as E, useMemo as J, useCallback as b, useEffect as j } from "react";
|
|
3
|
+
const Ie = In(null);
|
|
4
|
+
function Cn() {
|
|
5
|
+
const n = Sn(Ie);
|
|
6
|
+
if (!n)
|
|
7
|
+
throw new Error("Select subcomponents must be used within <Select />");
|
|
8
|
+
return n;
|
|
9
|
+
}
|
|
10
|
+
const Mn = Pe(function(t, r) {
|
|
11
|
+
const { innerProps: i, children: m, style: a } = t;
|
|
12
|
+
return /* @__PURE__ */ s("div", { ref: r, className: "rns__control", style: a, ...i, children: m });
|
|
13
|
+
});
|
|
14
|
+
function Dn(n) {
|
|
15
|
+
const { innerProps: t, children: r } = n;
|
|
16
|
+
return /* @__PURE__ */ s("div", { className: "rns__value-container", ...t, children: r });
|
|
17
|
+
}
|
|
18
|
+
function wn(n) {
|
|
19
|
+
const { innerProps: t, children: r } = n;
|
|
20
|
+
return /* @__PURE__ */ s("div", { className: "rns__indicators", ...t, children: r });
|
|
21
|
+
}
|
|
22
|
+
function Nn(n) {
|
|
23
|
+
const { innerProps: t } = n, r = Cn();
|
|
24
|
+
return /* @__PURE__ */ s(
|
|
25
|
+
"button",
|
|
26
|
+
{
|
|
27
|
+
type: "button",
|
|
28
|
+
className: "rns__indicator rns__dropdown-indicator",
|
|
29
|
+
"aria-hidden": !0,
|
|
30
|
+
tabIndex: -1,
|
|
31
|
+
...t,
|
|
32
|
+
children: /* @__PURE__ */ s("span", { className: "rns__dropdown-chevron", "aria-hidden": !0, children: r.isOpen ? "▲" : "▼" })
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
function xn(n) {
|
|
37
|
+
const { innerProps: t } = n;
|
|
38
|
+
return /* @__PURE__ */ s(
|
|
39
|
+
"button",
|
|
40
|
+
{
|
|
41
|
+
type: "button",
|
|
42
|
+
className: "rns__indicator rns__clear-indicator",
|
|
43
|
+
"aria-label": "Clear value",
|
|
44
|
+
...t,
|
|
45
|
+
children: "×"
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
const On = Pe(function(t, r) {
|
|
50
|
+
const { innerProps: i } = t;
|
|
51
|
+
return /* @__PURE__ */ s("input", { ref: r, className: "rns__input", ...i });
|
|
52
|
+
});
|
|
53
|
+
function Ln(n) {
|
|
54
|
+
const { innerProps: t = {}, children: r } = n, { ref: i, className: m, ...a } = t;
|
|
55
|
+
return /* @__PURE__ */ s(
|
|
56
|
+
"div",
|
|
57
|
+
{
|
|
58
|
+
ref: i,
|
|
59
|
+
className: m ?? "rns__menu",
|
|
60
|
+
...a,
|
|
61
|
+
children: r
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
function Vn(n) {
|
|
66
|
+
const { innerProps: t, children: r } = n;
|
|
67
|
+
return /* @__PURE__ */ s("div", { className: "rns__menu-list", role: "listbox", ...t, children: r });
|
|
68
|
+
}
|
|
69
|
+
function An(n) {
|
|
70
|
+
const { innerProps: t, children: r, data: i } = n;
|
|
71
|
+
return /* @__PURE__ */ s("div", { className: "rns__option", role: "option", ...t, children: r ?? (i == null ? void 0 : i.label) });
|
|
72
|
+
}
|
|
73
|
+
function Fn(n) {
|
|
74
|
+
const { children: t } = n;
|
|
75
|
+
return /* @__PURE__ */ s("div", { className: "rns__loading-message", children: t ?? "Loading..." });
|
|
76
|
+
}
|
|
77
|
+
function $n(n) {
|
|
78
|
+
const { children: t } = n;
|
|
79
|
+
return /* @__PURE__ */ s("div", { className: "rns__no-options", children: t ?? "No options" });
|
|
80
|
+
}
|
|
81
|
+
function kn(n) {
|
|
82
|
+
const { children: t, data: r } = n;
|
|
83
|
+
return /* @__PURE__ */ s("div", { className: "rns__single-value", children: t ?? (r == null ? void 0 : r.label) });
|
|
84
|
+
}
|
|
85
|
+
function Rn(n) {
|
|
86
|
+
const { children: t, data: r, removeProps: i } = n;
|
|
87
|
+
return /* @__PURE__ */ V("div", { className: "rns__multi-value", children: [
|
|
88
|
+
/* @__PURE__ */ s("span", { className: "rns__multi-value__label", children: t ?? (r == null ? void 0 : r.label) }),
|
|
89
|
+
/* @__PURE__ */ s("button", { type: "button", className: "rns__multi-value__remove", ...i, children: "×" })
|
|
90
|
+
] });
|
|
91
|
+
}
|
|
92
|
+
const En = {
|
|
93
|
+
Control: Mn,
|
|
94
|
+
ValueContainer: Dn,
|
|
95
|
+
IndicatorsContainer: wn,
|
|
96
|
+
DropdownIndicator: Nn,
|
|
97
|
+
ClearIndicator: xn,
|
|
98
|
+
Input: On,
|
|
99
|
+
Menu: Ln,
|
|
100
|
+
MenuList: Vn,
|
|
101
|
+
Option: An,
|
|
102
|
+
LoadingMessage: Fn,
|
|
103
|
+
NoOptionsMessage: $n,
|
|
104
|
+
SingleValue: kn,
|
|
105
|
+
MultiValue: Rn
|
|
106
|
+
}, jn = (n, t) => {
|
|
107
|
+
const r = t(n);
|
|
108
|
+
return String(r ?? "").toLowerCase();
|
|
109
|
+
};
|
|
110
|
+
function Bn(n, t, r, i) {
|
|
111
|
+
if (!t) return n;
|
|
112
|
+
const m = t.trim().toLowerCase();
|
|
113
|
+
return m ? typeof r == "function" ? n.filter((a) => r(a, t)) : n.filter((a) => jn(a, i).includes(m)) : n;
|
|
114
|
+
}
|
|
115
|
+
function y(n, t, r, i) {
|
|
116
|
+
const m = n == null ? void 0 : n[t];
|
|
117
|
+
return typeof m == "function" ? m(r, i) || r : m && typeof m == "object" ? { ...r, ...m } : r;
|
|
118
|
+
}
|
|
119
|
+
function qn(n, t, r) {
|
|
120
|
+
return n === t ? !0 : !n || !t ? !1 : r(n) === r(t);
|
|
121
|
+
}
|
|
122
|
+
function Wn(n, t, r, i) {
|
|
123
|
+
return n ? r && Array.isArray(t) ? t.some((m) => i(m) === i(n)) : qn(n, t, i) : !1;
|
|
124
|
+
}
|
|
125
|
+
function zn(n = {}) {
|
|
126
|
+
return { ...En, ...n };
|
|
127
|
+
}
|
|
128
|
+
function Tn(n) {
|
|
129
|
+
const {
|
|
130
|
+
options: t = [],
|
|
131
|
+
value: r,
|
|
132
|
+
defaultValue: i,
|
|
133
|
+
onChange: m,
|
|
134
|
+
isMulti: a = !1,
|
|
135
|
+
isSearchable: P = !0,
|
|
136
|
+
showMenuSearchInput: A = !1,
|
|
137
|
+
menuSearchPlaceholder: Se = "Search...",
|
|
138
|
+
menuSearchInputProps: be = {},
|
|
139
|
+
isClearable: Ce = !1,
|
|
140
|
+
isDisabled: c = !1,
|
|
141
|
+
isLoading: Me = !1,
|
|
142
|
+
loadOptions: B,
|
|
143
|
+
defaultOptions: q = !1,
|
|
144
|
+
filterOption: se,
|
|
145
|
+
getOptionValue: _ = (e) => e == null ? void 0 : e.value,
|
|
146
|
+
getOptionLabel: D = (e) => e == null ? void 0 : e.label,
|
|
147
|
+
placeholder: De = "Select...",
|
|
148
|
+
noOptionsMessage: we = () => "No options",
|
|
149
|
+
loadingMessage: Ne = () => "Loading...",
|
|
150
|
+
components: le,
|
|
151
|
+
className: xe,
|
|
152
|
+
classNamePrefix: k = "rns",
|
|
153
|
+
style: Oe,
|
|
154
|
+
styles: g = {},
|
|
155
|
+
inputValue: ae,
|
|
156
|
+
defaultInputValue: Le = "",
|
|
157
|
+
onInputChange: W,
|
|
158
|
+
onMenuOpen: z,
|
|
159
|
+
onMenuClose: H,
|
|
160
|
+
menuIsOpen: ie,
|
|
161
|
+
closeMenuOnSelect: ce,
|
|
162
|
+
blurInputOnSelect: ue = !0,
|
|
163
|
+
menuPlacement: de = "bottom",
|
|
164
|
+
id: Ve,
|
|
165
|
+
"aria-label": Ae,
|
|
166
|
+
"aria-labelledby": Fe,
|
|
167
|
+
name: fe,
|
|
168
|
+
tabIndex: $e = 0,
|
|
169
|
+
formatOptionLabel: F
|
|
170
|
+
} = n, pe = ce !== void 0 ? ce : !a, ke = bn(), K = Ve ?? `rns-${ke.replace(/:/g, "")}`, Q = `${K}-listbox`, X = r !== void 0, Y = ae !== void 0, Z = ie !== void 0, [Re, Ee] = L(
|
|
171
|
+
i ?? (a ? [] : null)
|
|
172
|
+
), f = X ? r : Re, [je, Be] = L(Le), p = Y ? ae : je, [qe, We] = L(!1), l = Z ? !!ie : qe, [$, w] = L(0), [ze, ee] = L([]), [He, me] = L(!1), [ne, he] = L(!1), ve = E(null), R = E(null), _e = E(null), te = E(null), U = E(0), h = J(
|
|
173
|
+
() => zn(le),
|
|
174
|
+
[le]
|
|
175
|
+
), N = typeof B == "function", Ke = Me || He, Ue = J(() => N ? [] : Bn(t, p, se, D), [N, t, p, se, D]), C = N ? ze : Ue, M = J(() => a ? Array.isArray(f) ? f : [] : f ? [f] : [], [a, f]), x = b(
|
|
176
|
+
(e, o) => {
|
|
177
|
+
X || Ee(e), m == null || m(e, o);
|
|
178
|
+
},
|
|
179
|
+
[X, m]
|
|
180
|
+
), T = b(
|
|
181
|
+
(e) => {
|
|
182
|
+
c || (Z || We(e), e ? z == null || z() : H == null || H());
|
|
183
|
+
},
|
|
184
|
+
[c, Z, z, H]
|
|
185
|
+
), I = b(
|
|
186
|
+
(e, o) => {
|
|
187
|
+
Y || Be(e), W == null || W(e, { action: o, prevInputValue: p });
|
|
188
|
+
},
|
|
189
|
+
[Y, W, p]
|
|
190
|
+
), O = b(() => {
|
|
191
|
+
l || T(!0);
|
|
192
|
+
}, [l, T]), S = b(() => {
|
|
193
|
+
l && (T(!1), I("", "menu-close"), w(0));
|
|
194
|
+
}, [l, T, I]), G = b(
|
|
195
|
+
(e) => {
|
|
196
|
+
if (!B) return;
|
|
197
|
+
const o = ++U.current;
|
|
198
|
+
me(!0), Promise.resolve(B(e)).then((u) => {
|
|
199
|
+
o === U.current && ee(Array.isArray(u) ? u : []);
|
|
200
|
+
}).catch(() => {
|
|
201
|
+
o === U.current && ee([]);
|
|
202
|
+
}).finally(() => {
|
|
203
|
+
o === U.current && me(!1);
|
|
204
|
+
});
|
|
205
|
+
},
|
|
206
|
+
[B]
|
|
207
|
+
);
|
|
208
|
+
j(() => {
|
|
209
|
+
N && (q === !0 ? G("") : Array.isArray(q) && ee(q));
|
|
210
|
+
}, [N, q, G]), j(() => {
|
|
211
|
+
!N || !l || G(p);
|
|
212
|
+
}, [N, l, p, G]), j(() => {
|
|
213
|
+
if (typeof document > "u" || !l) return;
|
|
214
|
+
const e = (o) => {
|
|
215
|
+
var d, v;
|
|
216
|
+
const u = o.target;
|
|
217
|
+
(d = ve.current) != null && d.contains(u) || (v = _e.current) != null && v.contains(u) || S();
|
|
218
|
+
};
|
|
219
|
+
return document.addEventListener("pointerdown", e, !0), () => document.removeEventListener("pointerdown", e, !0);
|
|
220
|
+
}, [l, S]), j(() => {
|
|
221
|
+
w(0);
|
|
222
|
+
}, [p, C.length, l]), j(() => {
|
|
223
|
+
if (!(!l || !P || typeof document > "u")) {
|
|
224
|
+
if (A && te.current) {
|
|
225
|
+
te.current.focus();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
R.current && R.current.focus();
|
|
229
|
+
}
|
|
230
|
+
}, [l, P, A]);
|
|
231
|
+
const re = b(
|
|
232
|
+
(e) => {
|
|
233
|
+
if (!(!e || c)) {
|
|
234
|
+
if (a) {
|
|
235
|
+
const o = Array.isArray(f) ? f : [], u = o.some(
|
|
236
|
+
(v) => _(v) === _(e)
|
|
237
|
+
), d = u ? o.filter((v) => _(v) !== _(e)) : [...o, e];
|
|
238
|
+
x(d, { action: u ? "remove-value" : "select-option", option: e });
|
|
239
|
+
} else
|
|
240
|
+
x(e, { action: "select-option", option: e });
|
|
241
|
+
pe ? S() : I("", "input-change"), ue && R.current && typeof document < "u" && R.current.blur();
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
[
|
|
245
|
+
c,
|
|
246
|
+
a,
|
|
247
|
+
f,
|
|
248
|
+
_,
|
|
249
|
+
x,
|
|
250
|
+
pe,
|
|
251
|
+
S,
|
|
252
|
+
I,
|
|
253
|
+
ue
|
|
254
|
+
]
|
|
255
|
+
), Te = b(
|
|
256
|
+
(e) => {
|
|
257
|
+
var d, v;
|
|
258
|
+
(d = e == null ? void 0 : e.preventDefault) == null || d.call(e), (v = e == null ? void 0 : e.stopPropagation) == null || v.call(e);
|
|
259
|
+
const o = f;
|
|
260
|
+
x(a ? [] : null, { action: "clear", removedValues: a ? o : o ? [o] : [] }), I("", "clear");
|
|
261
|
+
},
|
|
262
|
+
[a, f, x, I]
|
|
263
|
+
), ge = b(
|
|
264
|
+
(e) => {
|
|
265
|
+
if (c) return;
|
|
266
|
+
const { key: o } = e, u = C.length - 1;
|
|
267
|
+
if (o === "ArrowDown") {
|
|
268
|
+
e.preventDefault(), l ? w((d) => u < 0 ? 0 : Math.min(d + 1, u)) : O();
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (o === "ArrowUp") {
|
|
272
|
+
e.preventDefault(), l ? w((d) => u < 0 ? 0 : Math.max(d - 1, 0)) : O();
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (o === "Home" && l) {
|
|
276
|
+
e.preventDefault(), w(0);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (o === "End" && l) {
|
|
280
|
+
e.preventDefault(), w(u < 0 ? 0 : u);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (o === "Enter" && l) {
|
|
284
|
+
e.preventDefault();
|
|
285
|
+
const d = C[$];
|
|
286
|
+
d && re(d);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (o === "Escape" && l) {
|
|
290
|
+
e.preventDefault(), S();
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
o === "Tab" && l && S();
|
|
294
|
+
},
|
|
295
|
+
[
|
|
296
|
+
c,
|
|
297
|
+
C,
|
|
298
|
+
$,
|
|
299
|
+
l,
|
|
300
|
+
O,
|
|
301
|
+
S,
|
|
302
|
+
re
|
|
303
|
+
]
|
|
304
|
+
), Ge = y(g, "container", {}, { isDisabled: c }), Je = y(g, "control", {}, { isDisabled: c, isFocused: l }), Qe = y(
|
|
305
|
+
g,
|
|
306
|
+
"menu",
|
|
307
|
+
{},
|
|
308
|
+
{ placement: de }
|
|
309
|
+
), Xe = y(
|
|
310
|
+
g,
|
|
311
|
+
"menuSearchWrap",
|
|
312
|
+
{},
|
|
313
|
+
{ isDisabled: c, inputValue: p }
|
|
314
|
+
), Ye = y(
|
|
315
|
+
g,
|
|
316
|
+
"menuSearchInputWrap",
|
|
317
|
+
{},
|
|
318
|
+
{ isDisabled: c, inputValue: p, isFocused: ne }
|
|
319
|
+
), Ze = y(
|
|
320
|
+
g,
|
|
321
|
+
"menuSearchInput",
|
|
322
|
+
{},
|
|
323
|
+
{ isDisabled: c, inputValue: p, isFocused: ne }
|
|
324
|
+
), en = y(
|
|
325
|
+
g,
|
|
326
|
+
"menuSearchIcon",
|
|
327
|
+
{},
|
|
328
|
+
{ isDisabled: c, inputValue: p, isFocused: ne }
|
|
329
|
+
), nn = y(
|
|
330
|
+
g,
|
|
331
|
+
"menuSearchClear",
|
|
332
|
+
{},
|
|
333
|
+
{ isDisabled: c, hasValue: !!p }
|
|
334
|
+
), tn = J(
|
|
335
|
+
() => ({
|
|
336
|
+
isOpen: l,
|
|
337
|
+
isDisabled: c,
|
|
338
|
+
isMulti: a,
|
|
339
|
+
isSearchable: P,
|
|
340
|
+
inputValue: p,
|
|
341
|
+
highlightedIndex: $,
|
|
342
|
+
displayOptions: C,
|
|
343
|
+
value: f,
|
|
344
|
+
getOptionValue: _,
|
|
345
|
+
getOptionLabel: D,
|
|
346
|
+
classNamePrefix: k
|
|
347
|
+
}),
|
|
348
|
+
[
|
|
349
|
+
l,
|
|
350
|
+
c,
|
|
351
|
+
a,
|
|
352
|
+
P,
|
|
353
|
+
p,
|
|
354
|
+
$,
|
|
355
|
+
C,
|
|
356
|
+
f,
|
|
357
|
+
_,
|
|
358
|
+
D,
|
|
359
|
+
k
|
|
360
|
+
]
|
|
361
|
+
), rn = h.Control, on = h.ValueContainer, sn = h.IndicatorsContainer, ln = h.DropdownIndicator, an = h.ClearIndicator, cn = h.Input, un = h.Menu, dn = h.MenuList, fn = h.Option, pn = h.LoadingMessage, mn = h.NoOptionsMessage, hn = h.SingleValue, vn = h.MultiValue, _n = Ce && !c && (a ? M.length > 0 : f != null), gn = {
|
|
362
|
+
onKeyDown: ge,
|
|
363
|
+
onMouseDown: (e) => {
|
|
364
|
+
c || (e.preventDefault(), l ? S() : O());
|
|
365
|
+
},
|
|
366
|
+
role: "combobox",
|
|
367
|
+
"aria-expanded": l,
|
|
368
|
+
"aria-controls": Q,
|
|
369
|
+
"aria-haspopup": "listbox",
|
|
370
|
+
"aria-label": Ae,
|
|
371
|
+
"aria-labelledby": Fe,
|
|
372
|
+
tabIndex: P && !A ? -1 : $e
|
|
373
|
+
}, yn = {
|
|
374
|
+
ref: R,
|
|
375
|
+
id: `${K}-input`,
|
|
376
|
+
disabled: c,
|
|
377
|
+
readOnly: !P || A,
|
|
378
|
+
value: P && !A ? p : "",
|
|
379
|
+
placeholder: !a && f || a && M.length > 0 ? "" : De,
|
|
380
|
+
onChange: (e) => {
|
|
381
|
+
if (!P || c) return;
|
|
382
|
+
const o = e.target.value;
|
|
383
|
+
I(o, "input-change"), l || O();
|
|
384
|
+
},
|
|
385
|
+
onFocus: () => O(),
|
|
386
|
+
onKeyDown: (e) => {
|
|
387
|
+
if (e.key === "Backspace" && a && !p && M.length) {
|
|
388
|
+
const o = M.slice(0, -1);
|
|
389
|
+
x(o, {
|
|
390
|
+
action: "remove-value",
|
|
391
|
+
removedValue: M[M.length - 1]
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
autoComplete: "off",
|
|
396
|
+
autoCorrect: "off",
|
|
397
|
+
spellCheck: !1,
|
|
398
|
+
"aria-autocomplete": "list",
|
|
399
|
+
"aria-controls": Q,
|
|
400
|
+
"aria-activedescendant": l ? `${K}-opt-${$}` : void 0
|
|
401
|
+
}, Pn = [
|
|
402
|
+
"rns__wrapper",
|
|
403
|
+
k && `${k}__wrapper`,
|
|
404
|
+
c && "rns--is-disabled",
|
|
405
|
+
xe
|
|
406
|
+
].filter(Boolean).join(" ");
|
|
407
|
+
return /* @__PURE__ */ s(Ie.Provider, { value: tn, children: /* @__PURE__ */ V("div", { className: Pn, style: { ...Ge, ...Oe }, children: [
|
|
408
|
+
/* @__PURE__ */ V(
|
|
409
|
+
rn,
|
|
410
|
+
{
|
|
411
|
+
ref: ve,
|
|
412
|
+
innerProps: gn,
|
|
413
|
+
selectProps: n,
|
|
414
|
+
isDisabled: c,
|
|
415
|
+
isFocused: l,
|
|
416
|
+
style: Je,
|
|
417
|
+
children: [
|
|
418
|
+
/* @__PURE__ */ V(
|
|
419
|
+
on,
|
|
420
|
+
{
|
|
421
|
+
innerProps: {},
|
|
422
|
+
selectProps: n,
|
|
423
|
+
isDisabled: c,
|
|
424
|
+
children: [
|
|
425
|
+
a && M.map((e, o) => {
|
|
426
|
+
const u = y(g, "multiValue", {}, {});
|
|
427
|
+
return /* @__PURE__ */ s("span", { style: u, children: /* @__PURE__ */ s(
|
|
428
|
+
vn,
|
|
429
|
+
{
|
|
430
|
+
data: e,
|
|
431
|
+
selectProps: n,
|
|
432
|
+
removeProps: {
|
|
433
|
+
onMouseDown: (d) => d.stopPropagation(),
|
|
434
|
+
onClick: (d) => {
|
|
435
|
+
d.stopPropagation();
|
|
436
|
+
const v = M.filter(
|
|
437
|
+
(ye, oe) => oe !== o
|
|
438
|
+
);
|
|
439
|
+
x(v, { action: "remove-value", removedValue: e });
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
children: F ? F(e, { context: "value" }) : D(e)
|
|
443
|
+
}
|
|
444
|
+
) }, `${_(e)}-${o}`);
|
|
445
|
+
}),
|
|
446
|
+
!a && f && /* @__PURE__ */ s(hn, { data: f, selectProps: n, children: F ? F(f, { context: "value" }) : D(f) }),
|
|
447
|
+
/* @__PURE__ */ s(cn, { innerProps: yn, selectProps: n })
|
|
448
|
+
]
|
|
449
|
+
}
|
|
450
|
+
),
|
|
451
|
+
/* @__PURE__ */ V(sn, { innerProps: {}, selectProps: n, children: [
|
|
452
|
+
_n && /* @__PURE__ */ s(
|
|
453
|
+
an,
|
|
454
|
+
{
|
|
455
|
+
innerProps: {
|
|
456
|
+
onMouseDown: (e) => e.stopPropagation(),
|
|
457
|
+
onClick: Te
|
|
458
|
+
},
|
|
459
|
+
selectProps: n
|
|
460
|
+
}
|
|
461
|
+
),
|
|
462
|
+
/* @__PURE__ */ s(
|
|
463
|
+
ln,
|
|
464
|
+
{
|
|
465
|
+
innerProps: {
|
|
466
|
+
onMouseDown: (e) => {
|
|
467
|
+
e.preventDefault(), e.stopPropagation();
|
|
468
|
+
},
|
|
469
|
+
onClick: (e) => {
|
|
470
|
+
e.stopPropagation(), l ? S() : O();
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
selectProps: n
|
|
474
|
+
}
|
|
475
|
+
)
|
|
476
|
+
] })
|
|
477
|
+
]
|
|
478
|
+
}
|
|
479
|
+
),
|
|
480
|
+
l && /* @__PURE__ */ s(
|
|
481
|
+
un,
|
|
482
|
+
{
|
|
483
|
+
innerProps: {
|
|
484
|
+
ref: _e,
|
|
485
|
+
id: Q,
|
|
486
|
+
className: `rns__menu rns__menu--${de}`
|
|
487
|
+
},
|
|
488
|
+
selectProps: n,
|
|
489
|
+
children: /* @__PURE__ */ V(
|
|
490
|
+
"div",
|
|
491
|
+
{
|
|
492
|
+
style: Qe,
|
|
493
|
+
className: `${k}__menu-inner`,
|
|
494
|
+
children: [
|
|
495
|
+
P && A && /* @__PURE__ */ s("div", { className: "rns__menu-search-wrap", style: Xe, children: /* @__PURE__ */ V(
|
|
496
|
+
"div",
|
|
497
|
+
{
|
|
498
|
+
className: "rns__menu-search-input-wrap",
|
|
499
|
+
style: Ye,
|
|
500
|
+
children: [
|
|
501
|
+
/* @__PURE__ */ s(
|
|
502
|
+
"input",
|
|
503
|
+
{
|
|
504
|
+
ref: te,
|
|
505
|
+
className: "rns__menu-search-input",
|
|
506
|
+
style: Ze,
|
|
507
|
+
value: p,
|
|
508
|
+
placeholder: Se,
|
|
509
|
+
onChange: (e) => I(e.target.value, "input-change"),
|
|
510
|
+
onFocus: () => he(!0),
|
|
511
|
+
onBlur: () => he(!1),
|
|
512
|
+
onKeyDown: ge,
|
|
513
|
+
...be
|
|
514
|
+
}
|
|
515
|
+
),
|
|
516
|
+
!!p && /* @__PURE__ */ s(
|
|
517
|
+
"button",
|
|
518
|
+
{
|
|
519
|
+
type: "button",
|
|
520
|
+
className: "rns__menu-search-clear",
|
|
521
|
+
style: nn,
|
|
522
|
+
"aria-label": "Clear search",
|
|
523
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
524
|
+
onClick: () => I("", "clear"),
|
|
525
|
+
children: "×"
|
|
526
|
+
}
|
|
527
|
+
),
|
|
528
|
+
/* @__PURE__ */ s(
|
|
529
|
+
"span",
|
|
530
|
+
{
|
|
531
|
+
className: "rns__menu-search-icon",
|
|
532
|
+
style: en,
|
|
533
|
+
"aria-hidden": !0,
|
|
534
|
+
children: /* @__PURE__ */ s("svg", { viewBox: "0 0 20 20", width: "16", height: "16", fill: "currentColor", children: /* @__PURE__ */ s("path", { d: "M13.5 12h-.79l-.28-.27A5.49 5.49 0 0 0 13.75 8a5.5 5.5 0 1 0-5.5 5.5 5.49 5.49 0 0 0 3.73-1.32l.27.28v.79l5 4.99L18.49 17l-4.99-5zM8.25 12A4 4 0 1 1 8.25 4a4 4 0 0 1 0 8z" }) })
|
|
535
|
+
}
|
|
536
|
+
)
|
|
537
|
+
]
|
|
538
|
+
}
|
|
539
|
+
) }),
|
|
540
|
+
/* @__PURE__ */ s(dn, { innerProps: {}, selectProps: n, children: Ke ? /* @__PURE__ */ s(pn, { selectProps: n, children: Ne({ inputValue: p }) }) : C.length === 0 ? /* @__PURE__ */ s(mn, { selectProps: n, children: we({ inputValue: p }) }) : C.map((e, o) => {
|
|
541
|
+
const u = Wn(
|
|
542
|
+
e,
|
|
543
|
+
f,
|
|
544
|
+
a,
|
|
545
|
+
_
|
|
546
|
+
), d = o === $, v = y(
|
|
547
|
+
g,
|
|
548
|
+
"option",
|
|
549
|
+
{},
|
|
550
|
+
{ isSelected: u, isFocused: d }
|
|
551
|
+
), ye = F ? F(e, { context: "menu" }) : D(e);
|
|
552
|
+
return /* @__PURE__ */ s(
|
|
553
|
+
"div",
|
|
554
|
+
{
|
|
555
|
+
style: v,
|
|
556
|
+
role: "presentation",
|
|
557
|
+
children: /* @__PURE__ */ s(
|
|
558
|
+
fn,
|
|
559
|
+
{
|
|
560
|
+
data: e,
|
|
561
|
+
isSelected: u,
|
|
562
|
+
isFocused: d,
|
|
563
|
+
innerProps: {
|
|
564
|
+
id: `${K}-opt-${o}`,
|
|
565
|
+
role: "option",
|
|
566
|
+
"aria-selected": u,
|
|
567
|
+
onMouseMove: () => w(o),
|
|
568
|
+
onMouseDown: (oe) => oe.preventDefault(),
|
|
569
|
+
onClick: () => re(e)
|
|
570
|
+
},
|
|
571
|
+
selectProps: n,
|
|
572
|
+
children: ye
|
|
573
|
+
}
|
|
574
|
+
)
|
|
575
|
+
},
|
|
576
|
+
String(_(e))
|
|
577
|
+
);
|
|
578
|
+
}) })
|
|
579
|
+
]
|
|
580
|
+
}
|
|
581
|
+
)
|
|
582
|
+
}
|
|
583
|
+
),
|
|
584
|
+
fe && /* @__PURE__ */ s("input", { type: "hidden", name: fe, value: Hn(f, a, _) })
|
|
585
|
+
] }) });
|
|
586
|
+
}
|
|
587
|
+
function Hn(n, t, r) {
|
|
588
|
+
return t ? !Array.isArray(n) || n.length === 0 ? "" : n.map((i) => r(i)).join(",") : n ? String(r(n)) : "";
|
|
589
|
+
}
|
|
590
|
+
export {
|
|
591
|
+
Tn as Select,
|
|
592
|
+
Ie as SelectContext,
|
|
593
|
+
En as defaultComponents,
|
|
594
|
+
y as mergeStyles,
|
|
595
|
+
Cn as useSelectContext
|
|
596
|
+
};
|
|
597
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/SelectContext.jsx","../src/defaultComponents.jsx","../src/utils/filterOptions.js","../src/utils/mergeStyles.js","../src/Select.jsx"],"sourcesContent":["import { createContext, useContext } from 'react'\r\n\r\nexport const SelectContext = createContext(null)\r\n\r\nexport function useSelectContext() {\r\n const ctx = useContext(SelectContext)\r\n if (!ctx) {\r\n throw new Error('Select subcomponents must be used within <Select />')\r\n }\r\n return ctx\r\n}\r\n","import { forwardRef } from 'react'\r\nimport { useSelectContext } from './SelectContext.jsx'\r\n\r\nexport const DefaultControl = forwardRef(function DefaultControl(props, ref) {\r\n const { innerProps, children, style } = props\r\n return (\r\n <div ref={ref} className=\"rns__control\" style={style} {...innerProps}>\r\n {children}\r\n </div>\r\n )\r\n})\r\n\r\nexport function DefaultValueContainer(props) {\r\n const { innerProps, children } = props\r\n return (\r\n <div className=\"rns__value-container\" {...innerProps}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultIndicatorsContainer(props) {\r\n const { innerProps, children } = props\r\n return (\r\n <div className=\"rns__indicators\" {...innerProps}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultDropdownIndicator(props) {\r\n const { innerProps } = props\r\n const ctx = useSelectContext()\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"rns__indicator rns__dropdown-indicator\"\r\n aria-hidden\r\n tabIndex={-1}\r\n {...innerProps}\r\n >\r\n <span className=\"rns__dropdown-chevron\" aria-hidden>\r\n {ctx.isOpen ? '▲' : '▼'}\r\n </span>\r\n </button>\r\n )\r\n}\r\n\r\nexport function DefaultClearIndicator(props) {\r\n const { innerProps } = props\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"rns__indicator rns__clear-indicator\"\r\n aria-label=\"Clear value\"\r\n {...innerProps}\r\n >\r\n ×\r\n </button>\r\n )\r\n}\r\n\r\nexport const DefaultInput = forwardRef(function DefaultInput(props, ref) {\r\n const { innerProps } = props\r\n return <input ref={ref} className=\"rns__input\" {...innerProps} />\r\n})\r\n\r\nexport function DefaultMenu(props) {\r\n const { innerProps = {}, children } = props\r\n const { ref: menuRef, className, ...rest } = innerProps\r\n return (\r\n <div\r\n ref={menuRef}\r\n className={className ?? 'rns__menu'}\r\n {...rest}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultMenuList(props) {\r\n const { innerProps, children } = props\r\n return (\r\n <div className=\"rns__menu-list\" role=\"listbox\" {...innerProps}>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultOption(props) {\r\n const { innerProps, children, data } = props\r\n return (\r\n <div className=\"rns__option\" role=\"option\" {...innerProps}>\r\n {children ?? data?.label}\r\n </div>\r\n )\r\n}\r\n\r\nexport function DefaultLoadingMessage(props) {\r\n const { children } = props\r\n return <div className=\"rns__loading-message\">{children ?? 'Loading...'}</div>\r\n}\r\n\r\nexport function DefaultNoOptionsMessage(props) {\r\n const { children } = props\r\n return <div className=\"rns__no-options\">{children ?? 'No options'}</div>\r\n}\r\n\r\nexport function DefaultSingleValue(props) {\r\n const { children, data } = props\r\n return <div className=\"rns__single-value\">{children ?? data?.label}</div>\r\n}\r\n\r\nexport function DefaultMultiValue(props) {\r\n const { children, data, removeProps } = props\r\n return (\r\n <div className=\"rns__multi-value\">\r\n <span className=\"rns__multi-value__label\">{children ?? data?.label}</span>\r\n <button type=\"button\" className=\"rns__multi-value__remove\" {...removeProps}>\r\n ×\r\n </button>\r\n </div>\r\n )\r\n}\r\n\r\nexport const defaultComponents = {\r\n Control: DefaultControl,\r\n ValueContainer: DefaultValueContainer,\r\n IndicatorsContainer: DefaultIndicatorsContainer,\r\n DropdownIndicator: DefaultDropdownIndicator,\r\n ClearIndicator: DefaultClearIndicator,\r\n Input: DefaultInput,\r\n Menu: DefaultMenu,\r\n MenuList: DefaultMenuList,\r\n Option: DefaultOption,\r\n LoadingMessage: DefaultLoadingMessage,\r\n NoOptionsMessage: DefaultNoOptionsMessage,\r\n SingleValue: DefaultSingleValue,\r\n MultiValue: DefaultMultiValue,\r\n}\r\n","const defaultStringify = (option, getOptionLabel) => {\r\n const label = getOptionLabel(option)\r\n return String(label ?? '').toLowerCase()\r\n}\r\n\r\n/**\r\n * @param {object[]} options\r\n * @param {string} inputValue\r\n * @param {(option: object, input: string) => boolean} [filterOption]\r\n * @param {(option: object) => string} getOptionLabel\r\n */\r\nexport function filterOptions(options, inputValue, filterOption, getOptionLabel) {\r\n if (!inputValue) return options\r\n const q = inputValue.trim().toLowerCase()\r\n if (!q) return options\r\n\r\n if (typeof filterOption === 'function') {\r\n return options.filter((o) => filterOption(o, inputValue))\r\n }\r\n\r\n return options.filter((o) => defaultStringify(o, getOptionLabel).includes(q))\r\n}\r\n","/**\r\n * @param {Record<string, (base: object, state: object) => object | object>} stylesProp\r\n * @param {string} key\r\n * @param {object} baseStyle\r\n * @param {object} state\r\n */\r\nexport function mergeStyles(stylesProp, key, baseStyle, state) {\r\n const custom = stylesProp?.[key]\r\n if (typeof custom === 'function') {\r\n return custom(baseStyle, state) || baseStyle\r\n }\r\n if (custom && typeof custom === 'object') {\r\n return { ...baseStyle, ...custom }\r\n }\r\n return baseStyle\r\n}\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useId,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react'\r\nimport { SelectContext } from './SelectContext.jsx'\r\nimport { defaultComponents } from './defaultComponents.jsx'\r\nimport { filterOptions as applyFilter } from './utils/filterOptions.js'\r\nimport { mergeStyles } from './utils/mergeStyles.js'\r\nimport './styles/default.css'\r\n\r\nfunction shallowEqualOptions(a, b, getOptionValue) {\r\n if (a === b) return true\r\n if (!a || !b) return false\r\n return getOptionValue(a) === getOptionValue(b)\r\n}\r\n\r\nfunction isOptionSelected(option, value, isMulti, getOptionValue) {\r\n if (!option) return false\r\n if (isMulti && Array.isArray(value)) {\r\n return value.some((v) => getOptionValue(v) === getOptionValue(option))\r\n }\r\n return shallowEqualOptions(option, value, getOptionValue)\r\n}\r\n\r\nfunction mergeComponentMap(user = {}) {\r\n return { ...defaultComponents, ...user }\r\n}\r\n\r\n/**\r\n * @param {object} props\r\n */\r\nexport function Select(props) {\r\n const {\r\n options: optionsProp = [],\r\n value: valueProp,\r\n defaultValue,\r\n onChange,\r\n isMulti = false,\r\n isSearchable = true,\r\n showMenuSearchInput = false,\r\n menuSearchPlaceholder = 'Search...',\r\n menuSearchInputProps = {},\r\n isClearable = false,\r\n isDisabled = false,\r\n isLoading: isLoadingProp = false,\r\n loadOptions,\r\n defaultOptions = false,\r\n filterOption,\r\n getOptionValue = (o) => o?.value,\r\n getOptionLabel = (o) => o?.label,\r\n placeholder = 'Select...',\r\n noOptionsMessage = () => 'No options',\r\n loadingMessage = () => 'Loading...',\r\n components: componentsProp,\r\n className,\r\n classNamePrefix = 'rns',\r\n style,\r\n styles: stylesProp = {},\r\n inputValue: inputValueProp,\r\n defaultInputValue = '',\r\n onInputChange,\r\n onMenuOpen,\r\n onMenuClose,\r\n menuIsOpen: menuIsOpenProp,\r\n closeMenuOnSelect,\r\n blurInputOnSelect = true,\r\n menuPlacement = 'bottom',\r\n id,\r\n 'aria-label': ariaLabel,\r\n 'aria-labelledby': ariaLabelledBy,\r\n name,\r\n tabIndex = 0,\r\n formatOptionLabel,\r\n } = props\r\n\r\n const resolvedCloseMenuOnSelect =\r\n closeMenuOnSelect !== undefined ? closeMenuOnSelect : !isMulti\r\n\r\n const autoId = useId()\r\n const baseId = id ?? `rns-${autoId.replace(/:/g, '')}`\r\n const listboxId = `${baseId}-listbox`\r\n\r\n const isValueControlled = valueProp !== undefined\r\n const isInputControlled = inputValueProp !== undefined\r\n const isMenuControlled = menuIsOpenProp !== undefined\r\n\r\n const [uncontrolledValue, setUncontrolledValue] = useState(\r\n defaultValue ?? (isMulti ? [] : null),\r\n )\r\n const value = isValueControlled ? valueProp : uncontrolledValue\r\n\r\n const [internalInput, setInternalInput] = useState(defaultInputValue)\r\n const inputValue = isInputControlled ? inputValueProp : internalInput\r\n\r\n const [internalMenuOpen, setInternalMenuOpen] = useState(false)\r\n const isOpen = isMenuControlled ? !!menuIsOpenProp : internalMenuOpen\r\n\r\n const [highlightedIndex, setHighlightedIndex] = useState(0)\r\n const [asyncOptions, setAsyncOptions] = useState([])\r\n const [asyncLoading, setAsyncLoading] = useState(false)\r\n const [menuSearchFocused, setMenuSearchFocused] = useState(false)\r\n\r\n const controlRef = useRef(null)\r\n const inputRef = useRef(null)\r\n const menuRef = useRef(null)\r\n const menuSearchInputRef = useRef(null)\r\n const loadRequestRef = useRef(0)\r\n\r\n const components = useMemo(\r\n () => mergeComponentMap(componentsProp),\r\n [componentsProp],\r\n )\r\n\r\n const isAsync = typeof loadOptions === 'function'\r\n const isLoading = isLoadingProp || asyncLoading\r\n\r\n const syncFilteredOptions = useMemo(() => {\r\n if (isAsync) return []\r\n return applyFilter(optionsProp, inputValue, filterOption, getOptionLabel)\r\n }, [isAsync, optionsProp, inputValue, filterOption, getOptionLabel])\r\n\r\n const displayOptions = isAsync ? asyncOptions : syncFilteredOptions\r\n\r\n const selectedValues = useMemo(() => {\r\n if (isMulti) return Array.isArray(value) ? value : []\r\n return value ? [value] : []\r\n }, [isMulti, value])\r\n\r\n const setValue = useCallback(\r\n (next, meta) => {\r\n if (!isValueControlled) {\r\n setUncontrolledValue(next)\r\n }\r\n onChange?.(next, meta)\r\n },\r\n [isValueControlled, onChange],\r\n )\r\n\r\n const setMenuOpen = useCallback(\r\n (open) => {\r\n if (isDisabled) return\r\n if (!isMenuControlled) {\r\n setInternalMenuOpen(open)\r\n }\r\n if (open) onMenuOpen?.()\r\n else onMenuClose?.()\r\n },\r\n [isDisabled, isMenuControlled, onMenuOpen, onMenuClose],\r\n )\r\n\r\n const commitInput = useCallback(\r\n (next, action) => {\r\n if (!isInputControlled) {\r\n setInternalInput(next)\r\n }\r\n onInputChange?.(next, { action, prevInputValue: inputValue })\r\n },\r\n [isInputControlled, onInputChange, inputValue],\r\n )\r\n\r\n const openMenu = useCallback(() => {\r\n if (!isOpen) setMenuOpen(true)\r\n }, [isOpen, setMenuOpen])\r\n\r\n const closeMenu = useCallback(() => {\r\n if (isOpen) {\r\n setMenuOpen(false)\r\n commitInput('', 'menu-close')\r\n setHighlightedIndex(0)\r\n }\r\n }, [isOpen, setMenuOpen, commitInput])\r\n\r\n const runLoadOptions = useCallback(\r\n (search) => {\r\n if (!loadOptions) return\r\n const req = ++loadRequestRef.current\r\n setAsyncLoading(true)\r\n Promise.resolve(loadOptions(search))\r\n .then((loaded) => {\r\n if (req !== loadRequestRef.current) return\r\n setAsyncOptions(Array.isArray(loaded) ? loaded : [])\r\n })\r\n .catch(() => {\r\n if (req !== loadRequestRef.current) return\r\n setAsyncOptions([])\r\n })\r\n .finally(() => {\r\n if (req !== loadRequestRef.current) return\r\n setAsyncLoading(false)\r\n })\r\n },\r\n [loadOptions],\r\n )\r\n\r\n useEffect(() => {\r\n if (!isAsync) return\r\n if (defaultOptions === true) {\r\n runLoadOptions('')\r\n } else if (Array.isArray(defaultOptions)) {\r\n setAsyncOptions(defaultOptions)\r\n }\r\n }, [isAsync, defaultOptions, runLoadOptions])\r\n\r\n useEffect(() => {\r\n if (!isAsync || !isOpen) return\r\n runLoadOptions(inputValue)\r\n }, [isAsync, isOpen, inputValue, runLoadOptions])\r\n\r\n useEffect(() => {\r\n if (typeof document === 'undefined') return\r\n if (!isOpen) return\r\n const onPointerDown = (e) => {\r\n const t = e.target\r\n if (controlRef.current?.contains(t)) return\r\n if (menuRef.current?.contains(t)) return\r\n closeMenu()\r\n }\r\n document.addEventListener('pointerdown', onPointerDown, true)\r\n return () => document.removeEventListener('pointerdown', onPointerDown, true)\r\n }, [isOpen, closeMenu])\r\n\r\n useEffect(() => {\r\n setHighlightedIndex(0)\r\n }, [inputValue, displayOptions.length, isOpen])\r\n\r\n useEffect(() => {\r\n if (!isOpen || !isSearchable || typeof document === 'undefined') return\r\n if (showMenuSearchInput && menuSearchInputRef.current) {\r\n menuSearchInputRef.current.focus()\r\n return\r\n }\r\n if (inputRef.current) {\r\n inputRef.current.focus()\r\n }\r\n }, [isOpen, isSearchable, showMenuSearchInput])\r\n\r\n const selectOption = useCallback(\r\n (option) => {\r\n if (!option || isDisabled) return\r\n if (isMulti) {\r\n const current = Array.isArray(value) ? value : []\r\n const exists = current.some(\r\n (v) => getOptionValue(v) === getOptionValue(option),\r\n )\r\n const next = exists\r\n ? current.filter((v) => getOptionValue(v) !== getOptionValue(option))\r\n : [...current, option]\r\n setValue(next, { action: exists ? 'remove-value' : 'select-option', option })\r\n } else {\r\n setValue(option, { action: 'select-option', option })\r\n }\r\n if (resolvedCloseMenuOnSelect) {\r\n closeMenu()\r\n } else {\r\n commitInput('', 'input-change')\r\n }\r\n if (blurInputOnSelect && inputRef.current && typeof document !== 'undefined') {\r\n inputRef.current.blur()\r\n }\r\n },\r\n [\r\n isDisabled,\r\n isMulti,\r\n value,\r\n getOptionValue,\r\n setValue,\r\n resolvedCloseMenuOnSelect,\r\n closeMenu,\r\n commitInput,\r\n blurInputOnSelect,\r\n ],\r\n )\r\n\r\n const clearValue = useCallback(\r\n (e) => {\r\n e?.preventDefault?.()\r\n e?.stopPropagation?.()\r\n const prev = value\r\n const next = isMulti ? [] : null\r\n setValue(next, { action: 'clear', removedValues: isMulti ? prev : prev ? [prev] : [] })\r\n commitInput('', 'clear')\r\n },\r\n [isMulti, value, setValue, commitInput],\r\n )\r\n\r\n const onKeyDown = useCallback(\r\n (e) => {\r\n if (isDisabled) return\r\n const { key } = e\r\n const max = displayOptions.length - 1\r\n\r\n if (key === 'ArrowDown') {\r\n e.preventDefault()\r\n if (!isOpen) openMenu()\r\n else setHighlightedIndex((i) => (max < 0 ? 0 : Math.min(i + 1, max)))\r\n return\r\n }\r\n if (key === 'ArrowUp') {\r\n e.preventDefault()\r\n if (!isOpen) openMenu()\r\n else setHighlightedIndex((i) => (max < 0 ? 0 : Math.max(i - 1, 0)))\r\n return\r\n }\r\n if (key === 'Home' && isOpen) {\r\n e.preventDefault()\r\n setHighlightedIndex(0)\r\n return\r\n }\r\n if (key === 'End' && isOpen) {\r\n e.preventDefault()\r\n setHighlightedIndex(max < 0 ? 0 : max)\r\n return\r\n }\r\n if (key === 'Enter' && isOpen) {\r\n e.preventDefault()\r\n const opt = displayOptions[highlightedIndex]\r\n if (opt) selectOption(opt)\r\n return\r\n }\r\n if (key === 'Escape' && isOpen) {\r\n e.preventDefault()\r\n closeMenu()\r\n return\r\n }\r\n if (key === 'Tab' && isOpen) {\r\n closeMenu()\r\n }\r\n },\r\n [\r\n isDisabled,\r\n displayOptions,\r\n highlightedIndex,\r\n isOpen,\r\n openMenu,\r\n closeMenu,\r\n selectOption,\r\n ],\r\n )\r\n\r\n const containerStyle = mergeStyles(stylesProp, 'container', {}, { isDisabled })\r\n const controlStyle = mergeStyles(stylesProp, 'control', {}, { isDisabled, isFocused: isOpen })\r\n const menuStyle = mergeStyles(\r\n stylesProp,\r\n 'menu',\r\n {},\r\n { placement: menuPlacement },\r\n )\r\n const menuSearchWrapStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchWrap',\r\n {},\r\n { isDisabled, inputValue },\r\n )\r\n const menuSearchInputWrapStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchInputWrap',\r\n {},\r\n { isDisabled, inputValue, isFocused: menuSearchFocused },\r\n )\r\n const menuSearchInputStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchInput',\r\n {},\r\n { isDisabled, inputValue, isFocused: menuSearchFocused },\r\n )\r\n const menuSearchIconStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchIcon',\r\n {},\r\n { isDisabled, inputValue, isFocused: menuSearchFocused },\r\n )\r\n const menuSearchClearStyle = mergeStyles(\r\n stylesProp,\r\n 'menuSearchClear',\r\n {},\r\n { isDisabled, hasValue: !!inputValue },\r\n )\r\n\r\n const ctx = useMemo(\r\n () => ({\r\n isOpen,\r\n isDisabled,\r\n isMulti,\r\n isSearchable,\r\n inputValue,\r\n highlightedIndex,\r\n displayOptions,\r\n value,\r\n getOptionValue,\r\n getOptionLabel,\r\n classNamePrefix,\r\n }),\r\n [\r\n isOpen,\r\n isDisabled,\r\n isMulti,\r\n isSearchable,\r\n inputValue,\r\n highlightedIndex,\r\n displayOptions,\r\n value,\r\n getOptionValue,\r\n getOptionLabel,\r\n classNamePrefix,\r\n ],\r\n )\r\n\r\n const Control = components.Control\r\n const ValueContainer = components.ValueContainer\r\n const IndicatorsContainer = components.IndicatorsContainer\r\n const DropdownIndicator = components.DropdownIndicator\r\n const ClearIndicator = components.ClearIndicator\r\n const Input = components.Input\r\n const Menu = components.Menu\r\n const MenuList = components.MenuList\r\n const Option = components.Option\r\n const LoadingMessage = components.LoadingMessage\r\n const NoOptionsMessage = components.NoOptionsMessage\r\n const SingleValue = components.SingleValue\r\n const MultiValue = components.MultiValue\r\n\r\n const showClear =\r\n isClearable &&\r\n !isDisabled &&\r\n (isMulti ? selectedValues.length > 0 : value != null)\r\n\r\n const controlInnerProps = {\r\n onKeyDown,\r\n onMouseDown: (e) => {\r\n if (isDisabled) return\r\n e.preventDefault()\r\n if (isOpen) closeMenu()\r\n else openMenu()\r\n },\r\n role: 'combobox',\r\n 'aria-expanded': isOpen,\r\n 'aria-controls': listboxId,\r\n 'aria-haspopup': 'listbox',\r\n 'aria-label': ariaLabel,\r\n 'aria-labelledby': ariaLabelledBy,\r\n tabIndex: isSearchable && !showMenuSearchInput ? -1 : tabIndex,\r\n }\r\n\r\n const inputInnerProps = {\r\n ref: inputRef,\r\n id: `${baseId}-input`,\r\n disabled: isDisabled,\r\n readOnly: !isSearchable || showMenuSearchInput,\r\n value: isSearchable && !showMenuSearchInput ? inputValue : '',\r\n placeholder:\r\n (!isMulti && value) || (isMulti && selectedValues.length > 0)\r\n ? ''\r\n : placeholder,\r\n onChange: (e) => {\r\n if (!isSearchable || isDisabled) return\r\n const v = e.target.value\r\n commitInput(v, 'input-change')\r\n if (!isOpen) openMenu()\r\n },\r\n onFocus: () => openMenu(),\r\n onKeyDown: (e) => {\r\n if (e.key === 'Backspace' && isMulti && !inputValue && selectedValues.length) {\r\n const next = selectedValues.slice(0, -1)\r\n setValue(next, {\r\n action: 'remove-value',\r\n removedValue: selectedValues[selectedValues.length - 1],\r\n })\r\n }\r\n },\r\n autoComplete: 'off',\r\n autoCorrect: 'off',\r\n spellCheck: false,\r\n 'aria-autocomplete': 'list',\r\n 'aria-controls': listboxId,\r\n 'aria-activedescendant': isOpen\r\n ? `${baseId}-opt-${highlightedIndex}`\r\n : undefined,\r\n }\r\n\r\n const rootClass = [\r\n 'rns__wrapper',\r\n classNamePrefix && `${classNamePrefix}__wrapper`,\r\n isDisabled && 'rns--is-disabled',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <SelectContext.Provider value={ctx}>\r\n <div className={rootClass} style={{ ...containerStyle, ...style }}>\r\n <Control\r\n ref={controlRef}\r\n innerProps={controlInnerProps}\r\n selectProps={props}\r\n isDisabled={isDisabled}\r\n isFocused={isOpen}\r\n style={controlStyle}\r\n >\r\n <ValueContainer\r\n innerProps={{}}\r\n selectProps={props}\r\n isDisabled={isDisabled}\r\n >\r\n {isMulti &&\r\n selectedValues.map((v, i) => {\r\n const mvStyle = mergeStyles(stylesProp, 'multiValue', {}, {})\r\n return (\r\n <span key={`${getOptionValue(v)}-${i}`} style={mvStyle}>\r\n <MultiValue\r\n data={v}\r\n selectProps={props}\r\n removeProps={{\r\n onMouseDown: (e) => e.stopPropagation(),\r\n onClick: (e) => {\r\n e.stopPropagation()\r\n const next = selectedValues.filter(\r\n (_, j) => j !== i,\r\n )\r\n setValue(next, { action: 'remove-value', removedValue: v })\r\n },\r\n }}\r\n >\r\n {formatOptionLabel\r\n ? formatOptionLabel(v, { context: 'value' })\r\n : getOptionLabel(v)}\r\n </MultiValue>\r\n </span>\r\n )\r\n })}\r\n {!isMulti && value && (\r\n <SingleValue data={value} selectProps={props}>\r\n {formatOptionLabel\r\n ? formatOptionLabel(value, { context: 'value' })\r\n : getOptionLabel(value)}\r\n </SingleValue>\r\n )}\r\n <Input innerProps={inputInnerProps} selectProps={props} />\r\n </ValueContainer>\r\n <IndicatorsContainer innerProps={{}} selectProps={props}>\r\n {showClear && (\r\n <ClearIndicator\r\n innerProps={{\r\n onMouseDown: (e) => e.stopPropagation(),\r\n onClick: clearValue,\r\n }}\r\n selectProps={props}\r\n />\r\n )}\r\n <DropdownIndicator\r\n innerProps={{\r\n onMouseDown: (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n },\r\n onClick: (e) => {\r\n e.stopPropagation()\r\n if (isOpen) closeMenu()\r\n else openMenu()\r\n },\r\n }}\r\n selectProps={props}\r\n />\r\n </IndicatorsContainer>\r\n </Control>\r\n\r\n {isOpen && (\r\n <Menu\r\n innerProps={{\r\n ref: menuRef,\r\n id: listboxId,\r\n className: `rns__menu rns__menu--${menuPlacement}`,\r\n }}\r\n selectProps={props}\r\n >\r\n <div\r\n style={menuStyle}\r\n className={`${classNamePrefix}__menu-inner`}\r\n >\r\n {isSearchable && showMenuSearchInput && (\r\n <div className=\"rns__menu-search-wrap\" style={menuSearchWrapStyle}>\r\n <div\r\n className=\"rns__menu-search-input-wrap\"\r\n style={menuSearchInputWrapStyle}\r\n >\r\n <input\r\n ref={menuSearchInputRef}\r\n className=\"rns__menu-search-input\"\r\n style={menuSearchInputStyle}\r\n value={inputValue}\r\n placeholder={menuSearchPlaceholder}\r\n onChange={(e) => commitInput(e.target.value, 'input-change')}\r\n onFocus={() => setMenuSearchFocused(true)}\r\n onBlur={() => setMenuSearchFocused(false)}\r\n onKeyDown={onKeyDown}\r\n {...menuSearchInputProps}\r\n />\r\n {!!inputValue && (\r\n <button\r\n type=\"button\"\r\n className=\"rns__menu-search-clear\"\r\n style={menuSearchClearStyle}\r\n aria-label=\"Clear search\"\r\n onMouseDown={(e) => e.preventDefault()}\r\n onClick={() => commitInput('', 'clear')}\r\n >\r\n ×\r\n </button>\r\n )}\r\n <span\r\n className=\"rns__menu-search-icon\"\r\n style={menuSearchIconStyle}\r\n aria-hidden\r\n >\r\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M13.5 12h-.79l-.28-.27A5.49 5.49 0 0 0 13.75 8a5.5 5.5 0 1 0-5.5 5.5 5.49 5.49 0 0 0 3.73-1.32l.27.28v.79l5 4.99L18.49 17l-4.99-5zM8.25 12A4 4 0 1 1 8.25 4a4 4 0 0 1 0 8z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n <MenuList innerProps={{}} selectProps={props}>\r\n {isLoading ? (\r\n <LoadingMessage selectProps={props}>\r\n {loadingMessage({ inputValue })}\r\n </LoadingMessage>\r\n ) : displayOptions.length === 0 ? (\r\n <NoOptionsMessage selectProps={props}>\r\n {noOptionsMessage({ inputValue })}\r\n </NoOptionsMessage>\r\n ) : (\r\n displayOptions.map((opt, index) => {\r\n const selected = isOptionSelected(\r\n opt,\r\n value,\r\n isMulti,\r\n getOptionValue,\r\n )\r\n const focused = index === highlightedIndex\r\n const optStyle = mergeStyles(\r\n stylesProp,\r\n 'option',\r\n {},\r\n { isSelected: selected, isFocused: focused },\r\n )\r\n const label = formatOptionLabel\r\n ? formatOptionLabel(opt, { context: 'menu' })\r\n : getOptionLabel(opt)\r\n return (\r\n <div\r\n key={String(getOptionValue(opt))}\r\n style={optStyle}\r\n role=\"presentation\"\r\n >\r\n <Option\r\n data={opt}\r\n isSelected={selected}\r\n isFocused={focused}\r\n innerProps={{\r\n id: `${baseId}-opt-${index}`,\r\n role: 'option',\r\n 'aria-selected': selected,\r\n onMouseMove: () => setHighlightedIndex(index),\r\n onMouseDown: (e) => e.preventDefault(),\r\n onClick: () => selectOption(opt),\r\n }}\r\n selectProps={props}\r\n >\r\n {label}\r\n </Option>\r\n </div>\r\n )\r\n })\r\n )}\r\n </MenuList>\r\n </div>\r\n </Menu>\r\n )}\r\n\r\n {name && (\r\n <input type=\"hidden\" name={name} value={serializeForForm(value, isMulti, getOptionValue)} />\r\n )}\r\n </div>\r\n </SelectContext.Provider>\r\n )\r\n}\r\n\r\nfunction serializeForForm(value, isMulti, getOptionValue) {\r\n if (isMulti) {\r\n if (!Array.isArray(value) || value.length === 0) return ''\r\n return value.map((v) => getOptionValue(v)).join(',')\r\n }\r\n if (!value) return ''\r\n return String(getOptionValue(value))\r\n}\r\n"],"names":["SelectContext","createContext","useSelectContext","ctx","useContext","DefaultControl","forwardRef","props","ref","innerProps","children","style","jsx","DefaultValueContainer","DefaultIndicatorsContainer","DefaultDropdownIndicator","DefaultClearIndicator","DefaultInput","DefaultMenu","menuRef","className","rest","DefaultMenuList","DefaultOption","data","DefaultLoadingMessage","DefaultNoOptionsMessage","DefaultSingleValue","DefaultMultiValue","removeProps","jsxs","defaultComponents","defaultStringify","option","getOptionLabel","label","filterOptions","options","inputValue","filterOption","q","o","mergeStyles","stylesProp","key","baseStyle","state","custom","shallowEqualOptions","a","b","getOptionValue","isOptionSelected","value","isMulti","v","mergeComponentMap","user","Select","optionsProp","valueProp","defaultValue","onChange","isSearchable","showMenuSearchInput","menuSearchPlaceholder","menuSearchInputProps","isClearable","isDisabled","isLoadingProp","loadOptions","defaultOptions","placeholder","noOptionsMessage","loadingMessage","componentsProp","classNamePrefix","inputValueProp","defaultInputValue","onInputChange","onMenuOpen","onMenuClose","menuIsOpenProp","closeMenuOnSelect","blurInputOnSelect","menuPlacement","id","ariaLabel","ariaLabelledBy","name","tabIndex","formatOptionLabel","resolvedCloseMenuOnSelect","autoId","useId","baseId","listboxId","isValueControlled","isInputControlled","isMenuControlled","uncontrolledValue","setUncontrolledValue","useState","internalInput","setInternalInput","internalMenuOpen","setInternalMenuOpen","isOpen","highlightedIndex","setHighlightedIndex","asyncOptions","setAsyncOptions","asyncLoading","setAsyncLoading","menuSearchFocused","setMenuSearchFocused","controlRef","useRef","inputRef","menuSearchInputRef","loadRequestRef","components","useMemo","isAsync","isLoading","syncFilteredOptions","applyFilter","displayOptions","selectedValues","setValue","useCallback","next","meta","setMenuOpen","open","commitInput","action","openMenu","closeMenu","runLoadOptions","search","req","loaded","useEffect","onPointerDown","e","t","_a","_b","selectOption","current","exists","clearValue","prev","onKeyDown","max","i","opt","containerStyle","controlStyle","menuStyle","menuSearchWrapStyle","menuSearchInputWrapStyle","menuSearchInputStyle","menuSearchIconStyle","menuSearchClearStyle","Control","ValueContainer","IndicatorsContainer","DropdownIndicator","ClearIndicator","Input","Menu","MenuList","Option","LoadingMessage","NoOptionsMessage","SingleValue","MultiValue","showClear","controlInnerProps","inputInnerProps","rootClass","mvStyle","_","j","index","selected","focused","optStyle","serializeForForm"],"mappings":"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"}
|
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.rns__wrapper{position:relative;width:100%;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.4}.rns__control{display:flex;align-items:center;min-height:38px;border:1px solid #cbd5e1;border-radius:6px;background:#fff;cursor:default;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.rns__control:hover{border-color:#94a3b8}.rns__control:focus-within{border-color:#3b82f6;box-shadow:0 0 0 1px #3b82f6}.rns__value-container{display:flex;flex:1;flex-wrap:wrap;align-items:center;gap:4px;padding:2px 8px;min-width:0}.rns__single-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#0f172a}.rns__multi-value{display:inline-flex;align-items:center;background:#e2e8f0;border-radius:4px;font-size:13px;max-width:100%}.rns__multi-value__label{padding:2px 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rns__multi-value__remove{border:none;background:transparent;cursor:pointer;padding:2px 6px;line-height:1;color:#64748b;border-left:1px solid #cbd5e1;font-size:16px;font-weight:600}.rns__multi-value__remove:hover{color:#0f172a;background:#cbd5e1}.rns__input{flex:1 1 auto;min-width:4px;margin:0;padding:6px 0;border:none;outline:none;background:transparent;font:inherit;color:#0f172a}.rns__input:read-only{cursor:default;caret-color:transparent;min-width:1px;flex:0 0 auto}.rns__input::placeholder{color:#94a3b8}.rns__indicators{display:flex;align-items:center;flex-shrink:0}.rns__indicator{display:flex;align-items:center;justify-content:center;padding:6px 8px;border:none;background:transparent;cursor:pointer;color:#64748b;line-height:1}.rns__indicator:hover{color:#0f172a}.rns__clear-indicator{font-size:20px;font-weight:600}.rns__dropdown-chevron{font-size:10px}.rns__menu{position:absolute;left:0;right:0;top:100%;z-index:20;margin-top:4px}.rns__menu.rns__menu--top{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.rns__menu-inner{border:1px solid #cbd5e1;border-radius:6px;background:#fff;box-shadow:0 10px 25px -5px #0000001f;max-height:260px;overflow:hidden}.rns__menu-list{max-height:240px;overflow-y:auto;padding:4px 0}.rns__menu-search-wrap{padding:8px 10px;border-bottom:1px solid #e2e8f0}.rns__menu-search-input-wrap{display:flex;align-items:center;flex:1;min-width:0;max-width:100%;gap:8px;border:1px solid #d1d5db;border-radius:8px;padding:0 10px;background:#fff;box-sizing:border-box}.rns__menu-search-icon{display:inline-flex;color:#64748b;flex:0 0 auto}.rns__menu-search-input{flex:1;min-width:0;border:none;border-radius:0;padding:9px 0;outline:none;font:inherit}.rns__menu-search-input-wrap:focus-within{border-color:#3b82f6;box-shadow:0 0 0 1px #3b82f6}.rns__menu-search-clear{border:none;background:transparent;cursor:pointer;color:#64748b;font-size:20px;font-weight:600;line-height:1;flex:0 0 auto}.rns__option{padding:8px 12px;cursor:pointer;color:#0f172a}.rns__option[aria-selected=true]{background:#eff6ff;color:#1d4ed8}.rns__option:hover{background:#f1f5f9}.rns__loading-message,.rns__no-options{padding:10px 12px;color:#64748b;font-size:13px}.rns__wrapper.rns--is-disabled .rns__control{background:#f8fafc;border-color:#e2e8f0;cursor:not-allowed;opacity:.85}.rns__wrapper.rns--is-disabled .rns__input{cursor:not-allowed}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-next-select",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Accessible, SSR-safe React Select for Next.js — single/multi, async, customizable",
|
|
5
|
+
"author": "Yogesh Gabani",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": [
|
|
9
|
+
"**/*.css"
|
|
10
|
+
],
|
|
11
|
+
"main": "./dist/index.cjs",
|
|
12
|
+
"module": "./dist/index.js",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"import": "./dist/index.js",
|
|
16
|
+
"require": "./dist/index.cjs"
|
|
17
|
+
},
|
|
18
|
+
"./style.css": "./dist/style.css"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "vite build",
|
|
27
|
+
"dev": "vite build --watch",
|
|
28
|
+
"prepublishOnly": "npm run build"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
32
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
36
|
+
"react": "^19.0.0",
|
|
37
|
+
"react-dom": "^19.0.0",
|
|
38
|
+
"vite": "^6.0.3"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"react",
|
|
42
|
+
"select",
|
|
43
|
+
"react-select",
|
|
44
|
+
"nextjs",
|
|
45
|
+
"next.js",
|
|
46
|
+
"ssr",
|
|
47
|
+
"combobox",
|
|
48
|
+
"dropdown",
|
|
49
|
+
"multiselect",
|
|
50
|
+
"multi-select",
|
|
51
|
+
"async-select",
|
|
52
|
+
"searchable",
|
|
53
|
+
"accessible",
|
|
54
|
+
"a11y"
|
|
55
|
+
],
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=16"
|
|
58
|
+
}
|
|
59
|
+
}
|