@helpwave/hightide 0.1.26 → 0.1.28
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/coloring/index.d.mts +2 -0
- package/dist/coloring/index.d.ts +2 -0
- package/dist/coloring/index.js +85 -0
- package/dist/coloring/index.js.map +1 -0
- package/dist/coloring/index.mjs +48 -0
- package/dist/coloring/index.mjs.map +1 -0
- package/dist/components/branding/index.d.mts +3 -0
- package/dist/components/branding/index.d.ts +3 -0
- package/dist/components/branding/index.js +140 -0
- package/dist/components/branding/index.js.map +1 -0
- package/dist/components/branding/index.mjs +104 -0
- package/dist/components/branding/index.mjs.map +1 -0
- 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/date/index.d.mts +10 -0
- package/dist/components/date/index.d.ts +10 -0
- package/dist/components/date/index.js +1168 -0
- package/dist/components/date/index.js.map +1 -0
- package/dist/components/date/index.mjs +1124 -0
- package/dist/components/date/index.mjs.map +1 -0
- 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/form/index.d.mts +5 -0
- package/dist/components/form/index.d.ts +5 -0
- package/dist/components/form/index.js +100 -0
- package/dist/components/form/index.js.map +1 -0
- package/dist/components/form/index.mjs +64 -0
- package/dist/components/form/index.mjs.map +1 -0
- package/dist/components/icons-and-geometry/index.d.mts +7 -0
- package/dist/components/icons-and-geometry/index.d.ts +7 -0
- package/dist/components/icons-and-geometry/index.js +3955 -0
- package/dist/components/icons-and-geometry/index.js.map +1 -0
- package/dist/components/icons-and-geometry/index.mjs +3939 -0
- package/dist/components/icons-and-geometry/index.mjs.map +1 -0
- package/dist/components/index.d.mts +83 -0
- package/dist/components/index.d.ts +83 -0
- package/dist/components/index.js +15471 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +15377 -0
- package/dist/components/index.mjs.map +1 -0
- 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/index.d.mts +18 -0
- package/dist/components/layout/index.d.ts +18 -0
- package/dist/components/layout/index.js +3111 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/layout/index.mjs +3064 -0
- package/dist/components/layout/index.mjs.map +1 -0
- package/dist/components/loading-states/index.d.mts +12 -0
- package/dist/components/loading-states/index.d.ts +12 -0
- package/dist/components/loading-states/index.js +614 -0
- package/dist/components/loading-states/index.js.map +1 -0
- package/dist/components/loading-states/index.mjs +573 -0
- package/dist/components/loading-states/index.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/navigation/index.d.mts +9 -0
- package/dist/components/navigation/index.d.ts +9 -0
- package/dist/components/navigation/index.js +4660 -0
- package/dist/components/navigation/index.js.map +1 -0
- package/dist/components/navigation/index.mjs +4648 -0
- package/dist/components/navigation/index.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/properties/index.d.mts +12 -0
- package/dist/components/properties/index.d.ts +12 -0
- package/dist/components/properties/index.js +2983 -0
- package/dist/components/properties/index.js.map +1 -0
- package/dist/components/properties/index.mjs +2951 -0
- package/dist/components/properties/index.mjs.map +1 -0
- 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/table/index.d.mts +10 -0
- package/dist/components/table/index.d.ts +10 -0
- package/dist/components/table/index.js +2329 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table/index.mjs +2293 -0
- package/dist/components/table/index.mjs.map +1 -0
- 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/index.d.mts +30 -0
- package/dist/components/user-action/index.d.ts +30 -0
- package/dist/components/user-action/index.js +4257 -0
- package/dist/components/user-action/index.js.map +1 -0
- package/dist/components/user-action/index.mjs +4195 -0
- package/dist/components/user-action/index.mjs.map +1 -0
- package/dist/components/user-action/input/index.d.mts +6 -0
- package/dist/components/user-action/input/index.d.ts +6 -0
- package/dist/components/user-action/input/index.js +398 -0
- package/dist/components/user-action/input/index.js.map +1 -0
- package/dist/components/user-action/input/index.mjs +357 -0
- package/dist/components/user-action/input/index.mjs.map +1 -0
- 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/components/user-action/select/index.d.mts +4 -0
- package/dist/components/user-action/select/index.d.ts +4 -0
- package/dist/components/user-action/select/index.js +1369 -0
- package/dist/components/user-action/select/index.js.map +1 -0
- package/dist/components/user-action/select/index.mjs +1333 -0
- package/dist/components/user-action/select/index.mjs.map +1 -0
- package/dist/components/utils/index.d.mts +4 -0
- package/dist/components/utils/index.d.ts +4 -0
- package/dist/components/utils/index.js +302 -0
- package/dist/components/utils/index.js.map +1 -0
- package/dist/components/utils/index.mjs +275 -0
- package/dist/components/utils/index.mjs.map +1 -0
- package/dist/hooks/focus/index.d.mts +6 -0
- package/dist/hooks/focus/index.d.ts +6 -0
- package/dist/hooks/focus/index.js +379 -0
- package/dist/hooks/focus/index.js.map +1 -0
- package/dist/hooks/focus/index.mjs +339 -0
- package/dist/hooks/focus/index.mjs.map +1 -0
- package/dist/hooks/index.d.mts +16 -0
- package/dist/hooks/index.d.ts +16 -0
- package/dist/hooks/index.js +844 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +794 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index.d.mts +110 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.js +16101 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +15941 -0
- package/dist/index.mjs.map +1 -0
- package/dist/localization/defaults/index.d.mts +4 -0
- package/dist/localization/defaults/index.d.ts +4 -0
- package/dist/localization/defaults/index.js +223 -0
- package/dist/localization/defaults/index.js.map +1 -0
- package/dist/localization/defaults/index.mjs +195 -0
- package/dist/localization/defaults/index.mjs.map +1 -0
- package/dist/localization/index.d.mts +7 -0
- package/dist/localization/index.d.ts +7 -0
- package/dist/localization/index.js +415 -0
- package/dist/localization/index.js.map +1 -0
- package/dist/localization/index.mjs +380 -0
- package/dist/localization/index.mjs.map +1 -0
- 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/index.d.mts +5 -0
- package/dist/theming/index.d.ts +5 -0
- package/dist/theming/index.js +174 -0
- package/dist/theming/index.js.map +1 -0
- package/dist/theming/index.mjs +145 -0
- package/dist/theming/index.mjs.map +1 -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/dist/utils/index.d.mts +15 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.js +553 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +493 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +25 -24
- 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
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/theming/index.ts
|
|
20
|
+
var theming_exports = {};
|
|
21
|
+
__export(theming_exports, {
|
|
22
|
+
ThemeContext: () => ThemeContext,
|
|
23
|
+
ThemeProvider: () => ThemeProvider,
|
|
24
|
+
ThemeUtil: () => ThemeUtil,
|
|
25
|
+
useTheme: () => useTheme
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(theming_exports);
|
|
28
|
+
|
|
29
|
+
// src/theming/useTheme.tsx
|
|
30
|
+
var import_react2 = require("react");
|
|
31
|
+
var import_react3 = require("react");
|
|
32
|
+
var import_react4 = require("react");
|
|
33
|
+
|
|
34
|
+
// src/hooks/useLocalStorage.ts
|
|
35
|
+
var import_react = require("react");
|
|
36
|
+
|
|
37
|
+
// src/utils/storage.ts
|
|
38
|
+
var StorageService = class {
|
|
39
|
+
// this seems to be a bug in eslint as 'paramter-properties' is a special syntax of typescript
|
|
40
|
+
constructor(storage) {
|
|
41
|
+
this.storage = storage;
|
|
42
|
+
}
|
|
43
|
+
get(key) {
|
|
44
|
+
const value = this.storage.getItem(key);
|
|
45
|
+
if (value === null) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return JSON.parse(value);
|
|
49
|
+
}
|
|
50
|
+
set(key, value) {
|
|
51
|
+
this.storage.setItem(key, JSON.stringify(value));
|
|
52
|
+
}
|
|
53
|
+
delete(key) {
|
|
54
|
+
this.storage.removeItem(key);
|
|
55
|
+
}
|
|
56
|
+
deleteAll() {
|
|
57
|
+
this.storage.clear();
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
var LocalStorageService = class extends StorageService {
|
|
61
|
+
constructor() {
|
|
62
|
+
super(window.localStorage);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// src/utils/resolveSetState.ts
|
|
67
|
+
function resolveSetState(action, prev) {
|
|
68
|
+
return typeof action === "function" ? action(prev) : action;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/hooks/useLocalStorage.ts
|
|
72
|
+
var useLocalStorage = (key, initValue) => {
|
|
73
|
+
const get = (0, import_react.useCallback)(() => {
|
|
74
|
+
if (typeof window === "undefined") {
|
|
75
|
+
return initValue;
|
|
76
|
+
}
|
|
77
|
+
const storageService = new LocalStorageService();
|
|
78
|
+
const value = storageService.get(key);
|
|
79
|
+
return value || initValue;
|
|
80
|
+
}, [initValue, key]);
|
|
81
|
+
const [storedValue, setStoredValue] = (0, import_react.useState)(get);
|
|
82
|
+
const setValue = (0, import_react.useCallback)((action) => {
|
|
83
|
+
const newValue = resolveSetState(action, storedValue);
|
|
84
|
+
const storageService = new LocalStorageService();
|
|
85
|
+
storageService.set(key, newValue);
|
|
86
|
+
setStoredValue(newValue);
|
|
87
|
+
}, [storedValue, setStoredValue, key]);
|
|
88
|
+
return [storedValue, setValue];
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/theming/useTheme.tsx
|
|
92
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
93
|
+
var themes = ["light", "dark", "system"];
|
|
94
|
+
var defaultThemeTypeTranslation = {
|
|
95
|
+
en: {
|
|
96
|
+
dark: "Dark",
|
|
97
|
+
light: "Light",
|
|
98
|
+
system: "System",
|
|
99
|
+
theme: {
|
|
100
|
+
one: "Theme",
|
|
101
|
+
other: "Themes"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
de: {
|
|
105
|
+
dark: "Dunkel",
|
|
106
|
+
light: "Hell",
|
|
107
|
+
system: "System",
|
|
108
|
+
theme: {
|
|
109
|
+
one: "Farbschema",
|
|
110
|
+
other: "Farbschemas"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
var ThemeUtil = {
|
|
115
|
+
themes,
|
|
116
|
+
translation: defaultThemeTypeTranslation
|
|
117
|
+
};
|
|
118
|
+
var ThemeContext = (0, import_react4.createContext)(null);
|
|
119
|
+
var ThemeProvider = ({ children, initialTheme }) => {
|
|
120
|
+
const [storedTheme, setStoredTheme] = useLocalStorage("theme", initialTheme ?? "system");
|
|
121
|
+
const [themePreference, setThemePreference] = (0, import_react4.useState)("system");
|
|
122
|
+
const resolvedTheme = (0, import_react3.useMemo)(() => {
|
|
123
|
+
if (storedTheme && storedTheme !== "system") {
|
|
124
|
+
return storedTheme;
|
|
125
|
+
}
|
|
126
|
+
return themePreference === "dark" ? "dark" : "light";
|
|
127
|
+
}, [storedTheme, themePreference]);
|
|
128
|
+
(0, import_react4.useEffect)(() => {
|
|
129
|
+
if (!!initialTheme && storedTheme !== initialTheme) {
|
|
130
|
+
console.warn("ThemeProvider initial state changed: Prefer using useTheme's setTheme instead");
|
|
131
|
+
setStoredTheme(initialTheme);
|
|
132
|
+
}
|
|
133
|
+
}, [initialTheme]);
|
|
134
|
+
(0, import_react4.useEffect)(() => {
|
|
135
|
+
document.documentElement.setAttribute("data-theme", resolvedTheme);
|
|
136
|
+
}, [resolvedTheme]);
|
|
137
|
+
const getPreference = (0, import_react2.useCallback)(() => {
|
|
138
|
+
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
139
|
+
const prefersLight = window.matchMedia("(prefers-color-scheme: light)").matches;
|
|
140
|
+
setThemePreference(prefersDark ? "dark" : prefersLight ? "light" : "system");
|
|
141
|
+
}, []);
|
|
142
|
+
(0, import_react4.useEffect)(() => {
|
|
143
|
+
getPreference();
|
|
144
|
+
}, [getPreference]);
|
|
145
|
+
(0, import_react4.useEffect)(() => {
|
|
146
|
+
const darkQuery = window.matchMedia("(prefers-color-scheme: dark)");
|
|
147
|
+
const lightQuery = window.matchMedia("(prefers-color-scheme: light)");
|
|
148
|
+
const noPrefQuery = window.matchMedia("(prefers-color-scheme: no-preference)");
|
|
149
|
+
darkQuery.addEventListener("change", getPreference);
|
|
150
|
+
lightQuery.addEventListener("change", getPreference);
|
|
151
|
+
noPrefQuery.addEventListener("change", getPreference);
|
|
152
|
+
return () => {
|
|
153
|
+
darkQuery.removeEventListener("change", getPreference);
|
|
154
|
+
lightQuery.removeEventListener("change", getPreference);
|
|
155
|
+
noPrefQuery.removeEventListener("change", getPreference);
|
|
156
|
+
};
|
|
157
|
+
}, [getPreference]);
|
|
158
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value: { theme: storedTheme, resolvedTheme, setTheme: setStoredTheme }, children });
|
|
159
|
+
};
|
|
160
|
+
var useTheme = () => {
|
|
161
|
+
const context = (0, import_react4.useContext)(ThemeContext);
|
|
162
|
+
if (!context) {
|
|
163
|
+
throw new Error("useTheme must be used within ThemeContext. Try adding a ThemeProvider around your app.");
|
|
164
|
+
}
|
|
165
|
+
return context;
|
|
166
|
+
};
|
|
167
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
168
|
+
0 && (module.exports = {
|
|
169
|
+
ThemeContext,
|
|
170
|
+
ThemeProvider,
|
|
171
|
+
ThemeUtil,
|
|
172
|
+
useTheme
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/theming/index.ts","../../src/theming/useTheme.tsx","../../src/hooks/useLocalStorage.ts","../../src/utils/storage.ts","../../src/utils/resolveSetState.ts"],"sourcesContent":["export * from './useTheme'\n","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"]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// src/theming/useTheme.tsx
|
|
2
|
+
import { useCallback as useCallback2 } from "react";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { createContext, useContext, useEffect, useState as useState2 } from "react";
|
|
5
|
+
|
|
6
|
+
// src/hooks/useLocalStorage.ts
|
|
7
|
+
import { useCallback, useState } from "react";
|
|
8
|
+
|
|
9
|
+
// src/utils/storage.ts
|
|
10
|
+
var StorageService = class {
|
|
11
|
+
// this seems to be a bug in eslint as 'paramter-properties' is a special syntax of typescript
|
|
12
|
+
constructor(storage) {
|
|
13
|
+
this.storage = storage;
|
|
14
|
+
}
|
|
15
|
+
get(key) {
|
|
16
|
+
const value = this.storage.getItem(key);
|
|
17
|
+
if (value === null) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return JSON.parse(value);
|
|
21
|
+
}
|
|
22
|
+
set(key, value) {
|
|
23
|
+
this.storage.setItem(key, JSON.stringify(value));
|
|
24
|
+
}
|
|
25
|
+
delete(key) {
|
|
26
|
+
this.storage.removeItem(key);
|
|
27
|
+
}
|
|
28
|
+
deleteAll() {
|
|
29
|
+
this.storage.clear();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
var LocalStorageService = class extends StorageService {
|
|
33
|
+
constructor() {
|
|
34
|
+
super(window.localStorage);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// src/utils/resolveSetState.ts
|
|
39
|
+
function resolveSetState(action, prev) {
|
|
40
|
+
return typeof action === "function" ? action(prev) : action;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/hooks/useLocalStorage.ts
|
|
44
|
+
var useLocalStorage = (key, initValue) => {
|
|
45
|
+
const get = useCallback(() => {
|
|
46
|
+
if (typeof window === "undefined") {
|
|
47
|
+
return initValue;
|
|
48
|
+
}
|
|
49
|
+
const storageService = new LocalStorageService();
|
|
50
|
+
const value = storageService.get(key);
|
|
51
|
+
return value || initValue;
|
|
52
|
+
}, [initValue, key]);
|
|
53
|
+
const [storedValue, setStoredValue] = useState(get);
|
|
54
|
+
const setValue = useCallback((action) => {
|
|
55
|
+
const newValue = resolveSetState(action, storedValue);
|
|
56
|
+
const storageService = new LocalStorageService();
|
|
57
|
+
storageService.set(key, newValue);
|
|
58
|
+
setStoredValue(newValue);
|
|
59
|
+
}, [storedValue, setStoredValue, key]);
|
|
60
|
+
return [storedValue, setValue];
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// src/theming/useTheme.tsx
|
|
64
|
+
import { jsx } from "react/jsx-runtime";
|
|
65
|
+
var themes = ["light", "dark", "system"];
|
|
66
|
+
var defaultThemeTypeTranslation = {
|
|
67
|
+
en: {
|
|
68
|
+
dark: "Dark",
|
|
69
|
+
light: "Light",
|
|
70
|
+
system: "System",
|
|
71
|
+
theme: {
|
|
72
|
+
one: "Theme",
|
|
73
|
+
other: "Themes"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
de: {
|
|
77
|
+
dark: "Dunkel",
|
|
78
|
+
light: "Hell",
|
|
79
|
+
system: "System",
|
|
80
|
+
theme: {
|
|
81
|
+
one: "Farbschema",
|
|
82
|
+
other: "Farbschemas"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var ThemeUtil = {
|
|
87
|
+
themes,
|
|
88
|
+
translation: defaultThemeTypeTranslation
|
|
89
|
+
};
|
|
90
|
+
var ThemeContext = createContext(null);
|
|
91
|
+
var ThemeProvider = ({ children, initialTheme }) => {
|
|
92
|
+
const [storedTheme, setStoredTheme] = useLocalStorage("theme", initialTheme ?? "system");
|
|
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]);
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
if (!!initialTheme && storedTheme !== initialTheme) {
|
|
102
|
+
console.warn("ThemeProvider initial state changed: Prefer using useTheme's setTheme instead");
|
|
103
|
+
setStoredTheme(initialTheme);
|
|
104
|
+
}
|
|
105
|
+
}, [initialTheme]);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
document.documentElement.setAttribute("data-theme", resolvedTheme);
|
|
108
|
+
}, [resolvedTheme]);
|
|
109
|
+
const getPreference = useCallback2(() => {
|
|
110
|
+
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
111
|
+
const prefersLight = window.matchMedia("(prefers-color-scheme: light)").matches;
|
|
112
|
+
setThemePreference(prefersDark ? "dark" : prefersLight ? "light" : "system");
|
|
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;
|
|
138
|
+
};
|
|
139
|
+
export {
|
|
140
|
+
ThemeContext,
|
|
141
|
+
ThemeProvider,
|
|
142
|
+
ThemeUtil,
|
|
143
|
+
useTheme
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -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,
|