panelui-native 0.53.0 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +4 -1
  2. package/lib/module/components/combobox/index.js +61 -7
  3. package/lib/module/components/combobox/index.js.map +1 -1
  4. package/lib/module/components/hex-chart/index.js +765 -0
  5. package/lib/module/components/hex-chart/index.js.map +1 -0
  6. package/lib/module/components/sortable/index.js +74 -12
  7. package/lib/module/components/sortable/index.js.map +1 -1
  8. package/lib/module/components/steps/index.js +95 -12
  9. package/lib/module/components/steps/index.js.map +1 -1
  10. package/lib/module/components/tag-input/index.js +435 -0
  11. package/lib/module/components/tag-input/index.js.map +1 -0
  12. package/lib/module/components/tour/index.js +661 -0
  13. package/lib/module/components/tour/index.js.map +1 -0
  14. package/lib/module/index.js +3 -0
  15. package/lib/module/index.js.map +1 -1
  16. package/lib/module/utils/chart.js +209 -0
  17. package/lib/module/utils/chart.js.map +1 -1
  18. package/lib/typescript/src/components/combobox/index.d.ts.map +1 -1
  19. package/lib/typescript/src/components/hex-chart/index.d.ts +277 -0
  20. package/lib/typescript/src/components/hex-chart/index.d.ts.map +1 -0
  21. package/lib/typescript/src/components/sortable/index.d.ts.map +1 -1
  22. package/lib/typescript/src/components/steps/index.d.ts +19 -0
  23. package/lib/typescript/src/components/steps/index.d.ts.map +1 -1
  24. package/lib/typescript/src/components/tag-input/index.d.ts +240 -0
  25. package/lib/typescript/src/components/tag-input/index.d.ts.map +1 -0
  26. package/lib/typescript/src/components/tour/index.d.ts +168 -0
  27. package/lib/typescript/src/components/tour/index.d.ts.map +1 -0
  28. package/lib/typescript/src/index.d.ts +3 -0
  29. package/lib/typescript/src/index.d.ts.map +1 -1
  30. package/lib/typescript/src/utils/chart.d.ts +98 -0
  31. package/lib/typescript/src/utils/chart.d.ts.map +1 -1
  32. package/package.json +1 -1
  33. package/src/components/combobox/index.tsx +65 -12
  34. package/src/components/hex-chart/index.tsx +1009 -0
  35. package/src/components/sortable/index.tsx +72 -16
  36. package/src/components/steps/index.tsx +103 -8
  37. package/src/components/tag-input/index.tsx +619 -0
  38. package/src/components/tour/index.tsx +933 -0
  39. package/src/index.ts +30 -0
  40. package/src/utils/chart.ts +236 -0
@@ -0,0 +1,435 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * TagInput — a field whose value is a list of tokens rather than a string.
5
+ *
6
+ * The value is whatever gets typed. That is the whole distinction from a
7
+ * `Combobox` in `multiple` mode: a Combobox picks from a set of options you
8
+ * supply, so it needs a list, a filter and a surface to float that list on. A
9
+ * tag field has no options and no list — labels on a task, recipients on a
10
+ * message, keywords on a post — so it carries none of that machinery and never
11
+ * opens a portal.
12
+ *
13
+ * ```tsx
14
+ * <TagInput
15
+ * label="Topics"
16
+ * defaultValue={['expo', 'reanimated']}
17
+ * placeholder="Add a topic"
18
+ * />
19
+ * ```
20
+ *
21
+ * ## Three ways a tag gets committed
22
+ *
23
+ * Return commits what has been typed. So does any of `delimiters` — a comma by
24
+ * default — which is what makes pasting `design, research, ops` land as three
25
+ * tags instead of one long one. And `blurBehavior` decides what a field that
26
+ * loses focus mid-word does with the leftover.
27
+ *
28
+ * ## Backspace asks first
29
+ *
30
+ * Backspace on an empty field marks the last tag rather than taking it: the
31
+ * tag turns destructive, and a second backspace removes it. A held backspace
32
+ * repeats, and a field that deleted on the first one would empty itself in the
33
+ * time it takes to notice — the mark is the beat that lets you stop.
34
+ */
35
+ import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
36
+ import { Pressable, TextInput, View } from 'react-native';
37
+ import Animated, { FadeIn, FadeOut, LinearTransition, interpolateColor, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';
38
+ import { tv } from 'tailwind-variants';
39
+ import { useCSSVariable } from 'uniwind';
40
+ import { XIcon } from "../../icons/index.js";
41
+ import { Text } from "../../primitives/text.js";
42
+ import { selectionTick } from "../../utils/haptics.js";
43
+ import { Chip } from "../chip/index.js";
44
+ import { Label } from "../label/index.js";
45
+
46
+ /** Matches Input and Combobox, so the three read as the same control focused. */
47
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
48
+ const FOCUS_DURATION = 150;
49
+ /** Long enough to see a tag arrive or leave, short enough not to queue up. */
50
+ const ENTER_DURATION = 140;
51
+ const EXIT_DURATION = 120;
52
+ const REFLOW_DURATION = 180;
53
+ const tagInputVariants = tv({
54
+ slots: {
55
+ container: 'w-full gap-1.5',
56
+ /*
57
+ * The border colour is animated between the resting and focused tokens, so
58
+ * it is deliberately absent from the class. `flex-wrap` is the load-bearing
59
+ * part: a tag field grows down, because the alternative is a row that
60
+ * scrolls sideways and hides the tags you just added.
61
+ */
62
+ field: 'w-full flex-row flex-wrap items-center rounded-lg border',
63
+ /*
64
+ * A length rather than a `text-*` step, for the reason Input gives: a step
65
+ * sets a size and a line height together, and the extra leading lands above
66
+ * the glyphs, so in a box of fixed height the text sits below the tags it
67
+ * is supposed to be level with.
68
+ */
69
+ input: 'min-w-24 flex-1 py-0 font-normal text-foreground',
70
+ clear: 'items-center justify-center rounded-full',
71
+ description: 'text-sm text-muted-foreground',
72
+ error: 'text-sm text-destructive',
73
+ count: 'text-xs text-muted-foreground'
74
+ },
75
+ variants: {
76
+ variant: {
77
+ outline: {
78
+ field: 'bg-background'
79
+ },
80
+ filled: {
81
+ field: 'bg-muted'
82
+ }
83
+ },
84
+ size: {
85
+ sm: {
86
+ field: 'gap-1 px-2.5 py-1.5',
87
+ input: 'h-7 text-[14px]',
88
+ clear: 'h-5 w-5'
89
+ },
90
+ md: {
91
+ field: 'gap-1.5 px-3 py-2',
92
+ input: 'h-8 text-[16px]',
93
+ clear: 'h-6 w-6'
94
+ },
95
+ lg: {
96
+ field: 'gap-2 px-3.5 py-2.5',
97
+ input: 'h-10 text-[16px]',
98
+ clear: 'h-7 w-7'
99
+ }
100
+ },
101
+ disabled: {
102
+ true: {
103
+ field: 'opacity-[0.64]'
104
+ }
105
+ }
106
+ },
107
+ defaultVariants: {
108
+ variant: 'outline',
109
+ size: 'md'
110
+ }
111
+ });
112
+ /** A tag sits inside the field, so it is a step smaller than the field is. */
113
+ const CHIP_SIZE = {
114
+ sm: 'sm',
115
+ md: 'sm',
116
+ lg: 'md'
117
+ };
118
+
119
+ /** Why a tag was turned away, for a caller that wants to say so. */
120
+
121
+ /** What a field that loses focus mid-word does with the leftover text. */
122
+
123
+ /**
124
+ * Splitting without a regex, so a delimiter never has to be escaped — `.` and
125
+ * `|` are ordinary characters to someone listing the separators they use.
126
+ */
127
+ function splitOn(text, delimiters) {
128
+ let parts = [text];
129
+ for (const delimiter of delimiters) {
130
+ if (!delimiter) continue;
131
+ parts = parts.flatMap(part => part.split(delimiter));
132
+ }
133
+ return parts;
134
+ }
135
+ export const TagInput = /*#__PURE__*/forwardRef(({
136
+ className,
137
+ containerClassName,
138
+ value,
139
+ defaultValue,
140
+ onValueChange,
141
+ inputValue,
142
+ onInputValueChange,
143
+ label,
144
+ description,
145
+ errorMessage,
146
+ isRequired,
147
+ disabled = false,
148
+ readOnly = false,
149
+ max,
150
+ allowOverflow = false,
151
+ allowDuplicates = false,
152
+ delimiters = [','],
153
+ blurBehavior = 'add',
154
+ validate,
155
+ onReject,
156
+ chipVariant = 'default',
157
+ renderTag,
158
+ clearable = false,
159
+ showCount = false,
160
+ haptics = false,
161
+ variant,
162
+ size = 'md',
163
+ placeholder,
164
+ onFocus,
165
+ onBlur,
166
+ onKeyPress,
167
+ onSubmitEditing,
168
+ accessibilityLabel,
169
+ ...props
170
+ }, ref) => {
171
+ const inputRef = useRef(null);
172
+ useImperativeHandle(ref, () => inputRef.current);
173
+ const [ownTags, setOwnTags] = useState(defaultValue ?? []);
174
+ const tags = value ?? ownTags;
175
+ const [ownText, setOwnText] = useState('');
176
+ const text = inputValue ?? ownText;
177
+ const [focused, setFocused] = useState(false);
178
+ /*
179
+ * Which tag a second backspace would take. An index rather than the tag
180
+ * itself, because with `allowDuplicates` two tags can read the same and
181
+ * marking "the last one" has to mean the last one.
182
+ */
183
+ const [marked, setMarked] = useState(null);
184
+ const overflowing = max !== undefined && tags.length > max;
185
+ const invalid = !!errorMessage || overflowing;
186
+ const interactive = !disabled && !readOnly;
187
+
188
+ // The list can be emptied from outside, which would leave the mark pointing
189
+ // past the end of it — and a stale mark is a tag deleted by a backspace
190
+ // meant for the one that used to be there.
191
+ useEffect(() => {
192
+ if (marked !== null && marked >= tags.length) setMarked(null);
193
+ }, [marked, tags.length]);
194
+ const setText = useCallback(next => {
195
+ if (inputValue === undefined) setOwnText(next);
196
+ onInputValueChange?.(next);
197
+ }, [inputValue, onInputValueChange]);
198
+ const commit = useCallback(next => {
199
+ if (value === undefined) setOwnTags(next);
200
+ onValueChange?.(next);
201
+ }, [value, onValueChange]);
202
+
203
+ /**
204
+ * Adds every candidate that survives the rules, in order, and reports the
205
+ * ones that do not. Returns whether anything was actually taken, which is
206
+ * what tells the caller whether the draft text has been consumed.
207
+ */
208
+ const addTags = useCallback(candidates => {
209
+ const incoming = candidates.map(entry => entry.trim()).filter(entry => entry.length > 0);
210
+ if (incoming.length === 0) return false;
211
+ const next = [...tags];
212
+ let added = false;
213
+ for (const tag of incoming) {
214
+ if (!allowDuplicates && next.includes(tag)) {
215
+ onReject?.(tag, 'duplicate');
216
+ continue;
217
+ }
218
+ if (max !== undefined && next.length >= max && !allowOverflow) {
219
+ onReject?.(tag, 'max');
220
+ continue;
221
+ }
222
+ if (validate && !validate(tag, next)) {
223
+ onReject?.(tag, 'invalid');
224
+ continue;
225
+ }
226
+ next.push(tag);
227
+ added = true;
228
+ }
229
+ if (!added) return false;
230
+ if (haptics) selectionTick();
231
+ commit(next);
232
+ return true;
233
+ }, [tags, allowDuplicates, max, allowOverflow, validate, onReject, haptics, commit]);
234
+ const removeAt = useCallback(index => {
235
+ if (index < 0 || index >= tags.length) return;
236
+ if (haptics) selectionTick();
237
+ commit(tags.filter((_, position) => position !== index));
238
+ }, [tags, haptics, commit]);
239
+ const handleChangeText = useCallback(next => {
240
+ // Any typing at all takes the mark off: the backspace that would have
241
+ // removed a tag has been overtaken by a new word.
242
+ setMarked(null);
243
+ if (delimiters.length > 0 && delimiters.some(entry => next.includes(entry))) {
244
+ const parts = splitOn(next, delimiters);
245
+ // The last piece is what comes *after* the final delimiter — still
246
+ // being typed, so it stays in the field rather than becoming a tag.
247
+ const trailing = parts.pop() ?? '';
248
+ addTags(parts);
249
+ setText(trailing);
250
+ return;
251
+ }
252
+ setText(next);
253
+ }, [delimiters, addTags, setText]);
254
+ const handleSubmit = useCallback(event => {
255
+ if (addTags([text])) setText('');
256
+ onSubmitEditing?.(event);
257
+ }, [addTags, text, setText, onSubmitEditing]);
258
+ const handleKeyPress = useCallback(event => {
259
+ onKeyPress?.(event);
260
+ if (event.nativeEvent.key !== 'Backspace') {
261
+ setMarked(null);
262
+ return;
263
+ }
264
+ // There is still a character in front of the cursor: backspace means
265
+ // what it always means, and the tags are none of its business.
266
+ if (text.length > 0 || tags.length === 0) return;
267
+ if (marked !== null && marked < tags.length) {
268
+ removeAt(marked);
269
+ setMarked(null);
270
+ return;
271
+ }
272
+ setMarked(tags.length - 1);
273
+ }, [onKeyPress, text.length, tags.length, marked, removeAt]);
274
+ const handleFocus = useCallback(event => {
275
+ setFocused(true);
276
+ onFocus?.(event);
277
+ }, [onFocus]);
278
+ const handleBlur = useCallback(event => {
279
+ setFocused(false);
280
+ setMarked(null);
281
+ if (blurBehavior === 'clear') {
282
+ setText('');
283
+ } else if (blurBehavior === 'add') {
284
+ // Only cleared when it was taken. Text that was refused stays in the
285
+ // field, because a word that vanishes on blur looks like it was
286
+ // accepted and a rejected tag has to remain visible to be fixed.
287
+ if (addTags([text])) setText('');
288
+ }
289
+ onBlur?.(event);
290
+ }, [blurBehavior, setText, addTags, text, onBlur]);
291
+ const focusField = useCallback(() => {
292
+ inputRef.current?.focus();
293
+ }, []);
294
+ const clear = useCallback(() => {
295
+ setText('');
296
+ setMarked(null);
297
+ commit([]);
298
+ inputRef.current?.focus();
299
+ }, [setText, commit]);
300
+ const slots = tagInputVariants({
301
+ variant,
302
+ size,
303
+ disabled
304
+ });
305
+ const placeholderColor = useCSSVariable('--color-muted-foreground');
306
+ const restColor = useCSSVariable('--color-input');
307
+ const focusColor = useCSSVariable('--color-ring');
308
+ const errorColor = useCSSVariable('--color-destructive');
309
+ const mutedColor = typeof placeholderColor === 'string' ? placeholderColor : '#737373';
310
+
311
+ /*
312
+ * One 0..1 value rather than a class per state: Uniwind can only swap a
313
+ * class wholesale, which is the snap this is here to avoid, and a shared
314
+ * value crosses between the two colours on the UI thread without a
315
+ * re-render for every frame of it.
316
+ */
317
+ const focus = useSharedValue(0);
318
+ useEffect(() => {
319
+ focus.value = withTiming(focused ? 1 : 0, {
320
+ duration: FOCUS_DURATION
321
+ });
322
+ }, [focused, focus]);
323
+ const resting = typeof restColor === 'string' ? restColor : '#e5e5e5';
324
+ const active = invalid ? typeof errorColor === 'string' ? errorColor : '#ef4444' : typeof focusColor === 'string' ? focusColor : '#a3a3a3';
325
+ // An invalid field is tinted at rest too — the error is a fact about the
326
+ // value, not about whether the field happens to be focused.
327
+ const idle = invalid ? active : resting;
328
+ const borderStyle = useAnimatedStyle(() => ({
329
+ borderColor: interpolateColor(focus.value, [0, 1], [idle, active])
330
+ }));
331
+ const hasContent = tags.length > 0 || text.length > 0;
332
+ const fieldLabel = accessibilityLabel ?? label ?? placeholder;
333
+ const countLine = useMemo(() => {
334
+ if (!showCount || max === undefined) return null;
335
+ return `${tags.length} / ${max}`;
336
+ }, [showCount, max, tags.length]);
337
+ return /*#__PURE__*/_jsxs(View, {
338
+ className: slots.container({
339
+ className: containerClassName
340
+ }),
341
+ children: [label ? /*#__PURE__*/_jsx(Label, {
342
+ isRequired: isRequired,
343
+ isInvalid: invalid,
344
+ isDisabled: disabled,
345
+ children: label
346
+ }) : null, /*#__PURE__*/_jsx(Pressable, {
347
+ onPress: focusField,
348
+ disabled: !interactive
349
+ // The box is a way to reach the input, not a control of its own — the
350
+ // input below it already carries the label and the state.
351
+ ,
352
+ accessible: false,
353
+ children: /*#__PURE__*/_jsxs(Animated.View, {
354
+ style: borderStyle,
355
+ className: slots.field({
356
+ className
357
+ }),
358
+ children: [tags.map((tag, index) => /*#__PURE__*/_jsx(Animated.View, {
359
+ entering: FadeIn.duration(ENTER_DURATION),
360
+ exiting: FadeOut.duration(EXIT_DURATION),
361
+ layout: LinearTransition.duration(REFLOW_DURATION),
362
+ children: renderTag ? renderTag(tag, index) : /*#__PURE__*/_jsx(Chip, {
363
+ size: CHIP_SIZE[size]
364
+ // The marked tag turns destructive rather than growing an
365
+ // outline: it is about to be deleted, and that is the one
366
+ // colour in the theme that already means exactly that.
367
+ ,
368
+ variant: marked === index ? 'destructive' : chipVariant,
369
+ onClose: interactive ? () => removeAt(index) : undefined,
370
+ closeLabel: `Remove ${tag}`,
371
+ haptics: haptics,
372
+ children: tag
373
+ })
374
+ }, `${tag}-${index}`)), readOnly ? null : /*#__PURE__*/_jsx(TextInput, {
375
+ ref: inputRef,
376
+ value: text,
377
+ onChangeText: handleChangeText,
378
+ onFocus: handleFocus,
379
+ onBlur: handleBlur,
380
+ onKeyPress: handleKeyPress,
381
+ onSubmitEditing: handleSubmit,
382
+ editable: !disabled
383
+ // Return commits a tag and the field stays open for the next
384
+ // one — dismissing the keyboard after every tag would make
385
+ // adding three of them three separate visits to the field.
386
+ ,
387
+ submitBehavior: "submit",
388
+ returnKeyType: "done"
389
+ // Android lays a single-line input's text against the top of
390
+ // its box unless told otherwise; iOS centres it. Without this
391
+ // the text sits above the tags on one platform and level with
392
+ // them on the other.
393
+ ,
394
+ textAlignVertical: "center",
395
+ placeholder: tags.length > 0 ? undefined : placeholder,
396
+ placeholderTextColor: mutedColor,
397
+ autoCapitalize: "none",
398
+ autoCorrect: false,
399
+ autoComplete: "off",
400
+ accessibilityLabel: fieldLabel,
401
+ accessibilityState: {
402
+ disabled
403
+ },
404
+ "aria-required": isRequired,
405
+ "aria-invalid": invalid,
406
+ className: slots.input(),
407
+ ...props
408
+ }), clearable && hasContent && interactive ? /*#__PURE__*/_jsx(Pressable, {
409
+ accessibilityRole: "button",
410
+ accessibilityLabel: "Clear all tags",
411
+ hitSlop: 8,
412
+ onPress: clear,
413
+ className: slots.clear(),
414
+ children: /*#__PURE__*/_jsx(XIcon, {
415
+ size: 16,
416
+ color: mutedColor
417
+ })
418
+ }) : null]
419
+ })
420
+ }), errorMessage ? /*#__PURE__*/_jsx(Text, {
421
+ className: slots.error(),
422
+ children: errorMessage
423
+ }) : description ? /*#__PURE__*/_jsx(Text, {
424
+ className: slots.description(),
425
+ children: description
426
+ }) : null, countLine ? /*#__PURE__*/_jsx(Text, {
427
+ className: slots.count({
428
+ className: overflowing ? 'text-destructive' : undefined
429
+ }),
430
+ children: countLine
431
+ }) : null]
432
+ });
433
+ });
434
+ TagInput.displayName = 'TagInput';
435
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["forwardRef","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","Pressable","TextInput","View","Animated","FadeIn","FadeOut","LinearTransition","interpolateColor","useAnimatedStyle","useSharedValue","withTiming","tv","useCSSVariable","XIcon","Text","selectionTick","Chip","Label","jsx","_jsx","jsxs","_jsxs","FOCUS_DURATION","ENTER_DURATION","EXIT_DURATION","REFLOW_DURATION","tagInputVariants","slots","container","field","input","clear","description","error","count","variants","variant","outline","filled","size","sm","md","lg","disabled","true","defaultVariants","CHIP_SIZE","splitOn","text","delimiters","parts","delimiter","flatMap","part","split","TagInput","className","containerClassName","value","defaultValue","onValueChange","inputValue","onInputValueChange","label","errorMessage","isRequired","readOnly","max","allowOverflow","allowDuplicates","blurBehavior","validate","onReject","chipVariant","renderTag","clearable","showCount","haptics","placeholder","onFocus","onBlur","onKeyPress","onSubmitEditing","accessibilityLabel","props","ref","inputRef","current","ownTags","setOwnTags","tags","ownText","setOwnText","focused","setFocused","marked","setMarked","overflowing","undefined","length","invalid","interactive","setText","next","commit","addTags","candidates","incoming","map","entry","trim","filter","added","tag","includes","push","removeAt","index","_","position","handleChangeText","some","trailing","pop","handleSubmit","event","handleKeyPress","nativeEvent","key","handleFocus","handleBlur","focusField","focus","placeholderColor","restColor","focusColor","errorColor","mutedColor","duration","resting","active","idle","borderStyle","borderColor","hasContent","fieldLabel","countLine","children","isInvalid","isDisabled","onPress","accessible","style","entering","exiting","layout","onClose","closeLabel","onChangeText","editable","submitBehavior","returnKeyType","textAlignVertical","placeholderTextColor","autoCapitalize","autoCorrect","autoComplete","accessibilityState","accessibilityRole","hitSlop","color","displayName"],"sourceRoot":"../../../../src","sources":["components/tag-input/index.tsx"],"mappings":"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","ignoreList":[]}