@douglasneuroinformatics/libui 1.0.0 → 1.2.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/dist/{chunk-57KC6SAE.js → chunk-PAAJ5AH3.js} +6 -2
- package/dist/chunk-PAAJ5AH3.js.map +1 -0
- package/dist/components/index.d.ts +299 -8
- package/dist/components/index.js +122 -15
- package/dist/components/index.js.map +1 -1
- package/dist/douglasneuroinformatics-libui-1.2.0.tgz +0 -0
- package/dist/hooks/index.d.ts +39 -3
- package/dist/hooks/index.js +67 -35
- package/dist/hooks/index.js.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.js +5 -3
- package/package.json +40 -27
- package/dist/chunk-57KC6SAE.js.map +0 -1
|
@@ -4,8 +4,12 @@ import { twMerge } from "tailwind-merge";
|
|
|
4
4
|
function cn(...inputs) {
|
|
5
5
|
return twMerge(clsx(inputs));
|
|
6
6
|
}
|
|
7
|
+
function isBrowser() {
|
|
8
|
+
return typeof window !== "undefined";
|
|
9
|
+
}
|
|
7
10
|
|
|
8
11
|
export {
|
|
9
|
-
cn
|
|
12
|
+
cn,
|
|
13
|
+
isBrowser
|
|
10
14
|
};
|
|
11
|
-
//# sourceMappingURL=chunk-
|
|
15
|
+
//# sourceMappingURL=chunk-PAAJ5AH3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function isBrowser() {\n return typeof window !== 'undefined';\n}\n"],"mappings":";AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;AAEO,SAAS,YAAY;AAC1B,SAAO,OAAO,WAAW;AAC3B;","names":[]}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
1
|
import * as React from 'react';
|
|
3
2
|
import React__default from 'react';
|
|
4
|
-
import
|
|
3
|
+
import * as _radix_ui_react_accordion from '@radix-ui/react-accordion';
|
|
5
4
|
import { Simplify } from 'type-fest';
|
|
5
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
6
|
+
import { VariantProps } from 'class-variance-authority';
|
|
6
7
|
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
7
8
|
|
|
9
|
+
declare const Accordion: React.ForwardRefExoticComponent<(Omit<_radix_ui_react_accordion.AccordionSingleProps & React.RefAttributes<HTMLDivElement>, "ref"> | Omit<_radix_ui_react_accordion.AccordionMultipleProps & React.RefAttributes<HTMLDivElement>, "ref">) & React.RefAttributes<HTMLDivElement>> & {
|
|
10
|
+
Content: React.ForwardRefExoticComponent<Omit<_radix_ui_react_accordion.AccordionContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
Item: React.ForwardRefExoticComponent<Omit<_radix_ui_react_accordion.AccordionItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
12
|
+
Trigger: React.ForwardRefExoticComponent<Omit<_radix_ui_react_accordion.AccordionTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
13
|
+
};
|
|
14
|
+
|
|
8
15
|
declare const BUTTON_ICON_SIZE: {
|
|
9
16
|
lg: number;
|
|
10
17
|
md: number;
|
|
@@ -12,7 +19,7 @@ declare const BUTTON_ICON_SIZE: {
|
|
|
12
19
|
};
|
|
13
20
|
declare const buttonVariants: (props?: ({
|
|
14
21
|
size?: "md" | "icon" | "lg" | "sm" | null | undefined;
|
|
15
|
-
variant?: "
|
|
22
|
+
variant?: "link" | "primary" | "danger" | "ghost" | "outline" | "secondary" | null | undefined;
|
|
16
23
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
17
24
|
type ButtonProps = Simplify<React__default.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants> & {
|
|
18
25
|
asChild?: boolean;
|
|
@@ -76,7 +83,7 @@ declare const Button: React__default.ForwardRefExoticComponent<{
|
|
|
76
83
|
results?: number | undefined;
|
|
77
84
|
security?: string | undefined;
|
|
78
85
|
unselectable?: "on" | "off" | undefined;
|
|
79
|
-
inputMode?: "
|
|
86
|
+
inputMode?: "search" | "text" | "none" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
|
|
80
87
|
is?: string | undefined;
|
|
81
88
|
"aria-activedescendant"?: string | undefined;
|
|
82
89
|
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
@@ -90,7 +97,7 @@ declare const Button: React__default.ForwardRefExoticComponent<{
|
|
|
90
97
|
"aria-colindextext"?: string | undefined;
|
|
91
98
|
"aria-colspan"?: number | undefined;
|
|
92
99
|
"aria-controls"?: string | undefined;
|
|
93
|
-
"aria-current"?: boolean | "true" | "false" | "page" | "step" | "location" | "date" |
|
|
100
|
+
"aria-current"?: boolean | "time" | "true" | "false" | "page" | "step" | "location" | "date" | undefined;
|
|
94
101
|
"aria-describedby"?: string | undefined;
|
|
95
102
|
"aria-description"?: string | undefined;
|
|
96
103
|
"aria-details"?: string | undefined;
|
|
@@ -100,7 +107,7 @@ declare const Button: React__default.ForwardRefExoticComponent<{
|
|
|
100
107
|
"aria-expanded"?: (boolean | "true" | "false") | undefined;
|
|
101
108
|
"aria-flowto"?: string | undefined;
|
|
102
109
|
"aria-grabbed"?: (boolean | "true" | "false") | undefined;
|
|
103
|
-
"aria-haspopup"?: boolean | "
|
|
110
|
+
"aria-haspopup"?: boolean | "dialog" | "menu" | "true" | "false" | "grid" | "listbox" | "tree" | undefined;
|
|
104
111
|
"aria-hidden"?: (boolean | "true" | "false") | undefined;
|
|
105
112
|
"aria-invalid"?: boolean | "true" | "false" | "grammar" | "spelling" | undefined;
|
|
106
113
|
"aria-keyshortcuts"?: string | undefined;
|
|
@@ -298,14 +305,298 @@ declare const Button: React__default.ForwardRefExoticComponent<{
|
|
|
298
305
|
onTransitionEnd?: React__default.TransitionEventHandler<HTMLButtonElement> | undefined;
|
|
299
306
|
onTransitionEndCapture?: React__default.TransitionEventHandler<HTMLButtonElement> | undefined;
|
|
300
307
|
size?: "md" | "icon" | "lg" | "sm" | null | undefined;
|
|
301
|
-
variant?: "
|
|
308
|
+
variant?: "link" | "primary" | "danger" | "ghost" | "outline" | "secondary" | null | undefined;
|
|
302
309
|
asChild?: boolean | undefined;
|
|
303
310
|
label?: string | undefined;
|
|
304
311
|
} & React__default.RefAttributes<HTMLButtonElement>>;
|
|
305
312
|
|
|
313
|
+
type ArrowToggleProps = Simplify<React__default.HTMLAttributes<HTMLButtonElement> & {
|
|
314
|
+
/** Whether or not the arrow is currently toggled */
|
|
315
|
+
isToggled?: boolean;
|
|
316
|
+
/** The starting position of the arrow (i.e., which direction does it point to) */
|
|
317
|
+
position: 'down' | 'left' | 'right' | 'up';
|
|
318
|
+
/** The clockwise rotation of the arrow when toggled (e.g., if the position is 'right' and rotation is 90, the arrow will point down) */
|
|
319
|
+
rotation?: number;
|
|
320
|
+
/** The variant of button to use */
|
|
321
|
+
variant?: Extract<ButtonProps['variant'], 'ghost' | 'outline'>;
|
|
322
|
+
}>;
|
|
323
|
+
declare const ArrowToggle: React__default.ForwardRefExoticComponent<{
|
|
324
|
+
defaultChecked?: boolean | undefined;
|
|
325
|
+
defaultValue?: string | number | readonly string[] | undefined;
|
|
326
|
+
suppressContentEditableWarning?: boolean | undefined;
|
|
327
|
+
suppressHydrationWarning?: boolean | undefined;
|
|
328
|
+
accessKey?: string | undefined;
|
|
329
|
+
autoFocus?: boolean | undefined;
|
|
330
|
+
className?: string | undefined;
|
|
331
|
+
contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
|
|
332
|
+
contextMenu?: string | undefined;
|
|
333
|
+
dir?: string | undefined;
|
|
334
|
+
draggable?: (boolean | "true" | "false") | undefined;
|
|
335
|
+
hidden?: boolean | undefined;
|
|
336
|
+
id?: string | undefined;
|
|
337
|
+
lang?: string | undefined;
|
|
338
|
+
nonce?: string | undefined;
|
|
339
|
+
slot?: string | undefined;
|
|
340
|
+
spellCheck?: (boolean | "true" | "false") | undefined;
|
|
341
|
+
style?: React__default.CSSProperties | undefined;
|
|
342
|
+
tabIndex?: number | undefined;
|
|
343
|
+
title?: string | undefined;
|
|
344
|
+
translate?: "yes" | "no" | undefined;
|
|
345
|
+
radioGroup?: string | undefined;
|
|
346
|
+
role?: React__default.AriaRole | undefined;
|
|
347
|
+
about?: string | undefined;
|
|
348
|
+
content?: string | undefined;
|
|
349
|
+
datatype?: string | undefined;
|
|
350
|
+
inlist?: any;
|
|
351
|
+
prefix?: string | undefined;
|
|
352
|
+
property?: string | undefined;
|
|
353
|
+
rel?: string | undefined;
|
|
354
|
+
resource?: string | undefined;
|
|
355
|
+
rev?: string | undefined;
|
|
356
|
+
typeof?: string | undefined;
|
|
357
|
+
vocab?: string | undefined;
|
|
358
|
+
autoCapitalize?: string | undefined;
|
|
359
|
+
autoCorrect?: string | undefined;
|
|
360
|
+
autoSave?: string | undefined;
|
|
361
|
+
color?: string | undefined;
|
|
362
|
+
itemProp?: string | undefined;
|
|
363
|
+
itemScope?: boolean | undefined;
|
|
364
|
+
itemType?: string | undefined;
|
|
365
|
+
itemID?: string | undefined;
|
|
366
|
+
itemRef?: string | undefined;
|
|
367
|
+
results?: number | undefined;
|
|
368
|
+
security?: string | undefined;
|
|
369
|
+
unselectable?: "on" | "off" | undefined;
|
|
370
|
+
inputMode?: "search" | "text" | "none" | "tel" | "url" | "email" | "numeric" | "decimal" | undefined;
|
|
371
|
+
is?: string | undefined;
|
|
372
|
+
"aria-activedescendant"?: string | undefined;
|
|
373
|
+
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
374
|
+
"aria-autocomplete"?: "list" | "none" | "inline" | "both" | undefined;
|
|
375
|
+
"aria-braillelabel"?: string | undefined;
|
|
376
|
+
"aria-brailleroledescription"?: string | undefined;
|
|
377
|
+
"aria-busy"?: (boolean | "true" | "false") | undefined;
|
|
378
|
+
"aria-checked"?: boolean | "true" | "false" | "mixed" | undefined;
|
|
379
|
+
"aria-colcount"?: number | undefined;
|
|
380
|
+
"aria-colindex"?: number | undefined;
|
|
381
|
+
"aria-colindextext"?: string | undefined;
|
|
382
|
+
"aria-colspan"?: number | undefined;
|
|
383
|
+
"aria-controls"?: string | undefined;
|
|
384
|
+
"aria-current"?: boolean | "time" | "true" | "false" | "page" | "step" | "location" | "date" | undefined;
|
|
385
|
+
"aria-describedby"?: string | undefined;
|
|
386
|
+
"aria-description"?: string | undefined;
|
|
387
|
+
"aria-details"?: string | undefined;
|
|
388
|
+
"aria-disabled"?: (boolean | "true" | "false") | undefined;
|
|
389
|
+
"aria-dropeffect"?: "link" | "none" | "copy" | "execute" | "move" | "popup" | undefined;
|
|
390
|
+
"aria-errormessage"?: string | undefined;
|
|
391
|
+
"aria-expanded"?: (boolean | "true" | "false") | undefined;
|
|
392
|
+
"aria-flowto"?: string | undefined;
|
|
393
|
+
"aria-grabbed"?: (boolean | "true" | "false") | undefined;
|
|
394
|
+
"aria-haspopup"?: boolean | "dialog" | "menu" | "true" | "false" | "grid" | "listbox" | "tree" | undefined;
|
|
395
|
+
"aria-hidden"?: (boolean | "true" | "false") | undefined;
|
|
396
|
+
"aria-invalid"?: boolean | "true" | "false" | "grammar" | "spelling" | undefined;
|
|
397
|
+
"aria-keyshortcuts"?: string | undefined;
|
|
398
|
+
"aria-label"?: string | undefined;
|
|
399
|
+
"aria-labelledby"?: string | undefined;
|
|
400
|
+
"aria-level"?: number | undefined;
|
|
401
|
+
"aria-live"?: "off" | "assertive" | "polite" | undefined;
|
|
402
|
+
"aria-modal"?: (boolean | "true" | "false") | undefined;
|
|
403
|
+
"aria-multiline"?: (boolean | "true" | "false") | undefined;
|
|
404
|
+
"aria-multiselectable"?: (boolean | "true" | "false") | undefined;
|
|
405
|
+
"aria-orientation"?: "horizontal" | "vertical" | undefined;
|
|
406
|
+
"aria-owns"?: string | undefined;
|
|
407
|
+
"aria-placeholder"?: string | undefined;
|
|
408
|
+
"aria-posinset"?: number | undefined;
|
|
409
|
+
"aria-pressed"?: boolean | "true" | "false" | "mixed" | undefined;
|
|
410
|
+
"aria-readonly"?: (boolean | "true" | "false") | undefined;
|
|
411
|
+
"aria-relevant"?: "text" | "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text additions" | "text removals" | undefined;
|
|
412
|
+
"aria-required"?: (boolean | "true" | "false") | undefined;
|
|
413
|
+
"aria-roledescription"?: string | undefined;
|
|
414
|
+
"aria-rowcount"?: number | undefined;
|
|
415
|
+
"aria-rowindex"?: number | undefined;
|
|
416
|
+
"aria-rowindextext"?: string | undefined;
|
|
417
|
+
"aria-rowspan"?: number | undefined;
|
|
418
|
+
"aria-selected"?: (boolean | "true" | "false") | undefined;
|
|
419
|
+
"aria-setsize"?: number | undefined;
|
|
420
|
+
"aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
|
|
421
|
+
"aria-valuemax"?: number | undefined;
|
|
422
|
+
"aria-valuemin"?: number | undefined;
|
|
423
|
+
"aria-valuenow"?: number | undefined;
|
|
424
|
+
"aria-valuetext"?: string | undefined;
|
|
425
|
+
children?: React__default.ReactNode;
|
|
426
|
+
dangerouslySetInnerHTML?: {
|
|
427
|
+
__html: string | TrustedHTML;
|
|
428
|
+
} | undefined;
|
|
429
|
+
onCopy?: React__default.ClipboardEventHandler<HTMLButtonElement> | undefined;
|
|
430
|
+
onCopyCapture?: React__default.ClipboardEventHandler<HTMLButtonElement> | undefined;
|
|
431
|
+
onCut?: React__default.ClipboardEventHandler<HTMLButtonElement> | undefined;
|
|
432
|
+
onCutCapture?: React__default.ClipboardEventHandler<HTMLButtonElement> | undefined;
|
|
433
|
+
onPaste?: React__default.ClipboardEventHandler<HTMLButtonElement> | undefined;
|
|
434
|
+
onPasteCapture?: React__default.ClipboardEventHandler<HTMLButtonElement> | undefined;
|
|
435
|
+
onCompositionEnd?: React__default.CompositionEventHandler<HTMLButtonElement> | undefined;
|
|
436
|
+
onCompositionEndCapture?: React__default.CompositionEventHandler<HTMLButtonElement> | undefined;
|
|
437
|
+
onCompositionStart?: React__default.CompositionEventHandler<HTMLButtonElement> | undefined;
|
|
438
|
+
onCompositionStartCapture?: React__default.CompositionEventHandler<HTMLButtonElement> | undefined;
|
|
439
|
+
onCompositionUpdate?: React__default.CompositionEventHandler<HTMLButtonElement> | undefined;
|
|
440
|
+
onCompositionUpdateCapture?: React__default.CompositionEventHandler<HTMLButtonElement> | undefined;
|
|
441
|
+
onFocus?: React__default.FocusEventHandler<HTMLButtonElement> | undefined;
|
|
442
|
+
onFocusCapture?: React__default.FocusEventHandler<HTMLButtonElement> | undefined;
|
|
443
|
+
onBlur?: React__default.FocusEventHandler<HTMLButtonElement> | undefined;
|
|
444
|
+
onBlurCapture?: React__default.FocusEventHandler<HTMLButtonElement> | undefined;
|
|
445
|
+
onChange?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
446
|
+
onChangeCapture?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
447
|
+
onBeforeInput?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
448
|
+
onBeforeInputCapture?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
449
|
+
onInput?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
450
|
+
onInputCapture?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
451
|
+
onReset?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
452
|
+
onResetCapture?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
453
|
+
onSubmit?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
454
|
+
onSubmitCapture?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
455
|
+
onInvalid?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
456
|
+
onInvalidCapture?: React__default.FormEventHandler<HTMLButtonElement> | undefined;
|
|
457
|
+
onLoad?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
458
|
+
onLoadCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
459
|
+
onError?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
460
|
+
onErrorCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
461
|
+
onKeyDown?: React__default.KeyboardEventHandler<HTMLButtonElement> | undefined;
|
|
462
|
+
onKeyDownCapture?: React__default.KeyboardEventHandler<HTMLButtonElement> | undefined;
|
|
463
|
+
onKeyPress?: React__default.KeyboardEventHandler<HTMLButtonElement> | undefined;
|
|
464
|
+
onKeyPressCapture?: React__default.KeyboardEventHandler<HTMLButtonElement> | undefined;
|
|
465
|
+
onKeyUp?: React__default.KeyboardEventHandler<HTMLButtonElement> | undefined;
|
|
466
|
+
onKeyUpCapture?: React__default.KeyboardEventHandler<HTMLButtonElement> | undefined;
|
|
467
|
+
onAbort?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
468
|
+
onAbortCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
469
|
+
onCanPlay?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
470
|
+
onCanPlayCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
471
|
+
onCanPlayThrough?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
472
|
+
onCanPlayThroughCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
473
|
+
onDurationChange?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
474
|
+
onDurationChangeCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
475
|
+
onEmptied?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
476
|
+
onEmptiedCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
477
|
+
onEncrypted?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
478
|
+
onEncryptedCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
479
|
+
onEnded?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
480
|
+
onEndedCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
481
|
+
onLoadedData?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
482
|
+
onLoadedDataCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
483
|
+
onLoadedMetadata?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
484
|
+
onLoadedMetadataCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
485
|
+
onLoadStart?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
486
|
+
onLoadStartCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
487
|
+
onPause?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
488
|
+
onPauseCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
489
|
+
onPlay?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
490
|
+
onPlayCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
491
|
+
onPlaying?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
492
|
+
onPlayingCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
493
|
+
onProgress?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
494
|
+
onProgressCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
495
|
+
onRateChange?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
496
|
+
onRateChangeCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
497
|
+
onResize?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
498
|
+
onResizeCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
499
|
+
onSeeked?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
500
|
+
onSeekedCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
501
|
+
onSeeking?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
502
|
+
onSeekingCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
503
|
+
onStalled?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
504
|
+
onStalledCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
505
|
+
onSuspend?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
506
|
+
onSuspendCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
507
|
+
onTimeUpdate?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
508
|
+
onTimeUpdateCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
509
|
+
onVolumeChange?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
510
|
+
onVolumeChangeCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
511
|
+
onWaiting?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
512
|
+
onWaitingCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
513
|
+
onAuxClick?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
514
|
+
onAuxClickCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
515
|
+
onClick?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
516
|
+
onClickCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
517
|
+
onContextMenu?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
518
|
+
onContextMenuCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
519
|
+
onDoubleClick?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
520
|
+
onDoubleClickCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
521
|
+
onDrag?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
522
|
+
onDragCapture?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
523
|
+
onDragEnd?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
524
|
+
onDragEndCapture?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
525
|
+
onDragEnter?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
526
|
+
onDragEnterCapture?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
527
|
+
onDragExit?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
528
|
+
onDragExitCapture?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
529
|
+
onDragLeave?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
530
|
+
onDragLeaveCapture?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
531
|
+
onDragOver?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
532
|
+
onDragOverCapture?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
533
|
+
onDragStart?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
534
|
+
onDragStartCapture?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
535
|
+
onDrop?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
536
|
+
onDropCapture?: React__default.DragEventHandler<HTMLButtonElement> | undefined;
|
|
537
|
+
onMouseDown?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
538
|
+
onMouseDownCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
539
|
+
onMouseEnter?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
540
|
+
onMouseLeave?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
541
|
+
onMouseMove?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
542
|
+
onMouseMoveCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
543
|
+
onMouseOut?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
544
|
+
onMouseOutCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
545
|
+
onMouseOver?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
546
|
+
onMouseOverCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
547
|
+
onMouseUp?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
548
|
+
onMouseUpCapture?: React__default.MouseEventHandler<HTMLButtonElement> | undefined;
|
|
549
|
+
onSelect?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
550
|
+
onSelectCapture?: React__default.ReactEventHandler<HTMLButtonElement> | undefined;
|
|
551
|
+
onTouchCancel?: React__default.TouchEventHandler<HTMLButtonElement> | undefined;
|
|
552
|
+
onTouchCancelCapture?: React__default.TouchEventHandler<HTMLButtonElement> | undefined;
|
|
553
|
+
onTouchEnd?: React__default.TouchEventHandler<HTMLButtonElement> | undefined;
|
|
554
|
+
onTouchEndCapture?: React__default.TouchEventHandler<HTMLButtonElement> | undefined;
|
|
555
|
+
onTouchMove?: React__default.TouchEventHandler<HTMLButtonElement> | undefined;
|
|
556
|
+
onTouchMoveCapture?: React__default.TouchEventHandler<HTMLButtonElement> | undefined;
|
|
557
|
+
onTouchStart?: React__default.TouchEventHandler<HTMLButtonElement> | undefined;
|
|
558
|
+
onTouchStartCapture?: React__default.TouchEventHandler<HTMLButtonElement> | undefined;
|
|
559
|
+
onPointerDown?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
560
|
+
onPointerDownCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
561
|
+
onPointerMove?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
562
|
+
onPointerMoveCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
563
|
+
onPointerUp?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
564
|
+
onPointerUpCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
565
|
+
onPointerCancel?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
566
|
+
onPointerCancelCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
567
|
+
onPointerEnter?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
568
|
+
onPointerEnterCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
569
|
+
onPointerLeave?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
570
|
+
onPointerLeaveCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
571
|
+
onPointerOver?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
572
|
+
onPointerOverCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
573
|
+
onPointerOut?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
574
|
+
onPointerOutCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
575
|
+
onGotPointerCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
576
|
+
onGotPointerCaptureCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
577
|
+
onLostPointerCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
578
|
+
onLostPointerCaptureCapture?: React__default.PointerEventHandler<HTMLButtonElement> | undefined;
|
|
579
|
+
onScroll?: React__default.UIEventHandler<HTMLButtonElement> | undefined;
|
|
580
|
+
onScrollCapture?: React__default.UIEventHandler<HTMLButtonElement> | undefined;
|
|
581
|
+
onWheel?: React__default.WheelEventHandler<HTMLButtonElement> | undefined;
|
|
582
|
+
onWheelCapture?: React__default.WheelEventHandler<HTMLButtonElement> | undefined;
|
|
583
|
+
onAnimationStart?: React__default.AnimationEventHandler<HTMLButtonElement> | undefined;
|
|
584
|
+
onAnimationStartCapture?: React__default.AnimationEventHandler<HTMLButtonElement> | undefined;
|
|
585
|
+
onAnimationEnd?: React__default.AnimationEventHandler<HTMLButtonElement> | undefined;
|
|
586
|
+
onAnimationEndCapture?: React__default.AnimationEventHandler<HTMLButtonElement> | undefined;
|
|
587
|
+
onAnimationIteration?: React__default.AnimationEventHandler<HTMLButtonElement> | undefined;
|
|
588
|
+
onAnimationIterationCapture?: React__default.AnimationEventHandler<HTMLButtonElement> | undefined;
|
|
589
|
+
onTransitionEnd?: React__default.TransitionEventHandler<HTMLButtonElement> | undefined;
|
|
590
|
+
onTransitionEndCapture?: React__default.TransitionEventHandler<HTMLButtonElement> | undefined;
|
|
591
|
+
isToggled?: boolean | undefined;
|
|
592
|
+
position: 'down' | 'left' | 'right' | 'up';
|
|
593
|
+
rotation?: number | undefined;
|
|
594
|
+
variant?: "ghost" | "outline" | undefined;
|
|
595
|
+
} & React__default.RefAttributes<HTMLButtonElement>>;
|
|
596
|
+
|
|
306
597
|
type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
|
|
307
598
|
declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
|
|
308
599
|
|
|
309
600
|
declare const Label: React.ForwardRefExoticComponent<Omit<LabelPrimitive.LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & VariantProps<(props?: class_variance_authority_types.ClassProp | undefined) => string> & React.RefAttributes<HTMLLabelElement>>;
|
|
310
601
|
|
|
311
|
-
export { BUTTON_ICON_SIZE, Button, type ButtonProps, Input, type InputProps, Label, buttonVariants };
|
|
602
|
+
export { Accordion, ArrowToggle, type ArrowToggleProps, BUTTON_ICON_SIZE, Button, type ButtonProps, Input, type InputProps, Label, buttonVariants };
|
package/dist/components/index.js
CHANGED
|
@@ -1,12 +1,78 @@
|
|
|
1
1
|
import {
|
|
2
2
|
cn
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-PAAJ5AH3.js";
|
|
4
|
+
|
|
5
|
+
// src/components/Accordion/AccordionContent.tsx
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
import * as AccordionPrimitive from "@radix-ui/react-accordion";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
var AccordionContent = React.forwardRef(function AccordionContent2({ children, className, ...props }, ref) {
|
|
10
|
+
return /* @__PURE__ */ jsx(
|
|
11
|
+
AccordionPrimitive.Content,
|
|
12
|
+
{
|
|
13
|
+
className: "overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
|
|
14
|
+
ref,
|
|
15
|
+
...props,
|
|
16
|
+
children: /* @__PURE__ */ jsx("div", { className: cn("pb-4 pt-0", className), children })
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// src/components/Accordion/AccordionItem.tsx
|
|
22
|
+
import * as React2 from "react";
|
|
23
|
+
import * as AccordionPrimitive2 from "@radix-ui/react-accordion";
|
|
24
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
25
|
+
var AccordionItem = React2.forwardRef(function AccordionItem2({ className, ...props }, ref) {
|
|
26
|
+
return /* @__PURE__ */ jsx2(AccordionPrimitive2.Item, { className: cn("border-b", className), ref, ...props });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// src/components/Accordion/AccordionRoot.tsx
|
|
30
|
+
import * as React3 from "react";
|
|
31
|
+
import * as AccordionPrimitive3 from "@radix-ui/react-accordion";
|
|
32
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
33
|
+
var AccordionRoot = React3.forwardRef(function AccordionRoot2(props, ref) {
|
|
34
|
+
return /* @__PURE__ */ jsx3(AccordionPrimitive3.Root, { "data-testid": "accordion", ref, ...props });
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// src/components/Accordion/AccordionTrigger.tsx
|
|
38
|
+
import * as React4 from "react";
|
|
39
|
+
import * as AccordionPrimitive4 from "@radix-ui/react-accordion";
|
|
40
|
+
import { ChevronDownIcon } from "@radix-ui/react-icons";
|
|
41
|
+
import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
42
|
+
var AccordionTrigger = React4.forwardRef(function AccordionTrigger2({ children, className, ...props }, ref) {
|
|
43
|
+
return /* @__PURE__ */ jsx4(AccordionPrimitive4.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
|
|
44
|
+
AccordionPrimitive4.Trigger,
|
|
45
|
+
{
|
|
46
|
+
className: cn(
|
|
47
|
+
"flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
|
|
48
|
+
className
|
|
49
|
+
),
|
|
50
|
+
ref,
|
|
51
|
+
...props,
|
|
52
|
+
children: [
|
|
53
|
+
children,
|
|
54
|
+
/* @__PURE__ */ jsx4(ChevronDownIcon, { className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" })
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
) });
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// src/components/Accordion/Accordion.tsx
|
|
61
|
+
var Accordion = Object.assign(AccordionRoot, {
|
|
62
|
+
Content: AccordionContent,
|
|
63
|
+
Item: AccordionItem,
|
|
64
|
+
Trigger: AccordionTrigger
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// src/components/ArrowToggle/ArrowToggle.tsx
|
|
68
|
+
import React6, { useMemo } from "react";
|
|
69
|
+
import { ChevronUpIcon } from "@radix-ui/react-icons";
|
|
4
70
|
|
|
5
71
|
// src/components/Button/Button.tsx
|
|
6
|
-
import
|
|
7
|
-
import { Slot } from "@radix-ui/react-slot";
|
|
72
|
+
import React5 from "react";
|
|
73
|
+
import { Slot, Slottable } from "@radix-ui/react-slot";
|
|
8
74
|
import { cva } from "class-variance-authority";
|
|
9
|
-
import { jsxs } from "react/jsx-runtime";
|
|
75
|
+
import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
10
76
|
var BUTTON_ICON_SIZE = {
|
|
11
77
|
lg: 18,
|
|
12
78
|
md: 16,
|
|
@@ -37,25 +103,64 @@ var buttonVariants = cva(
|
|
|
37
103
|
}
|
|
38
104
|
}
|
|
39
105
|
);
|
|
40
|
-
var Button =
|
|
106
|
+
var Button = React5.forwardRef(function Button2({ asChild, children, className, label, size = "md", variant = "primary", ...props }, ref) {
|
|
41
107
|
const Comp = asChild ? Slot : "button";
|
|
42
|
-
return /* @__PURE__ */
|
|
108
|
+
return /* @__PURE__ */ jsxs2(Comp, { className: cn(buttonVariants({ className, size, variant })), ref, ...props, children: [
|
|
43
109
|
label,
|
|
44
|
-
children
|
|
110
|
+
/* @__PURE__ */ jsx5(Slottable, { children })
|
|
45
111
|
] });
|
|
46
112
|
});
|
|
47
113
|
|
|
114
|
+
// src/components/ArrowToggle/ArrowToggle.tsx
|
|
115
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
116
|
+
var ArrowToggle = React6.forwardRef(function ArrowToggle2({ className, isToggled, position, rotation = 0, variant = "ghost", ...props }, ref) {
|
|
117
|
+
const computedRotation = useMemo(() => {
|
|
118
|
+
const toggleRotation = isToggled ? rotation : 0;
|
|
119
|
+
switch (position) {
|
|
120
|
+
case "up":
|
|
121
|
+
return 0 + toggleRotation;
|
|
122
|
+
case "right":
|
|
123
|
+
return 90 + toggleRotation;
|
|
124
|
+
case "down":
|
|
125
|
+
return 180 + toggleRotation;
|
|
126
|
+
case "left":
|
|
127
|
+
return 270 + toggleRotation;
|
|
128
|
+
}
|
|
129
|
+
}, [position, rotation, isToggled]);
|
|
130
|
+
return /* @__PURE__ */ jsx6(
|
|
131
|
+
Button,
|
|
132
|
+
{
|
|
133
|
+
className: cn("h-6 w-6", className),
|
|
134
|
+
"data-testid": "arrow-toggle",
|
|
135
|
+
ref,
|
|
136
|
+
size: "icon",
|
|
137
|
+
type: "button",
|
|
138
|
+
variant,
|
|
139
|
+
...props,
|
|
140
|
+
children: /* @__PURE__ */ jsx6(
|
|
141
|
+
ChevronUpIcon,
|
|
142
|
+
{
|
|
143
|
+
className: "transform-gpu transition-transform",
|
|
144
|
+
"data-testid": "arrow-up-icon",
|
|
145
|
+
style: { transform: `rotate(${computedRotation}deg)` }
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
|
|
48
152
|
// src/components/Input/Input.tsx
|
|
49
|
-
import * as
|
|
50
|
-
import { jsx } from "react/jsx-runtime";
|
|
51
|
-
var Input =
|
|
52
|
-
return /* @__PURE__ */
|
|
153
|
+
import * as React7 from "react";
|
|
154
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
155
|
+
var Input = React7.forwardRef(function Input2({ className, type, ...props }, ref) {
|
|
156
|
+
return /* @__PURE__ */ jsx7(
|
|
53
157
|
"input",
|
|
54
158
|
{
|
|
55
159
|
className: cn(
|
|
56
160
|
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
57
161
|
className
|
|
58
162
|
),
|
|
163
|
+
"data-testid": "input",
|
|
59
164
|
ref,
|
|
60
165
|
type,
|
|
61
166
|
...props
|
|
@@ -64,15 +169,17 @@ var Input = React2.forwardRef(function Input2({ className, type, ...props }, ref
|
|
|
64
169
|
});
|
|
65
170
|
|
|
66
171
|
// src/components/Label/Label.tsx
|
|
67
|
-
import * as
|
|
172
|
+
import * as React8 from "react";
|
|
68
173
|
import * as LabelPrimitive from "@radix-ui/react-label";
|
|
69
174
|
import { cva as cva2 } from "class-variance-authority";
|
|
70
|
-
import { jsx as
|
|
175
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
71
176
|
var labelVariants = cva2("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70");
|
|
72
|
-
var Label =
|
|
73
|
-
return /* @__PURE__ */
|
|
177
|
+
var Label = React8.forwardRef(function Label2({ className, ...props }, ref) {
|
|
178
|
+
return /* @__PURE__ */ jsx8(LabelPrimitive.Root, { className: cn(labelVariants(), className), ref, ...props });
|
|
74
179
|
});
|
|
75
180
|
export {
|
|
181
|
+
Accordion,
|
|
182
|
+
ArrowToggle,
|
|
76
183
|
BUTTON_ICON_SIZE,
|
|
77
184
|
Button,
|
|
78
185
|
Input,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/Button/Button.tsx","../../src/components/Input/Input.tsx","../../src/components/Label/Label.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps, cva } from 'class-variance-authority';\nimport type { Simplify } from 'type-fest';\n\nimport { cn } from '@/utils';\n\nexport const BUTTON_ICON_SIZE = {\n lg: 18,\n md: 16,\n sm: 14\n};\n\nexport const buttonVariants = cva(\n 'flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',\n {\n defaultVariants: {\n size: 'md',\n variant: 'primary'\n },\n variants: {\n size: {\n icon: 'h-9 w-9',\n lg: 'h-10 rounded-md px-8',\n md: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs'\n },\n variant: {\n danger: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n outline: 'border border-input bg-inherit shadow-sm',\n primary: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n secondary: 'bg-secondary border text-secondary-foreground shadow-sm hover:bg-secondary/80'\n }\n }\n }\n);\n\nexport type ButtonProps = Simplify<\n React.ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n /** @deprecated - use children */\n label?: string;\n }\n>;\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { asChild = false, children, className, label, size = 'md', variant = 'primary', ...props },\n ref\n) {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp className={cn(buttonVariants({ className, size, variant }))} ref={ref} {...props}>\n {label}\n {children}\n </Comp>\n );\n});\n","import * as React from 'react';\n\nimport { cn } from '@/utils';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(function Input({ className, type, ...props }, ref) {\n return (\n <input\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n type={type}\n {...props}\n />\n );\n});\n","import * as React from 'react';\n\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport { type VariantProps, cva } from 'class-variance-authority';\n\nimport { cn } from '@/utils';\n\nconst labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70');\n\nexport const Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(function Label({ className, ...props }, ref) {\n return <LabelPrimitive.Root className={cn(labelVariants(), className)} ref={ref} {...props} />;\n});\n"],"mappings":";;;;;AAAA,OAAO,WAAW;AAElB,SAAS,YAAY;AACrB,SAA4B,WAAW;AAoDnC;AA/CG,IAAM,mBAAmB;AAAA,EAC9B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAWO,IAAM,SAAS,MAAM,WAA2C,SAASA,QAC9E,EAAE,UAAU,OAAO,UAAU,WAAW,OAAO,OAAO,MAAM,UAAU,WAAW,GAAG,MAAM,GAC1F,KACA;AACA,QAAM,OAAO,UAAU,OAAO;AAC9B,SACE,qBAAC,QAAK,WAAW,GAAG,eAAe,EAAE,WAAW,MAAM,QAAQ,CAAC,CAAC,GAAG,KAAW,GAAG,OAC9E;AAAA;AAAA,IACA;AAAA,KACH;AAEJ,CAAC;;;AC5DD,YAAYC,YAAW;AAQnB;AAFG,IAAM,QAAc,kBAAyC,SAASC,OAAM,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,KAAK;AACrH,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;;;AClBD,YAAYC,YAAW;AAEvB,YAAY,oBAAoB;AAChC,SAA4B,OAAAC,YAAW;AAU9B,gBAAAC,YAAA;AANT,IAAM,gBAAgBC,KAAI,4FAA4F;AAE/G,IAAM,QAAc,kBAGzB,SAASC,OAAM,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AAC7C,SAAO,gBAAAF,KAAgB,qBAAf,EAAoB,WAAW,GAAG,cAAc,GAAG,SAAS,GAAG,KAAW,GAAG,OAAO;AAC9F,CAAC;","names":["Button","React","Input","React","cva","jsx","cva","Label"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/Accordion/AccordionContent.tsx","../../src/components/Accordion/AccordionItem.tsx","../../src/components/Accordion/AccordionRoot.tsx","../../src/components/Accordion/AccordionTrigger.tsx","../../src/components/Accordion/Accordion.tsx","../../src/components/ArrowToggle/ArrowToggle.tsx","../../src/components/Button/Button.tsx","../../src/components/Input/Input.tsx","../../src/components/Label/Label.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\n\nimport { cn } from '@/utils';\n\nexport const AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(function AccordionContent({ children, className, ...props }, ref) {\n return (\n <AccordionPrimitive.Content\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n ref={ref}\n {...props}\n >\n <div className={cn('pb-4 pt-0', className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n});\n","import * as React from 'react';\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\n\nimport { cn } from '@/utils';\n\nexport const AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(function AccordionItem({ className, ...props }, ref) {\n return <AccordionPrimitive.Item className={cn('border-b', className)} ref={ref} {...props} />;\n});\n","import * as React from 'react';\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\n\nexport const AccordionRoot = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>\n>(function AccordionRoot(props, ref) {\n return <AccordionPrimitive.Root data-testid=\"accordion\" ref={ref} {...props} />;\n});\n","import * as React from 'react';\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { ChevronDownIcon } from '@radix-ui/react-icons';\n\nimport { cn } from '@/utils';\n\nexport const AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(function AccordionTrigger({ children, className, ...props }, ref) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n className={cn(\n 'flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n});\n","import { AccordionContent } from './AccordionContent';\nimport { AccordionItem } from './AccordionItem';\nimport { AccordionRoot } from './AccordionRoot';\nimport { AccordionTrigger } from './AccordionTrigger';\n\nexport const Accordion = Object.assign(AccordionRoot, {\n Content: AccordionContent,\n Item: AccordionItem,\n Trigger: AccordionTrigger\n});\n","import React, { useMemo } from 'react';\n\nimport { ChevronUpIcon } from '@radix-ui/react-icons';\nimport type { Simplify } from 'type-fest';\n\nimport { cn } from '@/utils';\n\nimport { Button, type ButtonProps } from '../Button';\n\nexport type ArrowToggleProps = Simplify<\n React.HTMLAttributes<HTMLButtonElement> & {\n /** Whether or not the arrow is currently toggled */\n isToggled?: boolean;\n\n /** The starting position of the arrow (i.e., which direction does it point to) */\n position: 'down' | 'left' | 'right' | 'up';\n\n /** The clockwise rotation of the arrow when toggled (e.g., if the position is 'right' and rotation is 90, the arrow will point down) */\n rotation?: number;\n\n /** The variant of button to use */\n variant?: Extract<ButtonProps['variant'], 'ghost' | 'outline'>;\n }\n>;\n\nexport const ArrowToggle = React.forwardRef<HTMLButtonElement, ArrowToggleProps>(function ArrowToggle(\n { className, isToggled, position, rotation = 0, variant = 'ghost', ...props },\n ref\n) {\n const computedRotation = useMemo(() => {\n const toggleRotation = isToggled ? rotation : 0;\n switch (position) {\n case 'up':\n return 0 + toggleRotation;\n case 'right':\n return 90 + toggleRotation;\n case 'down':\n return 180 + toggleRotation;\n case 'left':\n return 270 + toggleRotation;\n }\n }, [position, rotation, isToggled]);\n\n return (\n <Button\n className={cn('h-6 w-6', className)}\n data-testid=\"arrow-toggle\"\n ref={ref}\n size=\"icon\"\n type=\"button\"\n variant={variant}\n {...props}\n >\n <ChevronUpIcon\n className=\"transform-gpu transition-transform\"\n data-testid=\"arrow-up-icon\"\n style={{ transform: `rotate(${computedRotation}deg)` }}\n />\n </Button>\n );\n});\n","import React from 'react';\n\nimport { Slot, Slottable } from '@radix-ui/react-slot';\nimport { type VariantProps, cva } from 'class-variance-authority';\nimport type { Simplify } from 'type-fest';\n\nimport { cn } from '@/utils';\n\nexport const BUTTON_ICON_SIZE = {\n lg: 18,\n md: 16,\n sm: 14\n};\n\nexport const buttonVariants = cva(\n 'flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',\n {\n defaultVariants: {\n size: 'md',\n variant: 'primary'\n },\n variants: {\n size: {\n icon: 'h-9 w-9',\n lg: 'h-10 rounded-md px-8',\n md: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs'\n },\n variant: {\n danger: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n outline: 'border border-input bg-inherit shadow-sm',\n primary: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n secondary: 'bg-secondary border text-secondary-foreground shadow-sm hover:bg-secondary/80'\n }\n }\n }\n);\n\nexport type ButtonProps = Simplify<\n React.ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n /** @deprecated - use children */\n label?: string;\n }\n>;\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { asChild, children, className, label, size = 'md', variant = 'primary', ...props },\n ref\n) {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp className={cn(buttonVariants({ className, size, variant }))} ref={ref} {...props}>\n {label}\n <Slottable>{children}</Slottable>\n </Comp>\n );\n});\n","import * as React from 'react';\n\nimport { cn } from '@/utils';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(function Input({ className, type, ...props }, ref) {\n return (\n <input\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n data-testid=\"input\"\n ref={ref}\n type={type}\n {...props}\n />\n );\n});\n","import * as React from 'react';\n\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport { type VariantProps, cva } from 'class-variance-authority';\n\nimport { cn } from '@/utils';\n\nconst labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70');\n\nexport const Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(function Label({ className, ...props }, ref) {\n return <LabelPrimitive.Root className={cn(labelVariants(), className)} ref={ref} {...props} />;\n});\n"],"mappings":"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","names":["AccordionContent","React","AccordionPrimitive","jsx","AccordionItem","React","AccordionPrimitive","jsx","AccordionRoot","React","AccordionPrimitive","jsx","AccordionTrigger","React","React","jsx","jsxs","React","Button","jsx","React","ArrowToggle","React","jsx","Input","React","cva","jsx","cva","Label"]}
|
|
Binary file
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -52,11 +52,47 @@ declare global {
|
|
|
52
52
|
'session-storage': CustomEvent;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Represents the options for customizing the behavior of serialization and deserialization.
|
|
57
|
+
* @template T - The type of the state to be stored in session storage.
|
|
58
|
+
*/
|
|
59
|
+
type UseSessionStorageOptions<T> = {
|
|
60
|
+
/** A function to deserialize the stored value. */
|
|
61
|
+
deserializer?: (value: string) => T;
|
|
62
|
+
/**
|
|
63
|
+
* If `true` (default), the hook will initialize reading the session storage. In SSR, you should set it to `false`, returning the initial value initially.
|
|
64
|
+
* @default true
|
|
65
|
+
*/
|
|
66
|
+
initializeWithValue?: boolean;
|
|
67
|
+
/** A function to serialize the value before storing it. */
|
|
68
|
+
serializer?: (value: T) => string;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Custom hook that uses session storage to persist state across page reloads.
|
|
72
|
+
* @template T - The type of the state to be stored in session storage.
|
|
73
|
+
* @param {string} key - The key under which the value will be stored in session storage.
|
|
74
|
+
* @param {T | (() => T)} initialValue - The initial value of the state or a function that returns the initial value.
|
|
75
|
+
* @param {?UseSessionStorageOptions<T>} [options] - Options for customizing the behavior of serialization and deserialization (optional).
|
|
76
|
+
* @returns {[T, Dispatch<SetStateAction<T>>]} A tuple containing the stored value and a function to set the value.
|
|
77
|
+
* @public
|
|
78
|
+
* @example
|
|
79
|
+
* ```tsx
|
|
80
|
+
* const [count, setCount] = useSessionStorage('count', 0);
|
|
81
|
+
* // Access the `count` value and the `setCount` function to update it.
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
declare function useSessionStorage<T>(key: string, initialValue: (() => T) | T, options?: UseSessionStorageOptions<T>): [T, Dispatch<SetStateAction<T>>];
|
|
57
85
|
|
|
58
86
|
type Theme = 'dark' | 'light';
|
|
59
87
|
type UpdateTheme = (theme: Theme) => void;
|
|
88
|
+
/** @private */
|
|
89
|
+
declare const DEFAULT_THEME: Theme;
|
|
90
|
+
/** @private */
|
|
91
|
+
declare const THEME_ATTRIBUTE = "data-mode";
|
|
92
|
+
/** @private */
|
|
93
|
+
declare const THEME_KEY = "theme";
|
|
94
|
+
/** @private */
|
|
95
|
+
declare const SYS_DARK_MEDIA_QUERY = "(prefers-color-scheme: dark)";
|
|
60
96
|
/**
|
|
61
97
|
* Returns the current theme and a function to update the current theme
|
|
62
98
|
*
|
|
@@ -71,4 +107,4 @@ type WindowSize = {
|
|
|
71
107
|
};
|
|
72
108
|
declare function useWindowSize(): WindowSize;
|
|
73
109
|
|
|
74
|
-
export { type NotificationInterface, type NotificationsStore, type Theme, type WindowSize, useDownload, useEventCallback, useEventListener, useInterval, useIsomorphicLayoutEffect, useMediaQuery, useNotificationsStore, useOnClickOutside, useSessionStorage, useTheme, useWindowSize };
|
|
110
|
+
export { DEFAULT_THEME, type NotificationInterface, type NotificationsStore, SYS_DARK_MEDIA_QUERY, THEME_ATTRIBUTE, THEME_KEY, type Theme, type WindowSize, useDownload, useEventCallback, useEventListener, useInterval, useIsomorphicLayoutEffect, useMediaQuery, useNotificationsStore, useOnClickOutside, useSessionStorage, useTheme, useWindowSize };
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isBrowser
|
|
3
|
+
} from "../chunk-PAAJ5AH3.js";
|
|
4
|
+
|
|
1
5
|
// src/hooks/useDownload.ts
|
|
2
6
|
import { useEffect, useState } from "react";
|
|
3
7
|
|
|
@@ -58,7 +62,7 @@ import { useCallback, useRef } from "react";
|
|
|
58
62
|
|
|
59
63
|
// src/hooks/useIsomorphicLayoutEffect.ts
|
|
60
64
|
import { useEffect as useEffect2, useLayoutEffect } from "react";
|
|
61
|
-
var useIsomorphicLayoutEffect =
|
|
65
|
+
var useIsomorphicLayoutEffect = isBrowser() ? useLayoutEffect : useEffect2;
|
|
62
66
|
|
|
63
67
|
// src/hooks/useEventCallback.ts
|
|
64
68
|
function useEventCallback(fn) {
|
|
@@ -110,7 +114,7 @@ function useInterval(callback, delay) {
|
|
|
110
114
|
import { useEffect as useEffect5, useState as useState2 } from "react";
|
|
111
115
|
function useMediaQuery(query) {
|
|
112
116
|
const getMatches = (query2) => {
|
|
113
|
-
if (
|
|
117
|
+
if (isBrowser()) {
|
|
114
118
|
return window.matchMedia(query2).matches;
|
|
115
119
|
}
|
|
116
120
|
return false;
|
|
@@ -122,17 +126,9 @@ function useMediaQuery(query) {
|
|
|
122
126
|
useEffect5(() => {
|
|
123
127
|
const matchMedia = window.matchMedia(query);
|
|
124
128
|
handleChange();
|
|
125
|
-
|
|
126
|
-
matchMedia.addListener(handleChange);
|
|
127
|
-
} else {
|
|
128
|
-
matchMedia.addEventListener("change", handleChange);
|
|
129
|
-
}
|
|
129
|
+
matchMedia.addEventListener("change", handleChange);
|
|
130
130
|
return () => {
|
|
131
|
-
|
|
132
|
-
matchMedia.removeListener(handleChange);
|
|
133
|
-
} else {
|
|
134
|
-
matchMedia.removeEventListener("change", handleChange);
|
|
135
|
-
}
|
|
131
|
+
matchMedia.removeEventListener("change", handleChange);
|
|
136
132
|
};
|
|
137
133
|
}, [query]);
|
|
138
134
|
return matches;
|
|
@@ -152,43 +148,73 @@ function useOnClickOutside(ref, handler, mouseEvent = "mousedown") {
|
|
|
152
148
|
|
|
153
149
|
// src/hooks/useSessionStorage.ts
|
|
154
150
|
import { useCallback as useCallback2, useEffect as useEffect6, useState as useState3 } from "react";
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
151
|
+
var IS_SERVER = typeof window === "undefined";
|
|
152
|
+
function useSessionStorage(key, initialValue, options = {}) {
|
|
153
|
+
const { initializeWithValue = true } = options;
|
|
154
|
+
const serializer = useCallback2(
|
|
155
|
+
(value) => {
|
|
156
|
+
if (options.serializer) {
|
|
157
|
+
return options.serializer(value);
|
|
158
|
+
}
|
|
159
|
+
return JSON.stringify(value);
|
|
160
|
+
},
|
|
161
|
+
[options]
|
|
162
|
+
);
|
|
163
|
+
const deserializer = useCallback2(
|
|
164
|
+
(value) => {
|
|
165
|
+
if (options.deserializer) {
|
|
166
|
+
return options.deserializer(value);
|
|
167
|
+
}
|
|
168
|
+
if (value === "undefined") {
|
|
169
|
+
return void 0;
|
|
170
|
+
}
|
|
171
|
+
const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;
|
|
172
|
+
let parsed;
|
|
173
|
+
try {
|
|
174
|
+
parsed = JSON.parse(value);
|
|
175
|
+
} catch (error) {
|
|
176
|
+
console.error("Error parsing JSON:", error);
|
|
177
|
+
return defaultValue;
|
|
178
|
+
}
|
|
179
|
+
return parsed;
|
|
180
|
+
},
|
|
181
|
+
[options, initialValue]
|
|
182
|
+
);
|
|
163
183
|
const readValue = useCallback2(() => {
|
|
164
|
-
|
|
165
|
-
|
|
184
|
+
const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;
|
|
185
|
+
if (IS_SERVER) {
|
|
186
|
+
return initialValueToUse;
|
|
166
187
|
}
|
|
167
188
|
try {
|
|
168
|
-
const
|
|
169
|
-
return
|
|
189
|
+
const raw = window.sessionStorage.getItem(key);
|
|
190
|
+
return raw ? deserializer(raw) : initialValueToUse;
|
|
170
191
|
} catch (error) {
|
|
171
192
|
console.warn(`Error reading sessionStorage key \u201C${key}\u201D:`, error);
|
|
172
|
-
return
|
|
193
|
+
return initialValueToUse;
|
|
194
|
+
}
|
|
195
|
+
}, [initialValue, key, deserializer]);
|
|
196
|
+
const [storedValue, setStoredValue] = useState3(() => {
|
|
197
|
+
if (initializeWithValue) {
|
|
198
|
+
return readValue();
|
|
173
199
|
}
|
|
174
|
-
|
|
175
|
-
|
|
200
|
+
return initialValue instanceof Function ? initialValue() : initialValue;
|
|
201
|
+
});
|
|
176
202
|
const setValue = useEventCallback((value) => {
|
|
177
|
-
if (
|
|
203
|
+
if (IS_SERVER) {
|
|
178
204
|
console.warn(`Tried setting sessionStorage key \u201C${key}\u201D even though environment is not a client`);
|
|
179
205
|
}
|
|
180
206
|
try {
|
|
181
|
-
const newValue = value instanceof Function ? value(
|
|
182
|
-
window.sessionStorage.setItem(key,
|
|
207
|
+
const newValue = value instanceof Function ? value(readValue()) : value;
|
|
208
|
+
window.sessionStorage.setItem(key, serializer(newValue));
|
|
183
209
|
setStoredValue(newValue);
|
|
184
|
-
window.dispatchEvent(new
|
|
210
|
+
window.dispatchEvent(new StorageEvent("session-storage", { key }));
|
|
185
211
|
} catch (error) {
|
|
186
212
|
console.warn(`Error setting sessionStorage key \u201C${key}\u201D:`, error);
|
|
187
213
|
}
|
|
188
214
|
});
|
|
189
215
|
useEffect6(() => {
|
|
190
216
|
setStoredValue(readValue());
|
|
191
|
-
}, []);
|
|
217
|
+
}, [key]);
|
|
192
218
|
const handleStorageChange = useCallback2(
|
|
193
219
|
(event) => {
|
|
194
220
|
if (event.key && event.key !== key) {
|
|
@@ -205,19 +231,21 @@ function useSessionStorage(key, initialValue) {
|
|
|
205
231
|
|
|
206
232
|
// src/hooks/useTheme.ts
|
|
207
233
|
import { useCallback as useCallback3, useEffect as useEffect7, useState as useState4 } from "react";
|
|
234
|
+
var DEFAULT_THEME = "light";
|
|
208
235
|
var THEME_ATTRIBUTE = "data-mode";
|
|
209
236
|
var THEME_KEY = "theme";
|
|
237
|
+
var SYS_DARK_MEDIA_QUERY = "(prefers-color-scheme: dark)";
|
|
210
238
|
function useTheme() {
|
|
211
239
|
const [theme, setTheme] = useState4(() => {
|
|
212
|
-
if (
|
|
213
|
-
return
|
|
240
|
+
if (!isBrowser()) {
|
|
241
|
+
return DEFAULT_THEME;
|
|
214
242
|
}
|
|
215
243
|
const savedTheme = window.localStorage.getItem(THEME_KEY);
|
|
216
244
|
let initialTheme;
|
|
217
245
|
if (savedTheme === "dark" || savedTheme === "light") {
|
|
218
246
|
initialTheme = savedTheme;
|
|
219
247
|
} else {
|
|
220
|
-
initialTheme = window.matchMedia(
|
|
248
|
+
initialTheme = window.matchMedia(SYS_DARK_MEDIA_QUERY).matches ? "dark" : "light";
|
|
221
249
|
}
|
|
222
250
|
document.documentElement.setAttribute(THEME_ATTRIBUTE, initialTheme);
|
|
223
251
|
return initialTheme;
|
|
@@ -270,6 +298,10 @@ function useWindowSize() {
|
|
|
270
298
|
return windowSize;
|
|
271
299
|
}
|
|
272
300
|
export {
|
|
301
|
+
DEFAULT_THEME,
|
|
302
|
+
SYS_DARK_MEDIA_QUERY,
|
|
303
|
+
THEME_ATTRIBUTE,
|
|
304
|
+
THEME_KEY,
|
|
273
305
|
useDownload,
|
|
274
306
|
useEventCallback,
|
|
275
307
|
useEventListener,
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useDownload.ts","../../src/hooks/useNotificationsStore.ts","../../src/hooks/useEventCallback.ts","../../src/hooks/useIsomorphicLayoutEffect.ts","../../src/hooks/useEventListener.ts","../../src/hooks/useInterval.ts","../../src/hooks/useMediaQuery.ts","../../src/hooks/useOnClickOutside.ts","../../src/hooks/useSessionStorage.ts","../../src/hooks/useTheme.ts","../../src/hooks/useWindowSize.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { Promisable } from 'type-fest';\n\nimport { useNotificationsStore } from './useNotificationsStore';\n\n/**\n * Used to trigger downloads of arbitrary data to the client\n * @returns A function to invoke the download\n */\nexport function useDownload() {\n const notifications = useNotificationsStore();\n const [data, setData] = useState<null | string>(null);\n const [filename, setFilename] = useState<null | string>(null);\n\n useEffect(() => {\n if (data && filename) {\n const anchor = document.createElement('a');\n document.body.appendChild(anchor);\n const blob = new Blob([data], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n anchor.remove();\n setData(null);\n setFilename(null);\n }\n }, [data, filename]);\n\n return async (filename: string, fetchData: () => Promisable<string>) => {\n try {\n const data = await fetchData();\n setData(data);\n setFilename(filename);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n notifications.addNotification({\n message,\n title: 'Error',\n type: 'error'\n });\n }\n };\n}\n","import { create } from 'zustand';\n\nexport type NotificationInterface = {\n id: number;\n message?: string;\n title?: string;\n type: 'error' | 'info' | 'success' | 'warning';\n variant?: 'critical' | 'standard';\n};\n\nexport type NotificationsStore = {\n addNotification: (notification: Omit<NotificationInterface, 'id'>) => void;\n dismissNotification: (id: number) => void;\n notifications: NotificationInterface[];\n};\n\nexport const useNotificationsStore = create<NotificationsStore>((set) => ({\n addNotification: (notification) => {\n set((state) => ({\n notifications: [...state.notifications, { id: Date.now(), ...notification }]\n }));\n },\n dismissNotification: (id) => {\n set((state) => ({\n notifications: state.notifications.filter((notification) => notification.id !== id)\n }));\n },\n notifications: []\n}));\n","import { useCallback, useRef } from 'react';\n\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\nexport function useEventCallback<Args extends unknown[], R>(fn: (...args: Args) => R) {\n const ref = useRef<typeof fn>(() => {\n throw new Error('Cannot call an event handler while rendering.');\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((...args: Args) => ref.current(...args), [ref]);\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","import { type RefObject, useEffect, useRef } from 'react';\n\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\n// MediaQueryList Event based useEventListener interface\nfunction useEventListener<K extends keyof MediaQueryListEventMap>(\n eventName: K,\n handler: (event: MediaQueryListEventMap[K]) => void,\n element: RefObject<MediaQueryList>,\n options?: AddEventListenerOptions | boolean\n): void;\n\n// Window Event based useEventListener interface\nfunction useEventListener<K extends keyof WindowEventMap>(\n eventName: K,\n handler: (event: WindowEventMap[K]) => void,\n element?: undefined,\n options?: AddEventListenerOptions | boolean\n): void;\n\n// Element Event based useEventListener interface\nfunction useEventListener<K extends keyof HTMLElementEventMap, T extends HTMLElement = HTMLDivElement>(\n eventName: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n element: RefObject<T>,\n options?: AddEventListenerOptions | boolean\n): void;\n\n// Document Event based useEventListener interface\nfunction useEventListener<K extends keyof DocumentEventMap>(\n eventName: K,\n handler: (event: DocumentEventMap[K]) => void,\n element: RefObject<Document>,\n options?: AddEventListenerOptions | boolean\n): void;\n\nfunction useEventListener<\n KW extends keyof WindowEventMap,\n KH extends keyof HTMLElementEventMap,\n KM extends keyof MediaQueryListEventMap,\n T extends HTMLElement | MediaQueryList | void = void\n>(\n eventName: KH | KM | KW,\n handler: (event: Event | HTMLElementEventMap[KH] | MediaQueryListEventMap[KM] | WindowEventMap[KW]) => void,\n element?: RefObject<T>,\n options?: AddEventListenerOptions | boolean\n) {\n // Create a ref that stores handler\n const savedHandler = useRef(handler);\n\n useIsomorphicLayoutEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n useEffect(() => {\n // Define the listening target\n const targetElement: T | Window = element?.current ?? window;\n\n if (!(targetElement && targetElement.addEventListener)) return;\n\n // Create event listener that calls handler function stored in ref\n const listener: typeof handler = (event) => savedHandler.current(event);\n\n targetElement.addEventListener(eventName, listener, options);\n\n // Remove event listener on cleanup\n return () => {\n targetElement.removeEventListener(eventName, listener, options);\n };\n }, [eventName, element, options]);\n}\n\nexport { useEventListener };\n","import { useEffect, useRef } from 'react';\n\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\nexport function useInterval(callback: () => void, delay: null | number) {\n const savedCallback = useRef(callback);\n\n // Remember the latest callback if it changes.\n useIsomorphicLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval.\n useEffect(() => {\n // Don't schedule if no delay is specified.\n // Note: 0 is a valid value for delay.\n if (!delay && delay !== 0) {\n return;\n }\n\n const id = setInterval(() => savedCallback.current(), delay);\n\n return () => clearInterval(id);\n }, [delay]);\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * Get the result of an arbitrary CSS media query\n *\n * @param query - the CSS media query\n * @returns a boolean indicating the result of the query\n * @example\n * // true if the viewport is at least 768px wide\n * const matches = useMediaQuery('(min-width: 768px)')\n */\nexport function useMediaQuery(query: string): boolean {\n const getMatches = (query: string): boolean => {\n // Prevents SSR issues\n if (typeof window !== 'undefined') {\n return window.matchMedia(query).matches;\n }\n return false;\n };\n\n const [matches, setMatches] = useState<boolean>(getMatches(query));\n\n function handleChange() {\n setMatches(getMatches(query));\n }\n\n useEffect(() => {\n const matchMedia = window.matchMedia(query);\n\n // Triggered at the first client-side load and if query changes\n handleChange();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener('change', handleChange);\n }\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener('change', handleChange);\n }\n };\n }, [query]);\n\n return matches;\n}\n","import { type RefObject } from 'react';\n\nimport { useEventListener } from './useEventListener';\n\ntype Handler = (event: MouseEvent) => void;\n\nexport function useOnClickOutside<T extends HTMLElement = HTMLElement>(\n ref: RefObject<T>,\n handler: Handler,\n mouseEvent: 'mousedown' | 'mouseup' = 'mousedown'\n): void {\n useEventListener(mouseEvent, (event) => {\n const el = ref.current;\n\n // Do nothing if clicking ref's element or descendent elements\n if (!el || el.contains(event.target as Node)) {\n return;\n }\n\n handler(event);\n });\n}\n","import { type Dispatch, type SetStateAction, useCallback, useEffect, useState } from 'react';\n\nimport { useEventCallback } from './useEventCallback';\nimport { useEventListener } from './useEventListener';\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n interface WindowEventMap {\n 'session-storage': CustomEvent;\n }\n}\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>;\n\n// A wrapper for \"JSON.parse()\"\" to support \"undefined\" value\nfunction parseJSON<T>(value: null | string): T | undefined {\n try {\n return value === 'undefined' ? undefined : (JSON.parse(value ?? '') as T);\n } catch {\n return undefined;\n }\n}\n\nexport function useSessionStorage<T>(key: string, initialValue: T): [T, SetValue<T>] {\n // Get from session storage then\n // parse stored json or return initialValue\n const readValue = useCallback((): T => {\n // Prevent build error \"window is undefined\" but keep keep working\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n try {\n const item = window.sessionStorage.getItem(key);\n return item ? (parseJSON(item) as T) : initialValue;\n } catch (error) {\n console.warn(`Error reading sessionStorage key “${key}”:`, error);\n return initialValue;\n }\n }, [initialValue, key]);\n\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState<T>(readValue);\n\n // Return a wrapped version of useState's setter function that ...\n // ... persists the new value to sessionStorage.\n const setValue: SetValue<T> = useEventCallback((value) => {\n // Prevent build error \"window is undefined\" but keeps working\n if (typeof window == 'undefined') {\n console.warn(`Tried setting sessionStorage key “${key}” even though environment is not a client`);\n }\n\n try {\n // Allow value to be a function so we have the same API as useState\n const newValue = value instanceof Function ? value(storedValue) : value;\n\n // Save to session storage\n window.sessionStorage.setItem(key, JSON.stringify(newValue));\n\n // Save state\n setStoredValue(newValue);\n\n // We dispatch a custom event so every useSessionStorage hook are notified\n window.dispatchEvent(new Event('session-storage'));\n } catch (error) {\n console.warn(`Error setting sessionStorage key “${key}”:`, error);\n }\n });\n\n useEffect(() => {\n setStoredValue(readValue());\n }, []);\n\n const handleStorageChange = useCallback(\n (event: CustomEvent | StorageEvent) => {\n if ((event as StorageEvent).key && (event as StorageEvent).key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n\n // this only works for other documents, not the current one\n useEventListener('storage', handleStorageChange);\n\n // this is a custom event, triggered in writeValueTosessionStorage\n // See: useSessionStorage()\n useEventListener('session-storage', handleStorageChange);\n\n return [storedValue, setValue];\n}\n","import { useCallback, useEffect, useState } from 'react';\n\ntype Theme = 'dark' | 'light';\n\ntype UpdateTheme = (theme: Theme) => void;\n\nconst THEME_ATTRIBUTE = 'data-mode';\nconst THEME_KEY = 'theme';\n\n/**\n * Returns the current theme and a function to update the current theme\n *\n * The reason the implementation of this hook is rather convoluted is for\n * cases where the theme is updated outside this hook\n */\nfunction useTheme(): readonly [Theme, UpdateTheme] {\n // Initial theme value is based on the value saved in local storage or the system theme\n const [theme, setTheme] = useState<Theme>(() => {\n if (typeof window === 'undefined') {\n return 'light';\n }\n const savedTheme = window.localStorage.getItem(THEME_KEY);\n let initialTheme: Theme;\n if (savedTheme === 'dark' || savedTheme === 'light') {\n initialTheme = savedTheme;\n } else {\n initialTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n document.documentElement.setAttribute(THEME_ATTRIBUTE, initialTheme);\n return initialTheme;\n });\n\n useEffect(() => {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === THEME_ATTRIBUTE) {\n const updatedTheme = (mutation.target as HTMLHtmlElement).getAttribute(THEME_ATTRIBUTE);\n if (updatedTheme === 'light' || updatedTheme === 'dark') {\n window.localStorage.setItem(THEME_KEY, updatedTheme);\n setTheme(updatedTheme);\n } else {\n console.error(`Unexpected value for 'data-mode' attribute: ${updatedTheme}`);\n }\n }\n });\n });\n observer.observe(document.documentElement, {\n attributes: true\n });\n return () => observer.disconnect();\n }, []);\n\n // When the user wants to change the theme\n const updateTheme = useCallback(\n (theme: Theme) => {\n document.documentElement.setAttribute(THEME_ATTRIBUTE, theme);\n },\n [document.documentElement]\n );\n\n return [theme, updateTheme] as const;\n}\n\nexport { type Theme, useTheme };\n","import { useState } from 'react';\n\nimport { useEventListener } from './useEventListener';\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\nexport type WindowSize = {\n height: number;\n width: number;\n};\n\nexport function useWindowSize(): WindowSize {\n const [windowSize, setWindowSize] = useState<WindowSize>({\n height: 0,\n width: 0\n });\n\n const handleSize = () => {\n setWindowSize({\n height: window.innerHeight,\n width: window.innerWidth\n });\n };\n\n useEventListener('resize', handleSize);\n\n // Set size at the first client-side load\n useIsomorphicLayoutEffect(() => {\n handleSize();\n }, []);\n\n return windowSize;\n}\n"],"mappings":"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","names":["filename","data","useEffect","useEffect","useRef","useRef","useEffect","useEffect","useRef","useRef","useEffect","useEffect","useState","query","useCallback","useEffect","useState","useCallback","useState","useEffect","useCallback","useEffect","useState","theme","useState","useState"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useDownload.ts","../../src/hooks/useNotificationsStore.ts","../../src/hooks/useEventCallback.ts","../../src/hooks/useIsomorphicLayoutEffect.ts","../../src/hooks/useEventListener.ts","../../src/hooks/useInterval.ts","../../src/hooks/useMediaQuery.ts","../../src/hooks/useOnClickOutside.ts","../../src/hooks/useSessionStorage.ts","../../src/hooks/useTheme.ts","../../src/hooks/useWindowSize.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { Promisable } from 'type-fest';\n\nimport { useNotificationsStore } from './useNotificationsStore';\n\n/**\n * Used to trigger downloads of arbitrary data to the client\n * @returns A function to invoke the download\n */\nexport function useDownload() {\n const notifications = useNotificationsStore();\n const [data, setData] = useState<null | string>(null);\n const [filename, setFilename] = useState<null | string>(null);\n\n useEffect(() => {\n if (data && filename) {\n const anchor = document.createElement('a');\n document.body.appendChild(anchor);\n const blob = new Blob([data], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n anchor.remove();\n setData(null);\n setFilename(null);\n }\n }, [data, filename]);\n\n return async (filename: string, fetchData: () => Promisable<string>) => {\n try {\n const data = await fetchData();\n setData(data);\n setFilename(filename);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'An unknown error occurred';\n notifications.addNotification({\n message,\n title: 'Error',\n type: 'error'\n });\n }\n };\n}\n","import { create } from 'zustand';\n\nexport type NotificationInterface = {\n id: number;\n message?: string;\n title?: string;\n type: 'error' | 'info' | 'success' | 'warning';\n variant?: 'critical' | 'standard';\n};\n\nexport type NotificationsStore = {\n addNotification: (notification: Omit<NotificationInterface, 'id'>) => void;\n dismissNotification: (id: number) => void;\n notifications: NotificationInterface[];\n};\n\nexport const useNotificationsStore = create<NotificationsStore>((set) => ({\n addNotification: (notification) => {\n set((state) => ({\n notifications: [...state.notifications, { id: Date.now(), ...notification }]\n }));\n },\n dismissNotification: (id) => {\n set((state) => ({\n notifications: state.notifications.filter((notification) => notification.id !== id)\n }));\n },\n notifications: []\n}));\n","import { useCallback, useRef } from 'react';\n\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\nexport function useEventCallback<Args extends unknown[], R>(fn: (...args: Args) => R) {\n const ref = useRef<typeof fn>(() => {\n throw new Error('Cannot call an event handler while rendering.');\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((...args: Args) => ref.current(...args), [ref]);\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\nimport { isBrowser } from '@/utils';\n\nexport const useIsomorphicLayoutEffect = isBrowser() ? useLayoutEffect : useEffect;\n","import { type RefObject, useEffect, useRef } from 'react';\n\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\n// MediaQueryList Event based useEventListener interface\nfunction useEventListener<K extends keyof MediaQueryListEventMap>(\n eventName: K,\n handler: (event: MediaQueryListEventMap[K]) => void,\n element: RefObject<MediaQueryList>,\n options?: AddEventListenerOptions | boolean\n): void;\n\n// Window Event based useEventListener interface\nfunction useEventListener<K extends keyof WindowEventMap>(\n eventName: K,\n handler: (event: WindowEventMap[K]) => void,\n element?: undefined,\n options?: AddEventListenerOptions | boolean\n): void;\n\n// Element Event based useEventListener interface\nfunction useEventListener<K extends keyof HTMLElementEventMap, T extends HTMLElement = HTMLDivElement>(\n eventName: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n element: RefObject<T>,\n options?: AddEventListenerOptions | boolean\n): void;\n\n// Document Event based useEventListener interface\nfunction useEventListener<K extends keyof DocumentEventMap>(\n eventName: K,\n handler: (event: DocumentEventMap[K]) => void,\n element: RefObject<Document>,\n options?: AddEventListenerOptions | boolean\n): void;\n\nfunction useEventListener<\n KW extends keyof WindowEventMap,\n KH extends keyof HTMLElementEventMap,\n KM extends keyof MediaQueryListEventMap,\n T extends HTMLElement | MediaQueryList | void = void\n>(\n eventName: KH | KM | KW,\n handler: (event: Event | HTMLElementEventMap[KH] | MediaQueryListEventMap[KM] | WindowEventMap[KW]) => void,\n element?: RefObject<T>,\n options?: AddEventListenerOptions | boolean\n) {\n // Create a ref that stores handler\n const savedHandler = useRef(handler);\n\n useIsomorphicLayoutEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n useEffect(() => {\n // Define the listening target\n const targetElement: T | Window = element?.current ?? window;\n\n if (!(targetElement && targetElement.addEventListener)) return;\n\n // Create event listener that calls handler function stored in ref\n const listener: typeof handler = (event) => savedHandler.current(event);\n\n targetElement.addEventListener(eventName, listener, options);\n\n // Remove event listener on cleanup\n return () => {\n targetElement.removeEventListener(eventName, listener, options);\n };\n }, [eventName, element, options]);\n}\n\nexport { useEventListener };\n","import { useEffect, useRef } from 'react';\n\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\nexport function useInterval(callback: () => void, delay: null | number) {\n const savedCallback = useRef(callback);\n\n // Remember the latest callback if it changes.\n useIsomorphicLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval.\n useEffect(() => {\n // Don't schedule if no delay is specified.\n // Note: 0 is a valid value for delay.\n if (!delay && delay !== 0) {\n return;\n }\n\n const id = setInterval(() => savedCallback.current(), delay);\n\n return () => clearInterval(id);\n }, [delay]);\n}\n","import { useEffect, useState } from 'react';\n\nimport { isBrowser } from '@/utils';\n\n/**\n * Get the result of an arbitrary CSS media query\n *\n * @param query - the CSS media query\n * @returns a boolean indicating the result of the query\n * @example\n * // true if the viewport is at least 768px wide\n * const matches = useMediaQuery('(min-width: 768px)')\n */\nexport function useMediaQuery(query: string): boolean {\n const getMatches = (query: string): boolean => {\n // Prevents SSR issues\n if (isBrowser()) {\n return window.matchMedia(query).matches;\n }\n return false;\n };\n\n const [matches, setMatches] = useState<boolean>(getMatches(query));\n\n function handleChange() {\n setMatches(getMatches(query));\n }\n\n useEffect(() => {\n const matchMedia = window.matchMedia(query);\n\n // Triggered at the first client-side load and if query changes\n handleChange();\n\n matchMedia.addEventListener('change', handleChange);\n\n return () => {\n matchMedia.removeEventListener('change', handleChange);\n };\n }, [query]);\n\n return matches;\n}\n","import { type RefObject } from 'react';\n\nimport { useEventListener } from './useEventListener';\n\ntype Handler = (event: MouseEvent) => void;\n\nexport function useOnClickOutside<T extends HTMLElement = HTMLElement>(\n ref: RefObject<T>,\n handler: Handler,\n mouseEvent: 'mousedown' | 'mouseup' = 'mousedown'\n): void {\n useEventListener(mouseEvent, (event) => {\n const el = ref.current;\n\n // Do nothing if clicking ref's element or descendent elements\n if (!el || el.contains(event.target as Node)) {\n return;\n }\n\n handler(event);\n });\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport { useEventCallback } from './useEventCallback';\nimport { useEventListener } from './useEventListener';\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n interface WindowEventMap {\n 'session-storage': CustomEvent;\n }\n}\n\n/**\n * Represents the options for customizing the behavior of serialization and deserialization.\n * @template T - The type of the state to be stored in session storage.\n */\ntype UseSessionStorageOptions<T> = {\n /** A function to deserialize the stored value. */\n deserializer?: (value: string) => T;\n /**\n * If `true` (default), the hook will initialize reading the session storage. In SSR, you should set it to `false`, returning the initial value initially.\n * @default true\n */\n initializeWithValue?: boolean;\n /** A function to serialize the value before storing it. */\n serializer?: (value: T) => string;\n};\n\nconst IS_SERVER = typeof window === 'undefined';\n\n/**\n * Custom hook that uses session storage to persist state across page reloads.\n * @template T - The type of the state to be stored in session storage.\n * @param {string} key - The key under which the value will be stored in session storage.\n * @param {T | (() => T)} initialValue - The initial value of the state or a function that returns the initial value.\n * @param {?UseSessionStorageOptions<T>} [options] - Options for customizing the behavior of serialization and deserialization (optional).\n * @returns {[T, Dispatch<SetStateAction<T>>]} A tuple containing the stored value and a function to set the value.\n * @public\n * @example\n * ```tsx\n * const [count, setCount] = useSessionStorage('count', 0);\n * // Access the `count` value and the `setCount` function to update it.\n * ```\n */\nexport function useSessionStorage<T>(\n key: string,\n initialValue: (() => T) | T,\n options: UseSessionStorageOptions<T> = {}\n): [T, Dispatch<SetStateAction<T>>] {\n const { initializeWithValue = true } = options;\n\n const serializer = useCallback<(value: T) => string>(\n (value) => {\n if (options.serializer) {\n return options.serializer(value);\n }\n\n return JSON.stringify(value);\n },\n [options]\n );\n\n const deserializer = useCallback<(value: string) => T>(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n // Support 'undefined' as a value\n if (value === 'undefined') {\n return undefined as unknown as T;\n }\n\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error('Error parsing JSON:', error);\n return defaultValue; // Return initialValue if parsing fails\n }\n\n return parsed as T;\n },\n [options, initialValue]\n );\n\n // Get from session storage then\n // parse stored json or return initialValue\n const readValue = useCallback((): T => {\n const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;\n\n // Prevent build error \"window is undefined\" but keep keep working\n if (IS_SERVER) {\n return initialValueToUse;\n }\n\n try {\n const raw = window.sessionStorage.getItem(key);\n return raw ? deserializer(raw) : initialValueToUse;\n } catch (error) {\n console.warn(`Error reading sessionStorage key “${key}”:`, error);\n return initialValueToUse;\n }\n }, [initialValue, key, deserializer]);\n\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n\n return initialValue instanceof Function ? initialValue() : initialValue;\n });\n\n // Return a wrapped version of useState's setter function that ...\n // ... persists the new value to sessionStorage.\n const setValue: Dispatch<SetStateAction<T>> = useEventCallback((value) => {\n // Prevent build error \"window is undefined\" but keeps working\n if (IS_SERVER) {\n console.warn(`Tried setting sessionStorage key “${key}” even though environment is not a client`);\n }\n\n try {\n // Allow value to be a function so we have the same API as useState\n const newValue = value instanceof Function ? value(readValue()) : value;\n\n // Save to session storage\n window.sessionStorage.setItem(key, serializer(newValue));\n\n // Save state\n setStoredValue(newValue);\n\n // We dispatch a custom event so every similar useSessionStorage hook is notified\n window.dispatchEvent(new StorageEvent('session-storage', { key }));\n } catch (error) {\n console.warn(`Error setting sessionStorage key “${key}”:`, error);\n }\n });\n\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n\n const handleStorageChange = useCallback(\n (event: CustomEvent | StorageEvent) => {\n if ((event as StorageEvent).key && (event as StorageEvent).key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n\n // this only works for other documents, not the current one\n useEventListener('storage', handleStorageChange);\n\n // this is a custom event, triggered in writeValueToSessionStorage\n // See: useSessionStorage()\n useEventListener('session-storage', handleStorageChange);\n\n return [storedValue, setValue];\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { isBrowser } from '@/utils';\n\ntype Theme = 'dark' | 'light';\n\ntype UpdateTheme = (theme: Theme) => void;\n\n/** @private */\nconst DEFAULT_THEME: Theme = 'light';\n\n/** @private */\nconst THEME_ATTRIBUTE = 'data-mode';\n\n/** @private */\nconst THEME_KEY = 'theme';\n\n/** @private */\nconst SYS_DARK_MEDIA_QUERY = '(prefers-color-scheme: dark)';\n\n/**\n * Returns the current theme and a function to update the current theme\n *\n * The reason the implementation of this hook is rather convoluted is for\n * cases where the theme is updated outside this hook\n */\nfunction useTheme(): readonly [Theme, UpdateTheme] {\n // Initial theme value is based on the value saved in local storage or the system theme\n const [theme, setTheme] = useState<Theme>(() => {\n if (!isBrowser()) {\n return DEFAULT_THEME;\n }\n const savedTheme = window.localStorage.getItem(THEME_KEY);\n let initialTheme: Theme;\n if (savedTheme === 'dark' || savedTheme === 'light') {\n initialTheme = savedTheme;\n } else {\n initialTheme = window.matchMedia(SYS_DARK_MEDIA_QUERY).matches ? 'dark' : 'light';\n }\n document.documentElement.setAttribute(THEME_ATTRIBUTE, initialTheme);\n return initialTheme;\n });\n\n useEffect(() => {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === THEME_ATTRIBUTE) {\n const updatedTheme = (mutation.target as HTMLHtmlElement).getAttribute(THEME_ATTRIBUTE);\n if (updatedTheme === 'light' || updatedTheme === 'dark') {\n window.localStorage.setItem(THEME_KEY, updatedTheme);\n setTheme(updatedTheme);\n } else {\n console.error(`Unexpected value for 'data-mode' attribute: ${updatedTheme}`);\n }\n }\n });\n });\n observer.observe(document.documentElement, {\n attributes: true\n });\n return () => observer.disconnect();\n }, []);\n\n // When the user wants to change the theme\n const updateTheme = useCallback(\n (theme: Theme) => {\n document.documentElement.setAttribute(THEME_ATTRIBUTE, theme);\n },\n [document.documentElement]\n );\n\n return [theme, updateTheme] as const;\n}\n\nexport { DEFAULT_THEME, SYS_DARK_MEDIA_QUERY, THEME_ATTRIBUTE, THEME_KEY, type Theme, useTheme };\n","import { useState } from 'react';\n\nimport { useEventListener } from './useEventListener';\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\nexport type WindowSize = {\n height: number;\n width: number;\n};\n\nexport function useWindowSize(): WindowSize {\n const [windowSize, setWindowSize] = useState<WindowSize>({\n height: 0,\n width: 0\n });\n\n const handleSize = () => {\n setWindowSize({\n height: window.innerHeight,\n width: window.innerWidth\n });\n };\n\n useEventListener('resize', handleSize);\n\n // Set size at the first client-side load\n useIsomorphicLayoutEffect(() => {\n handleSize();\n }, []);\n\n return windowSize;\n}\n"],"mappings":"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","names":["filename","data","useEffect","useEffect","useEffect","useRef","useRef","useEffect","useEffect","useRef","useRef","useEffect","useEffect","useState","query","useState","useEffect","useCallback","useEffect","useState","useCallback","useState","useEffect","useCallback","useEffect","useState","useState","useEffect","useCallback","theme","useState","useState"]}
|
package/dist/utils.d.ts
CHANGED
package/dist/utils.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@douglasneuroinformatics/libui",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"packageManager": "pnpm@8.15.3",
|
|
6
6
|
"description": "Generic UI components for DNP projects, built using React and TailwindCSS",
|
|
7
7
|
"author": {
|
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
"email": "support@douglasneuroinformatics.ca"
|
|
10
10
|
},
|
|
11
11
|
"license": "LGPL-3.0",
|
|
12
|
+
"homepage": "https://github.com/DouglasNeuroInformatics/libui/#readme",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/DouglasNeuroInformatics/libui/.git"
|
|
16
|
+
},
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/DouglasNeuroInformatics/libui/issues"
|
|
19
|
+
},
|
|
12
20
|
"keywords": [
|
|
13
21
|
"React",
|
|
14
22
|
"TailwindCSS"
|
|
@@ -39,12 +47,23 @@
|
|
|
39
47
|
"tailwind.config.cjs",
|
|
40
48
|
"tailwind.config.d.cts"
|
|
41
49
|
],
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsup && cp -r src/styles dist",
|
|
52
|
+
"format": "prettier --write src",
|
|
53
|
+
"lint": "tsc && eslint --fix src",
|
|
54
|
+
"prepare": "husky",
|
|
55
|
+
"storybook": "storybook dev --no-open -p 6006",
|
|
56
|
+
"storybook:build": "storybook build",
|
|
57
|
+
"test": "vitest",
|
|
58
|
+
"test:coverage": "vitest --coverage"
|
|
59
|
+
},
|
|
42
60
|
"peerDependencies": {
|
|
43
61
|
"react": "^18.2.0",
|
|
44
62
|
"react-dom": "^18.2.0",
|
|
45
63
|
"tailwindcss": "^3.3.5"
|
|
46
64
|
},
|
|
47
65
|
"dependencies": {
|
|
66
|
+
"@radix-ui/react-accordion": "^1.1.2",
|
|
48
67
|
"@radix-ui/react-icons": "^1.3.0",
|
|
49
68
|
"@radix-ui/react-label": "^2.0.2",
|
|
50
69
|
"@radix-ui/react-slot": "^1.0.2",
|
|
@@ -54,58 +73,52 @@
|
|
|
54
73
|
"i18next-browser-languagedetector": "^7.2.0",
|
|
55
74
|
"lodash-es": "^4.17.21",
|
|
56
75
|
"react-i18next": "^14.1.0",
|
|
57
|
-
"tailwind-merge": "^
|
|
76
|
+
"tailwind-merge": "^2.2.1",
|
|
58
77
|
"tailwindcss-animate": "^1.0.7",
|
|
59
|
-
"type-fest": "^4.
|
|
78
|
+
"type-fest": "^4.12.0",
|
|
60
79
|
"zustand": "^4.5.2"
|
|
61
80
|
},
|
|
62
81
|
"devDependencies": {
|
|
63
82
|
"@commitlint/cli": "^19.1.0",
|
|
64
83
|
"@commitlint/config-conventional": "^19.1.0",
|
|
65
84
|
"@commitlint/types": "^19.0.3",
|
|
66
|
-
"@douglasneuroinformatics/eslint-config": "^4.
|
|
85
|
+
"@douglasneuroinformatics/eslint-config": "^4.1.1",
|
|
67
86
|
"@semantic-release/changelog": "^6.0.3",
|
|
68
87
|
"@semantic-release/git": "^10.0.1",
|
|
69
88
|
"@semantic-release/npm": "^11.0.3",
|
|
70
|
-
"@storybook/addon-essentials": "^
|
|
71
|
-
"@storybook/addon-interactions": "^
|
|
72
|
-
"@storybook/addon-links": "^
|
|
73
|
-
"@storybook/addon-themes": "^
|
|
74
|
-
"@storybook/blocks": "^
|
|
75
|
-
"@storybook/icons": "^1.2.
|
|
76
|
-
"@storybook/manager-api": "^
|
|
77
|
-
"@storybook/react": "^
|
|
78
|
-
"@storybook/react-vite": "^
|
|
79
|
-
"@storybook/theming": "^
|
|
89
|
+
"@storybook/addon-essentials": "^8.0.0",
|
|
90
|
+
"@storybook/addon-interactions": "^8.0.0",
|
|
91
|
+
"@storybook/addon-links": "^8.0.0",
|
|
92
|
+
"@storybook/addon-themes": "^8.0.0",
|
|
93
|
+
"@storybook/blocks": "^8.0.0",
|
|
94
|
+
"@storybook/icons": "^1.2.9",
|
|
95
|
+
"@storybook/manager-api": "^8.0.0",
|
|
96
|
+
"@storybook/react": "^8.0.0",
|
|
97
|
+
"@storybook/react-vite": "^8.0.0",
|
|
98
|
+
"@storybook/theming": "^8.0.0",
|
|
80
99
|
"@testing-library/jest-dom": "^6.4.2",
|
|
81
100
|
"@testing-library/react": "14.2.1",
|
|
82
101
|
"@testing-library/user-event": "^14.5.2",
|
|
83
102
|
"@types/lodash-es": "^4.17.12",
|
|
84
|
-
"@types/node": "^20.11.
|
|
85
|
-
"@types/react": "^18.2.
|
|
86
|
-
"@types/react-dom": "^18.2.
|
|
103
|
+
"@types/node": "^20.11.27",
|
|
104
|
+
"@types/react": "^18.2.65",
|
|
105
|
+
"@types/react-dom": "^18.2.22",
|
|
87
106
|
"@vitejs/plugin-react-swc": "^3.6.0",
|
|
88
107
|
"@vitest/coverage-v8": "^1.3.1",
|
|
89
108
|
"autoprefixer": "^10.4.18",
|
|
90
109
|
"eslint": "^8.57.0",
|
|
110
|
+
"happy-dom": "^13.8.2",
|
|
91
111
|
"husky": "^9.0.11",
|
|
92
112
|
"jsdom": "24.0.0",
|
|
93
113
|
"postcss": "^8.4.35",
|
|
94
114
|
"prettier": "^3.2.5",
|
|
95
115
|
"prettier-plugin-tailwindcss": "^0.5.12",
|
|
96
116
|
"semantic-release": "^23.0.2",
|
|
97
|
-
"storybook": "^
|
|
117
|
+
"storybook": "^8.0.0",
|
|
98
118
|
"storybook-react-i18next": "^2.1.1",
|
|
99
119
|
"tsup": "^8.0.2",
|
|
100
120
|
"typescript": "~5.3.3",
|
|
101
|
-
"vite": "
|
|
121
|
+
"vite": "5.1.6",
|
|
102
122
|
"vitest": "^1.3.1"
|
|
103
|
-
},
|
|
104
|
-
"scripts": {
|
|
105
|
-
"build": "tsup && cp -r src/styles dist",
|
|
106
|
-
"format": "prettier --write src",
|
|
107
|
-
"lint": "tsc && eslint --fix src",
|
|
108
|
-
"storybook": "storybook dev -p 6006",
|
|
109
|
-
"storybook:build": "storybook build"
|
|
110
123
|
}
|
|
111
|
-
}
|
|
124
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
|