diff --git a/src/custom-components/ColorPickerModal.tsx b/src/custom-components/ColorPickerModal.tsx new file mode 100644 index 0000000..743dc5e --- /dev/null +++ b/src/custom-components/ColorPickerModal.tsx @@ -0,0 +1,163 @@ +import { gamepadSliderClasses, ConfirmModal, SliderField } from "../deck-components"; +import { useState, FC, CSSProperties } from "react"; + +interface ColorPickerModalProps { + closeModal: () => void; + onConfirm?(HSLString: string): any; + title?: string; + defaultH?: number; + defaultS?: number; + defaultL?: number; + defaultA?: number; +} + +export const ColorPickerModal: FC = ({ + closeModal, + onConfirm = () => {}, + title = "Color Picker", + defaultH = 0, + defaultS = 100, + defaultL = 50, + defaultA = 1, +}) => { + const [H, setH] = useState(defaultH); + const [S, setS] = useState(defaultS); + const [L, setL] = useState(defaultL); + const [A, setA] = useState(defaultA); + + const colorPickerCSSVars = { + "--decky-color-picker-hvalue": `${H}`, + "--decky-color-picker-svalue": `${S}%`, + "--decky-color-picker-lvalue": `${L}%`, + "--decky-color-picker-avalue": `${A}`, + } as CSSProperties; + + return ( + { + onConfirm(`hsla(${H}, ${S}%, ${L}%, ${A})`); + closeModal(); + }} + > + +
+
+ + {title} + +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ ); +}; diff --git a/src/deck-components/static-classes.ts b/src/deck-components/static-classes.ts index 1972413..a15447b 100644 --- a/src/deck-components/static-classes.ts +++ b/src/deck-components/static-classes.ts @@ -307,9 +307,58 @@ type PlaySectionClasses = Record< string >; +type GamepadSliderClasses = Record< + | "error-shake-duration" + | "SliderControlPanelGroup" + | "SliderControlAndNotches" + | "WithDefaultValue" + | "SliderControl" + | "Disabled" + | "SliderTrack" + | "SliderHasNotches" + | "SliderTrackDark" + | "SliderHandleContainer" + | "VerticalLineSliderHandleContainer" + | "ParenSliderHandleContainer" + | "SliderHandle" + | "SliderHandleFocusPop" + | "VerticalLineSliderHandle" + | "ParenSliderHandle" + | "Left" + | "SliderControlWithIcon" + | "Icon" + | "SliderNotchContainer" + | "SliderNotch" + | "AlignToEnds" + | "SliderNotchLabel" + | "AlignToLeft" + | "AlignToRight" + | "SliderNotchTick" + | "TickActive" + | "LabelText" + | "DescriptionValue" + | "EditableValue" + | "FakeEditableValue" + | "RedBorder" + | "EditableValueSuffix" + | "ErrorShake" + | "error-shake" + | "CompoundSlider" + | "CompoundSliderSubSlider" + | "Right" + | "CompoundSliderSubSliderLabelContainer" + | "CompoundSliderSubSliderLabelPositioner" + | "CompoundSliderSubSliderLabel" + | "CompoundSliderSubSliderLabelInternal" + | "DefaultValueTickContainer" + | "DefaultValueTick", + string +>; + export const staticClasses: StaticClasses = findModule((mod) => typeof mod === 'object' && mod.TransitionMenuDelay); export const scrollClasses: ScrollClasses = findModule((mod) => typeof mod === 'object' && mod.ScrollPanel && mod.ScrollY); export const gamepadDialogClasses: GamepadDialogClasses = findModule((mod) => typeof mod === 'object' && mod.WithFirstRow); export const quickAccessControlsClasses: QuickAccessControlsClasses = findModule((mod) => typeof mod === 'object' && mod.PanelSectionRow); export const updaterFieldClasses: UpdaterFieldClasses = findModule((mod) => typeof mod === 'object' && mod.PatchNotes && mod.PostedTime); export const playSectionClasses: PlaySectionClasses = findModule((mod) => typeof mod === 'object' && mod.MenuButton && mod.MenuActive); +export const gamepadSliderClasses: GamepadSliderClasses = findModule((mod) => typeof mod === 'object' && mod.SliderTrack && mod.SliderHasNotches); \ No newline at end of file