diff --git a/geopandas/tools/clip.py b/geopandas/tools/clip.py
index da022b8e..bf74e837 100644
--- a/geopandas/tools/clip.py
+++ b/geopandas/tools/clip.py
@@ -152,7 +152,11 @@ def clip(gdf, mask, keep_geom_type=False):
         ((box_mask[0] <= box_gdf[2]) and (box_gdf[0] <= box_mask[2]))
         and ((box_mask[1] <= box_gdf[3]) and (box_gdf[1] <= box_mask[3]))
     ):
-        return GeoDataFrame(columns=gdf.columns, crs=gdf.crs)
+        return (
+            GeoDataFrame(columns=gdf.columns, crs=gdf.crs)
+            if isinstance(gdf, GeoDataFrame)
+            else GeoSeries(crs=gdf.crs)
+        )
 
     if isinstance(mask, (GeoDataFrame, GeoSeries)):
         poly = mask.geometry.unary_union

BUG: clip GeoSeries by non-overlapping mask raises error
Clipping GeoSeries by non-overlapping `mask` raises error as we try to return GeoDataFrame with original columns in here: https://github.com/geopandas/geopandas/blob/7350b49688f51b281f69638c8c51a448a0115fb0/geopandas/tools/clip.py#L155

In case of GeoSeries we should return empty GeoSeries I would say.
MRE:

```py
import geopandas as gpd
from shapely.geometry import Point

s = gpd.GeoSeries([Point(0,0), Point(1,1)])
mask = Point(10, 10).buffer(2)
gpd.clip(s, mask)
```


<details>

```
~/Dropbox/Python/geopandas/martinfleis/geopandas/tools/clip.py in clip(gdf, mask, keep_geom_type)
    153         and ((box_mask[1] <= box_gdf[3]) and (box_gdf[1] <= box_mask[3]))
    154     ):
--> 155         return GeoDataFrame(columns=gdf.columns, crs=gdf.crs)
    156 
    157     if isinstance(mask, (GeoDataFrame, GeoSeries)):

~/anaconda3/envs/geo_dev/lib/python3.8/site-packages/pandas/core/generic.py in __getattr__(self, name)
   5173             or name in self._accessors
   5174         ):
-> 5175             return object.__getattribute__(self, name)
   5176         else:
   5177             if self._info_axis._can_hold_identifiers_and_holds_name(name):

AttributeError: 'GeoSeries' object has no attribute 'columns'
```

</details>

diff --git a/geopandas/tools/tests/test_clip.py b/geopandas/tools/tests/test_clip.py
index 64aea513..ffacf656 100644
--- a/geopandas/tools/tests/test_clip.py
+++ b/geopandas/tools/tests/test_clip.py
@@ -9,7 +9,7 @@ from shapely.geometry import Polygon, Point, LineString, LinearRing, GeometryCol
 
 import geopandas
 from geopandas import GeoDataFrame, GeoSeries, clip
-from geopandas.testing import assert_geodataframe_equal
+from geopandas.testing import assert_geodataframe_equal, assert_geoseries_equal
 
 import pytest
 
@@ -159,7 +159,7 @@ def test_returns_series(point_gdf, single_rectangle_gdf):
 
 
 def test_non_overlapping_geoms():
-    """Test that a bounding box returns error if the extents don't overlap"""
+    """Test that a bounding box returns empty if the extents don't overlap"""
     unit_box = Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)])
     unit_gdf = GeoDataFrame([1], geometry=[unit_box], crs="EPSG:4326")
     non_overlapping_gdf = unit_gdf.copy()
@@ -170,6 +170,8 @@ def test_non_overlapping_geoms():
     assert_geodataframe_equal(
         out, GeoDataFrame(columns=unit_gdf.columns, crs=unit_gdf.crs)
     )
+    out2 = clip(unit_gdf.geometry, non_overlapping_gdf)
+    assert_geoseries_equal(out2, GeoSeries(crs=unit_gdf.crs))
 
 
 def test_clip_points(point_gdf, single_rectangle_gdf):

pip install -e .
parse_log_pytest
requirements.txt
pytest descartes matplotlib rtree
apt-get update apt-get install -y gcc
3.7
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==24.2.0
certifi @ file:///croot/certifi_1671487769961/work/certifi
click==8.1.8
click-plugins==1.1.1
cligj==0.7.2
cycler==0.11.0
Cython==3.0.12
descartes==1.1.0
exceptiongroup==1.2.2
fiona==1.9.6
fonttools==4.38.0
-e git+https://github.com/geopandas/geopandas.git@196902feeaec2acd65bec4832704a8196f4d3b0d#egg=geopandas
importlib-metadata==6.7.0
iniconfig==2.0.0
kiwisolver==1.4.5
matplotlib==3.5.3
numpy==1.21.6
packaging==24.0
pandas==1.3.5
Pillow==9.5.0
pluggy==1.2.0
pyparsing==3.1.4
pyproj==3.2.1
pytest==7.4.4
python-dateutil==2.9.0.post0
pytz==2025.2
Rtree==1.0.1
shapely==2.0.7
six==1.17.0
tomli==2.0.1
typing_extensions==4.7.1
zipp==3.15.0

name: geopandas
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==24.2.0
      - click==8.1.8
      - click-plugins==1.1.1
      - cligj==0.7.2
      - cycler==0.11.0
      - cython==3.0.12
      - descartes==1.1.0
      - exceptiongroup==1.2.2
      - fiona==1.9.6
      - fonttools==4.38.0
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - kiwisolver==1.4.5
      - matplotlib==3.5.3
      - numpy==1.21.6
      - packaging==24.0
      - pandas==1.3.5
      - pillow==9.5.0
      - pluggy==1.2.0
      - pyparsing==3.1.4
      - pyproj==3.2.1
      - pytest==7.4.4
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - rtree==1.0.1
      - shapely==2.0.7
      - six==1.17.0
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - zipp==3.15.0
prefix: /opt/conda/envs/geopandas

geopandas/tools/tests/test_clip.py::test_non_overlapping_geoms
geopandas/tools/tests/test_clip.py::test_not_gdf geopandas/tools/tests/test_clip.py::test_returns_gdf geopandas/tools/tests/test_clip.py::test_returns_series geopandas/tools/tests/test_clip.py::test_clip_points geopandas/tools/tests/test_clip.py::test_clip_poly geopandas/tools/tests/test_clip.py::test_clip_poly_series geopandas/tools/tests/test_clip.py::test_clip_multipoly_keep_slivers geopandas/tools/tests/test_clip.py::test_clip_multipoly_keep_geom_type geopandas/tools/tests/test_clip.py::test_clip_single_multipoly_no_extra_geoms geopandas/tools/tests/test_clip.py::test_clip_multiline geopandas/tools/tests/test_clip.py::test_clip_multipoint geopandas/tools/tests/test_clip.py::test_clip_lines geopandas/tools/tests/test_clip.py::test_clip_with_multipolygon geopandas/tools/tests/test_clip.py::test_clip_warning_no_extra_geoms geopandas/tools/tests/test_clip.py::test_clip_with_polygon geopandas/tools/tests/test_clip.py::test_clip_with_line_extra_geom geopandas/tools/tests/test_clip.py::test_clip_line_keep_slivers
geopandas/tools/clip.py
geopandas/tools/clip.py