Skip to content

Commit b7137c5

Browse files
Fetch branding (#75)
* Fetch branding components * Bump version * Add typing * tighten typing * Fix * remove comments * Loosen up schema
1 parent fffcbf9 commit b7137c5

5 files changed

Lines changed: 328 additions & 2 deletions

File tree

hyperbrowser/models/__init__.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,32 @@
3333
FetchOutputHtml,
3434
FetchOutputLinks,
3535
FetchOutputScreenshot,
36+
FetchOutputBranding,
3637
FetchOutputFormat,
3738
)
39+
from .web.branding import (
40+
BrandingProfile,
41+
BrandingColors,
42+
BrandingFont,
43+
BrandingFontRole,
44+
BrandingTypography,
45+
BrandingFontFamilies,
46+
BrandingFontStacks,
47+
BrandingFontSizes,
48+
BrandingSpacing,
49+
BrandingComponents,
50+
BrandingButtonStyle,
51+
BrandingInputStyle,
52+
BrandingBorderRadiusCorners,
53+
BrandingImages,
54+
BrandingPersonality,
55+
BrandingPersonalityTone,
56+
BrandingPersonalityEnergy,
57+
BrandingDesignSystem,
58+
BrandingDesignFramework,
59+
BrandingConfidence,
60+
BrandingColorScheme,
61+
)
3862
from .web.search import (
3963
WebSearchFilters,
4064
WebSearchFiletype,
@@ -624,7 +648,30 @@
624648
"FetchOutputHtml",
625649
"FetchOutputLinks",
626650
"FetchOutputScreenshot",
651+
"FetchOutputBranding",
627652
"FetchOutputFormat",
653+
# web branding response shape
654+
"BrandingProfile",
655+
"BrandingColors",
656+
"BrandingFont",
657+
"BrandingFontRole",
658+
"BrandingTypography",
659+
"BrandingFontFamilies",
660+
"BrandingFontStacks",
661+
"BrandingFontSizes",
662+
"BrandingSpacing",
663+
"BrandingComponents",
664+
"BrandingButtonStyle",
665+
"BrandingInputStyle",
666+
"BrandingBorderRadiusCorners",
667+
"BrandingImages",
668+
"BrandingPersonality",
669+
"BrandingPersonalityTone",
670+
"BrandingPersonalityEnergy",
671+
"BrandingDesignSystem",
672+
"BrandingDesignFramework",
673+
"BrandingConfidence",
674+
"BrandingColorScheme",
628675
"FetchStorageStateOptions",
629676
"FetchOutputJsonOptions",
630677
"FetchOutputScreenshotOptions",
Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
from __future__ import annotations
2+
from typing import Literal, Optional, List, Union
3+
from pydantic import BaseModel, ConfigDict, Field
4+
5+
6+
BrandingColorScheme = Union[Literal["light", "dark"], str]
7+
8+
BrandingPersonalityTone = Union[
9+
Literal[
10+
"professional",
11+
"playful",
12+
"modern",
13+
"traditional",
14+
"minimalist",
15+
"bold",
16+
],
17+
str,
18+
]
19+
20+
BrandingPersonalityEnergy = Union[Literal["low", "medium", "high"], str]
21+
22+
BrandingFontRole = Union[
23+
Literal["heading", "body", "monospace", "display", "unknown"],
24+
str,
25+
]
26+
27+
BrandingDesignFramework = Union[
28+
Literal[
29+
"tailwind",
30+
"bootstrap",
31+
"material",
32+
"chakra",
33+
"custom",
34+
"unknown",
35+
],
36+
str,
37+
]
38+
39+
40+
class BrandingColors(BaseModel):
41+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
42+
43+
primary: Optional[str] = None
44+
secondary: Optional[str] = None
45+
accent: Optional[str] = None
46+
background: Optional[str] = None
47+
text_primary: Optional[str] = Field(
48+
default=None, alias="textPrimary", serialization_alias="textPrimary"
49+
)
50+
text_secondary: Optional[str] = Field(
51+
default=None, alias="textSecondary", serialization_alias="textSecondary"
52+
)
53+
link: Optional[str] = None
54+
success: Optional[str] = None
55+
warning: Optional[str] = None
56+
error: Optional[str] = None
57+
58+
59+
class BrandingFont(BaseModel):
60+
model_config = ConfigDict(extra="allow")
61+
62+
family: Optional[str] = None
63+
role: Optional[BrandingFontRole] = None
64+
65+
66+
class BrandingBorderRadiusCorners(BaseModel):
67+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
68+
69+
top_left: Optional[str] = Field(
70+
default=None, alias="topLeft", serialization_alias="topLeft"
71+
)
72+
top_right: Optional[str] = Field(
73+
default=None, alias="topRight", serialization_alias="topRight"
74+
)
75+
bottom_right: Optional[str] = Field(
76+
default=None, alias="bottomRight", serialization_alias="bottomRight"
77+
)
78+
bottom_left: Optional[str] = Field(
79+
default=None, alias="bottomLeft", serialization_alias="bottomLeft"
80+
)
81+
82+
83+
class BrandingButtonStyle(BaseModel):
84+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
85+
86+
background: Optional[str] = None
87+
text_color: Optional[str] = Field(
88+
default=None, alias="textColor", serialization_alias="textColor"
89+
)
90+
border_color: Optional[str] = Field(
91+
default=None, alias="borderColor", serialization_alias="borderColor"
92+
)
93+
border_radius: Optional[str] = Field(
94+
default=None, alias="borderRadius", serialization_alias="borderRadius"
95+
)
96+
border_radius_corners: Optional[BrandingBorderRadiusCorners] = Field(
97+
default=None,
98+
alias="borderRadiusCorners",
99+
serialization_alias="borderRadiusCorners",
100+
)
101+
shadow: Optional[str] = None
102+
103+
104+
class BrandingInputStyle(BaseModel):
105+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
106+
107+
background: Optional[str] = None
108+
text_color: Optional[str] = Field(
109+
default=None, alias="textColor", serialization_alias="textColor"
110+
)
111+
border_color: Optional[str] = Field(
112+
default=None, alias="borderColor", serialization_alias="borderColor"
113+
)
114+
focus_border_color: Optional[str] = Field(
115+
default=None,
116+
alias="focusBorderColor",
117+
serialization_alias="focusBorderColor",
118+
)
119+
border_radius: Optional[str] = Field(
120+
default=None, alias="borderRadius", serialization_alias="borderRadius"
121+
)
122+
border_radius_corners: Optional[BrandingBorderRadiusCorners] = Field(
123+
default=None,
124+
alias="borderRadiusCorners",
125+
serialization_alias="borderRadiusCorners",
126+
)
127+
shadow: Optional[str] = None
128+
129+
130+
class BrandingComponents(BaseModel):
131+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
132+
133+
button_primary: Optional[BrandingButtonStyle] = Field(
134+
default=None, alias="buttonPrimary", serialization_alias="buttonPrimary"
135+
)
136+
button_secondary: Optional[BrandingButtonStyle] = Field(
137+
default=None,
138+
alias="buttonSecondary",
139+
serialization_alias="buttonSecondary",
140+
)
141+
input: Optional[BrandingInputStyle] = None
142+
143+
144+
class BrandingFontFamilies(BaseModel):
145+
model_config = ConfigDict(extra="allow")
146+
147+
primary: Optional[str] = None
148+
heading: Optional[str] = None
149+
code: Optional[str] = None
150+
151+
152+
class BrandingFontStacks(BaseModel):
153+
model_config = ConfigDict(extra="allow")
154+
155+
primary: Optional[List[Optional[str]]] = None
156+
heading: Optional[List[Optional[str]]] = None
157+
body: Optional[List[Optional[str]]] = None
158+
paragraph: Optional[List[Optional[str]]] = None
159+
160+
161+
class BrandingFontSizes(BaseModel):
162+
model_config = ConfigDict(extra="allow")
163+
164+
h1: Optional[str] = None
165+
h2: Optional[str] = None
166+
h3: Optional[str] = None
167+
body: Optional[str] = None
168+
small: Optional[str] = None
169+
170+
171+
class BrandingTypography(BaseModel):
172+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
173+
174+
font_families: Optional[BrandingFontFamilies] = Field(
175+
default=None, alias="fontFamilies", serialization_alias="fontFamilies"
176+
)
177+
font_stacks: Optional[BrandingFontStacks] = Field(
178+
default=None, alias="fontStacks", serialization_alias="fontStacks"
179+
)
180+
font_sizes: Optional[BrandingFontSizes] = Field(
181+
default=None, alias="fontSizes", serialization_alias="fontSizes"
182+
)
183+
line_heights: Optional[dict[str, Optional[float]]] = Field(
184+
default=None, alias="lineHeights", serialization_alias="lineHeights"
185+
)
186+
font_weights: Optional[dict[str, Optional[float]]] = Field(
187+
default=None, alias="fontWeights", serialization_alias="fontWeights"
188+
)
189+
190+
191+
class BrandingSpacing(BaseModel):
192+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
193+
194+
base_unit: Optional[float] = Field(
195+
default=None, alias="baseUnit", serialization_alias="baseUnit"
196+
)
197+
border_radius: Optional[str] = Field(
198+
default=None, alias="borderRadius", serialization_alias="borderRadius"
199+
)
200+
padding: Optional[dict[str, Optional[float]]] = None
201+
margins: Optional[dict[str, Optional[float]]] = None
202+
grid_gutter: Optional[float] = Field(
203+
default=None, alias="gridGutter", serialization_alias="gridGutter"
204+
)
205+
206+
207+
class BrandingImages(BaseModel):
208+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
209+
210+
logo: Optional[str] = None
211+
logo_href: Optional[str] = Field(
212+
default=None, alias="logoHref", serialization_alias="logoHref"
213+
)
214+
logo_alt: Optional[str] = Field(
215+
default=None, alias="logoAlt", serialization_alias="logoAlt"
216+
)
217+
favicon: Optional[str] = None
218+
og_image: Optional[str] = Field(
219+
default=None, alias="ogImage", serialization_alias="ogImage"
220+
)
221+
222+
223+
class BrandingPersonality(BaseModel):
224+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
225+
226+
tone: Optional[BrandingPersonalityTone] = None
227+
energy: Optional[BrandingPersonalityEnergy] = None
228+
target_audience: Optional[str] = Field(
229+
default=None,
230+
alias="targetAudience",
231+
serialization_alias="targetAudience",
232+
)
233+
234+
235+
class BrandingDesignSystem(BaseModel):
236+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
237+
238+
framework: Optional[BrandingDesignFramework] = None
239+
component_library: Optional[str] = Field(
240+
default=None,
241+
alias="componentLibrary",
242+
serialization_alias="componentLibrary",
243+
)
244+
245+
246+
class BrandingConfidence(BaseModel):
247+
model_config = ConfigDict(extra="allow")
248+
249+
buttons: Optional[float] = None
250+
colors: Optional[float] = None
251+
overall: Optional[float] = None
252+
253+
254+
class BrandingProfile(BaseModel):
255+
model_config = ConfigDict(populate_by_alias=True, extra="allow")
256+
257+
color_scheme: Optional[BrandingColorScheme] = Field(
258+
default=None, alias="colorScheme", serialization_alias="colorScheme"
259+
)
260+
colors: Optional[BrandingColors] = None
261+
fonts: Optional[List[BrandingFont]] = None
262+
typography: Optional[BrandingTypography] = None
263+
spacing: Optional[BrandingSpacing] = None
264+
components: Optional[BrandingComponents] = None
265+
images: Optional[BrandingImages] = None
266+
personality: Optional[BrandingPersonality] = None
267+
design_system: Optional[BrandingDesignSystem] = Field(
268+
default=None, alias="designSystem", serialization_alias="designSystem"
269+
)
270+
confidence: Optional[BrandingConfidence] = None

hyperbrowser/models/web/common.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
FetchSanitizeMode,
1111
)
1212
from hyperbrowser.models.session import ScreenConfig
13+
from hyperbrowser.models.web.branding import BrandingProfile
1314

1415

1516
class FetchOutputScreenshotOptions(BaseModel):
@@ -79,6 +80,7 @@ class PageData(BaseModel):
7980
json_: Optional[dict[str, Any]] = Field(
8081
default=None, alias="json", serialization_alias="json"
8182
)
83+
branding: Optional[BrandingProfile] = None
8284

8385

8486
class FetchOutputMarkdown(BaseModel):
@@ -112,13 +114,18 @@ class FetchOutputJson(FetchOutputJsonOptions):
112114
type: Literal["json"]
113115

114116

117+
class FetchOutputBranding(BaseModel):
118+
type: Literal["branding"]
119+
120+
115121
FetchOutputFormat = Union[
116122
FetchOutputMarkdown,
117123
FetchOutputHtml,
118124
FetchOutputLinks,
119125
FetchOutputScreenshot,
120126
FetchOutputJson,
121-
Literal["markdown", "html", "links", "screenshot"],
127+
FetchOutputBranding,
128+
Literal["markdown", "html", "links", "screenshot", "branding"],
122129
]
123130

124131

hyperbrowser/models/web/fetch.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
FetchNavigationOptions,
88
FetchCacheOptions,
99
)
10+
from .branding import BrandingProfile
1011
from hyperbrowser.models.consts import FetchStatus, FetchStealthMode
1112

1213

@@ -46,6 +47,7 @@ class FetchResponseData(BaseModel):
4647
json_: Optional[dict] = Field(
4748
default=None, alias="json", serialization_alias="json"
4849
)
50+
branding: Optional[BrandingProfile] = None
4951

5052

5153
class FetchResponse(BaseModel):

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "hyperbrowser"
3-
version = "0.90.4"
3+
version = "0.90.5"
44
description = "Python SDK for hyperbrowser"
55
authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
66
license = "MIT"

0 commit comments

Comments
 (0)