@helpwave/hightide 0.0.18 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -2
- package/dist/coloring/shading.cjs +556 -0
- package/dist/coloring/shading.cjs.map +1 -0
- package/dist/coloring/{shading.d.mts → shading.d.cts} +1 -1
- package/dist/coloring/shading.js +476 -37
- package/dist/coloring/shading.js.map +1 -1
- package/dist/coloring/types.cjs +31 -0
- package/dist/coloring/{types.mjs.map → types.cjs.map} +1 -1
- package/dist/coloring/types.js +2 -27
- package/dist/coloring/types.js.map +1 -1
- package/dist/components/{HelpwaveBadge.js → branding/HelpwaveBadge.cjs} +65 -33
- package/dist/components/branding/HelpwaveBadge.cjs.map +1 -0
- package/dist/components/branding/HelpwaveBadge.js +123 -0
- package/dist/components/branding/HelpwaveBadge.js.map +1 -0
- package/dist/components/date/{DatePicker.mjs → DatePicker.cjs} +158 -94
- package/dist/components/date/DatePicker.cjs.map +1 -0
- package/dist/components/date/{DatePicker.d.mts → DatePicker.d.cts} +7 -8
- package/dist/components/date/DatePicker.d.ts +4 -5
- package/dist/components/date/DatePicker.js +121 -129
- package/dist/components/date/DatePicker.js.map +1 -1
- package/dist/components/date/{DayPicker.mjs → DayPicker.cjs} +77 -24
- package/dist/components/date/DayPicker.cjs.map +1 -0
- package/dist/components/date/{DayPicker.d.mts → DayPicker.d.cts} +3 -3
- package/dist/components/date/DayPicker.d.ts +2 -2
- package/dist/components/date/DayPicker.js +38 -61
- package/dist/components/date/DayPicker.js.map +1 -1
- package/dist/components/{TimeDisplay.js → date/TimeDisplay.cjs} +24 -9
- package/dist/components/date/TimeDisplay.cjs.map +1 -0
- package/dist/components/{TimeDisplay.d.mts → date/TimeDisplay.d.cts} +2 -3
- package/dist/components/{TimeDisplay.d.ts → date/TimeDisplay.d.ts} +2 -3
- package/dist/components/{TimeDisplay.mjs → date/TimeDisplay.js} +23 -8
- package/dist/components/date/TimeDisplay.js.map +1 -0
- package/dist/components/date/{TimePicker.mjs → TimePicker.cjs} +62 -26
- package/dist/components/date/TimePicker.cjs.map +1 -0
- package/dist/components/date/{TimePicker.d.mts → TimePicker.d.cts} +2 -2
- package/dist/components/date/TimePicker.d.ts +2 -2
- package/dist/components/date/TimePicker.js +25 -61
- package/dist/components/date/TimePicker.js.map +1 -1
- package/dist/components/date/{YearMonthPicker.mjs → YearMonthPicker.cjs} +93 -42
- package/dist/components/date/YearMonthPicker.cjs.map +1 -0
- package/dist/components/date/{YearMonthPicker.d.mts → YearMonthPicker.d.cts} +2 -2
- package/dist/components/date/YearMonthPicker.d.ts +2 -2
- package/dist/components/date/YearMonthPicker.js +56 -77
- package/dist/components/date/YearMonthPicker.js.map +1 -1
- package/dist/components/{AvatarGroup.js → icons-and-geometry/Avatar.cjs} +23 -19
- package/dist/components/icons-and-geometry/Avatar.cjs.map +1 -0
- package/dist/components/icons-and-geometry/Avatar.d.cts +30 -0
- package/dist/components/icons-and-geometry/Avatar.d.ts +30 -0
- package/dist/components/{AvatarGroup.mjs → icons-and-geometry/Avatar.js} +13 -10
- package/dist/components/icons-and-geometry/Avatar.js.map +1 -0
- package/dist/components/{Circle.js → icons-and-geometry/Circle.cjs} +3 -3
- package/dist/components/icons-and-geometry/Circle.cjs.map +1 -0
- package/dist/components/{Circle.mjs → icons-and-geometry/Circle.js} +2 -2
- package/dist/components/icons-and-geometry/Circle.js.map +1 -0
- package/dist/components/{icons/Helpwave.js → icons-and-geometry/Helpwave.cjs} +38 -6
- package/dist/components/icons-and-geometry/Helpwave.cjs.map +1 -0
- package/dist/components/icons-and-geometry/Helpwave.js +75 -0
- package/dist/components/icons-and-geometry/Helpwave.js.map +1 -0
- package/dist/components/{Ring.js → icons-and-geometry/Ring.cjs} +6 -6
- package/dist/components/icons-and-geometry/Ring.cjs.map +1 -0
- package/dist/components/{Ring.mjs → icons-and-geometry/Ring.js} +4 -4
- package/dist/components/icons-and-geometry/Ring.js.map +1 -0
- package/dist/components/{icons/Tag.js → icons-and-geometry/Tag.cjs} +3 -3
- package/dist/components/icons-and-geometry/Tag.cjs.map +1 -0
- package/dist/components/{icons/Tag.mjs → icons-and-geometry/Tag.js} +2 -2
- package/dist/components/icons-and-geometry/Tag.js.map +1 -0
- package/dist/components/{BreadCrumb.js → layout-and-navigation/BreadCrumb.cjs} +12 -5
- package/dist/components/layout-and-navigation/BreadCrumb.cjs.map +1 -0
- package/dist/components/{BreadCrumb.mjs → layout-and-navigation/BreadCrumb.js} +10 -3
- package/dist/components/layout-and-navigation/BreadCrumb.js.map +1 -0
- package/dist/components/{layout/Carousel.js → layout-and-navigation/Carousel.cjs} +4 -4
- package/dist/components/layout-and-navigation/Carousel.cjs.map +1 -0
- package/dist/components/{layout/Carousel.mjs → layout-and-navigation/Carousel.js} +4 -4
- package/dist/components/layout-and-navigation/Carousel.js.map +1 -0
- package/dist/components/{ChipList.js → layout-and-navigation/Chip.cjs} +6 -6
- package/dist/components/layout-and-navigation/Chip.cjs.map +1 -0
- package/dist/components/{ChipList.mjs → layout-and-navigation/Chip.js} +2 -2
- package/dist/components/layout-and-navigation/Chip.js.map +1 -0
- package/dist/components/{layout/DividerInserter.js → layout-and-navigation/DividerInserter.cjs} +3 -3
- package/dist/components/layout-and-navigation/DividerInserter.cjs.map +1 -0
- package/dist/components/{layout/DividerInserter.mjs → layout-and-navigation/DividerInserter.js} +2 -2
- package/dist/components/layout-and-navigation/DividerInserter.js.map +1 -0
- package/dist/components/{Expandable.js → layout-and-navigation/Expandable.cjs} +3 -3
- package/dist/components/layout-and-navigation/Expandable.cjs.map +1 -0
- package/dist/components/{Expandable.mjs → layout-and-navigation/Expandable.js} +2 -2
- package/dist/components/layout-and-navigation/Expandable.js.map +1 -0
- package/dist/components/{layout/FAQSection.js → layout-and-navigation/FAQSection.cjs} +7 -7
- package/dist/components/layout-and-navigation/FAQSection.cjs.map +1 -0
- package/dist/components/{layout/FAQSection.d.mts → layout-and-navigation/FAQSection.d.cts} +1 -1
- package/dist/components/{layout → layout-and-navigation}/FAQSection.d.ts +1 -1
- package/dist/components/{layout/FAQSection.mjs → layout-and-navigation/FAQSection.js} +5 -5
- package/dist/components/layout-and-navigation/FAQSection.js.map +1 -0
- package/dist/components/{MarkdownInterpreter.js → layout-and-navigation/MarkdownInterpreter.cjs} +2 -2
- package/dist/components/layout-and-navigation/MarkdownInterpreter.cjs.map +1 -0
- package/dist/components/{MarkdownInterpreter.mjs → layout-and-navigation/MarkdownInterpreter.js} +2 -2
- package/dist/components/layout-and-navigation/MarkdownInterpreter.js.map +1 -0
- package/dist/components/layout-and-navigation/Overlay.cjs +467 -0
- package/dist/components/layout-and-navigation/Overlay.cjs.map +1 -0
- package/dist/components/layout-and-navigation/Overlay.d.cts +63 -0
- package/dist/components/layout-and-navigation/Overlay.d.ts +63 -0
- package/dist/components/layout-and-navigation/Overlay.js +429 -0
- package/dist/components/layout-and-navigation/Overlay.js.map +1 -0
- package/dist/components/{Pagination.js → layout-and-navigation/Pagination.cjs} +25 -10
- package/dist/components/layout-and-navigation/Pagination.cjs.map +1 -0
- package/dist/components/{Pagination.d.mts → layout-and-navigation/Pagination.d.cts} +2 -3
- package/dist/components/{Pagination.d.ts → layout-and-navigation/Pagination.d.ts} +2 -3
- package/dist/components/{Pagination.mjs → layout-and-navigation/Pagination.js} +25 -10
- package/dist/components/layout-and-navigation/Pagination.js.map +1 -0
- package/dist/components/{SearchableList.js → layout-and-navigation/SearchableList.cjs} +51 -34
- package/dist/components/layout-and-navigation/SearchableList.cjs.map +1 -0
- package/dist/components/{SearchableList.d.mts → layout-and-navigation/SearchableList.d.cts} +2 -2
- package/dist/components/{SearchableList.d.ts → layout-and-navigation/SearchableList.d.ts} +2 -2
- package/dist/components/{SearchableList.mjs → layout-and-navigation/SearchableList.js} +52 -40
- package/dist/components/layout-and-navigation/SearchableList.js.map +1 -0
- package/dist/components/{StepperBar.js → layout-and-navigation/StepperBar.cjs} +42 -16
- package/dist/components/layout-and-navigation/StepperBar.cjs.map +1 -0
- package/dist/components/{StepperBar.d.mts → layout-and-navigation/StepperBar.d.cts} +2 -3
- package/dist/components/{StepperBar.d.ts → layout-and-navigation/StepperBar.d.ts} +2 -3
- package/dist/components/{StepperBar.mjs → layout-and-navigation/StepperBar.js} +40 -14
- package/dist/components/layout-and-navigation/StepperBar.js.map +1 -0
- package/dist/components/{Table.js → layout-and-navigation/Table.cjs} +176 -40
- package/dist/components/layout-and-navigation/Table.cjs.map +1 -0
- package/dist/components/{Table.d.mts → layout-and-navigation/Table.d.cts} +10 -1
- package/dist/components/{Table.d.ts → layout-and-navigation/Table.d.ts} +10 -1
- package/dist/components/{Table.mjs → layout-and-navigation/Table.js} +175 -40
- package/dist/components/layout-and-navigation/Table.js.map +1 -0
- package/dist/components/{TextImage.js → layout-and-navigation/TextImage.cjs} +25 -10
- package/dist/components/layout-and-navigation/TextImage.cjs.map +1 -0
- package/dist/components/{TextImage.d.mts → layout-and-navigation/TextImage.d.cts} +2 -3
- package/dist/components/{TextImage.d.ts → layout-and-navigation/TextImage.d.ts} +2 -3
- package/dist/components/{TextImage.mjs → layout-and-navigation/TextImage.js} +23 -8
- package/dist/components/layout-and-navigation/TextImage.js.map +1 -0
- package/dist/components/{layout/Tile.js → layout-and-navigation/Tile.cjs} +4 -4
- package/dist/components/layout-and-navigation/Tile.cjs.map +1 -0
- package/dist/components/{layout/Tile.mjs → layout-and-navigation/Tile.js} +2 -2
- package/dist/components/layout-and-navigation/Tile.js.map +1 -0
- package/dist/components/{VerticalDivider.js → layout-and-navigation/VerticalDivider.cjs} +2 -2
- package/dist/components/layout-and-navigation/VerticalDivider.cjs.map +1 -0
- package/dist/components/{VerticalDivider.mjs → layout-and-navigation/VerticalDivider.js} +2 -2
- package/dist/components/layout-and-navigation/VerticalDivider.js.map +1 -0
- package/dist/components/{ErrorComponent.js → loading-states/ErrorComponent.cjs} +25 -10
- package/dist/components/loading-states/ErrorComponent.cjs.map +1 -0
- package/dist/components/{ErrorComponent.d.mts → loading-states/ErrorComponent.d.cts} +2 -3
- package/dist/components/{ErrorComponent.d.ts → loading-states/ErrorComponent.d.ts} +2 -3
- package/dist/components/{ErrorComponent.mjs → loading-states/ErrorComponent.js} +24 -9
- package/dist/components/loading-states/ErrorComponent.js.map +1 -0
- package/dist/components/{LoadingAndErrorComponent.js → loading-states/LoadingAndErrorComponent.cjs} +67 -18
- package/dist/components/loading-states/LoadingAndErrorComponent.cjs.map +1 -0
- package/dist/components/{LoadingAndErrorComponent.d.mts → loading-states/LoadingAndErrorComponent.d.cts} +6 -6
- package/dist/components/{LoadingAndErrorComponent.d.ts → loading-states/LoadingAndErrorComponent.d.ts} +4 -4
- package/dist/components/{LoadingAndErrorComponent.mjs → loading-states/LoadingAndErrorComponent.js} +66 -17
- package/dist/components/loading-states/LoadingAndErrorComponent.js.map +1 -0
- package/dist/components/{LoadingAnimation.js → loading-states/LoadingAnimation.cjs} +64 -15
- package/dist/components/loading-states/LoadingAnimation.cjs.map +1 -0
- package/dist/components/{LoadingAnimation.d.mts → loading-states/LoadingAnimation.d.cts} +2 -3
- package/dist/components/{LoadingAnimation.d.ts → loading-states/LoadingAnimation.d.ts} +2 -3
- package/dist/components/{LoadingAnimation.mjs → loading-states/LoadingAnimation.js} +63 -14
- package/dist/components/loading-states/LoadingAnimation.js.map +1 -0
- package/dist/components/{LoadingButton.js → loading-states/LoadingButton.cjs} +101 -58
- package/dist/components/loading-states/LoadingButton.cjs.map +1 -0
- package/dist/components/{LoadingButton.d.mts → loading-states/LoadingButton.d.cts} +1 -1
- package/dist/components/{LoadingButton.d.ts → loading-states/LoadingButton.d.ts} +1 -1
- package/dist/components/{LoadingButton.mjs → loading-states/LoadingButton.js} +100 -57
- package/dist/components/loading-states/LoadingButton.js.map +1 -0
- package/dist/components/{ProgressIndicator.js → loading-states/ProgressIndicator.cjs} +2 -2
- package/dist/components/loading-states/ProgressIndicator.cjs.map +1 -0
- package/dist/components/{ProgressIndicator.mjs → loading-states/ProgressIndicator.js} +2 -2
- package/dist/components/loading-states/ProgressIndicator.js.map +1 -0
- package/dist/components/modals/ConfirmDialog.cjs +353 -0
- package/dist/components/modals/ConfirmDialog.cjs.map +1 -0
- package/dist/components/modals/{ConfirmDialog.d.mts → ConfirmDialog.d.cts} +6 -6
- package/dist/components/modals/ConfirmDialog.d.ts +6 -6
- package/dist/components/modals/ConfirmDialog.js +157 -266
- package/dist/components/modals/ConfirmDialog.js.map +1 -1
- package/dist/components/modals/{DiscardChangesDialog.js → DiscardChangesModal.cjs} +213 -117
- package/dist/components/modals/DiscardChangesModal.cjs.map +1 -0
- package/dist/components/modals/DiscardChangesModal.d.cts +23 -0
- package/dist/components/modals/DiscardChangesModal.d.ts +23 -0
- package/dist/components/modals/{DiscardChangesDialog.mjs → DiscardChangesModal.js} +202 -106
- package/dist/components/modals/DiscardChangesModal.js.map +1 -0
- package/dist/components/modals/InputModal.cjs +533 -0
- package/dist/components/modals/InputModal.cjs.map +1 -0
- package/dist/components/modals/{InputModal.d.mts → InputModal.d.cts} +7 -7
- package/dist/components/modals/InputModal.d.ts +6 -6
- package/dist/components/modals/InputModal.js +197 -299
- package/dist/components/modals/InputModal.js.map +1 -1
- package/dist/components/modals/LanguageModal.cjs +667 -0
- package/dist/components/modals/LanguageModal.cjs.map +1 -0
- package/dist/components/modals/LanguageModal.d.cts +20 -0
- package/dist/components/modals/LanguageModal.d.ts +7 -8
- package/dist/components/modals/LanguageModal.js +308 -204
- package/dist/components/modals/LanguageModal.js.map +1 -1
- package/dist/components/modals/ThemeModal.cjs +694 -0
- package/dist/components/modals/ThemeModal.cjs.map +1 -0
- package/dist/components/modals/ThemeModal.d.cts +21 -0
- package/dist/components/modals/ThemeModal.d.ts +21 -0
- package/dist/components/modals/ThemeModal.js +657 -0
- package/dist/components/modals/ThemeModal.js.map +1 -0
- package/dist/components/properties/CheckboxProperty.cjs +362 -0
- package/dist/components/properties/CheckboxProperty.cjs.map +1 -0
- package/dist/components/properties/{CheckboxProperty.d.mts → CheckboxProperty.d.cts} +3 -3
- package/dist/components/properties/CheckboxProperty.d.ts +2 -2
- package/dist/components/properties/CheckboxProperty.js +94 -93
- package/dist/components/properties/CheckboxProperty.js.map +1 -1
- package/dist/components/properties/DateProperty.cjs +451 -0
- package/dist/components/properties/DateProperty.cjs.map +1 -0
- package/dist/components/properties/{DateProperty.d.mts → DateProperty.d.cts} +3 -3
- package/dist/components/properties/DateProperty.d.ts +2 -2
- package/dist/components/properties/DateProperty.js +110 -116
- package/dist/components/properties/DateProperty.js.map +1 -1
- package/dist/components/properties/{MultiSelectProperty.mjs → MultiSelectProperty.cjs} +216 -155
- package/dist/components/properties/MultiSelectProperty.cjs.map +1 -0
- package/dist/components/properties/{MultiSelectProperty.d.mts → MultiSelectProperty.d.cts} +5 -5
- package/dist/components/properties/MultiSelectProperty.d.ts +4 -4
- package/dist/components/properties/MultiSelectProperty.js +180 -184
- package/dist/components/properties/MultiSelectProperty.js.map +1 -1
- package/dist/components/properties/NumberProperty.cjs +459 -0
- package/dist/components/properties/NumberProperty.cjs.map +1 -0
- package/dist/components/properties/{NumberProperty.d.mts → NumberProperty.d.cts} +3 -3
- package/dist/components/properties/NumberProperty.d.ts +2 -2
- package/dist/components/properties/NumberProperty.js +109 -116
- package/dist/components/properties/NumberProperty.js.map +1 -1
- package/dist/components/properties/PropertyBase.cjs +223 -0
- package/dist/components/properties/PropertyBase.cjs.map +1 -0
- package/dist/components/properties/{PropertyBase.d.mts → PropertyBase.d.cts} +2 -2
- package/dist/components/properties/PropertyBase.d.ts +2 -2
- package/dist/components/properties/PropertyBase.js +60 -69
- package/dist/components/properties/PropertyBase.js.map +1 -1
- package/dist/components/properties/{SelectProperty.mjs → SelectProperty.cjs} +251 -199
- package/dist/components/properties/SelectProperty.cjs.map +1 -0
- package/dist/components/properties/{SelectProperty.d.mts → SelectProperty.d.cts} +5 -6
- package/dist/components/properties/SelectProperty.d.ts +4 -5
- package/dist/components/properties/SelectProperty.js +215 -228
- package/dist/components/properties/SelectProperty.js.map +1 -1
- package/dist/components/properties/TextProperty.cjs +428 -0
- package/dist/components/properties/TextProperty.cjs.map +1 -0
- package/dist/components/properties/{TextProperty.d.mts → TextProperty.d.cts} +3 -3
- package/dist/components/properties/TextProperty.d.ts +2 -2
- package/dist/components/properties/TextProperty.js +134 -121
- package/dist/components/properties/TextProperty.js.map +1 -1
- package/dist/components/{Button.js → user-action/Button.cjs} +70 -12
- package/dist/components/user-action/Button.cjs.map +1 -0
- package/dist/components/{Button.d.mts → user-action/Button.d.cts} +32 -5
- package/dist/components/{Button.d.ts → user-action/Button.d.ts} +32 -5
- package/dist/components/{Button.mjs → user-action/Button.js} +66 -10
- package/dist/components/user-action/Button.js.map +1 -0
- package/dist/components/{user-input/Checkbox.js → user-action/Checkbox.cjs} +26 -16
- package/dist/components/user-action/Checkbox.cjs.map +1 -0
- package/dist/components/{user-input/Checkbox.d.mts → user-action/Checkbox.d.cts} +5 -5
- package/dist/components/{user-input → user-action}/Checkbox.d.ts +4 -4
- package/dist/components/{user-input/Checkbox.mjs → user-action/Checkbox.js} +24 -14
- package/dist/components/user-action/Checkbox.js.map +1 -0
- package/dist/components/{user-input/DateAndTimePicker.js → user-action/DateAndTimePicker.cjs} +51 -23
- package/dist/components/user-action/DateAndTimePicker.cjs.map +1 -0
- package/dist/components/{user-input/DateAndTimePicker.d.mts → user-action/DateAndTimePicker.d.cts} +7 -8
- package/dist/components/{user-input → user-action}/DateAndTimePicker.d.ts +2 -3
- package/dist/components/{user-input/DateAndTimePicker.mjs → user-action/DateAndTimePicker.js} +44 -16
- package/dist/components/user-action/DateAndTimePicker.js.map +1 -0
- package/dist/components/{user-input/Input.js → user-action/Input.cjs} +35 -34
- package/dist/components/user-action/Input.cjs.map +1 -0
- package/dist/components/{user-input/Input.d.mts → user-action/Input.d.cts} +9 -16
- package/dist/components/{user-input → user-action}/Input.d.ts +8 -15
- package/dist/components/{user-input/Input.mjs → user-action/Input.js} +35 -39
- package/dist/components/user-action/Input.js.map +1 -0
- package/dist/components/{user-input/Label.js → user-action/Label.cjs} +15 -3
- package/dist/components/user-action/Label.cjs.map +1 -0
- package/dist/components/{user-input/Label.d.mts → user-action/Label.d.cts} +1 -1
- package/dist/components/{user-input → user-action}/Label.d.ts +1 -1
- package/dist/components/{user-input/Label.mjs → user-action/Label.js} +5 -3
- package/dist/components/user-action/Label.js.map +1 -0
- package/dist/components/{user-input/Menu.js → user-action/Menu.cjs} +4 -4
- package/dist/components/user-action/Menu.cjs.map +1 -0
- package/dist/components/{user-input/Menu.mjs → user-action/Menu.js} +3 -3
- package/dist/components/user-action/Menu.js.map +1 -0
- package/dist/components/{user-input/MultiSelect.js → user-action/MultiSelect.cjs} +76 -51
- package/dist/components/user-action/MultiSelect.cjs.map +1 -0
- package/dist/components/{user-input/MultiSelect.d.mts → user-action/MultiSelect.d.cts} +3 -3
- package/dist/components/{user-input → user-action}/MultiSelect.d.ts +2 -2
- package/dist/components/{user-input/MultiSelect.mjs → user-action/MultiSelect.js} +75 -55
- package/dist/components/user-action/MultiSelect.js.map +1 -0
- package/dist/components/{user-input/ScrollPicker.js → user-action/ScrollPicker.cjs} +4 -4
- package/dist/components/user-action/ScrollPicker.cjs.map +1 -0
- package/dist/components/{user-input/ScrollPicker.mjs → user-action/ScrollPicker.js} +3 -3
- package/dist/components/user-action/ScrollPicker.js.map +1 -0
- package/dist/components/{user-input/SearchableSelect.js → user-action/Select.cjs} +181 -152
- package/dist/components/user-action/Select.cjs.map +1 -0
- package/dist/components/user-action/Select.d.cts +49 -0
- package/dist/components/user-action/Select.d.ts +49 -0
- package/dist/components/{user-input/SearchableSelect.mjs → user-action/Select.js} +167 -145
- package/dist/components/user-action/Select.js.map +1 -0
- package/dist/components/{user-input/Textarea.js → user-action/Textarea.cjs} +80 -35
- package/dist/components/user-action/Textarea.cjs.map +1 -0
- package/dist/components/user-action/Textarea.d.cts +28 -0
- package/dist/components/{user-input → user-action}/Textarea.d.ts +9 -5
- package/dist/components/user-action/Textarea.js +163 -0
- package/dist/components/user-action/Textarea.js.map +1 -0
- package/dist/components/{user-input/ToggleableInput.js → user-action/ToggleableInput.cjs} +9 -15
- package/dist/components/user-action/ToggleableInput.cjs.map +1 -0
- package/dist/components/{user-input/ToggleableInput.mjs → user-action/ToggleableInput.js} +8 -14
- package/dist/components/user-action/ToggleableInput.js.map +1 -0
- package/dist/components/{Tooltip.js → user-action/Tooltip.cjs} +13 -9
- package/dist/components/user-action/Tooltip.cjs.map +1 -0
- package/dist/components/{Tooltip.d.mts → user-action/Tooltip.d.cts} +1 -1
- package/dist/components/{Tooltip.d.ts → user-action/Tooltip.d.ts} +1 -1
- package/dist/components/{Tooltip.mjs → user-action/Tooltip.js} +12 -8
- package/dist/components/user-action/Tooltip.js.map +1 -0
- package/dist/css/globals.css +178 -126
- package/dist/css/uncompiled/globals.css +65 -29
- package/dist/hooks/useHoverState.cjs +72 -0
- package/dist/hooks/{useHoverState.mjs.map → useHoverState.cjs.map} +1 -1
- package/dist/hooks/useHoverState.js +7 -32
- package/dist/hooks/useHoverState.js.map +1 -1
- package/dist/hooks/useLocalStorage.cjs +83 -0
- package/dist/hooks/useLocalStorage.cjs.map +1 -0
- package/dist/hooks/useLocalStorage.js +9 -34
- package/dist/hooks/useLocalStorage.js.map +1 -1
- package/dist/hooks/useOutsideClick.cjs +48 -0
- package/dist/hooks/{useOutsideClick.mjs.map → useOutsideClick.cjs.map} +1 -1
- package/dist/hooks/useOutsideClick.js +4 -29
- package/dist/hooks/useOutsideClick.js.map +1 -1
- package/dist/hooks/useSaveDelay.cjs +68 -0
- package/dist/hooks/{useSaveDelay.mjs.map → useSaveDelay.cjs.map} +1 -1
- package/dist/hooks/useSaveDelay.js +6 -31
- package/dist/hooks/useSaveDelay.js.map +1 -1
- package/dist/{index.mjs → index.cjs} +4008 -3882
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +82 -0
- package/dist/index.d.ts +49 -55
- package/dist/index.js +3825 -4056
- package/dist/index.js.map +1 -1
- package/dist/{hooks/useLanguage.js → localization/LanguageProvider.cjs} +30 -26
- package/dist/localization/LanguageProvider.cjs.map +1 -0
- package/dist/localization/LanguageProvider.d.cts +18 -0
- package/dist/localization/LanguageProvider.d.ts +18 -0
- package/dist/{hooks/useLanguage.mjs → localization/LanguageProvider.js} +26 -19
- package/dist/localization/LanguageProvider.js.map +1 -0
- package/dist/{hooks/useTranslation.js → localization/useTranslation.cjs} +23 -8
- package/dist/localization/useTranslation.cjs.map +1 -0
- package/dist/{hooks/useTranslation.d.mts → localization/useTranslation.d.cts} +5 -7
- package/dist/{hooks → localization}/useTranslation.d.ts +5 -7
- package/dist/{hooks/useTranslation.mjs → localization/useTranslation.js} +22 -7
- package/dist/localization/useTranslation.js.map +1 -0
- package/dist/localization/util.cjs +41 -0
- package/dist/localization/util.cjs.map +1 -0
- package/dist/localization/util.d.cts +18 -0
- package/dist/localization/util.d.ts +18 -0
- package/dist/localization/util.js +16 -0
- package/dist/localization/util.js.map +1 -0
- package/dist/{hooks/useTheme.js → theming/useTheme.cjs} +19 -11
- package/dist/theming/useTheme.cjs.map +1 -0
- package/dist/{hooks/useTheme.d.mts → theming/useTheme.d.cts} +9 -5
- package/dist/{hooks → theming}/useTheme.d.ts +9 -5
- package/dist/{hooks/useTheme.mjs → theming/useTheme.js} +15 -7
- package/dist/theming/useTheme.js.map +1 -0
- package/dist/util/{array.mjs → array.cjs} +34 -3
- package/dist/util/array.cjs.map +1 -0
- package/dist/util/array.js +2 -33
- package/dist/util/array.js.map +1 -1
- package/dist/util/builder.cjs +34 -0
- package/dist/util/{builder.mjs.map → builder.cjs.map} +1 -1
- package/dist/util/builder.js +2 -27
- package/dist/util/builder.js.map +1 -1
- package/dist/util/{date.mjs → date.cjs} +41 -3
- package/dist/util/date.cjs.map +1 -0
- package/dist/util/date.js +2 -40
- package/dist/util/date.js.map +1 -1
- package/dist/util/easeFunctions.cjs +63 -0
- package/dist/util/easeFunctions.cjs.map +1 -0
- package/dist/util/easeFunctions.js +2 -29
- package/dist/util/easeFunctions.js.map +1 -1
- package/dist/util/emailValidation.cjs +33 -0
- package/dist/util/{emailValidation.mjs.map → emailValidation.cjs.map} +1 -1
- package/dist/util/emailValidation.js +2 -27
- package/dist/util/emailValidation.js.map +1 -1
- package/dist/util/{loopingArray.mjs → loopingArray.cjs} +28 -3
- package/dist/util/{loopingArray.mjs.map → loopingArray.cjs.map} +1 -1
- package/dist/util/loopingArray.js +2 -27
- package/dist/util/loopingArray.js.map +1 -1
- package/dist/util/math.cjs +33 -0
- package/dist/util/{math.mjs.map → math.cjs.map} +1 -1
- package/dist/util/math.js +2 -27
- package/dist/util/math.js.map +1 -1
- package/dist/util/news.cjs +77 -0
- package/dist/util/news.cjs.map +1 -0
- package/dist/util/{news.d.mts → news.d.cts} +11 -13
- package/dist/util/news.d.ts +11 -13
- package/dist/util/news.js +22 -49
- package/dist/util/news.js.map +1 -1
- package/dist/util/noop.cjs +31 -0
- package/dist/util/noop.cjs.map +1 -0
- package/dist/util/noop.js +2 -27
- package/dist/util/noop.js.map +1 -1
- package/dist/util/simpleSearch.cjs +54 -0
- package/dist/util/simpleSearch.cjs.map +1 -0
- package/dist/util/simpleSearch.js +2 -30
- package/dist/util/simpleSearch.js.map +1 -1
- package/dist/util/storage.cjs +64 -0
- package/dist/util/storage.cjs.map +1 -0
- package/dist/util/storage.js +2 -28
- package/dist/util/storage.js.map +1 -1
- package/dist/util/types.cjs +19 -0
- package/dist/util/types.cjs.map +1 -0
- package/dist/util/types.js +0 -18
- package/dist/util/types.js.map +1 -1
- package/package.json +9 -12
- package/dist/coloring/shading.mjs +0 -47
- package/dist/coloring/shading.mjs.map +0 -1
- package/dist/coloring/types.mjs +0 -6
- package/dist/components/Avatar.d.mts +0 -17
- package/dist/components/Avatar.d.ts +0 -17
- package/dist/components/Avatar.js +0 -85
- package/dist/components/Avatar.js.map +0 -1
- package/dist/components/Avatar.mjs +0 -48
- package/dist/components/Avatar.mjs.map +0 -1
- package/dist/components/AvatarGroup.d.mts +0 -14
- package/dist/components/AvatarGroup.d.ts +0 -14
- package/dist/components/AvatarGroup.js.map +0 -1
- package/dist/components/AvatarGroup.mjs.map +0 -1
- package/dist/components/BreadCrumb.js.map +0 -1
- package/dist/components/BreadCrumb.mjs.map +0 -1
- package/dist/components/Button.js.map +0 -1
- package/dist/components/Button.mjs.map +0 -1
- package/dist/components/ChipList.js.map +0 -1
- package/dist/components/ChipList.mjs.map +0 -1
- package/dist/components/Circle.js.map +0 -1
- package/dist/components/Circle.mjs.map +0 -1
- package/dist/components/ErrorComponent.js.map +0 -1
- package/dist/components/ErrorComponent.mjs.map +0 -1
- package/dist/components/Expandable.js.map +0 -1
- package/dist/components/Expandable.mjs.map +0 -1
- package/dist/components/HelpwaveBadge.js.map +0 -1
- package/dist/components/HelpwaveBadge.mjs +0 -91
- package/dist/components/HelpwaveBadge.mjs.map +0 -1
- package/dist/components/HideableContentSection.d.mts +0 -14
- package/dist/components/HideableContentSection.d.ts +0 -14
- package/dist/components/HideableContentSection.js +0 -70
- package/dist/components/HideableContentSection.js.map +0 -1
- package/dist/components/HideableContentSection.mjs +0 -35
- package/dist/components/HideableContentSection.mjs.map +0 -1
- package/dist/components/InputGroup.d.mts +0 -17
- package/dist/components/InputGroup.d.ts +0 -17
- package/dist/components/InputGroup.js +0 -97
- package/dist/components/InputGroup.js.map +0 -1
- package/dist/components/InputGroup.mjs +0 -62
- package/dist/components/InputGroup.mjs.map +0 -1
- package/dist/components/LoadingAndErrorComponent.js.map +0 -1
- package/dist/components/LoadingAndErrorComponent.mjs.map +0 -1
- package/dist/components/LoadingAnimation.js.map +0 -1
- package/dist/components/LoadingAnimation.mjs.map +0 -1
- package/dist/components/LoadingButton.js.map +0 -1
- package/dist/components/LoadingButton.mjs.map +0 -1
- package/dist/components/MarkdownInterpreter.js.map +0 -1
- package/dist/components/MarkdownInterpreter.mjs.map +0 -1
- package/dist/components/Pagination.js.map +0 -1
- package/dist/components/Pagination.mjs.map +0 -1
- package/dist/components/Profile.d.mts +0 -31
- package/dist/components/Profile.d.ts +0 -31
- package/dist/components/Profile.js +0 -197
- package/dist/components/Profile.js.map +0 -1
- package/dist/components/Profile.mjs +0 -162
- package/dist/components/Profile.mjs.map +0 -1
- package/dist/components/ProgressIndicator.js.map +0 -1
- package/dist/components/ProgressIndicator.mjs.map +0 -1
- package/dist/components/Ring.js.map +0 -1
- package/dist/components/Ring.mjs.map +0 -1
- package/dist/components/SearchableList.js.map +0 -1
- package/dist/components/SearchableList.mjs.map +0 -1
- package/dist/components/SortButton.d.mts +0 -15
- package/dist/components/SortButton.d.ts +0 -15
- package/dist/components/SortButton.js +0 -132
- package/dist/components/SortButton.js.map +0 -1
- package/dist/components/SortButton.mjs +0 -97
- package/dist/components/SortButton.mjs.map +0 -1
- package/dist/components/StepperBar.js.map +0 -1
- package/dist/components/StepperBar.mjs.map +0 -1
- package/dist/components/Table.js.map +0 -1
- package/dist/components/Table.mjs.map +0 -1
- package/dist/components/TechRadar.d.mts +0 -39
- package/dist/components/TechRadar.d.ts +0 -39
- package/dist/components/TechRadar.js +0 -243
- package/dist/components/TechRadar.js.map +0 -1
- package/dist/components/TechRadar.mjs +0 -208
- package/dist/components/TechRadar.mjs.map +0 -1
- package/dist/components/TextImage.js.map +0 -1
- package/dist/components/TextImage.mjs.map +0 -1
- package/dist/components/TimeDisplay.js.map +0 -1
- package/dist/components/TimeDisplay.mjs.map +0 -1
- package/dist/components/Tooltip.js.map +0 -1
- package/dist/components/Tooltip.mjs.map +0 -1
- package/dist/components/VerticalDivider.js.map +0 -1
- package/dist/components/VerticalDivider.mjs.map +0 -1
- package/dist/components/date/DatePicker.mjs.map +0 -1
- package/dist/components/date/DayPicker.mjs.map +0 -1
- package/dist/components/date/TimePicker.mjs.map +0 -1
- package/dist/components/date/YearMonthPicker.mjs.map +0 -1
- package/dist/components/icons/Helpwave.js.map +0 -1
- package/dist/components/icons/Helpwave.mjs +0 -43
- package/dist/components/icons/Helpwave.mjs.map +0 -1
- package/dist/components/icons/Tag.js.map +0 -1
- package/dist/components/icons/Tag.mjs.map +0 -1
- package/dist/components/layout/Carousel.js.map +0 -1
- package/dist/components/layout/Carousel.mjs.map +0 -1
- package/dist/components/layout/DividerInserter.js.map +0 -1
- package/dist/components/layout/DividerInserter.mjs.map +0 -1
- package/dist/components/layout/FAQSection.js.map +0 -1
- package/dist/components/layout/FAQSection.mjs.map +0 -1
- package/dist/components/layout/Tile.js.map +0 -1
- package/dist/components/layout/Tile.mjs.map +0 -1
- package/dist/components/modals/ConfirmDialog.mjs +0 -388
- package/dist/components/modals/ConfirmDialog.mjs.map +0 -1
- package/dist/components/modals/DiscardChangesDialog.d.mts +0 -23
- package/dist/components/modals/DiscardChangesDialog.d.ts +0 -23
- package/dist/components/modals/DiscardChangesDialog.js.map +0 -1
- package/dist/components/modals/DiscardChangesDialog.mjs.map +0 -1
- package/dist/components/modals/InputModal.mjs +0 -566
- package/dist/components/modals/InputModal.mjs.map +0 -1
- package/dist/components/modals/LanguageModal.d.mts +0 -21
- package/dist/components/modals/LanguageModal.mjs +0 -489
- package/dist/components/modals/LanguageModal.mjs.map +0 -1
- package/dist/components/modals/Modal.d.mts +0 -43
- package/dist/components/modals/Modal.d.ts +0 -43
- package/dist/components/modals/Modal.js +0 -286
- package/dist/components/modals/Modal.js.map +0 -1
- package/dist/components/modals/Modal.mjs +0 -249
- package/dist/components/modals/Modal.mjs.map +0 -1
- package/dist/components/modals/ModalRegister.d.mts +0 -16
- package/dist/components/modals/ModalRegister.d.ts +0 -16
- package/dist/components/modals/ModalRegister.js +0 -63
- package/dist/components/modals/ModalRegister.js.map +0 -1
- package/dist/components/modals/ModalRegister.mjs +0 -37
- package/dist/components/modals/ModalRegister.mjs.map +0 -1
- package/dist/components/properties/CheckboxProperty.mjs +0 -291
- package/dist/components/properties/CheckboxProperty.mjs.map +0 -1
- package/dist/components/properties/DateProperty.mjs +0 -392
- package/dist/components/properties/DateProperty.mjs.map +0 -1
- package/dist/components/properties/MultiSelectProperty.mjs.map +0 -1
- package/dist/components/properties/NumberProperty.mjs +0 -401
- package/dist/components/properties/NumberProperty.mjs.map +0 -1
- package/dist/components/properties/PropertyBase.mjs +0 -162
- package/dist/components/properties/PropertyBase.mjs.map +0 -1
- package/dist/components/properties/SelectProperty.mjs.map +0 -1
- package/dist/components/properties/TextProperty.mjs +0 -345
- package/dist/components/properties/TextProperty.mjs.map +0 -1
- package/dist/components/user-input/Checkbox.js.map +0 -1
- package/dist/components/user-input/Checkbox.mjs.map +0 -1
- package/dist/components/user-input/DateAndTimePicker.js.map +0 -1
- package/dist/components/user-input/DateAndTimePicker.mjs.map +0 -1
- package/dist/components/user-input/Input.js.map +0 -1
- package/dist/components/user-input/Input.mjs.map +0 -1
- package/dist/components/user-input/Label.js.map +0 -1
- package/dist/components/user-input/Label.mjs.map +0 -1
- package/dist/components/user-input/Menu.js.map +0 -1
- package/dist/components/user-input/Menu.mjs.map +0 -1
- package/dist/components/user-input/MultiSelect.js.map +0 -1
- package/dist/components/user-input/MultiSelect.mjs.map +0 -1
- package/dist/components/user-input/ScrollPicker.js.map +0 -1
- package/dist/components/user-input/ScrollPicker.mjs.map +0 -1
- package/dist/components/user-input/SearchableSelect.d.mts +0 -14
- package/dist/components/user-input/SearchableSelect.d.ts +0 -14
- package/dist/components/user-input/SearchableSelect.js.map +0 -1
- package/dist/components/user-input/SearchableSelect.mjs.map +0 -1
- package/dist/components/user-input/Select.d.mts +0 -36
- package/dist/components/user-input/Select.d.ts +0 -36
- package/dist/components/user-input/Select.js +0 -153
- package/dist/components/user-input/Select.js.map +0 -1
- package/dist/components/user-input/Select.mjs +0 -118
- package/dist/components/user-input/Select.mjs.map +0 -1
- package/dist/components/user-input/Textarea.d.mts +0 -24
- package/dist/components/user-input/Textarea.js.map +0 -1
- package/dist/components/user-input/Textarea.mjs +0 -119
- package/dist/components/user-input/Textarea.mjs.map +0 -1
- package/dist/components/user-input/ToggleableInput.js.map +0 -1
- package/dist/components/user-input/ToggleableInput.mjs.map +0 -1
- package/dist/hooks/useHoverState.mjs +0 -47
- package/dist/hooks/useLanguage.d.mts +0 -21
- package/dist/hooks/useLanguage.d.ts +0 -21
- package/dist/hooks/useLanguage.js.map +0 -1
- package/dist/hooks/useLanguage.mjs.map +0 -1
- package/dist/hooks/useLocalStorage.mjs +0 -58
- package/dist/hooks/useLocalStorage.mjs.map +0 -1
- package/dist/hooks/useOutsideClick.mjs +0 -23
- package/dist/hooks/useSaveDelay.mjs +0 -43
- package/dist/hooks/useTheme.js.map +0 -1
- package/dist/hooks/useTheme.mjs.map +0 -1
- package/dist/hooks/useTranslation.js.map +0 -1
- package/dist/hooks/useTranslation.mjs.map +0 -1
- package/dist/index.d.mts +0 -88
- package/dist/index.mjs.map +0 -1
- package/dist/util/array.mjs.map +0 -1
- package/dist/util/builder.mjs +0 -9
- package/dist/util/date.mjs.map +0 -1
- package/dist/util/easeFunctions.mjs +0 -36
- package/dist/util/easeFunctions.mjs.map +0 -1
- package/dist/util/emailValidation.mjs +0 -8
- package/dist/util/math.mjs +0 -8
- package/dist/util/news.mjs +0 -48
- package/dist/util/news.mjs.map +0 -1
- package/dist/util/noop.mjs +0 -6
- package/dist/util/noop.mjs.map +0 -1
- package/dist/util/simpleSearch.mjs +0 -26
- package/dist/util/simpleSearch.mjs.map +0 -1
- package/dist/util/storage.mjs +0 -38
- package/dist/util/storage.mjs.map +0 -1
- package/dist/util/types.mjs +0 -1
- package/dist/util/types.mjs.map +0 -1
- /package/dist/coloring/{types.d.mts → types.d.cts} +0 -0
- /package/dist/components/{HelpwaveBadge.d.mts → branding/HelpwaveBadge.d.cts} +0 -0
- /package/dist/components/{HelpwaveBadge.d.ts → branding/HelpwaveBadge.d.ts} +0 -0
- /package/dist/components/{Circle.d.mts → icons-and-geometry/Circle.d.cts} +0 -0
- /package/dist/components/{Circle.d.ts → icons-and-geometry/Circle.d.ts} +0 -0
- /package/dist/components/{icons/Helpwave.d.mts → icons-and-geometry/Helpwave.d.cts} +0 -0
- /package/dist/components/{icons → icons-and-geometry}/Helpwave.d.ts +0 -0
- /package/dist/components/{Ring.d.mts → icons-and-geometry/Ring.d.cts} +0 -0
- /package/dist/components/{Ring.d.ts → icons-and-geometry/Ring.d.ts} +0 -0
- /package/dist/components/{icons/Tag.d.mts → icons-and-geometry/Tag.d.cts} +0 -0
- /package/dist/components/{icons → icons-and-geometry}/Tag.d.ts +0 -0
- /package/dist/components/{BreadCrumb.d.mts → layout-and-navigation/BreadCrumb.d.cts} +0 -0
- /package/dist/components/{BreadCrumb.d.ts → layout-and-navigation/BreadCrumb.d.ts} +0 -0
- /package/dist/components/{layout/Carousel.d.mts → layout-and-navigation/Carousel.d.cts} +0 -0
- /package/dist/components/{layout → layout-and-navigation}/Carousel.d.ts +0 -0
- /package/dist/components/{ChipList.d.mts → layout-and-navigation/Chip.d.cts} +0 -0
- /package/dist/components/{ChipList.d.ts → layout-and-navigation/Chip.d.ts} +0 -0
- /package/dist/components/{layout/DividerInserter.d.mts → layout-and-navigation/DividerInserter.d.cts} +0 -0
- /package/dist/components/{layout → layout-and-navigation}/DividerInserter.d.ts +0 -0
- /package/dist/components/{Expandable.d.mts → layout-and-navigation/Expandable.d.cts} +0 -0
- /package/dist/components/{Expandable.d.ts → layout-and-navigation/Expandable.d.ts} +0 -0
- /package/dist/components/{MarkdownInterpreter.d.mts → layout-and-navigation/MarkdownInterpreter.d.cts} +0 -0
- /package/dist/components/{MarkdownInterpreter.d.ts → layout-and-navigation/MarkdownInterpreter.d.ts} +0 -0
- /package/dist/components/{layout/Tile.d.mts → layout-and-navigation/Tile.d.cts} +0 -0
- /package/dist/components/{layout → layout-and-navigation}/Tile.d.ts +0 -0
- /package/dist/components/{VerticalDivider.d.mts → layout-and-navigation/VerticalDivider.d.cts} +0 -0
- /package/dist/components/{VerticalDivider.d.ts → layout-and-navigation/VerticalDivider.d.ts} +0 -0
- /package/dist/components/{ProgressIndicator.d.mts → loading-states/ProgressIndicator.d.cts} +0 -0
- /package/dist/components/{ProgressIndicator.d.ts → loading-states/ProgressIndicator.d.ts} +0 -0
- /package/dist/components/{user-input/Menu.d.mts → user-action/Menu.d.cts} +0 -0
- /package/dist/components/{user-input → user-action}/Menu.d.ts +0 -0
- /package/dist/components/{user-input/ScrollPicker.d.mts → user-action/ScrollPicker.d.cts} +0 -0
- /package/dist/components/{user-input → user-action}/ScrollPicker.d.ts +0 -0
- /package/dist/components/{user-input/ToggleableInput.d.mts → user-action/ToggleableInput.d.cts} +0 -0
- /package/dist/components/{user-input → user-action}/ToggleableInput.d.ts +0 -0
- /package/dist/hooks/{useHoverState.d.mts → useHoverState.d.cts} +0 -0
- /package/dist/hooks/{useLocalStorage.d.mts → useLocalStorage.d.cts} +0 -0
- /package/dist/hooks/{useOutsideClick.d.mts → useOutsideClick.d.cts} +0 -0
- /package/dist/hooks/{useSaveDelay.d.mts → useSaveDelay.d.cts} +0 -0
- /package/dist/util/{array.d.mts → array.d.cts} +0 -0
- /package/dist/util/{builder.d.mts → builder.d.cts} +0 -0
- /package/dist/util/{date.d.mts → date.d.cts} +0 -0
- /package/dist/util/{easeFunctions.d.mts → easeFunctions.d.cts} +0 -0
- /package/dist/util/{emailValidation.d.mts → emailValidation.d.cts} +0 -0
- /package/dist/util/{loopingArray.d.mts → loopingArray.d.cts} +0 -0
- /package/dist/util/{math.d.mts → math.d.cts} +0 -0
- /package/dist/util/{noop.d.mts → noop.d.cts} +0 -0
- /package/dist/util/{simpleSearch.d.mts → simpleSearch.d.cts} +0 -0
- /package/dist/util/{storage.d.mts → storage.d.cts} +0 -0
- /package/dist/util/{types.d.mts → types.d.cts} +0 -0
|
@@ -1,20 +1,35 @@
|
|
|
1
|
-
// src/components/user-
|
|
1
|
+
// src/components/user-action/MultiSelect.tsx
|
|
2
2
|
import { useState as useState7 } from "react";
|
|
3
3
|
import { Search } from "lucide-react";
|
|
4
4
|
|
|
5
|
-
// src/
|
|
5
|
+
// src/localization/LanguageProvider.tsx
|
|
6
6
|
import { createContext, useContext, useEffect as useEffect2, useState as useState2 } from "react";
|
|
7
7
|
|
|
8
|
-
// src/hooks/useLocalStorage.
|
|
8
|
+
// src/hooks/useLocalStorage.ts
|
|
9
9
|
import { useCallback, useEffect, useState } from "react";
|
|
10
10
|
|
|
11
|
-
// src/
|
|
12
|
-
|
|
11
|
+
// src/localization/util.ts
|
|
12
|
+
var languages = ["en", "de"];
|
|
13
|
+
var languagesLocalNames = {
|
|
14
|
+
en: "English",
|
|
15
|
+
de: "Deutsch"
|
|
16
|
+
};
|
|
13
17
|
var DEFAULT_LANGUAGE = "en";
|
|
14
|
-
var
|
|
18
|
+
var LanguageUtil = {
|
|
19
|
+
languages,
|
|
20
|
+
DEFAULT_LANGUAGE,
|
|
21
|
+
languagesLocalNames
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/localization/LanguageProvider.tsx
|
|
25
|
+
import { jsx } from "react/jsx-runtime";
|
|
26
|
+
var LanguageContext = createContext({
|
|
27
|
+
language: LanguageUtil.DEFAULT_LANGUAGE,
|
|
28
|
+
setLanguage: (v) => v
|
|
29
|
+
});
|
|
15
30
|
var useLanguage = () => useContext(LanguageContext);
|
|
16
31
|
|
|
17
|
-
// src/
|
|
32
|
+
// src/localization/useTranslation.ts
|
|
18
33
|
var useTranslation = (defaults, translationOverwrite = {}) => {
|
|
19
34
|
const { language: languageProp, translation: overwrite } = translationOverwrite;
|
|
20
35
|
const { language: inferredLanguage } = useLanguage();
|
|
@@ -34,10 +49,10 @@ var MultiSearchWithMapping = (search, objects, mapping) => {
|
|
|
34
49
|
});
|
|
35
50
|
};
|
|
36
51
|
|
|
37
|
-
// src/components/user-
|
|
38
|
-
import
|
|
52
|
+
// src/components/user-action/MultiSelect.tsx
|
|
53
|
+
import clsx5 from "clsx";
|
|
39
54
|
|
|
40
|
-
// src/components/user-
|
|
55
|
+
// src/components/user-action/Menu.tsx
|
|
41
56
|
import { useRef } from "react";
|
|
42
57
|
import clsx from "clsx";
|
|
43
58
|
|
|
@@ -105,7 +120,7 @@ var useHoverState = (props = void 0) => {
|
|
|
105
120
|
};
|
|
106
121
|
};
|
|
107
122
|
|
|
108
|
-
// src/components/user-
|
|
123
|
+
// src/components/user-action/Menu.tsx
|
|
109
124
|
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
110
125
|
var MenuItem = ({
|
|
111
126
|
children,
|
|
@@ -160,14 +175,9 @@ var Menu = ({
|
|
|
160
175
|
);
|
|
161
176
|
};
|
|
162
177
|
|
|
163
|
-
// src/components/user-
|
|
164
|
-
import {
|
|
165
|
-
|
|
166
|
-
useRef as useRef2,
|
|
167
|
-
useState as useState5,
|
|
168
|
-
forwardRef
|
|
169
|
-
} from "react";
|
|
170
|
-
import clsx2 from "clsx";
|
|
178
|
+
// src/components/user-action/Input.tsx
|
|
179
|
+
import { forwardRef, useEffect as useEffect6, useRef as useRef2, useState as useState5 } from "react";
|
|
180
|
+
import clsx3 from "clsx";
|
|
171
181
|
|
|
172
182
|
// src/hooks/useSaveDelay.ts
|
|
173
183
|
import { useEffect as useEffect5, useState as useState4 } from "react";
|
|
@@ -212,7 +222,8 @@ function useSaveDelay(setNotificationStatus, delay) {
|
|
|
212
222
|
// src/util/noop.ts
|
|
213
223
|
var noop = () => void 0;
|
|
214
224
|
|
|
215
|
-
// src/components/user-
|
|
225
|
+
// src/components/user-action/Label.tsx
|
|
226
|
+
import clsx2 from "clsx";
|
|
216
227
|
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
217
228
|
var styleMapping = {
|
|
218
229
|
labelSmall: "textstyle-label-sm",
|
|
@@ -223,23 +234,25 @@ var Label = ({
|
|
|
223
234
|
children,
|
|
224
235
|
name,
|
|
225
236
|
labelType = "labelSmall",
|
|
237
|
+
className,
|
|
226
238
|
...props
|
|
227
239
|
}) => {
|
|
228
|
-
return /* @__PURE__ */ jsx3("label", { ...props,
|
|
240
|
+
return /* @__PURE__ */ jsx3("label", { ...props, className: clsx2(styleMapping[labelType], className), children: children ? children : name });
|
|
229
241
|
};
|
|
230
242
|
|
|
231
|
-
// src/components/user-
|
|
243
|
+
// src/components/user-action/Input.tsx
|
|
232
244
|
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
233
|
-
var
|
|
245
|
+
var Input = ({
|
|
234
246
|
id,
|
|
235
247
|
type = "text",
|
|
236
248
|
value,
|
|
237
249
|
label,
|
|
238
250
|
onChange = noop,
|
|
239
|
-
|
|
240
|
-
className = "",
|
|
251
|
+
onChangeText = noop,
|
|
241
252
|
onEditCompleted,
|
|
253
|
+
className = "",
|
|
242
254
|
expanded = true,
|
|
255
|
+
autoFocus,
|
|
243
256
|
onBlur,
|
|
244
257
|
containerClassName,
|
|
245
258
|
...restProps
|
|
@@ -250,12 +263,12 @@ var ControlledInput = ({
|
|
|
250
263
|
} = useSaveDelay(() => void 0, 3e3);
|
|
251
264
|
const ref = useRef2(null);
|
|
252
265
|
useEffect6(() => {
|
|
253
|
-
if (
|
|
266
|
+
if (autoFocus) {
|
|
254
267
|
ref.current?.focus();
|
|
255
268
|
}
|
|
256
|
-
}, [
|
|
257
|
-
return /* @__PURE__ */ jsxs2("div", { className:
|
|
258
|
-
label && /* @__PURE__ */ jsx4(Label, { ...label, htmlFor: id, className:
|
|
269
|
+
}, [autoFocus]);
|
|
270
|
+
return /* @__PURE__ */ jsxs2("div", { className: clsx3({ "w-full": expanded }, containerClassName), children: [
|
|
271
|
+
label && /* @__PURE__ */ jsx4(Label, { ...label, htmlFor: id, className: clsx3("mb-1", label.className) }),
|
|
259
272
|
/* @__PURE__ */ jsx4(
|
|
260
273
|
"input",
|
|
261
274
|
{
|
|
@@ -263,13 +276,13 @@ var ControlledInput = ({
|
|
|
263
276
|
value,
|
|
264
277
|
id,
|
|
265
278
|
type,
|
|
266
|
-
className
|
|
279
|
+
className,
|
|
267
280
|
onBlur: (event) => {
|
|
268
281
|
if (onBlur) {
|
|
269
282
|
onBlur(event);
|
|
270
283
|
}
|
|
271
284
|
if (onEditCompleted) {
|
|
272
|
-
onEditCompleted(event.target.value
|
|
285
|
+
onEditCompleted(event.target.value);
|
|
273
286
|
clearUpdateTimer();
|
|
274
287
|
}
|
|
275
288
|
},
|
|
@@ -277,12 +290,12 @@ var ControlledInput = ({
|
|
|
277
290
|
const value2 = e.target.value;
|
|
278
291
|
if (onEditCompleted) {
|
|
279
292
|
restartTimer(() => {
|
|
280
|
-
onEditCompleted(value2
|
|
293
|
+
onEditCompleted(value2);
|
|
281
294
|
clearUpdateTimer();
|
|
282
295
|
});
|
|
283
296
|
}
|
|
284
|
-
onChange(
|
|
285
|
-
|
|
297
|
+
onChange(e);
|
|
298
|
+
onChangeText(value2);
|
|
286
299
|
},
|
|
287
300
|
...restProps
|
|
288
301
|
}
|
|
@@ -306,8 +319,7 @@ var FormInput = forwardRef(function FormInput2({
|
|
|
306
319
|
ref,
|
|
307
320
|
id,
|
|
308
321
|
...restProps,
|
|
309
|
-
className:
|
|
310
|
-
"block bg-surface text-on-surface px-3 py-2 rounded-md w-full border-2 border-gray-200 hover:border-primary focus:outline-none focus:border-primary focus:ring-primary",
|
|
322
|
+
className: clsx3(
|
|
311
323
|
{
|
|
312
324
|
"focus:border-primary focus:ring-primary": !errorText,
|
|
313
325
|
"focus:border-negative focus:ring-negative text-negative": !!errorText
|
|
@@ -316,21 +328,21 @@ var FormInput = forwardRef(function FormInput2({
|
|
|
316
328
|
)
|
|
317
329
|
}
|
|
318
330
|
);
|
|
319
|
-
return /* @__PURE__ */ jsxs2("div", { className:
|
|
320
|
-
labelText && /* @__PURE__ */ jsxs2("label", { htmlFor: id, className:
|
|
331
|
+
return /* @__PURE__ */ jsxs2("div", { className: clsx3("flex flex-col gap-y-1", containerClassName), children: [
|
|
332
|
+
labelText && /* @__PURE__ */ jsxs2("label", { htmlFor: id, className: clsx3("textstyle-label-md", labelClassName), children: [
|
|
321
333
|
labelText,
|
|
322
334
|
required && /* @__PURE__ */ jsx4("span", { className: "text-primary font-bold", children: "*" })
|
|
323
335
|
] }),
|
|
324
336
|
input,
|
|
325
|
-
errorText && /* @__PURE__ */ jsx4("label", { htmlFor: id, className:
|
|
337
|
+
errorText && /* @__PURE__ */ jsx4("label", { htmlFor: id, className: clsx3("text-negative", errorClassName), children: errorText })
|
|
326
338
|
] });
|
|
327
339
|
});
|
|
328
340
|
|
|
329
|
-
// src/components/user-
|
|
341
|
+
// src/components/user-action/Checkbox.tsx
|
|
330
342
|
import { useState as useState6 } from "react";
|
|
331
343
|
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
|
332
344
|
import { Check, Minus } from "lucide-react";
|
|
333
|
-
import
|
|
345
|
+
import clsx4 from "clsx";
|
|
334
346
|
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
335
347
|
var checkboxSizeMapping = {
|
|
336
348
|
small: "size-4",
|
|
@@ -342,7 +354,7 @@ var checkboxIconSizeMapping = {
|
|
|
342
354
|
medium: "size-5",
|
|
343
355
|
large: "size-7"
|
|
344
356
|
};
|
|
345
|
-
var
|
|
357
|
+
var Checkbox = ({
|
|
346
358
|
id,
|
|
347
359
|
label,
|
|
348
360
|
checked,
|
|
@@ -367,7 +379,7 @@ var ControlledCheckbox = ({
|
|
|
367
379
|
const newValue = checked === "indeterminate" ? false : !checked;
|
|
368
380
|
propagateChange(newValue);
|
|
369
381
|
};
|
|
370
|
-
return /* @__PURE__ */ jsxs3("div", { className:
|
|
382
|
+
return /* @__PURE__ */ jsxs3("div", { className: clsx4("row justify-center items-center", containerClassName), children: [
|
|
371
383
|
/* @__PURE__ */ jsx5(
|
|
372
384
|
CheckboxPrimitive.Root,
|
|
373
385
|
{
|
|
@@ -375,7 +387,7 @@ var ControlledCheckbox = ({
|
|
|
375
387
|
checked,
|
|
376
388
|
disabled,
|
|
377
389
|
id,
|
|
378
|
-
className:
|
|
390
|
+
className: clsx4(usedSizeClass, `items-center border-2 rounded outline-none focus:border-primary`, {
|
|
379
391
|
"text-disabled-text border-disabled-text": disabled,
|
|
380
392
|
"border-on-background": !disabled,
|
|
381
393
|
"bg-primary/30 border-primary text-primary": checked === true || checked === "indeterminate",
|
|
@@ -387,11 +399,19 @@ var ControlledCheckbox = ({
|
|
|
387
399
|
] })
|
|
388
400
|
}
|
|
389
401
|
),
|
|
390
|
-
label && /* @__PURE__ */ jsx5(
|
|
402
|
+
label && /* @__PURE__ */ jsx5(
|
|
403
|
+
Label,
|
|
404
|
+
{
|
|
405
|
+
...label,
|
|
406
|
+
className: clsx4("cursor-pointer", label.className),
|
|
407
|
+
htmlFor: id,
|
|
408
|
+
onClick: changeValue
|
|
409
|
+
}
|
|
410
|
+
)
|
|
391
411
|
] });
|
|
392
412
|
};
|
|
393
413
|
|
|
394
|
-
// src/components/user-
|
|
414
|
+
// src/components/user-action/MultiSelect.tsx
|
|
395
415
|
import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
396
416
|
var defaultMultiSelectTranslation = {
|
|
397
417
|
en: {
|
|
@@ -435,13 +455,13 @@ var MultiSelect = ({
|
|
|
435
455
|
const selectedItems = options.filter((value) => value.selected);
|
|
436
456
|
const menuButtonText = selectedItems.length === 0 ? hintText ?? translation.select : /* @__PURE__ */ jsx6("span", { children: `${selectedItems.length} ${translation.selected}` });
|
|
437
457
|
const borderColor = "border-menu-border";
|
|
438
|
-
return /* @__PURE__ */ jsxs4("div", { className:
|
|
458
|
+
return /* @__PURE__ */ jsxs4("div", { className: clsx5(className), children: [
|
|
439
459
|
label && /* @__PURE__ */ jsx6(
|
|
440
460
|
Label,
|
|
441
461
|
{
|
|
442
462
|
...label,
|
|
443
463
|
htmlFor: label.name,
|
|
444
|
-
className:
|
|
464
|
+
className: clsx5(" mb-1", label.className),
|
|
445
465
|
labelType: label.labelType ?? "labelBig"
|
|
446
466
|
}
|
|
447
467
|
),
|
|
@@ -454,7 +474,7 @@ var MultiSelect = ({
|
|
|
454
474
|
{
|
|
455
475
|
ref,
|
|
456
476
|
onClick: disabled ? void 0 : onClick,
|
|
457
|
-
className:
|
|
477
|
+
className: clsx5(
|
|
458
478
|
borderColor,
|
|
459
479
|
"bg-menu-background text-menu-text inline-w-full justify-between items-center rounded-lg border-2 px-4 py-2 font-medium",
|
|
460
480
|
{
|
|
@@ -466,27 +486,27 @@ var MultiSelect = ({
|
|
|
466
486
|
children: selectedDisplay ? selectedDisplay({ items: options, disabled }) : menuButtonText
|
|
467
487
|
}
|
|
468
488
|
),
|
|
469
|
-
menuClassName:
|
|
489
|
+
menuClassName: clsx5(
|
|
470
490
|
"!rounded-lg !shadow-lg !max-h-[500px] !min-w-[400px] !max-w-[70vh] !overflow-y-auto !border !border-2",
|
|
471
491
|
borderColor,
|
|
472
492
|
{ "!py-0": !enableSearch, "!pb-0": enableSearch }
|
|
473
493
|
),
|
|
474
494
|
children: [
|
|
475
495
|
enableSearch && /* @__PURE__ */ jsxs4("div", { className: "row gap-x-2 items-center px-2 py-2", children: [
|
|
476
|
-
/* @__PURE__ */ jsx6(
|
|
496
|
+
/* @__PURE__ */ jsx6(Input, { autoFocus: true, className: "w-full", value: searchText, onChangeText: setSearchText }),
|
|
477
497
|
/* @__PURE__ */ jsx6(Search, {})
|
|
478
498
|
] }, "selectSearch"),
|
|
479
499
|
filteredOptions.map((option, index) => /* @__PURE__ */ jsx6(
|
|
480
500
|
MenuItem,
|
|
481
501
|
{
|
|
482
|
-
className:
|
|
502
|
+
className: clsx5({
|
|
483
503
|
"cursor-not-allowed !bg-disabled-background !text-disabled-text hover:brightness-100": !!option.disabled,
|
|
484
504
|
"cursor-pointer": !option.disabled
|
|
485
505
|
}),
|
|
486
506
|
children: /* @__PURE__ */ jsxs4(
|
|
487
507
|
"div",
|
|
488
508
|
{
|
|
489
|
-
className:
|
|
509
|
+
className: clsx5("overflow-hidden whitespace-nowrap text-ellipsis row items-center gap-x-2", option.className),
|
|
490
510
|
onClick: () => {
|
|
491
511
|
if (!option.disabled) {
|
|
492
512
|
onChange(options.map((value) => value.value === option.value ? {
|
|
@@ -496,7 +516,7 @@ var MultiSelect = ({
|
|
|
496
516
|
}
|
|
497
517
|
},
|
|
498
518
|
children: [
|
|
499
|
-
/* @__PURE__ */ jsx6(
|
|
519
|
+
/* @__PURE__ */ jsx6(Checkbox, { checked: option.selected, disabled: option.disabled, size: "small" }),
|
|
500
520
|
option.label
|
|
501
521
|
]
|
|
502
522
|
}
|
|
@@ -512,4 +532,4 @@ var MultiSelect = ({
|
|
|
512
532
|
export {
|
|
513
533
|
MultiSelect
|
|
514
534
|
};
|
|
515
|
-
//# sourceMappingURL=MultiSelect.
|
|
535
|
+
//# sourceMappingURL=MultiSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/user-action/MultiSelect.tsx","../../../src/localization/LanguageProvider.tsx","../../../src/hooks/useLocalStorage.ts","../../../src/localization/util.ts","../../../src/localization/useTranslation.ts","../../../src/util/simpleSearch.ts","../../../src/components/user-action/Menu.tsx","../../../src/hooks/useOutsideClick.ts","../../../src/hooks/useHoverState.ts","../../../src/components/user-action/Input.tsx","../../../src/hooks/useSaveDelay.ts","../../../src/util/noop.ts","../../../src/components/user-action/Label.tsx","../../../src/components/user-action/Checkbox.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { useState } from 'react'\nimport { Search } from 'lucide-react'\nimport type { PropsForTranslation } from '@/localization/useTranslation'\nimport { useTranslation } from '@/localization/useTranslation'\nimport type { Language } from '@/localization/util'\nimport { MultiSearchWithMapping } from '@/util/simpleSearch'\nimport clsx from 'clsx'\nimport { Menu, MenuItem } from './Menu'\nimport { Input } from './Input'\nimport { Checkbox } from './Checkbox'\nimport type { LabelProps } from './Label'\nimport { Label } from './Label'\n\ntype MultiSelectTranslation = {\n select: string,\n search: string,\n selected: string,\n}\n\nconst defaultMultiSelectTranslation: Record<Language, MultiSelectTranslation> = {\n en: {\n select: 'Select',\n search: 'Search',\n selected: 'selected'\n },\n de: {\n select: 'Auswählen',\n search: 'Suche',\n selected: 'ausgewählt'\n }\n}\n\n// TODO maybe add custom item builder here\nexport type MultiSelectOption<T> = {\n label: string,\n value: T,\n selected: boolean,\n disabled?: boolean,\n className?: string,\n}\n\nexport type SearchProps<T> = {\n initialSearch?: string,\n searchMapping: (value: MultiSelectOption<T>) => string[],\n}\n\nexport type MultiSelectProps<T> = {\n options: MultiSelectOption<T>[],\n onChange: (options: MultiSelectOption<T>[]) => void,\n search?: SearchProps<T>,\n disabled?: boolean,\n selectedDisplay?: (props: {\n items: MultiSelectOption<T>[],\n disabled: boolean,\n }) => ReactNode,\n label?: LabelProps,\n hintText?: string,\n showDisabledOptions?: boolean,\n className?: string,\n triggerClassName?: string,\n}\n\n/**\n * A Component for multi selection\n */\nexport const MultiSelect = <T, >({\n overwriteTranslation,\n options,\n onChange,\n search,\n disabled = false,\n selectedDisplay,\n label,\n hintText,\n showDisabledOptions = true,\n className = '',\n triggerClassName = '',\n }: PropsForTranslation<MultiSelectTranslation, MultiSelectProps<T>>) => {\n const translation = useTranslation(defaultMultiSelectTranslation, overwriteTranslation)\n const [searchText, setSearchText] = useState<string>(search?.initialSearch ?? '')\n let filteredOptions: MultiSelectOption<T>[] = options\n const enableSearch = !!search\n if (enableSearch && !!searchText) {\n filteredOptions = MultiSearchWithMapping<MultiSelectOption<T>>(\n searchText,\n filteredOptions,\n value => search.searchMapping(value)\n )\n }\n if (!showDisabledOptions) {\n filteredOptions = filteredOptions.filter(value => !value.disabled)\n }\n\n const selectedItems = options.filter(value => value.selected)\n const menuButtonText = selectedItems.length === 0 ?\n hintText ?? translation.select\n : <span>{`${selectedItems.length} ${translation.selected}`}</span>\n\n const borderColor = 'border-menu-border'\n\n return (\n <div className={clsx(className)}>\n {label && (\n <Label {...label} htmlFor={label.name} className={clsx(' mb-1', label.className)}\n labelType={label.labelType ?? 'labelBig'}/>\n )}\n <Menu<HTMLDivElement>\n alignment=\"t_\"\n trigger={(onClick, ref) => (\n <div ref={ref} onClick={disabled ? undefined : onClick}\n className={clsx(borderColor, 'bg-menu-background text-menu-text inline-w-full justify-between items-center rounded-lg border-2 px-4 py-2 font-medium',\n {\n 'hover:brightness-90 hover:border-primary cursor-pointer': !disabled,\n 'bg-disabled-background text-disabled cursor-not-allowed': disabled\n },\n triggerClassName)}\n >\n {selectedDisplay ? selectedDisplay({ items: options, disabled }) : menuButtonText}\n </div>\n )}\n menuClassName={clsx(\n '!rounded-lg !shadow-lg !max-h-[500px] !min-w-[400px] !max-w-[70vh] !overflow-y-auto !border !border-2', borderColor,\n { '!py-0': !enableSearch, '!pb-0': enableSearch }\n )}\n >\n {enableSearch && (\n <div key=\"selectSearch\" className=\"row gap-x-2 items-center px-2 py-2\">\n <Input autoFocus={true} className=\"w-full\" value={searchText} onChangeText={setSearchText}/>\n <Search/>\n </div>\n )}\n {filteredOptions.map((option, index) => (\n <MenuItem key={`item${index}`} className={clsx({\n 'cursor-not-allowed !bg-disabled-background !text-disabled-text hover:brightness-100': !!option.disabled,\n 'cursor-pointer': !option.disabled,\n })}\n >\n <div\n className={clsx('overflow-hidden whitespace-nowrap text-ellipsis row items-center gap-x-2', option.className)}\n onClick={() => {\n if (!option.disabled) {\n onChange(options.map(value => value.value === option.value ? ({\n ...option,\n selected: !value.selected\n }) : value))\n }\n }}\n >\n <Checkbox checked={option.selected} disabled={option.disabled} size=\"small\"/>\n {option.label}\n </div>\n </MenuItem>\n ))}\n </Menu>\n </div>\n )\n}\n","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { useLocalStorage } from '@/hooks/useLocalStorage'\nimport type { Language } from './util'\nimport { LanguageUtil } from './util'\n\nexport type LanguageContextValue = {\n language: Language,\n setLanguage: Dispatch<SetStateAction<Language>>,\n}\n\nexport const LanguageContext = createContext<LanguageContextValue>({\n language: LanguageUtil.DEFAULT_LANGUAGE,\n setLanguage: (v) => v\n})\n\nexport const useLanguage = () => useContext(LanguageContext)\n\nexport const useLocale = (overWriteLanguage?: Language) => {\n const { language } = useLanguage()\n const mapping: Record<Language, string> = {\n en: 'en-US',\n de: 'de-DE'\n }\n return mapping[overWriteLanguage ?? language]\n}\n\ntype LanguageProviderProps = {\n initialLanguage?: Language,\n}\n\nexport const LanguageProvider = ({ initialLanguage, children }: PropsWithChildren<LanguageProviderProps>) => {\n const [language, setLanguage] = useState<Language>(initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n const [storedLanguage, setStoredLanguage] = useLocalStorage<Language>('language', initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n\n useEffect(() => {\n if (language !== initialLanguage && initialLanguage) {\n console.warn('LanguageProvider initial state changed: Prefer using languageProvider\\'s setLanguage instead')\n setLanguage(initialLanguage)\n }\n }, [initialLanguage]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n // TODO set locale of html tag here as well\n setStoredLanguage(language)\n }, [language, setStoredLanguage])\n\n useEffect(() => {\n if (storedLanguage !== null) {\n setLanguage(storedLanguage)\n return\n }\n\n const LanguageToTestAgainst = Object.values(LanguageUtil.languages)\n\n const matchingBrowserLanguage = window.navigator.languages\n .map(language => LanguageToTestAgainst.find((test) => language === test || language.split('-')[0] === test))\n .filter(entry => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0] as Language\n setLanguage(firstMatch)\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <LanguageContext.Provider value={{\n language,\n setLanguage\n }}>\n {children}\n </LanguageContext.Provider>\n )\n}","import type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { LocalStorageService } from '../util/storage'\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(value => {\n const newValue = value instanceof Function ? value(storedValue) : value\n const storageService = new LocalStorageService()\n storageService.set(key, value)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n useEffect(() => {\n setStoredValue(get())\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return [storedValue, setValue]\n}","/**\n * The supported languages\n */\nconst languages = ['en', 'de'] as const\n\n/**\n * The supported languages\n */\nexport type Language = typeof languages[number]\n\n/**\n * The supported languages' names in their respective language\n */\nconst languagesLocalNames: Record<Language, string> = {\n en: 'English',\n de: 'Deutsch',\n}\n\n/**\n * The default language\n */\nconst DEFAULT_LANGUAGE: Language = 'en'\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LanguageUtil = {\n languages,\n DEFAULT_LANGUAGE,\n languagesLocalNames,\n}","import { useLanguage } from './LanguageProvider'\nimport type { Language } from './util'\n\nexport type Translation<T> = Record<Language, T>\n\ntype OverwriteTranslationType<Translation extends Record<string, unknown>> = {\n language?: Language,\n translation?: Partial<Record<Language, Partial<Translation>>>,\n}\n\n/**\n * Adds the `language` prop to the component props.\n *\n * @param Translation the type of the translation object\n *\n * @param Props the type of the component props, defaults to `Record<string, never>`,\n * if you don't expect any other props other than `language` and get an\n * error when using your component (because it uses `forwardRef` etc.)\n * you can try out `Record<string, unknown>`, this might resolve your\n * problem as `SomeType & never` is still `never` but `SomeType & unknown`\n * is `SomeType` which means that adding back props (like `ref` etc.)\n * works properly\n */\nexport type PropsForTranslation<\n Translation extends Record<string, unknown>,\n Props = Record<string, never>\n> = Props & {\n overwriteTranslation?: OverwriteTranslationType<Translation>,\n};\n\nexport const useTranslation = <Translation extends Record<string, unknown>>(\n defaults: Record<Language, Translation>,\n translationOverwrite: OverwriteTranslationType<Translation> = {}\n): Translation => {\n const { language: languageProp, translation: overwrite } = translationOverwrite\n const { language: inferredLanguage } = useLanguage()\n const usedLanguage = languageProp ?? inferredLanguage\n let defaultValues: Translation = defaults[usedLanguage]\n if (overwrite && overwrite[usedLanguage]) {\n defaultValues = { ...defaultValues, ...overwrite[usedLanguage] }\n }\n return defaultValues\n}\n","/**\n * Finds all values matching the search values by first mapping the values to a string array and then checking each entry for matches.\n * Returns the list of all matches.\n *\n * @param search The list of search strings e.g. `[name, type]`\n *\n * @param objects The list of objects to be searched in\n *\n * @param mapping The mapping of objects to the string properties they fulfil\n *\n * @return The list of objects that match all search strings\n */\nexport const MultiSubjectSearchWithMapping = <T>(search: string[], objects: T[], mapping: (value: T) => (string | undefined)[]) => {\n return objects.filter(object => {\n const mappedSearchKeywords = mapping(object).map(value => value ? value.toLowerCase().trim() : undefined)\n return search.every(searchValue => !!mappedSearchKeywords.find(value => !!value && value.includes(searchValue.toLowerCase().trim())))\n })\n}\n\n/**\n * Finds all values matching the search value by first mapping the values to a string array and then checking each entry for matches.\n * Returns the list of all matches.\n *\n * @param search The search string e.g `name`\n *\n * @param objects The list of objects to be searched in\n *\n * @param mapping The mapping of objects to the string properties they fulfil\n *\n * @return The list of objects that match the search string\n */\nexport const MultiSearchWithMapping = <T>(search: string, objects: T[], mapping: (value: T) => string[]) => {\n return objects.filter(object => {\n const mappedSearchKeywords = mapping(object).map(value => value.toLowerCase().trim())\n return !!mappedSearchKeywords.find(value => value.includes(search.toLowerCase().trim()))\n })\n}\n\n/**\n * Finds all values matching the search value by first mapping the values to a string and returns the list of all matches.\n *\n * @param search The search string e.g `name`\n *\n * @param objects The list of objects to be searched in\n *\n * @param mapping The mapping of objects to a string that is compared to the search\n *\n * @return The list of objects that match the search string\n */\nexport const SimpleSearchWithMapping = <T>(search: string, objects: T[], mapping: (value: T) => string) => {\n return MultiSearchWithMapping(search, objects, value => [mapping(value)])\n}\n\n/**\n * Finds all values matching the search value and returns the list of all matches.\n *\n * @param search The search string e.g `name`\n *\n * @param objects The list of objects to be searched in\n *\n * @return The list of objects that match the search string\n */\nexport const SimpleSearch = (search: string, objects: string[]) => {\n return SimpleSearchWithMapping(search, objects, value => value)\n}\n","import { type PropsWithChildren, type ReactNode, type RefObject, useRef } from 'react'\nimport clsx from 'clsx'\nimport { useOutsideClick } from '@/hooks/useOutsideClick'\nimport { useHoverState } from '@/hooks/useHoverState'\n\ntype MenuProps<T> = PropsWithChildren<{\n trigger: (onClick: () => void, ref: RefObject<T>) => ReactNode,\n /**\n * @default 'tl'\n */\n alignment?: 'tl' | 'tr' | 'bl' | 'br' | '_l' | '_r' | 't_' | 'b_',\n showOnHover?: boolean,\n menuClassName?: string,\n}>\n\nexport type MenuItemProps = {\n onClick?: () => void,\n alignment?: 'left' | 'right',\n className?: string,\n}\nconst MenuItem = ({\n children,\n onClick,\n alignment = 'left',\n className\n }: PropsWithChildren<MenuItemProps>) => (\n <div\n className={clsx('block px-3 py-1 bg-menu-background text-menu-text hover:brightness-90', {\n 'text-right': alignment === 'right',\n 'text-left': alignment === 'left',\n }, className)}\n onClick={onClick}\n >\n {children}\n </div>\n)\n\n/**\n * A Menu Component to allow the user to see different functions\n */\nconst Menu = <T extends HTMLElement>({\n trigger,\n children,\n alignment = 'tl',\n showOnHover = false,\n menuClassName = '',\n }: MenuProps<T>) => {\n const { isHovered: isOpen, setIsHovered: setIsOpen, handlers } = useHoverState({ isDisabled: !showOnHover })\n const triggerRef = useRef<T>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n useOutsideClick([triggerRef, menuRef], () => setIsOpen(false))\n\n return (\n <div\n className=\"relative\"\n {...handlers}\n >\n {trigger(() => setIsOpen(!isOpen), triggerRef)}\n {isOpen ? (\n <div ref={menuRef} onClick={e => e.stopPropagation()}\n className={clsx('absolute top-full mt-1 py-2 w-60 rounded-lg bg-menu-background text-menu-text ring-1 ring-slate-900/5 text-sm leading-6 font-semibold shadow-md z-[1]', {\n ' top-[8px]': alignment[0] === 't',\n ' bottom-[8px]': alignment[0] === 'b',\n ' left-[-8px]': alignment[1] === 'l',\n ' right-[-8px]': alignment[1] === 'r',\n }, menuClassName)}>\n {children}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport { Menu, MenuItem }\n","import type { RefObject } from 'react'\nimport { useEffect } from 'react'\n\nexport const useOutsideClick = <Ts extends RefObject<HTMLElement>[]>(refs: Ts, handler: () => void) => {\n useEffect(() => {\n const listener = (event: MouseEvent | TouchEvent) => {\n // returning means not \"not clicking outside\"\n\n // if no target exists, return\n if (event.target === null) return\n // if the target is a ref's element or descendent thereof, return\n if (refs.some((ref) => !ref.current || ref.current.contains(event.target as Node))) {\n return\n }\n\n handler()\n }\n document.addEventListener('mousedown', listener)\n document.addEventListener('touchstart', listener)\n return () => {\n document.removeEventListener('mousedown', listener)\n document.removeEventListener('touchstart', listener)\n }\n }, [refs, handler])\n}\n","import type { Dispatch, SetStateAction } from 'react'\nimport { useEffect, useState } from 'react'\n\ntype UseHoverStateProps = {\n /**\n * The delay after which the menu is closed in milliseconds\n *\n * default: 200ms\n */\n closingDelay: number,\n /**\n * Whether the hover state management should be disabled\n *\n * default: false\n */\n isDisabled: boolean,\n}\n\ntype UseHoverStateReturnType = {\n /**\n * Whether the element is hovered\n */\n isHovered: boolean,\n /**\n * Function to change the current hover status\n */\n setIsHovered: Dispatch<SetStateAction<boolean>>,\n /**\n * Handlers to pass on to the component that should be hovered\n */\n handlers: {\n onMouseEnter: () => void,\n onMouseLeave: () => void,\n },\n}\n\nconst defaultUseHoverStateProps: UseHoverStateProps = {\n closingDelay: 200,\n isDisabled: false,\n}\n\n/**\n * @param props See UseHoverStateProps\n *\n * A react hook for managing the hover state of a component. The handlers provided should be\n * forwarded to the component which should be hovered over\n */\nexport const useHoverState = (props: Partial<UseHoverStateProps> | undefined = undefined): UseHoverStateReturnType => {\n const { closingDelay, isDisabled } = { ...defaultUseHoverStateProps, ...props }\n\n const [isHovered, setIsHovered] = useState(false)\n const [timer, setTimer] = useState<NodeJS.Timeout>()\n\n const onMouseEnter = () => {\n if (isDisabled) {\n return\n }\n clearTimeout(timer)\n setIsHovered(true)\n }\n\n const onMouseLeave = () => {\n if (isDisabled) {\n return\n }\n setTimer(setTimeout(() => {\n setIsHovered(false)\n }, closingDelay))\n }\n\n useEffect(() => {\n if (timer) {\n return () => {\n clearTimeout(timer)\n }\n }\n })\n\n useEffect(() => {\n if (timer) {\n clearTimeout(timer)\n }\n }, [isDisabled]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n isHovered, setIsHovered, handlers: { onMouseEnter, onMouseLeave }\n }\n}\n","import React, { forwardRef, type InputHTMLAttributes, useEffect, useRef, useState } from 'react'\nimport clsx from 'clsx'\nimport { useSaveDelay } from '@/hooks/useSaveDelay'\nimport { noop } from '@/util/noop'\nimport type { LabelProps } from './Label'\nimport { Label } from './Label'\n\nexport type InputProps = {\n /**\n * used for the label's `for` attribute\n */\n label?: Omit<LabelProps, 'id'>,\n /**\n * Callback for when the input's value changes\n * This is pretty much required but made optional for the rare cases where it actually isn't need such as when used with disabled\n * That could be enforced through a union type but that seems a bit overkill\n * @default noop\n */\n onChangeText?: (text: string) => void,\n className?: string,\n onEditCompleted?: (text: string) => void,\n expanded?: boolean,\n containerClassName?: string,\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'label'>\n\n/**\n * A Component for inputting text or other information\n *\n * Its state is managed must be managed by the parent\n */\nconst Input = ({\n id,\n type = 'text',\n value,\n label,\n onChange = noop,\n onChangeText = noop,\n onEditCompleted,\n className = '',\n expanded = true,\n autoFocus,\n onBlur,\n containerClassName,\n ...restProps\n }: InputProps) => {\n const {\n restartTimer,\n clearUpdateTimer\n } = useSaveDelay(() => undefined, 3000)\n const ref = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if(autoFocus) {\n ref.current?.focus()\n }\n }, [autoFocus])\n\n return (\n <div className={clsx({ 'w-full': expanded }, containerClassName)}>\n {label && <Label {...label} htmlFor={id} className={clsx('mb-1', label.className)}/>}\n <input\n ref={ref}\n value={value}\n id={id}\n type={type}\n className={className}\n onBlur={event => {\n if (onBlur) {\n onBlur(event)\n }\n if (onEditCompleted) {\n onEditCompleted(event.target.value)\n clearUpdateTimer()\n }\n }}\n onChange={e => {\n const value = e.target.value\n if (onEditCompleted) {\n restartTimer(() => {\n onEditCompleted(value)\n clearUpdateTimer()\n })\n }\n onChange(e)\n onChangeText(value)\n }}\n {...restProps}\n />\n </div>\n )\n}\n\ntype InputUncontrolledProps = Omit<InputProps, 'value'> & {\n /**\n * @default ''\n */\n defaultValue?: string,\n}\n\n/**\n * A Component for inputting text or other information\n *\n * Its state is managed by the component itself\n */\nconst InputUncontrolled = ({\n defaultValue = '',\n onChangeText = noop,\n ...props\n }: InputUncontrolledProps) => {\n const [value, setValue] = useState(defaultValue)\n\n return (\n <Input\n {...props}\n value={value}\n onChangeText={text => {\n setValue(text)\n onChangeText(text)\n }}\n />\n )\n}\n\nexport type FormInputProps = InputHTMLAttributes<HTMLInputElement> & {\n id: string,\n labelText?: string,\n errorText?: string,\n labelClassName?: string,\n errorClassName?: string,\n containerClassName?: string,\n}\n\nconst FormInput = forwardRef<HTMLInputElement, FormInputProps>(function FormInput({\n id,\n labelText,\n errorText,\n className,\n labelClassName,\n errorClassName,\n containerClassName,\n required,\n ...restProps\n }, ref) {\n const input = (\n <input\n ref={ref}\n id={id}\n {...restProps}\n className={clsx(\n {\n 'focus:border-primary focus:ring-primary': !errorText,\n 'focus:border-negative focus:ring-negative text-negative': !!errorText,\n },\n className\n )}\n />\n )\n\n return (\n <div className={clsx('flex flex-col gap-y-1', containerClassName)}>\n {labelText && (\n <label htmlFor={id} className={clsx('textstyle-label-md', labelClassName)}>\n {labelText}\n {required && <span className=\"text-primary font-bold\">*</span>}\n </label>\n )}\n {input}\n {errorText && <label htmlFor={id} className={clsx('text-negative', errorClassName)}>{errorText}</label>}\n </div>\n )\n})\n\nexport {\n InputUncontrolled,\n Input,\n FormInput\n}\n","import { useEffect, useState } from 'react'\n\nexport function useSaveDelay(setNotificationStatus: (isShowing: boolean) => void, delay: number) {\n const [updateTimer, setUpdateTimer] = useState<NodeJS.Timeout | undefined>(undefined)\n const [notificationTimer, setNotificationTimer] = useState<NodeJS.Timeout | undefined>(undefined)\n\n const restartTimer = (onSave: () => void) => {\n clearTimeout(updateTimer)\n setUpdateTimer(setTimeout(() => {\n onSave()\n setNotificationStatus(true)\n // Show Saved Notification for fade animation duration\n clearTimeout(notificationTimer)\n setNotificationTimer(setTimeout(() => {\n setNotificationStatus(false)\n clearTimeout(notificationTimer)\n }, delay))\n clearTimeout(updateTimer)\n }, delay))\n }\n\n const clearUpdateTimer = (hasSaved = true) => {\n clearTimeout(updateTimer)\n if (hasSaved) {\n setNotificationStatus(true)\n clearTimeout(notificationTimer)\n setNotificationTimer(setTimeout(() => {\n setNotificationStatus(false)\n clearTimeout(notificationTimer)\n }, delay))\n } else {\n setNotificationStatus(false)\n }\n }\n\n useEffect(() => {\n return () => {\n clearTimeout(updateTimer)\n clearTimeout(notificationTimer)\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return { restartTimer, clearUpdateTimer }\n}","export const noop = () => undefined\n","import type { LabelHTMLAttributes } from 'react'\nimport clsx from 'clsx'\n\nexport type LabelType = 'labelSmall' | 'labelMedium' | 'labelBig'\n\nconst styleMapping: Record<LabelType, string> = {\n labelSmall: 'textstyle-label-sm',\n labelMedium: 'textstyle-label-md',\n labelBig: 'textstyle-label-lg',\n}\n\nexport type LabelProps = {\n /** The text for the label */\n name?: string,\n /** The styling for the label */\n labelType?: LabelType,\n} & LabelHTMLAttributes<HTMLLabelElement>\n\n/**\n * A Label component\n */\nexport const Label = ({\n children,\n name,\n labelType = 'labelSmall',\n className,\n ...props\n }: LabelProps) => {\n return (\n <label {...props} className={clsx(styleMapping[labelType], className)}>\n {children ? children : name}\n </label>\n )\n}\n","import { useState } from 'react'\nimport type { CheckedState } from '@radix-ui/react-checkbox'\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { Check, Minus } from 'lucide-react'\nimport clsx from 'clsx'\nimport type { LabelProps } from './Label'\nimport { Label } from './Label'\n\ntype CheckBoxSize = 'small' | 'medium' | 'large'\n\nconst checkboxSizeMapping: Record<CheckBoxSize, string> = {\n small: 'size-4',\n medium: 'size-6',\n large: 'size-8',\n}\n\nconst checkboxIconSizeMapping: Record<CheckBoxSize, string> = {\n small: 'size-3',\n medium: 'size-5',\n large: 'size-7',\n}\n\ntype CheckboxProps = {\n /** used for the label's `for` attribute */\n id?: string,\n label?: Omit<LabelProps, 'id'>,\n /**\n * @default false\n */\n checked: CheckedState,\n disabled?: boolean,\n onChange?: (checked: boolean) => void,\n onChangeTristate?: (checked: CheckedState) => void,\n size?: CheckBoxSize,\n className?: string,\n containerClassName?: string,\n}\n\n/**\n * A Tristate checkbox\n *\n * The state is managed by the parent\n */\nconst Checkbox = ({\n id,\n label,\n checked,\n disabled,\n onChange,\n onChangeTristate,\n size = 'medium',\n className = '',\n containerClassName\n }: CheckboxProps) => {\n const usedSizeClass = checkboxSizeMapping[size]\n const innerIconSize = checkboxIconSizeMapping[size]\n\n const propagateChange = (checked: CheckedState) => {\n if (onChangeTristate) {\n onChangeTristate(checked)\n }\n if (onChange) {\n onChange(checked === 'indeterminate' ? false : checked)\n }\n }\n\n const changeValue = () => {\n const newValue = checked === 'indeterminate' ? false : !checked\n propagateChange(newValue)\n }\n\n return (\n <div className={clsx('row justify-center items-center', containerClassName)}>\n <CheckboxPrimitive.Root\n onCheckedChange={propagateChange}\n checked={checked}\n disabled={disabled}\n id={id}\n className={clsx(usedSizeClass, `items-center border-2 rounded outline-none focus:border-primary`, {\n 'text-disabled-text border-disabled-text': disabled,\n 'border-on-background': !disabled,\n 'bg-primary/30 border-primary text-primary': checked === true || checked === 'indeterminate',\n 'hover:border-gray-400 focus:hover:border-primary': !checked\n }, className)}\n >\n <CheckboxPrimitive.Indicator>\n {checked === true && <Check className={innerIconSize}/>}\n {checked === 'indeterminate' && <Minus className={innerIconSize}/>}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n {label && (\n <Label {...label} className={clsx('cursor-pointer', label.className)} htmlFor={id}\n onClick={changeValue}/>\n )}\n </div>\n )\n}\n\ntype CheckboxUncontrolledProps = Omit<CheckboxProps, 'value' | 'checked'> & {\n /**\n * @default false\n */\n defaultValue?: CheckedState,\n}\n\n/**\n * A Tristate checkbox\n *\n * The state is managed by this component\n */\nconst CheckboxUncontrolled = ({\n onChange,\n onChangeTristate,\n defaultValue = false,\n ...props\n }: CheckboxUncontrolledProps) => {\n const [checked, setChecked] = useState(defaultValue)\n\n const handleChange = (checked: CheckedState) => {\n if (onChangeTristate) {\n onChangeTristate(checked)\n }\n if (onChange) {\n onChange(checked === 'indeterminate' ? false : checked)\n }\n setChecked(checked)\n }\n\n return (\n <Checkbox\n {...props}\n checked={checked}\n onChangeTristate={handleChange}\n />\n )\n}\n\nexport {\n CheckboxProps,\n CheckboxUncontrolled,\n Checkbox,\n}\n"],"mappings":"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","names":["useState","useEffect","useState","clsx","useEffect","useEffect","useState","jsx","useEffect","useRef","useState","clsx","useEffect","useState","clsx","jsx","jsx","jsxs","useRef","useEffect","clsx","value","FormInput","jsx","clsx","jsxs","useState","clsx","jsx","jsxs","checked","clsx","jsx","jsxs","useState","clsx"]}
|
|
@@ -27,14 +27,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
|
|
30
|
-
// src/components/user-
|
|
30
|
+
// src/components/user-action/ScrollPicker.tsx
|
|
31
31
|
var ScrollPicker_exports = {};
|
|
32
32
|
__export(ScrollPicker_exports, {
|
|
33
33
|
ScrollPicker: () => ScrollPicker
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(ScrollPicker_exports);
|
|
36
36
|
var import_react = require("react");
|
|
37
|
-
var import_clsx = __toESM(require("clsx"));
|
|
37
|
+
var import_clsx = __toESM(require("clsx"), 1);
|
|
38
38
|
|
|
39
39
|
// src/util/noop.ts
|
|
40
40
|
var noop = () => void 0;
|
|
@@ -81,7 +81,7 @@ var clamp = (value, min = 0, max = 1) => {
|
|
|
81
81
|
return Math.min(Math.max(value, min), max);
|
|
82
82
|
};
|
|
83
83
|
|
|
84
|
-
// src/components/user-
|
|
84
|
+
// src/components/user-action/ScrollPicker.tsx
|
|
85
85
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
86
86
|
var up = 1;
|
|
87
87
|
var down = -1;
|
|
@@ -279,4 +279,4 @@ var ScrollPicker = ({
|
|
|
279
279
|
0 && (module.exports = {
|
|
280
280
|
ScrollPicker
|
|
281
281
|
});
|
|
282
|
-
//# sourceMappingURL=ScrollPicker.
|
|
282
|
+
//# sourceMappingURL=ScrollPicker.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/user-action/ScrollPicker.tsx","../../../src/util/noop.ts","../../../src/util/array.ts","../../../src/util/math.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport clsx from 'clsx'\nimport { noop } from '@/util/noop'\nimport { getNeighbours, range } from '@/util/array'\nimport { clamp } from '@/util/math'\n\nexport type ScrollPickerProps<T> = {\n options: T[],\n mapping: (value: T) => string,\n selected?: T,\n onChange?: (value: T) => void,\n disabled?: boolean,\n}\n\ntype AnimationData<T> = {\n /** The index we scroll to */\n targetIndex: number,\n /** The index we are currently showing centered */\n currentIndex: number,\n items: T[],\n /** From -0.5 to 0.5 */\n transition: number,\n velocity: number,\n animationVelocity: number,\n lastTimeStamp?: number,\n lastScrollTimeStamp?: number,\n}\n\nconst up = 1\nconst down = -1\ntype Direction = 1 | -1\n\n/**\n * A component for picking an option by scrolling\n */\nexport const ScrollPicker = <T, >({\n options,\n mapping,\n selected,\n onChange = noop,\n disabled = false,\n }: ScrollPickerProps<T>) => {\n let selectedIndex = 0\n if (selected && options.indexOf(selected) !== -1) {\n selectedIndex = options.indexOf(selected)\n }\n const [{\n currentIndex,\n transition,\n items,\n lastTimeStamp\n }, setAnimation] = useState<AnimationData<T>>({\n targetIndex: selectedIndex,\n currentIndex: disabled ? selectedIndex : 0,\n velocity: 0,\n animationVelocity: Math.floor(options.length / 2),\n transition: 0,\n items: options,\n })\n\n const itemsShownCount = 5\n const shownItems = getNeighbours(range(0, items.length - 1), currentIndex).map(index => ({\n name: mapping(items[index]!), index\n }))\n\n const itemHeight = 40\n const distance = 8\n\n const containerHeight = itemHeight * (itemsShownCount - 2) + distance * (itemsShownCount - 2 + 1)\n\n const getDirection = useCallback((targetIndex: number, currentIndex: number, transition: number, length: number): Direction => {\n if (targetIndex === currentIndex) {\n return transition > 0 ? up : down\n }\n let distanceForward = targetIndex - currentIndex\n if (distanceForward < 0) {\n distanceForward += length\n }\n return distanceForward >= length / 2 ? down : up\n }, [])\n\n const animate = useCallback((timestamp: number, startTime: number | undefined) => {\n setAnimation((prevState) => {\n const {\n targetIndex,\n currentIndex,\n transition,\n animationVelocity,\n velocity,\n items,\n lastScrollTimeStamp\n } = prevState\n if (disabled) {\n return { ...prevState, currentIndex: targetIndex, velocity: 0, lastTimeStamp: timestamp }\n }\n if ((targetIndex === currentIndex && velocity === 0 && transition === 0) || !startTime) {\n return { ...prevState, lastTimeStamp: timestamp }\n }\n const progress = (timestamp - startTime) / 1000 // to seconds\n const direction = getDirection(targetIndex, currentIndex, transition, items.length)\n\n let newVelocity = velocity\n let usedVelocity\n let newCurrentIndex = currentIndex\n const isAutoScrolling = velocity === 0 && (!lastScrollTimeStamp || timestamp - lastScrollTimeStamp > 300)\n\n const newLastScrollTimeStamp = velocity !== 0 ? timestamp : lastScrollTimeStamp\n\n // manual scrolling\n if (isAutoScrolling) {\n usedVelocity = direction * animationVelocity\n } else {\n usedVelocity = velocity\n newVelocity = velocity * 0.5 // drag loss\n if (Math.abs(newVelocity) <= 0.05) {\n newVelocity = 0\n }\n }\n\n let newTransition = transition + usedVelocity * progress\n const changeThreshold = 0.5\n\n while (newTransition >= changeThreshold) {\n if (newCurrentIndex === targetIndex && newTransition >= changeThreshold && isAutoScrolling) {\n newTransition = 0\n break\n }\n newCurrentIndex = (currentIndex + 1) % items.length\n newTransition -= 1\n }\n if (newTransition >= changeThreshold) {\n newTransition = 0\n }\n while (newTransition <= -changeThreshold) {\n if (newCurrentIndex === targetIndex && newTransition <= -changeThreshold && isAutoScrolling) {\n newTransition = 0\n break\n }\n newCurrentIndex = currentIndex === 0 ? items.length - 1 : currentIndex - 1\n newTransition += 1\n }\n let newTargetIndex = targetIndex\n if (!isAutoScrolling) {\n newTargetIndex = newCurrentIndex\n }\n\n if ((currentIndex !== newTargetIndex || newTargetIndex !== targetIndex) && newTargetIndex === newCurrentIndex) {\n onChange(items[newCurrentIndex]!)\n }\n return {\n targetIndex: newTargetIndex,\n currentIndex: newCurrentIndex,\n animationVelocity,\n transition: newTransition,\n velocity: newVelocity,\n items,\n lastTimeStamp: timestamp,\n lastScrollTimeStamp: newLastScrollTimeStamp\n }\n })\n }, [disabled, getDirection, onChange])\n\n useEffect(() => {\n // constant update\n requestAnimationFrame((timestamp) => animate(timestamp, lastTimeStamp))\n })\n\n const opacity = (transition: number, index: number, itemsCount: number) => {\n const max = 100\n const min = 0\n const distance = max - min\n\n let opacityValue = min\n const unitTransition = clamp((transition) / 0.5)\n if (index === 1 || index === itemsCount - 2) {\n if (index === 1 && transition > 0) {\n opacityValue += Math.floor(unitTransition * distance)\n }\n if (index === itemsCount - 2 && transition < 0) {\n opacityValue += Math.floor(unitTransition * distance)\n }\n } else {\n opacityValue = max\n }\n\n // TODO this is not the right value for the bottom entry\n return clamp(1 - (opacityValue / max))\n }\n\n return (\n <div\n className=\"relative overflow-hidden\"\n style={{ height: containerHeight }}\n onWheel={event => {\n if (event.deltaY !== 0) {\n // TODO slower increase\n setAnimation(({ velocity, ...animationData }) =>\n ({ ...animationData, velocity: velocity + event.deltaY }))\n }\n }}\n >\n <div className=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 left-1/2\">\n <div\n className=\"absolute z-[1] top-1/2 -translate-y-1/2 -translate-x-1/2 left-1/2 w-full min-w-[40px] border border-y-2 border-x-0 border-[#00000033]\"\n style={{ height: `${itemHeight}px` }}\n />\n <div\n className=\"col select-none\"\n style={{\n transform: `translateY(${-transition * (distance + itemHeight)}px)`,\n columnGap: `${distance}px`,\n }}\n >\n {shownItems.map(({ name, index }, arrayIndex) => (\n <div\n key={index}\n className={clsx(\n `col items-center justify-center rounded-md`,\n {\n 'text-primary font-bold': currentIndex === index,\n 'text-on-background': currentIndex === index,\n 'cursor-pointer': !disabled,\n 'cursor-not-allowed': disabled,\n }\n )}\n style={{\n opacity: currentIndex !== index ? opacity(transition, arrayIndex, shownItems.length) : undefined,\n height: `${itemHeight}px`,\n maxHeight: `${itemHeight}px`,\n }}\n onClick={() => !disabled && setAnimation(prevState => ({ ...prevState, targetIndex: index }))}\n >\n {name}\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","export const noop = () => undefined\n","export const equalSizeGroups = <T>(array: T[], groupSize: number): T[][] => {\n if (groupSize <= 0) {\n console.warn(`group size should be greater than 0: groupSize = ${groupSize}`)\n return [[...array]]\n }\n\n const groups = []\n for (let i = 0; i < array.length; i += groupSize) {\n groups.push(array.slice(i, Math.min(i + groupSize, array.length)))\n }\n return groups\n}\n\n/**\n * @param start\n * @param end inclusive\n * @param allowEmptyRange Whether the range can be defined empty via end < start\n */\nexport const range = (start: number, end: number, allowEmptyRange: boolean = false): number[] => {\n if (end < start) {\n if (!allowEmptyRange) {\n console.warn(`range: end (${end}) < start (${start}) should be allowed explicitly, set allowEmptyRange to true`)\n }\n return []\n }\n return Array.from({ length: end - start + 1 }, (_, index) => index + start)\n}\n\n/** Finds the closest match\n * @param list The list of all possible matches\n * @param firstCloser Return whether item1 is closer than item2\n */\nexport const closestMatch = <T>(list: T[], firstCloser: (item1: T, item2: T) => boolean) => {\n return list.reduce((item1, item2) => {\n return firstCloser(item1, item2) ? item1 : item2\n })\n}\n\n/**\n * returns the item in middle of a list and its neighbours before and after\n * e.g. [1,2,3,4,5,6] for item = 1 would return [5,6,1,2,3]\n */\nexport const getNeighbours = <T>(list: T[], item: T, neighbourDistance: number = 2) => {\n const index = list.indexOf(item)\n const totalItems = neighbourDistance * 2 + 1\n if (list.length < totalItems) {\n console.warn('List is to short')\n return list\n }\n\n if (index === -1) {\n console.error('item not found in list')\n return list.splice(0, totalItems)\n }\n\n let start = index - neighbourDistance\n if (start < 0) {\n start += list.length\n }\n const end = (index + neighbourDistance + 1) % list.length\n\n const result: T[] = []\n let ignoreOnce = list.length === totalItems\n for (let i = start; i !== end || ignoreOnce; i = (i + 1) % list.length) {\n result.push(list[i]!)\n if (end === i && ignoreOnce) {\n ignoreOnce = false\n }\n }\n return result\n}\n\nexport const createLoopingListWithIndex = <T>(list: T[], startIndex: number = 0, length: number = 0, forwards: boolean = true) => {\n if (length < 0) {\n console.warn(`createLoopingList: length must be >= 0, given ${length}`)\n } else if (length === 0) {\n length = list.length\n }\n\n const returnList: [number, T][] = []\n\n if (forwards) {\n for (let i = startIndex; returnList.length < length; i = (i + 1) % list.length) {\n returnList.push([i, list[i]!])\n }\n } else {\n for (let i = startIndex; returnList.length < length; i = i === 0 ? i = list.length - 1 : i - 1) {\n returnList.push([i, list[i]!])\n }\n }\n\n return returnList\n}\n\nexport const createLoopingList = <T>(list: T[], startIndex: number = 0, length: number = 0, forwards: boolean = true) => {\n return createLoopingListWithIndex(list, startIndex, length, forwards).map(([_, item]) => item)\n}\n\nexport const ArrayUtil = {\n unique: <T>(list: T[]): T[] => {\n const seen = new Set<T>()\n return list.filter((item) => {\n if (seen.has(item)) {\n return false\n }\n seen.add(item)\n return true\n })\n },\n\n difference: <T>(list: T[], removeList: T[]): T[] => {\n const remove = new Set<T>(removeList)\n return list.filter((item) => !remove.has(item))\n }\n}\n","export const clamp = (value: number, min: number = 0, max: number = 1): number => {\n return Math.min(Math.max(value, min), max)\n}\n"],"mappings":"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","names":["currentIndex","transition","items","distance","clsx"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/components/user-
|
|
1
|
+
// src/components/user-action/ScrollPicker.tsx
|
|
2
2
|
import { useCallback, useEffect, useState } from "react";
|
|
3
3
|
import clsx from "clsx";
|
|
4
4
|
|
|
@@ -47,7 +47,7 @@ var clamp = (value, min = 0, max = 1) => {
|
|
|
47
47
|
return Math.min(Math.max(value, min), max);
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
-
// src/components/user-
|
|
50
|
+
// src/components/user-action/ScrollPicker.tsx
|
|
51
51
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
52
52
|
var up = 1;
|
|
53
53
|
var down = -1;
|
|
@@ -244,4 +244,4 @@ var ScrollPicker = ({
|
|
|
244
244
|
export {
|
|
245
245
|
ScrollPicker
|
|
246
246
|
};
|
|
247
|
-
//# sourceMappingURL=ScrollPicker.
|
|
247
|
+
//# sourceMappingURL=ScrollPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/user-action/ScrollPicker.tsx","../../../src/util/noop.ts","../../../src/util/array.ts","../../../src/util/math.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport clsx from 'clsx'\nimport { noop } from '@/util/noop'\nimport { getNeighbours, range } from '@/util/array'\nimport { clamp } from '@/util/math'\n\nexport type ScrollPickerProps<T> = {\n options: T[],\n mapping: (value: T) => string,\n selected?: T,\n onChange?: (value: T) => void,\n disabled?: boolean,\n}\n\ntype AnimationData<T> = {\n /** The index we scroll to */\n targetIndex: number,\n /** The index we are currently showing centered */\n currentIndex: number,\n items: T[],\n /** From -0.5 to 0.5 */\n transition: number,\n velocity: number,\n animationVelocity: number,\n lastTimeStamp?: number,\n lastScrollTimeStamp?: number,\n}\n\nconst up = 1\nconst down = -1\ntype Direction = 1 | -1\n\n/**\n * A component for picking an option by scrolling\n */\nexport const ScrollPicker = <T, >({\n options,\n mapping,\n selected,\n onChange = noop,\n disabled = false,\n }: ScrollPickerProps<T>) => {\n let selectedIndex = 0\n if (selected && options.indexOf(selected) !== -1) {\n selectedIndex = options.indexOf(selected)\n }\n const [{\n currentIndex,\n transition,\n items,\n lastTimeStamp\n }, setAnimation] = useState<AnimationData<T>>({\n targetIndex: selectedIndex,\n currentIndex: disabled ? selectedIndex : 0,\n velocity: 0,\n animationVelocity: Math.floor(options.length / 2),\n transition: 0,\n items: options,\n })\n\n const itemsShownCount = 5\n const shownItems = getNeighbours(range(0, items.length - 1), currentIndex).map(index => ({\n name: mapping(items[index]!), index\n }))\n\n const itemHeight = 40\n const distance = 8\n\n const containerHeight = itemHeight * (itemsShownCount - 2) + distance * (itemsShownCount - 2 + 1)\n\n const getDirection = useCallback((targetIndex: number, currentIndex: number, transition: number, length: number): Direction => {\n if (targetIndex === currentIndex) {\n return transition > 0 ? up : down\n }\n let distanceForward = targetIndex - currentIndex\n if (distanceForward < 0) {\n distanceForward += length\n }\n return distanceForward >= length / 2 ? down : up\n }, [])\n\n const animate = useCallback((timestamp: number, startTime: number | undefined) => {\n setAnimation((prevState) => {\n const {\n targetIndex,\n currentIndex,\n transition,\n animationVelocity,\n velocity,\n items,\n lastScrollTimeStamp\n } = prevState\n if (disabled) {\n return { ...prevState, currentIndex: targetIndex, velocity: 0, lastTimeStamp: timestamp }\n }\n if ((targetIndex === currentIndex && velocity === 0 && transition === 0) || !startTime) {\n return { ...prevState, lastTimeStamp: timestamp }\n }\n const progress = (timestamp - startTime) / 1000 // to seconds\n const direction = getDirection(targetIndex, currentIndex, transition, items.length)\n\n let newVelocity = velocity\n let usedVelocity\n let newCurrentIndex = currentIndex\n const isAutoScrolling = velocity === 0 && (!lastScrollTimeStamp || timestamp - lastScrollTimeStamp > 300)\n\n const newLastScrollTimeStamp = velocity !== 0 ? timestamp : lastScrollTimeStamp\n\n // manual scrolling\n if (isAutoScrolling) {\n usedVelocity = direction * animationVelocity\n } else {\n usedVelocity = velocity\n newVelocity = velocity * 0.5 // drag loss\n if (Math.abs(newVelocity) <= 0.05) {\n newVelocity = 0\n }\n }\n\n let newTransition = transition + usedVelocity * progress\n const changeThreshold = 0.5\n\n while (newTransition >= changeThreshold) {\n if (newCurrentIndex === targetIndex && newTransition >= changeThreshold && isAutoScrolling) {\n newTransition = 0\n break\n }\n newCurrentIndex = (currentIndex + 1) % items.length\n newTransition -= 1\n }\n if (newTransition >= changeThreshold) {\n newTransition = 0\n }\n while (newTransition <= -changeThreshold) {\n if (newCurrentIndex === targetIndex && newTransition <= -changeThreshold && isAutoScrolling) {\n newTransition = 0\n break\n }\n newCurrentIndex = currentIndex === 0 ? items.length - 1 : currentIndex - 1\n newTransition += 1\n }\n let newTargetIndex = targetIndex\n if (!isAutoScrolling) {\n newTargetIndex = newCurrentIndex\n }\n\n if ((currentIndex !== newTargetIndex || newTargetIndex !== targetIndex) && newTargetIndex === newCurrentIndex) {\n onChange(items[newCurrentIndex]!)\n }\n return {\n targetIndex: newTargetIndex,\n currentIndex: newCurrentIndex,\n animationVelocity,\n transition: newTransition,\n velocity: newVelocity,\n items,\n lastTimeStamp: timestamp,\n lastScrollTimeStamp: newLastScrollTimeStamp\n }\n })\n }, [disabled, getDirection, onChange])\n\n useEffect(() => {\n // constant update\n requestAnimationFrame((timestamp) => animate(timestamp, lastTimeStamp))\n })\n\n const opacity = (transition: number, index: number, itemsCount: number) => {\n const max = 100\n const min = 0\n const distance = max - min\n\n let opacityValue = min\n const unitTransition = clamp((transition) / 0.5)\n if (index === 1 || index === itemsCount - 2) {\n if (index === 1 && transition > 0) {\n opacityValue += Math.floor(unitTransition * distance)\n }\n if (index === itemsCount - 2 && transition < 0) {\n opacityValue += Math.floor(unitTransition * distance)\n }\n } else {\n opacityValue = max\n }\n\n // TODO this is not the right value for the bottom entry\n return clamp(1 - (opacityValue / max))\n }\n\n return (\n <div\n className=\"relative overflow-hidden\"\n style={{ height: containerHeight }}\n onWheel={event => {\n if (event.deltaY !== 0) {\n // TODO slower increase\n setAnimation(({ velocity, ...animationData }) =>\n ({ ...animationData, velocity: velocity + event.deltaY }))\n }\n }}\n >\n <div className=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 left-1/2\">\n <div\n className=\"absolute z-[1] top-1/2 -translate-y-1/2 -translate-x-1/2 left-1/2 w-full min-w-[40px] border border-y-2 border-x-0 border-[#00000033]\"\n style={{ height: `${itemHeight}px` }}\n />\n <div\n className=\"col select-none\"\n style={{\n transform: `translateY(${-transition * (distance + itemHeight)}px)`,\n columnGap: `${distance}px`,\n }}\n >\n {shownItems.map(({ name, index }, arrayIndex) => (\n <div\n key={index}\n className={clsx(\n `col items-center justify-center rounded-md`,\n {\n 'text-primary font-bold': currentIndex === index,\n 'text-on-background': currentIndex === index,\n 'cursor-pointer': !disabled,\n 'cursor-not-allowed': disabled,\n }\n )}\n style={{\n opacity: currentIndex !== index ? opacity(transition, arrayIndex, shownItems.length) : undefined,\n height: `${itemHeight}px`,\n maxHeight: `${itemHeight}px`,\n }}\n onClick={() => !disabled && setAnimation(prevState => ({ ...prevState, targetIndex: index }))}\n >\n {name}\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","export const noop = () => undefined\n","export const equalSizeGroups = <T>(array: T[], groupSize: number): T[][] => {\n if (groupSize <= 0) {\n console.warn(`group size should be greater than 0: groupSize = ${groupSize}`)\n return [[...array]]\n }\n\n const groups = []\n for (let i = 0; i < array.length; i += groupSize) {\n groups.push(array.slice(i, Math.min(i + groupSize, array.length)))\n }\n return groups\n}\n\n/**\n * @param start\n * @param end inclusive\n * @param allowEmptyRange Whether the range can be defined empty via end < start\n */\nexport const range = (start: number, end: number, allowEmptyRange: boolean = false): number[] => {\n if (end < start) {\n if (!allowEmptyRange) {\n console.warn(`range: end (${end}) < start (${start}) should be allowed explicitly, set allowEmptyRange to true`)\n }\n return []\n }\n return Array.from({ length: end - start + 1 }, (_, index) => index + start)\n}\n\n/** Finds the closest match\n * @param list The list of all possible matches\n * @param firstCloser Return whether item1 is closer than item2\n */\nexport const closestMatch = <T>(list: T[], firstCloser: (item1: T, item2: T) => boolean) => {\n return list.reduce((item1, item2) => {\n return firstCloser(item1, item2) ? item1 : item2\n })\n}\n\n/**\n * returns the item in middle of a list and its neighbours before and after\n * e.g. [1,2,3,4,5,6] for item = 1 would return [5,6,1,2,3]\n */\nexport const getNeighbours = <T>(list: T[], item: T, neighbourDistance: number = 2) => {\n const index = list.indexOf(item)\n const totalItems = neighbourDistance * 2 + 1\n if (list.length < totalItems) {\n console.warn('List is to short')\n return list\n }\n\n if (index === -1) {\n console.error('item not found in list')\n return list.splice(0, totalItems)\n }\n\n let start = index - neighbourDistance\n if (start < 0) {\n start += list.length\n }\n const end = (index + neighbourDistance + 1) % list.length\n\n const result: T[] = []\n let ignoreOnce = list.length === totalItems\n for (let i = start; i !== end || ignoreOnce; i = (i + 1) % list.length) {\n result.push(list[i]!)\n if (end === i && ignoreOnce) {\n ignoreOnce = false\n }\n }\n return result\n}\n\nexport const createLoopingListWithIndex = <T>(list: T[], startIndex: number = 0, length: number = 0, forwards: boolean = true) => {\n if (length < 0) {\n console.warn(`createLoopingList: length must be >= 0, given ${length}`)\n } else if (length === 0) {\n length = list.length\n }\n\n const returnList: [number, T][] = []\n\n if (forwards) {\n for (let i = startIndex; returnList.length < length; i = (i + 1) % list.length) {\n returnList.push([i, list[i]!])\n }\n } else {\n for (let i = startIndex; returnList.length < length; i = i === 0 ? i = list.length - 1 : i - 1) {\n returnList.push([i, list[i]!])\n }\n }\n\n return returnList\n}\n\nexport const createLoopingList = <T>(list: T[], startIndex: number = 0, length: number = 0, forwards: boolean = true) => {\n return createLoopingListWithIndex(list, startIndex, length, forwards).map(([_, item]) => item)\n}\n\nexport const ArrayUtil = {\n unique: <T>(list: T[]): T[] => {\n const seen = new Set<T>()\n return list.filter((item) => {\n if (seen.has(item)) {\n return false\n }\n seen.add(item)\n return true\n })\n },\n\n difference: <T>(list: T[], removeList: T[]): T[] => {\n const remove = new Set<T>(removeList)\n return list.filter((item) => !remove.has(item))\n }\n}\n","export const clamp = (value: number, min: number = 0, max: number = 1): number => {\n return Math.min(Math.max(value, min), max)\n}\n"],"mappings":"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","names":["currentIndex","transition","items","distance"]}
|