@helpwave/hightide 0.1.26 → 0.1.27
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/components/date/DatePicker.js +1 -1
- package/dist/components/date/DatePicker.js.map +1 -1
- package/dist/components/date/DatePicker.mjs +1 -1
- package/dist/components/date/DatePicker.mjs.map +1 -1
- package/dist/components/date/YearMonthPicker.js +1 -1
- package/dist/components/date/YearMonthPicker.js.map +1 -1
- package/dist/components/date/YearMonthPicker.mjs +1 -1
- package/dist/components/date/YearMonthPicker.mjs.map +1 -1
- package/dist/components/dialog/ConfirmDialog.d.mts +1 -1
- package/dist/components/dialog/ConfirmDialog.d.ts +1 -1
- package/dist/components/dialog/ConfirmDialog.js +2 -2
- package/dist/components/dialog/ConfirmDialog.js.map +1 -1
- package/dist/components/dialog/ConfirmDialog.mjs +2 -2
- package/dist/components/dialog/ConfirmDialog.mjs.map +1 -1
- package/dist/components/dialog/Dialog.d.mts +1 -1
- package/dist/components/dialog/Dialog.d.ts +1 -1
- package/dist/components/dialog/Dialog.js +2 -2
- package/dist/components/dialog/Dialog.js.map +1 -1
- package/dist/components/dialog/Dialog.mjs +2 -2
- package/dist/components/dialog/Dialog.mjs.map +1 -1
- package/dist/components/dialog/DiscardChangesDialog.d.mts +1 -1
- package/dist/components/dialog/DiscardChangesDialog.d.ts +1 -1
- package/dist/components/dialog/DiscardChangesDialog.js +2 -2
- package/dist/components/dialog/DiscardChangesDialog.js.map +1 -1
- package/dist/components/dialog/DiscardChangesDialog.mjs +2 -2
- package/dist/components/dialog/DiscardChangesDialog.mjs.map +1 -1
- package/dist/components/dialog/InputDialog.d.mts +1 -1
- package/dist/components/dialog/InputDialog.d.ts +1 -1
- package/dist/components/dialog/InputDialog.js +2 -2
- package/dist/components/dialog/InputDialog.js.map +1 -1
- package/dist/components/dialog/InputDialog.mjs +2 -2
- package/dist/components/dialog/InputDialog.mjs.map +1 -1
- package/dist/components/dialog/LanguageDialog.d.mts +1 -1
- package/dist/components/dialog/LanguageDialog.d.ts +1 -1
- package/dist/components/dialog/LanguageDialog.js +28 -15
- package/dist/components/dialog/LanguageDialog.js.map +1 -1
- package/dist/components/dialog/LanguageDialog.mjs +28 -15
- package/dist/components/dialog/LanguageDialog.mjs.map +1 -1
- package/dist/components/dialog/ThemeDialog.d.mts +1 -1
- package/dist/components/dialog/ThemeDialog.d.ts +1 -1
- package/dist/components/dialog/ThemeDialog.js +69 -33
- package/dist/components/dialog/ThemeDialog.js.map +1 -1
- package/dist/components/dialog/ThemeDialog.mjs +60 -24
- package/dist/components/dialog/ThemeDialog.mjs.map +1 -1
- package/dist/components/dialog/index.d.mts +1 -1
- package/dist/components/dialog/index.d.ts +1 -1
- package/dist/components/dialog/index.js +61 -25
- package/dist/components/dialog/index.js.map +1 -1
- package/dist/components/dialog/index.mjs +61 -25
- package/dist/components/dialog/index.mjs.map +1 -1
- package/dist/components/layout/Carousel.d.mts +33 -0
- package/dist/components/layout/Carousel.d.ts +33 -0
- package/dist/components/layout/Carousel.js +684 -0
- package/dist/components/layout/Carousel.js.map +1 -0
- package/dist/components/layout/Carousel.mjs +659 -0
- package/dist/components/layout/Carousel.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/Chip.js +1 -1
- package/dist/components/layout/Chip.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/Chip.mjs +1 -1
- package/dist/components/layout/Chip.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/DividerInserter.js +1 -1
- package/dist/components/layout/DividerInserter.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/DividerInserter.mjs +1 -1
- package/dist/components/layout/DividerInserter.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/Expandable.js +2 -2
- package/dist/components/layout/Expandable.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/Expandable.mjs +2 -2
- package/dist/components/layout/Expandable.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/FAQSection.js +5 -5
- package/dist/components/layout/FAQSection.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/FAQSection.mjs +5 -5
- package/dist/components/layout/FAQSection.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/FloatingContainer.js +2 -2
- package/dist/components/layout/FloatingContainer.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/FloatingContainer.mjs +2 -2
- package/dist/components/layout/FloatingContainer.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/ListBox.js +2 -2
- package/dist/components/layout/ListBox.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/ListBox.mjs +2 -2
- package/dist/components/layout/ListBox.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/MarkdownInterpreter.js +1 -1
- package/dist/components/layout/MarkdownInterpreter.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/MarkdownInterpreter.mjs +1 -1
- package/dist/components/layout/MarkdownInterpreter.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/ScrollArea.js +2 -2
- package/dist/components/layout/ScrollArea.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/ScrollArea.mjs +1 -1
- package/dist/components/layout/ScrollArea.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/TextImage.js +3 -3
- package/dist/components/layout/TextImage.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/TextImage.mjs +2 -2
- package/dist/components/layout/TextImage.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/VerticalDivider.js +1 -1
- package/dist/components/layout/VerticalDivider.js.map +1 -0
- package/dist/components/{layout-and-navigation → layout}/VerticalDivider.mjs +1 -1
- package/dist/components/layout/VerticalDivider.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → navigation}/BreadCrumb.js +1 -1
- package/dist/components/navigation/BreadCrumb.js.map +1 -0
- package/dist/components/{layout-and-navigation → navigation}/BreadCrumb.mjs +1 -1
- package/dist/components/navigation/BreadCrumb.mjs.map +1 -0
- package/dist/components/navigation/Navigation.d.mts +21 -0
- package/dist/components/navigation/Navigation.d.ts +21 -0
- package/dist/components/navigation/Navigation.js +4018 -0
- package/dist/components/navigation/Navigation.js.map +1 -0
- package/dist/components/navigation/Navigation.mjs +4012 -0
- package/dist/components/navigation/Navigation.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → navigation}/Pagination.js +3 -3
- package/dist/components/navigation/Pagination.js.map +1 -0
- package/dist/components/{layout-and-navigation → navigation}/Pagination.mjs +3 -3
- package/dist/components/navigation/Pagination.mjs.map +1 -0
- package/dist/components/{layout-and-navigation → navigation}/StepperBar.js +3 -3
- package/dist/components/navigation/StepperBar.js.map +1 -0
- package/dist/components/{layout-and-navigation → navigation}/StepperBar.mjs +3 -3
- package/dist/components/navigation/StepperBar.mjs.map +1 -0
- package/dist/components/properties/MultiSelectProperty.js +27 -14
- package/dist/components/properties/MultiSelectProperty.js.map +1 -1
- package/dist/components/properties/MultiSelectProperty.mjs +27 -14
- package/dist/components/properties/MultiSelectProperty.mjs.map +1 -1
- package/dist/components/properties/SelectProperty.js +27 -14
- package/dist/components/properties/SelectProperty.js.map +1 -1
- package/dist/components/properties/SelectProperty.mjs +27 -14
- package/dist/components/properties/SelectProperty.mjs.map +1 -1
- package/dist/components/table/Table.js +1 -1
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/table/Table.mjs +1 -1
- package/dist/components/table/Table.mjs.map +1 -1
- package/dist/components/user-action/DateAndTimePicker.js +1 -1
- package/dist/components/user-action/DateAndTimePicker.js.map +1 -1
- package/dist/components/user-action/DateAndTimePicker.mjs +1 -1
- package/dist/components/user-action/DateAndTimePicker.mjs.map +1 -1
- package/dist/components/user-action/select/Select.d.mts +5 -1
- package/dist/components/user-action/select/Select.d.ts +5 -1
- package/dist/components/user-action/select/Select.js +27 -14
- package/dist/components/user-action/select/Select.js.map +1 -1
- package/dist/components/user-action/select/Select.mjs +27 -14
- package/dist/components/user-action/select/Select.mjs.map +1 -1
- package/dist/style/globals.css +63 -10
- package/dist/style/uncompiled/globals.css +5 -4
- package/dist/style/uncompiled/utitlity/shadow.css +4 -0
- package/dist/theming/useTheme.d.mts +3 -1
- package/dist/theming/useTheme.d.ts +3 -1
- package/dist/theming/useTheme.js +40 -17
- package/dist/theming/useTheme.js.map +1 -1
- package/dist/theming/useTheme.mjs +38 -15
- package/dist/theming/useTheme.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/components/layout-and-navigation/BreadCrumb.js.map +0 -1
- package/dist/components/layout-and-navigation/BreadCrumb.mjs.map +0 -1
- package/dist/components/layout-and-navigation/Carousel.d.mts +0 -25
- package/dist/components/layout-and-navigation/Carousel.d.ts +0 -25
- package/dist/components/layout-and-navigation/Carousel.js +0 -643
- package/dist/components/layout-and-navigation/Carousel.js.map +0 -1
- package/dist/components/layout-and-navigation/Carousel.mjs +0 -609
- package/dist/components/layout-and-navigation/Carousel.mjs.map +0 -1
- package/dist/components/layout-and-navigation/Chip.js.map +0 -1
- package/dist/components/layout-and-navigation/Chip.mjs.map +0 -1
- package/dist/components/layout-and-navigation/DividerInserter.js.map +0 -1
- package/dist/components/layout-and-navigation/DividerInserter.mjs.map +0 -1
- package/dist/components/layout-and-navigation/Expandable.js.map +0 -1
- package/dist/components/layout-and-navigation/Expandable.mjs.map +0 -1
- package/dist/components/layout-and-navigation/FAQSection.js.map +0 -1
- package/dist/components/layout-and-navigation/FAQSection.mjs.map +0 -1
- package/dist/components/layout-and-navigation/FloatingContainer.js.map +0 -1
- package/dist/components/layout-and-navigation/FloatingContainer.mjs.map +0 -1
- package/dist/components/layout-and-navigation/ListBox.js.map +0 -1
- package/dist/components/layout-and-navigation/ListBox.mjs.map +0 -1
- package/dist/components/layout-and-navigation/MarkdownInterpreter.js.map +0 -1
- package/dist/components/layout-and-navigation/MarkdownInterpreter.mjs.map +0 -1
- package/dist/components/layout-and-navigation/Pagination.js.map +0 -1
- package/dist/components/layout-and-navigation/Pagination.mjs.map +0 -1
- package/dist/components/layout-and-navigation/ScrollArea.js.map +0 -1
- package/dist/components/layout-and-navigation/ScrollArea.mjs.map +0 -1
- package/dist/components/layout-and-navigation/StepperBar.js.map +0 -1
- package/dist/components/layout-and-navigation/StepperBar.mjs.map +0 -1
- package/dist/components/layout-and-navigation/TextImage.js.map +0 -1
- package/dist/components/layout-and-navigation/TextImage.mjs.map +0 -1
- package/dist/components/layout-and-navigation/VerticalDivider.js.map +0 -1
- package/dist/components/layout-and-navigation/VerticalDivider.mjs.map +0 -1
- /package/dist/components/{layout-and-navigation → layout}/Chip.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/Chip.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/DividerInserter.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/DividerInserter.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/Expandable.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/Expandable.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/FAQSection.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/FAQSection.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/FloatingContainer.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/FloatingContainer.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/ListBox.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/ListBox.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/MarkdownInterpreter.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/MarkdownInterpreter.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/ScrollArea.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/ScrollArea.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/TextImage.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/TextImage.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/VerticalDivider.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → layout}/VerticalDivider.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → navigation}/BreadCrumb.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → navigation}/BreadCrumb.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → navigation}/Pagination.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → navigation}/Pagination.d.ts +0 -0
- /package/dist/components/{layout-and-navigation → navigation}/StepperBar.d.mts +0 -0
- /package/dist/components/{layout-and-navigation → navigation}/StepperBar.d.ts +0 -0
package/dist/style/globals.css
CHANGED
|
@@ -421,6 +421,12 @@
|
|
|
421
421
|
.z-100 {
|
|
422
422
|
z-index: 100;
|
|
423
423
|
}
|
|
424
|
+
.z-2000 {
|
|
425
|
+
z-index: 2000;
|
|
426
|
+
}
|
|
427
|
+
.z-2001 {
|
|
428
|
+
z-index: 2001;
|
|
429
|
+
}
|
|
424
430
|
.z-\[1\] {
|
|
425
431
|
z-index: 1;
|
|
426
432
|
}
|
|
@@ -539,6 +545,11 @@
|
|
|
539
545
|
flex-direction: row;
|
|
540
546
|
column-gap: calc(var(--spacing) * 4);
|
|
541
547
|
}
|
|
548
|
+
.flex-row-6 {
|
|
549
|
+
display: flex;
|
|
550
|
+
flex-direction: row;
|
|
551
|
+
column-gap: calc(var(--spacing) * 6);
|
|
552
|
+
}
|
|
542
553
|
.row {
|
|
543
554
|
display: flex;
|
|
544
555
|
flex-direction: row;
|
|
@@ -574,8 +585,10 @@
|
|
|
574
585
|
flex-direction: column;
|
|
575
586
|
row-gap: calc(var(--spacing) * 6);
|
|
576
587
|
}
|
|
577
|
-
|
|
578
|
-
display:
|
|
588
|
+
.flex-col-8 {
|
|
589
|
+
display: flex;
|
|
590
|
+
flex-direction: column;
|
|
591
|
+
row-gap: calc(var(--spacing) * 8);
|
|
579
592
|
}
|
|
580
593
|
.block {
|
|
581
594
|
display: block;
|
|
@@ -824,6 +837,9 @@
|
|
|
824
837
|
.min-w-20 {
|
|
825
838
|
min-width: calc(var(--spacing) * 20);
|
|
826
839
|
}
|
|
840
|
+
.min-w-32 {
|
|
841
|
+
min-width: calc(var(--spacing) * 32);
|
|
842
|
+
}
|
|
827
843
|
.min-w-40 {
|
|
828
844
|
min-width: calc(var(--spacing) * 40);
|
|
829
845
|
}
|
|
@@ -906,9 +922,6 @@
|
|
|
906
922
|
.animate-pulse {
|
|
907
923
|
animation: var(--animate-pulse);
|
|
908
924
|
}
|
|
909
|
-
.\!cursor-grabbing {
|
|
910
|
-
cursor: grabbing !important;
|
|
911
|
-
}
|
|
912
925
|
.cursor-col-resize {
|
|
913
926
|
cursor: col-resize;
|
|
914
927
|
}
|
|
@@ -979,6 +992,9 @@
|
|
|
979
992
|
.gap-x-2 {
|
|
980
993
|
column-gap: calc(var(--spacing) * 2);
|
|
981
994
|
}
|
|
995
|
+
.gap-x-6 {
|
|
996
|
+
column-gap: calc(var(--spacing) * 6);
|
|
997
|
+
}
|
|
982
998
|
.gap-y-1 {
|
|
983
999
|
row-gap: calc(var(--spacing) * 1);
|
|
984
1000
|
}
|
|
@@ -1382,6 +1398,9 @@
|
|
|
1382
1398
|
.p-4 {
|
|
1383
1399
|
padding: calc(var(--spacing) * 4);
|
|
1384
1400
|
}
|
|
1401
|
+
.p-8 {
|
|
1402
|
+
padding: calc(var(--spacing) * 8);
|
|
1403
|
+
}
|
|
1385
1404
|
.px-1 {
|
|
1386
1405
|
padding-inline: calc(var(--spacing) * 1);
|
|
1387
1406
|
}
|
|
@@ -1975,11 +1994,14 @@
|
|
|
1975
1994
|
-webkit-user-select: none;
|
|
1976
1995
|
user-select: none;
|
|
1977
1996
|
}
|
|
1978
|
-
.animation-delay-3000 {
|
|
1979
|
-
animation-delay: calc(3000 * 1ms);
|
|
1980
|
-
}
|
|
1981
1997
|
.shadow-hw-bottom {
|
|
1982
1998
|
--shadow-bottom: 0 calc(1rem/16) calc(20rem/16) 0 var(--tw-shadow-color, rgb(0 0 0 / 10%));
|
|
1999
|
+
&:where([data-theme=dark], [data-theme=dark] *) {
|
|
2000
|
+
--shadow-bottom: 0 calc(1rem/16) calc(20rem/16) 0 var(--tw-shadow-color, rgb(0 0 0 / 20%));
|
|
2001
|
+
}
|
|
2002
|
+
}
|
|
2003
|
+
.animation-delay-3000 {
|
|
2004
|
+
animation-delay: calc(3000 * 1ms);
|
|
1983
2005
|
}
|
|
1984
2006
|
.shadow-r-4 {
|
|
1985
2007
|
--shadow-right: calc(4 * 1px) 0 calc(4 * 1px) 0 var(--tw-shadow-color, rgb(0 0 0 / 2%));
|
|
@@ -2144,6 +2166,11 @@
|
|
|
2144
2166
|
cursor: pointer;
|
|
2145
2167
|
}
|
|
2146
2168
|
}
|
|
2169
|
+
.group-focus-within\/slide\:border-primary {
|
|
2170
|
+
&:is(:where(.group\/slide):focus-within *) {
|
|
2171
|
+
border-color: var(--color-primary);
|
|
2172
|
+
}
|
|
2173
|
+
}
|
|
2147
2174
|
.group-hover\:border-primary {
|
|
2148
2175
|
&:is(:where(.group):hover *) {
|
|
2149
2176
|
@media (hover: hover) {
|
|
@@ -2664,6 +2691,16 @@
|
|
|
2664
2691
|
display: block;
|
|
2665
2692
|
}
|
|
2666
2693
|
}
|
|
2694
|
+
.desktop\:flex {
|
|
2695
|
+
@media (width >= 64rem) {
|
|
2696
|
+
display: flex;
|
|
2697
|
+
}
|
|
2698
|
+
}
|
|
2699
|
+
.desktop\:hidden {
|
|
2700
|
+
@media (width >= 64rem) {
|
|
2701
|
+
display: none;
|
|
2702
|
+
}
|
|
2703
|
+
}
|
|
2667
2704
|
.desktop\:w-1\/2 {
|
|
2668
2705
|
@media (width >= 64rem) {
|
|
2669
2706
|
width: calc(1/2 * 100%);
|
|
@@ -3193,9 +3230,25 @@
|
|
|
3193
3230
|
padding-inline: calc(var(--spacing) * 24);
|
|
3194
3231
|
}
|
|
3195
3232
|
}
|
|
3196
|
-
|
|
3197
|
-
|
|
3233
|
+
.link {
|
|
3234
|
+
border-radius: 0.25rem;
|
|
3235
|
+
padding: calc(var(--spacing) * 2);
|
|
3236
|
+
font-size: var(--text-lg);
|
|
3237
|
+
line-height: var(--tw-leading, var(--text-lg--line-height));
|
|
3238
|
+
--tw-font-weight: var(--font-weight-bold);
|
|
3239
|
+
font-weight: var(--font-weight-bold);
|
|
3240
|
+
text-decoration-thickness: 3px;
|
|
3241
|
+
&:hover {
|
|
3242
|
+
@media (hover: hover) {
|
|
3243
|
+
text-decoration-line: underline;
|
|
3244
|
+
}
|
|
3245
|
+
}
|
|
3246
|
+
&:focus {
|
|
3247
|
+
text-decoration-line: underline;
|
|
3248
|
+
}
|
|
3249
|
+
}
|
|
3198
3250
|
* {
|
|
3251
|
+
list-style-type: none;
|
|
3199
3252
|
border-color: var(--color-border);
|
|
3200
3253
|
}
|
|
3201
3254
|
html {
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
--breakpoint-desktop: 64rem; /* 1024px for 16px font-size*/
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
/* Styles that can be overwritten by utils */
|
|
22
21
|
@layer components {
|
|
23
22
|
.btn-sm {
|
|
24
23
|
@apply flex-row-1 items-center justify-center px-1.5 py-1 rounded-1.5 h-8 min-h-8;
|
|
@@ -79,11 +78,13 @@
|
|
|
79
78
|
.section-padding {
|
|
80
79
|
@apply px-6 tablet:px-12 desktop:px-24 py-16;
|
|
81
80
|
}
|
|
82
|
-
}
|
|
83
81
|
|
|
84
|
-
|
|
82
|
+
.link {
|
|
83
|
+
@apply decoration-3 p-2 hover:underline focus:underline font-bold text-lg rounded;
|
|
84
|
+
}
|
|
85
|
+
|
|
85
86
|
* {
|
|
86
|
-
@apply border-border;
|
|
87
|
+
@apply border-border list-none;
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
html {
|
|
@@ -41,6 +41,10 @@
|
|
|
41
41
|
|
|
42
42
|
@utility shadow-hw-bottom {
|
|
43
43
|
--shadow-bottom: 0 calc(1rem/16) calc(20rem/16) 0 var(--tw-shadow-color, rgb(0 0 0 / 10%));
|
|
44
|
+
|
|
45
|
+
@variant dark {
|
|
46
|
+
--shadow-bottom: 0 calc(1rem/16) calc(20rem/16) 0 var(--tw-shadow-color, rgb(0 0 0 / 20%));
|
|
47
|
+
}
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
@layer utilities {
|
|
@@ -6,6 +6,7 @@ import '../localization/util.mjs';
|
|
|
6
6
|
|
|
7
7
|
declare const themes: readonly ["light", "dark", "system"];
|
|
8
8
|
type ThemeType = typeof themes[number];
|
|
9
|
+
type ResolvedTheme = Exclude<ThemeType, 'system'>;
|
|
9
10
|
type ThemeTypeTranslation = Record<ThemeType, string> & {
|
|
10
11
|
theme: TranslationPlural;
|
|
11
12
|
};
|
|
@@ -15,6 +16,7 @@ declare const ThemeUtil: {
|
|
|
15
16
|
};
|
|
16
17
|
type ThemeContextType = {
|
|
17
18
|
theme: ThemeType;
|
|
19
|
+
resolvedTheme: ResolvedTheme;
|
|
18
20
|
setTheme: Dispatch<SetStateAction<ThemeType>>;
|
|
19
21
|
};
|
|
20
22
|
declare const ThemeContext: React.Context<ThemeContextType>;
|
|
@@ -24,4 +26,4 @@ type ThemeProviderProps = {
|
|
|
24
26
|
declare const ThemeProvider: ({ children, initialTheme }: PropsWithChildren<ThemeProviderProps>) => react_jsx_runtime.JSX.Element;
|
|
25
27
|
declare const useTheme: () => ThemeContextType;
|
|
26
28
|
|
|
27
|
-
export { ThemeContext, ThemeProvider, type ThemeType, type ThemeTypeTranslation, ThemeUtil, useTheme };
|
|
29
|
+
export { type ResolvedTheme, ThemeContext, ThemeProvider, type ThemeType, type ThemeTypeTranslation, ThemeUtil, useTheme };
|
|
@@ -6,6 +6,7 @@ import '../localization/util.js';
|
|
|
6
6
|
|
|
7
7
|
declare const themes: readonly ["light", "dark", "system"];
|
|
8
8
|
type ThemeType = typeof themes[number];
|
|
9
|
+
type ResolvedTheme = Exclude<ThemeType, 'system'>;
|
|
9
10
|
type ThemeTypeTranslation = Record<ThemeType, string> & {
|
|
10
11
|
theme: TranslationPlural;
|
|
11
12
|
};
|
|
@@ -15,6 +16,7 @@ declare const ThemeUtil: {
|
|
|
15
16
|
};
|
|
16
17
|
type ThemeContextType = {
|
|
17
18
|
theme: ThemeType;
|
|
19
|
+
resolvedTheme: ResolvedTheme;
|
|
18
20
|
setTheme: Dispatch<SetStateAction<ThemeType>>;
|
|
19
21
|
};
|
|
20
22
|
declare const ThemeContext: React.Context<ThemeContextType>;
|
|
@@ -24,4 +26,4 @@ type ThemeProviderProps = {
|
|
|
24
26
|
declare const ThemeProvider: ({ children, initialTheme }: PropsWithChildren<ThemeProviderProps>) => react_jsx_runtime.JSX.Element;
|
|
25
27
|
declare const useTheme: () => ThemeContextType;
|
|
26
28
|
|
|
27
|
-
export { ThemeContext, ThemeProvider, type ThemeType, type ThemeTypeTranslation, ThemeUtil, useTheme };
|
|
29
|
+
export { type ResolvedTheme, ThemeContext, ThemeProvider, type ThemeType, type ThemeTypeTranslation, ThemeUtil, useTheme };
|
package/dist/theming/useTheme.js
CHANGED
|
@@ -27,9 +27,7 @@ __export(useTheme_exports, {
|
|
|
27
27
|
module.exports = __toCommonJS(useTheme_exports);
|
|
28
28
|
var import_react2 = require("react");
|
|
29
29
|
var import_react3 = require("react");
|
|
30
|
-
|
|
31
|
-
// src/utils/noop.ts
|
|
32
|
-
var noop = () => void 0;
|
|
30
|
+
var import_react4 = require("react");
|
|
33
31
|
|
|
34
32
|
// src/hooks/useLocalStorage.ts
|
|
35
33
|
var import_react = require("react");
|
|
@@ -115,30 +113,55 @@ var ThemeUtil = {
|
|
|
115
113
|
themes,
|
|
116
114
|
translation: defaultThemeTypeTranslation
|
|
117
115
|
};
|
|
118
|
-
var ThemeContext = (0,
|
|
119
|
-
theme: "light",
|
|
120
|
-
setTheme: noop
|
|
121
|
-
});
|
|
116
|
+
var ThemeContext = (0, import_react4.createContext)(null);
|
|
122
117
|
var ThemeProvider = ({ children, initialTheme }) => {
|
|
123
118
|
const [storedTheme, setStoredTheme] = useLocalStorage("theme", initialTheme ?? "system");
|
|
124
|
-
const [
|
|
125
|
-
(0, import_react3.
|
|
119
|
+
const [themePreference, setThemePreference] = (0, import_react4.useState)("system");
|
|
120
|
+
const resolvedTheme = (0, import_react3.useMemo)(() => {
|
|
121
|
+
if (storedTheme && storedTheme !== "system") {
|
|
122
|
+
return storedTheme;
|
|
123
|
+
}
|
|
124
|
+
return themePreference === "dark" ? "dark" : "light";
|
|
125
|
+
}, [storedTheme, themePreference]);
|
|
126
|
+
(0, import_react4.useEffect)(() => {
|
|
126
127
|
if (!!initialTheme && storedTheme !== initialTheme) {
|
|
127
128
|
console.warn("ThemeProvider initial state changed: Prefer using useTheme's setTheme instead");
|
|
128
129
|
setStoredTheme(initialTheme);
|
|
129
130
|
}
|
|
130
131
|
}, [initialTheme]);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
(0, import_react3.useEffect)(() => {
|
|
132
|
+
(0, import_react4.useEffect)(() => {
|
|
133
|
+
document.documentElement.setAttribute("data-theme", resolvedTheme);
|
|
134
|
+
}, [resolvedTheme]);
|
|
135
|
+
const getPreference = (0, import_react2.useCallback)(() => {
|
|
136
136
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
137
|
-
|
|
137
|
+
const prefersLight = window.matchMedia("(prefers-color-scheme: light)").matches;
|
|
138
|
+
setThemePreference(prefersDark ? "dark" : prefersLight ? "light" : "system");
|
|
138
139
|
}, []);
|
|
139
|
-
|
|
140
|
+
(0, import_react4.useEffect)(() => {
|
|
141
|
+
getPreference();
|
|
142
|
+
}, [getPreference]);
|
|
143
|
+
(0, import_react4.useEffect)(() => {
|
|
144
|
+
const darkQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
145
|
+
const lightQuery = window.matchMedia("(prefers-color-scheme: light)");
|
|
146
|
+
const noPrefQuery = window.matchMedia("(prefers-color-scheme: no-preference)");
|
|
147
|
+
darkQuery.addEventListener("change", getPreference);
|
|
148
|
+
lightQuery.addEventListener("change", getPreference);
|
|
149
|
+
noPrefQuery.addEventListener("change", getPreference);
|
|
150
|
+
return () => {
|
|
151
|
+
darkQuery.removeEventListener("change", getPreference);
|
|
152
|
+
lightQuery.removeEventListener("change", getPreference);
|
|
153
|
+
noPrefQuery.removeEventListener("change", getPreference);
|
|
154
|
+
};
|
|
155
|
+
}, [getPreference]);
|
|
156
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value: { theme: storedTheme, resolvedTheme, setTheme: setStoredTheme }, children });
|
|
157
|
+
};
|
|
158
|
+
var useTheme = () => {
|
|
159
|
+
const context = (0, import_react4.useContext)(ThemeContext);
|
|
160
|
+
if (!context) {
|
|
161
|
+
throw new Error("useTheme must be used within ThemeContext. Try adding a ThemeProvider around your app.");
|
|
162
|
+
}
|
|
163
|
+
return context;
|
|
140
164
|
};
|
|
141
|
-
var useTheme = () => (0, import_react3.useContext)(ThemeContext);
|
|
142
165
|
// Annotate the CommonJS export names for ESM import in node:
|
|
143
166
|
0 && (module.exports = {
|
|
144
167
|
ThemeContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/theming/useTheme.tsx","../../src/
|
|
1
|
+
{"version":3,"sources":["../../src/theming/useTheme.tsx","../../src/hooks/useLocalStorage.ts","../../src/utils/storage.ts","../../src/utils/resolveSetState.ts"],"sourcesContent":["import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { useCallback } from 'react'\nimport { useMemo } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport type { Translation, TranslationPlural } from '../localization/useTranslation'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\n\nconst themes = ['light', 'dark', 'system'] as const\n\nexport type ThemeType = typeof themes[number]\nexport type ResolvedTheme = Exclude<ThemeType, 'system'>\n\nexport type ThemeTypeTranslation = Record<ThemeType, string> & {\n theme: TranslationPlural,\n}\n\nconst defaultThemeTypeTranslation: Translation<ThemeTypeTranslation> = {\n en: {\n dark: 'Dark',\n light: 'Light',\n system: 'System',\n theme: {\n one: 'Theme',\n other: 'Themes'\n }\n },\n de: {\n dark: 'Dunkel',\n light: 'Hell',\n system: 'System',\n theme: {\n one: 'Farbschema',\n other: 'Farbschemas'\n }\n }\n}\n\nexport const ThemeUtil = {\n themes,\n translation: defaultThemeTypeTranslation,\n}\n\ntype ThemeContextType = {\n theme: ThemeType,\n resolvedTheme: ResolvedTheme,\n setTheme: Dispatch<SetStateAction<ThemeType>>,\n}\n\nexport const ThemeContext = createContext<ThemeContextType | null>(null)\n\ntype ThemeProviderProps = {\n initialTheme?: ThemeType,\n}\n\nexport const ThemeProvider = ({ children, initialTheme }: PropsWithChildren<ThemeProviderProps>) => {\n const [storedTheme, setStoredTheme] = useLocalStorage<ThemeType>('theme', initialTheme ?? 'system')\n const [themePreference, setThemePreference] = useState<ThemeType>('system')\n\n const resolvedTheme = useMemo(() => {\n if(storedTheme && storedTheme !== 'system') {\n return storedTheme\n }\n return themePreference === 'dark' ? 'dark' : 'light'\n }, [storedTheme, themePreference])\n\n useEffect(() => {\n if (!!initialTheme && storedTheme !== initialTheme) {\n console.warn('ThemeProvider initial state changed: Prefer using useTheme\\'s setTheme instead')\n setStoredTheme(initialTheme)\n }\n }, [initialTheme]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', resolvedTheme)\n }, [resolvedTheme])\n\n const getPreference = useCallback(() => {\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n const prefersLight = window.matchMedia('(prefers-color-scheme: light)').matches\n setThemePreference(prefersDark ? 'dark' : (prefersLight ? 'light' : 'system'))\n }, [])\n\n useEffect(() => {\n getPreference()\n }, [getPreference])\n\n useEffect(() => {\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const lightQuery = window.matchMedia('(prefers-color-scheme: light)')\n const noPrefQuery = window.matchMedia('(prefers-color-scheme: no-preference)')\n darkQuery.addEventListener('change', getPreference)\n lightQuery.addEventListener('change', getPreference)\n noPrefQuery.addEventListener('change', getPreference)\n return () => {\n darkQuery.removeEventListener('change', getPreference)\n lightQuery.removeEventListener('change', getPreference)\n noPrefQuery.removeEventListener('change', getPreference)\n }\n }, [getPreference])\n\n return (\n <ThemeContext.Provider value={{ theme: storedTheme, resolvedTheme, setTheme: setStoredTheme }}>\n {children}\n </ThemeContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = useContext(ThemeContext)\n if(!context) {\n throw new Error('useTheme must be used within ThemeContext. Try adding a ThemeProvider around your app.')\n }\n return context\n}\n","'use client'\n\nimport type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useState } from 'react'\nimport { LocalStorageService } from '@/src/utils/storage'\nimport { resolveSetState } from '@/src/utils/resolveSetState'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\nexport const useLocalStorage = <T>(key: string, initValue: T): [T, SetValue<T>] => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return initValue\n }\n const storageService = new LocalStorageService()\n const value = storageService.get<T>(key)\n return value || initValue\n }, [initValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(action => {\n const newValue = resolveSetState(action, storedValue)\n const storageService = new LocalStorageService()\n storageService.set(key, newValue)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n return [storedValue, setValue]\n}","class StorageService {\n // this seems to be a bug in eslint as 'paramter-properties' is a special syntax of typescript\n\n constructor(private storage: Storage) {\n }\n\n public get<T>(key: string): T | null {\n const value = this.storage.getItem(key)\n if (value === null) {\n return null\n }\n return JSON.parse(value)\n }\n\n public set<T>(key: string, value: T) {\n this.storage.setItem(key, JSON.stringify(value))\n }\n\n public delete(key: string) {\n this.storage.removeItem(key)\n }\n\n public deleteAll() {\n this.storage.clear()\n }\n}\n\nexport class LocalStorageService extends StorageService {\n constructor() {\n super(window.localStorage)\n }\n}\n\nexport class SessionStorageService extends StorageService {\n constructor() {\n super(window.sessionStorage)\n }\n}\n","import type { SetStateAction } from 'react'\n\nexport function resolveSetState<T>(action: SetStateAction<T>, prev: T): T {\n return typeof action === 'function' ? (action as (prev: T) => T)(prev) : action\n}"],"mappings":"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","names":["import_react"]}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
// src/theming/useTheme.tsx
|
|
2
|
+
import { useCallback as useCallback2 } from "react";
|
|
2
3
|
import { useMemo } from "react";
|
|
3
4
|
import { createContext, useContext, useEffect, useState as useState2 } from "react";
|
|
4
5
|
|
|
5
|
-
// src/utils/noop.ts
|
|
6
|
-
var noop = () => void 0;
|
|
7
|
-
|
|
8
6
|
// src/hooks/useLocalStorage.ts
|
|
9
7
|
import { useCallback, useState } from "react";
|
|
10
8
|
|
|
@@ -89,30 +87,55 @@ var ThemeUtil = {
|
|
|
89
87
|
themes,
|
|
90
88
|
translation: defaultThemeTypeTranslation
|
|
91
89
|
};
|
|
92
|
-
var ThemeContext = createContext(
|
|
93
|
-
theme: "light",
|
|
94
|
-
setTheme: noop
|
|
95
|
-
});
|
|
90
|
+
var ThemeContext = createContext(null);
|
|
96
91
|
var ThemeProvider = ({ children, initialTheme }) => {
|
|
97
92
|
const [storedTheme, setStoredTheme] = useLocalStorage("theme", initialTheme ?? "system");
|
|
98
|
-
const [
|
|
93
|
+
const [themePreference, setThemePreference] = useState2("system");
|
|
94
|
+
const resolvedTheme = useMemo(() => {
|
|
95
|
+
if (storedTheme && storedTheme !== "system") {
|
|
96
|
+
return storedTheme;
|
|
97
|
+
}
|
|
98
|
+
return themePreference === "dark" ? "dark" : "light";
|
|
99
|
+
}, [storedTheme, themePreference]);
|
|
99
100
|
useEffect(() => {
|
|
100
101
|
if (!!initialTheme && storedTheme !== initialTheme) {
|
|
101
102
|
console.warn("ThemeProvider initial state changed: Prefer using useTheme's setTheme instead");
|
|
102
103
|
setStoredTheme(initialTheme);
|
|
103
104
|
}
|
|
104
105
|
}, [initialTheme]);
|
|
105
|
-
const usedTheme = useMemo(() => storedTheme !== "system" ? storedTheme : userTheme, [storedTheme, userTheme]);
|
|
106
|
-
useEffect(() => {
|
|
107
|
-
document.documentElement.setAttribute("data-theme", usedTheme);
|
|
108
|
-
}, [usedTheme]);
|
|
109
106
|
useEffect(() => {
|
|
107
|
+
document.documentElement.setAttribute("data-theme", resolvedTheme);
|
|
108
|
+
}, [resolvedTheme]);
|
|
109
|
+
const getPreference = useCallback2(() => {
|
|
110
110
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
111
|
-
|
|
111
|
+
const prefersLight = window.matchMedia("(prefers-color-scheme: light)").matches;
|
|
112
|
+
setThemePreference(prefersDark ? "dark" : prefersLight ? "light" : "system");
|
|
112
113
|
}, []);
|
|
113
|
-
|
|
114
|
+
useEffect(() => {
|
|
115
|
+
getPreference();
|
|
116
|
+
}, [getPreference]);
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
const darkQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
119
|
+
const lightQuery = window.matchMedia("(prefers-color-scheme: light)");
|
|
120
|
+
const noPrefQuery = window.matchMedia("(prefers-color-scheme: no-preference)");
|
|
121
|
+
darkQuery.addEventListener("change", getPreference);
|
|
122
|
+
lightQuery.addEventListener("change", getPreference);
|
|
123
|
+
noPrefQuery.addEventListener("change", getPreference);
|
|
124
|
+
return () => {
|
|
125
|
+
darkQuery.removeEventListener("change", getPreference);
|
|
126
|
+
lightQuery.removeEventListener("change", getPreference);
|
|
127
|
+
noPrefQuery.removeEventListener("change", getPreference);
|
|
128
|
+
};
|
|
129
|
+
}, [getPreference]);
|
|
130
|
+
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: { theme: storedTheme, resolvedTheme, setTheme: setStoredTheme }, children });
|
|
131
|
+
};
|
|
132
|
+
var useTheme = () => {
|
|
133
|
+
const context = useContext(ThemeContext);
|
|
134
|
+
if (!context) {
|
|
135
|
+
throw new Error("useTheme must be used within ThemeContext. Try adding a ThemeProvider around your app.");
|
|
136
|
+
}
|
|
137
|
+
return context;
|
|
114
138
|
};
|
|
115
|
-
var useTheme = () => useContext(ThemeContext);
|
|
116
139
|
export {
|
|
117
140
|
ThemeContext,
|
|
118
141
|
ThemeProvider,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/theming/useTheme.tsx","../../src/
|
|
1
|
+
{"version":3,"sources":["../../src/theming/useTheme.tsx","../../src/hooks/useLocalStorage.ts","../../src/utils/storage.ts","../../src/utils/resolveSetState.ts"],"sourcesContent":["import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { useCallback } from 'react'\nimport { useMemo } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport type { Translation, TranslationPlural } from '../localization/useTranslation'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\n\nconst themes = ['light', 'dark', 'system'] as const\n\nexport type ThemeType = typeof themes[number]\nexport type ResolvedTheme = Exclude<ThemeType, 'system'>\n\nexport type ThemeTypeTranslation = Record<ThemeType, string> & {\n theme: TranslationPlural,\n}\n\nconst defaultThemeTypeTranslation: Translation<ThemeTypeTranslation> = {\n en: {\n dark: 'Dark',\n light: 'Light',\n system: 'System',\n theme: {\n one: 'Theme',\n other: 'Themes'\n }\n },\n de: {\n dark: 'Dunkel',\n light: 'Hell',\n system: 'System',\n theme: {\n one: 'Farbschema',\n other: 'Farbschemas'\n }\n }\n}\n\nexport const ThemeUtil = {\n themes,\n translation: defaultThemeTypeTranslation,\n}\n\ntype ThemeContextType = {\n theme: ThemeType,\n resolvedTheme: ResolvedTheme,\n setTheme: Dispatch<SetStateAction<ThemeType>>,\n}\n\nexport const ThemeContext = createContext<ThemeContextType | null>(null)\n\ntype ThemeProviderProps = {\n initialTheme?: ThemeType,\n}\n\nexport const ThemeProvider = ({ children, initialTheme }: PropsWithChildren<ThemeProviderProps>) => {\n const [storedTheme, setStoredTheme] = useLocalStorage<ThemeType>('theme', initialTheme ?? 'system')\n const [themePreference, setThemePreference] = useState<ThemeType>('system')\n\n const resolvedTheme = useMemo(() => {\n if(storedTheme && storedTheme !== 'system') {\n return storedTheme\n }\n return themePreference === 'dark' ? 'dark' : 'light'\n }, [storedTheme, themePreference])\n\n useEffect(() => {\n if (!!initialTheme && storedTheme !== initialTheme) {\n console.warn('ThemeProvider initial state changed: Prefer using useTheme\\'s setTheme instead')\n setStoredTheme(initialTheme)\n }\n }, [initialTheme]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', resolvedTheme)\n }, [resolvedTheme])\n\n const getPreference = useCallback(() => {\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n const prefersLight = window.matchMedia('(prefers-color-scheme: light)').matches\n setThemePreference(prefersDark ? 'dark' : (prefersLight ? 'light' : 'system'))\n }, [])\n\n useEffect(() => {\n getPreference()\n }, [getPreference])\n\n useEffect(() => {\n const darkQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const lightQuery = window.matchMedia('(prefers-color-scheme: light)')\n const noPrefQuery = window.matchMedia('(prefers-color-scheme: no-preference)')\n darkQuery.addEventListener('change', getPreference)\n lightQuery.addEventListener('change', getPreference)\n noPrefQuery.addEventListener('change', getPreference)\n return () => {\n darkQuery.removeEventListener('change', getPreference)\n lightQuery.removeEventListener('change', getPreference)\n noPrefQuery.removeEventListener('change', getPreference)\n }\n }, [getPreference])\n\n return (\n <ThemeContext.Provider value={{ theme: storedTheme, resolvedTheme, setTheme: setStoredTheme }}>\n {children}\n </ThemeContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = useContext(ThemeContext)\n if(!context) {\n throw new Error('useTheme must be used within ThemeContext. Try adding a ThemeProvider around your app.')\n }\n return context\n}\n","'use client'\n\nimport type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useState } from 'react'\nimport { LocalStorageService } from '@/src/utils/storage'\nimport { resolveSetState } from '@/src/utils/resolveSetState'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\nexport const useLocalStorage = <T>(key: string, initValue: T): [T, SetValue<T>] => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return initValue\n }\n const storageService = new LocalStorageService()\n const value = storageService.get<T>(key)\n return value || initValue\n }, [initValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(action => {\n const newValue = resolveSetState(action, storedValue)\n const storageService = new LocalStorageService()\n storageService.set(key, newValue)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n return [storedValue, setValue]\n}","class StorageService {\n // this seems to be a bug in eslint as 'paramter-properties' is a special syntax of typescript\n\n constructor(private storage: Storage) {\n }\n\n public get<T>(key: string): T | null {\n const value = this.storage.getItem(key)\n if (value === null) {\n return null\n }\n return JSON.parse(value)\n }\n\n public set<T>(key: string, value: T) {\n this.storage.setItem(key, JSON.stringify(value))\n }\n\n public delete(key: string) {\n this.storage.removeItem(key)\n }\n\n public deleteAll() {\n this.storage.clear()\n }\n}\n\nexport class LocalStorageService extends StorageService {\n constructor() {\n super(window.localStorage)\n }\n}\n\nexport class SessionStorageService extends StorageService {\n constructor() {\n super(window.sessionStorage)\n }\n}\n","import type { SetStateAction } from 'react'\n\nexport function resolveSetState<T>(action: SetStateAction<T>, prev: T): T {\n return typeof action === 'function' ? (action as (prev: T) => T)(prev) : action\n}"],"mappings":"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","names":["useCallback","useState","useState","useCallback"]}
|