hl.plugin("dynamic-cursors", function()
    enabled = true

        -- tilt    - tilt the cursor based on x-velocity
        -- rotate  - rotate the cursor based on movement direction
        -- stretch - stretch the cursor shape based on direction and velocity
        -- none    - do not change the cursors behaviour
        mode = tilt

        -- minimum angle difference in degrees after which the shape is changed
        -- smaller values are smoother, but more expensive for hw cursors
        threshold = 1

        rotate {
            -- length in px of the simulated stick used to rotate the cursor
            -- most realistic if this is your actual cursor size
            length = 30

            -- clockwise offset applied to the angle in degrees
            -- this will apply to ALL shapes
            offset = 0.0
        }

        tilt {
            -- controls how powerful the tilt is, the lower, the more power
            -- this value controls at which speed (px/s) the full tilt is reached
            -- the full tilt being 60° in both directions
            limit = 2000

            -- relationship between speed and tilt, supports these values:
            -- linear             - a linear function is used
            -- quadratic          - a quadratic function is used (most realistic to actual air drag)
            -- negative_quadratic - negative version of the quadratic one, feels more aggressive
            -- see `activation` in `src/mode/utils.cpp` for how exactly the calculation is done
            function = negative_quadratic

            -- time window (ms) over which the speed is calculated
            -- higher values will make slow motions smoother but more delayed
            window = 182
        }

        stretch {
            -- controls how much the cursor is stretched
            -- this value controls at which speed (px/s) the full stretch is reached
            -- the full stretch being twice the original length
            limit = 3000

            -- relationship between speed and stretch amount, supports these values:
            -- linear             - a linear function is used
            -- quadratic          - a quadratic function is used
            -- negative_quadratic - negative version of the quadratic one, feels more aggressive
            -- see `activation` in `src/mode/utils.cpp` for how exactly the calculation is done
            function = quadratic

            -- time window (ms) over which the speed is calculated
            -- higher values will make slow motions smoother but more delayed
            window = 100
        }

        -- configure shake to find
        -- magnifies the cursor if its is being shaken
        shake {
            enabled = true

            -- use nearest-neighbour (pixelated) scaling when shaking
            -- may look weird when effects are enabled
            nearest = false

            -- controls how soon a shake is detected
            -- lower values mean sooner
            threshold = 2.2

            -- magnification level immediately after shake start
            base = 1.2
            -- magnification increase per second when continuing to shake
            speed = 7.0
            -- how much the speed is influenced by the current shake intensitiy
            influence = 6.0

            -- maximal magnification the cursor can reach
            -- values below 1 disable the limit (e.g. 0)
            limit = 3.2

            -- time in millseconds the cursor will stay magnified after a shake has ended
            timeout = 1300

            -- show cursor behaviour `tilt`, `rotate`, etc. while shaking
            effects = true

            -- enable ipc events for shake
            -- see the `ipc` section below
            ipc = false
        }

        -- use hyprcursor to get a higher resolution texture when the cursor is magnified
        -- see the `hyprcursor` section below
        hyprcursor {
            -- use nearest-neighbour (pixelated) scaling when magnifing beyond texture size
            -- this will also have effect without hyprcursor support being enabled
            -- 0 / false - never use pixelated scaling
            -- 1 / true  - use pixelated when no highres image
            -- 2         - always use pixleated scaling
            nearest = true

            -- enable dedicated hyprcursor support
            enabled = true

            -- resolution in pixels to load the magnified shapes at
            -- be warned that loading a very high-resolution image will take a long time and might impact memory consumption
            -- -1 means we use [normal cursor size] * [shake:base option]
            resolution = -1

            -- shape to use when clientside cursors are being magnified
            -- see the shape-name property of shape rules for possible names

            -- specifying clientside will use the actual shape, but will be pixelated
            fallback = clientside
        }

end)
