Hopsakee commited on
Commit
9c717aa
·
1 Parent(s): d1b6a3a

working small from main

Browse files
.gradio/certificate.pem ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
31
+ -----END CERTIFICATE-----
app_starter_gui/css.py CHANGED
@@ -4,6 +4,8 @@
4
  __all__ = ['generate_css', 'test_generate_css']
5
 
6
  # %% ../nbs/01_css.ipynb 2
 
 
7
  from .core import Button
8
  from fastcore.test import * # for test_assert
9
 
@@ -72,10 +74,16 @@ def generate_css(buttons):
72
  """
73
 
74
  all_css = []
75
- for i, button in enumerate(buttons, 1):
76
- btn_id = f"btn{i}"
77
- css = css_template.format(btn_id=btn_id, image_url=button.image_url)
78
- all_css.append(css)
 
 
 
 
 
 
79
 
80
  return "\n".join(all_css)
81
 
@@ -89,7 +97,7 @@ def test_generate_css():
89
  Button("Search", "img.jpg", "https://search.com", "Search")
90
  ]
91
  css = generate_css(buttons)
92
- test('#btn1', css.lower(), lambda x,y: x in y)
93
- test('#btn2', css.lower(), lambda x,y: x in y)
94
 
95
  test_generate_css()
 
4
  __all__ = ['generate_css', 'test_generate_css']
5
 
6
  # %% ../nbs/01_css.ipynb 2
7
+ from operator import attrgetter
8
+ from itertools import groupby
9
  from .core import Button
10
  from fastcore.test import * # for test_assert
11
 
 
74
  """
75
 
76
  all_css = []
77
+
78
+ # Sort buttons by app_type to match the dashboard layout
79
+ buttons = sorted(buttons, key=attrgetter('app_type'))
80
+ button_groups = {k: list(g) for k, g in groupby(buttons, key=attrgetter('app_type'))}
81
+
82
+ for app_type, type_buttons in button_groups.items():
83
+ for button_idx, button in enumerate(type_buttons, 1):
84
+ btn_id = f"btn_{app_type}_{button_idx}"
85
+ css = css_template.format(btn_id=btn_id, image_url=button.image_url)
86
+ all_css.append(css)
87
 
88
  return "\n".join(all_css)
89
 
 
97
  Button("Search", "img.jpg", "https://search.com", "Search")
98
  ]
99
  css = generate_css(buttons)
100
+ test('#btn_ai_1', css.lower(), lambda x,y: x in y)
101
+ test('#btn_search_1', css.lower(), lambda x,y: x in y)
102
 
103
  test_generate_css()
app_starter_gui/gradio_app.py CHANGED
@@ -5,6 +5,8 @@ __all__ = ['create_app', 'test_create_app']
5
 
6
  # %% ../nbs/02_gradio_app.ipynb 2
7
  import gradio as gr
 
 
8
  from .core import Button, load_buttons
9
  from .css import generate_css
10
 
@@ -20,16 +22,28 @@ def create_app(yaml_file='buttons.yaml', css_generator=generate_css):
20
  """
21
  buttons = load_buttons(yaml_file)
22
  css = generate_css(buttons)
 
 
 
23
 
24
  with gr.Blocks(css=css) as blocks:
25
- with gr.Column():
26
- gr.HTML('<div class="button-grid">' +
27
- ''.join([f'''
28
- <a href="{b.link_url}" class="{b.app_type.lower()}">
29
- <img src="{b.image_url}" style="max-width:100%"/>
30
- <p>{b.label}</p>
31
- </a>''' for b in buttons]) +
32
- '</div>')
 
 
 
 
 
 
 
 
 
33
  return blocks
34
 
35
  # %% ../nbs/02_gradio_app.ipynb 6
 
5
 
6
  # %% ../nbs/02_gradio_app.ipynb 2
7
  import gradio as gr
8
+ from itertools import groupby
9
+ from operator import attrgetter
10
  from .core import Button, load_buttons
11
  from .css import generate_css
12
 
 
22
  """
23
  buttons = load_buttons(yaml_file)
24
  css = generate_css(buttons)
25
+
26
+ buttons_sorted = sorted(buttons, key=attrgetter('app_type'))
27
+ button_groups = {k: list(g) for k, g in groupby(buttons_sorted, key=attrgetter('app_type'))}
28
 
29
  with gr.Blocks(css=css) as blocks:
30
+ with gr.Row():
31
+ # Create a column for each app_type
32
+ for app_type, type_buttons in button_groups.items():
33
+ with gr.Column():
34
+ gr.Markdown(f"### {app_type}")
35
+ for button_idx, button in enumerate(type_buttons):
36
+ btn = gr.Button(
37
+ value=button.label,
38
+ elem_id=f"btn_{app_type}_{button_idx}", # Make unique ID for each button
39
+ scale=1,
40
+ )
41
+ btn.click(
42
+ fn=None,
43
+ inputs=None,
44
+ outputs=None,
45
+ js=f"() => {{ window.open('{button.link_url}', '_blank'); }}"
46
+ )
47
  return blocks
48
 
49
  # %% ../nbs/02_gradio_app.ipynb 6
buttons.yaml CHANGED
@@ -3,6 +3,6 @@
3
  link_url: https://huggingface.co/spaces/Hopsakee/fabric_to_espanso
4
  app_type: Prompt
5
  - label: Jaws of the Lion
6
- image_url: google.jpg
7
  link_url: https://notebooklm.google.com/notebook/ac6595f8-963c-4bd8-87cf-26b7007434a6?_gl=1*10y09ch*_ga*OTQ0NDQwODcwLjE3MzUzNzU4MDc.*_ga_W0LDH41ZCB*MTczNjk3MjM5NS43LjAuMTczNjk3MjM5NS4wLjAuMA..
8
  app_type: Bordspel
 
3
  link_url: https://huggingface.co/spaces/Hopsakee/fabric_to_espanso
4
  app_type: Prompt
5
  - label: Jaws of the Lion
6
+ image_url: https://static1.srcdn.com/wordpress/wp-content/uploads/2020/06/Gloomhaven-Jaws-of-the-Lion-Hatchet.jpg
7
  link_url: https://notebooklm.google.com/notebook/ac6595f8-963c-4bd8-87cf-26b7007434a6?_gl=1*10y09ch*_ga*OTQ0NDQwODcwLjE3MzUzNzU4MDc.*_ga_W0LDH41ZCB*MTczNjk3MjM5NS43LjAuMTczNjk3MjM5NS4wLjAuMA..
8
  app_type: Bordspel
gradio_app.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/02_gradio_app.ipynb.
2
+
3
+ # %% auto 0
4
+ __all__ = ['create_app', 'test_create_app']
5
+
6
+ # %% ../nbs/02_gradio_app.ipynb 2
7
+ import gradio as gr
8
+ from itertools import groupby
9
+ from operator import attrgetter
10
+ from app_starter_gui.core import Button, load_buttons
11
+ from app_starter_gui.css import generate_css
12
+
13
+ # %% ../nbs/02_gradio_app.ipynb 4
14
+ def create_app(yaml_file='buttons.yaml', css_generator=generate_css):
15
+ """Create a Gradio dashboard for the button interface
16
+
17
+ Args:
18
+ yaml_file: Path to YAML file containing button data (default: 'buttons.yaml')
19
+ css_generator: Function to generate CSS (default: generate_css)
20
+ Returns:
21
+ gr.Blocks: Gradio interface
22
+ """
23
+ buttons = load_buttons(yaml_file)
24
+ css = generate_css(buttons)
25
+
26
+ buttons_sorted = sorted(buttons, key=attrgetter('app_type'))
27
+ buttons_grouped = {k: list(g) for k, g in groupby(buttons_sorted, key=attrgetter('app_type'))}
28
+
29
+ with gr.Blocks(css=css) as blocks:
30
+ with gr.Row():
31
+ # Create a column for each app type
32
+ for app_type, type_buttons in buttons_grouped.items():
33
+ with gr.Column():
34
+ gr.Markdown(f"### {app_type}")
35
+ for i, button in enumerate(type_buttons, 1):
36
+ btn = gr.Button(
37
+ value=button.label,
38
+ elem_id=f"btn_{app_type}_{i}",
39
+ scale=1,
40
+ )
41
+ btn.click(
42
+ fn=None,
43
+ inputs=None,
44
+ outputs=None,
45
+ js=f"() => {{ window.open('{button.link_url}', '_blank'); }}"
46
+ )
47
+ return blocks
48
+
49
+ if __name__ == '__main__':
50
+ demo = create_app()
51
+ demo.launch(share=True)
nbs/01_css.ipynb CHANGED
@@ -16,7 +16,11 @@
16
  {
17
  "cell_type": "code",
18
  "execution_count": null,
19
- "metadata": {},
 
 
 
 
20
  "outputs": [],
21
  "source": [
22
  "#| default_exp css"
@@ -25,7 +29,11 @@
25
  {
26
  "cell_type": "code",
27
  "execution_count": null,
28
- "metadata": {},
 
 
 
 
29
  "outputs": [
30
  {
31
  "ename": "ModuleNotFoundError",
@@ -42,6 +50,8 @@
42
  "source": [
43
  "#| export\n",
44
  "#| hide\n",
 
 
45
  "from app_starter_gui.core import Button\n",
46
  "from fastcore.test import * # for test_assert"
47
  ]
@@ -49,7 +59,11 @@
49
  {
50
  "cell_type": "code",
51
  "execution_count": null,
52
- "metadata": {},
 
 
 
 
53
  "outputs": [],
54
  "source": [
55
  "from nbdev.showdoc import show_doc"
@@ -58,7 +72,11 @@
58
  {
59
  "cell_type": "code",
60
  "execution_count": null,
61
- "metadata": {},
 
 
 
 
62
  "outputs": [],
63
  "source": [
64
  "#| export\n",
@@ -126,10 +144,16 @@
126
  " \"\"\"\n",
127
  " \n",
128
  " all_css = []\n",
129
- " for i, button in enumerate(buttons, 1):\n",
130
- " btn_id = f\"btn{i}\"\n",
131
- " css = css_template.format(btn_id=btn_id, image_url=button.image_url)\n",
132
- " all_css.append(css)\n",
 
 
 
 
 
 
133
  " \n",
134
  " return \"\\n\".join(all_css)"
135
  ]
@@ -137,7 +161,11 @@
137
  {
138
  "cell_type": "code",
139
  "execution_count": null,
140
- "metadata": {},
 
 
 
 
141
  "outputs": [
142
  {
143
  "ename": "NameError",
@@ -165,7 +193,11 @@
165
  {
166
  "cell_type": "code",
167
  "execution_count": null,
168
- "metadata": {},
 
 
 
 
169
  "outputs": [
170
  {
171
  "ename": "NameError",
@@ -192,8 +224,8 @@
192
  " Button(\"Search\", \"img.jpg\", \"https://search.com\", \"Search\")\n",
193
  " ]\n",
194
  " css = generate_css(buttons)\n",
195
- " test('#btn1', css.lower(), lambda x,y: x in y)\n",
196
- " test('#btn2', css.lower(), lambda x,y: x in y)\n",
197
  "\n",
198
  "test_generate_css()"
199
  ]
@@ -201,7 +233,11 @@
201
  {
202
  "cell_type": "code",
203
  "execution_count": null,
204
- "metadata": {},
 
 
 
 
205
  "outputs": [],
206
  "source": [
207
  "#| hide\n",
 
16
  {
17
  "cell_type": "code",
18
  "execution_count": null,
19
+ "metadata": {
20
+ "vscode": {
21
+ "languageId": "python"
22
+ }
23
+ },
24
  "outputs": [],
25
  "source": [
26
  "#| default_exp css"
 
29
  {
30
  "cell_type": "code",
31
  "execution_count": null,
32
+ "metadata": {
33
+ "vscode": {
34
+ "languageId": "python"
35
+ }
36
+ },
37
  "outputs": [
38
  {
39
  "ename": "ModuleNotFoundError",
 
50
  "source": [
51
  "#| export\n",
52
  "#| hide\n",
53
+ "from operator import attrgetter\n",
54
+ "from itertools import groupby\n",
55
  "from app_starter_gui.core import Button\n",
56
  "from fastcore.test import * # for test_assert"
57
  ]
 
59
  {
60
  "cell_type": "code",
61
  "execution_count": null,
62
+ "metadata": {
63
+ "vscode": {
64
+ "languageId": "python"
65
+ }
66
+ },
67
  "outputs": [],
68
  "source": [
69
  "from nbdev.showdoc import show_doc"
 
72
  {
73
  "cell_type": "code",
74
  "execution_count": null,
75
+ "metadata": {
76
+ "vscode": {
77
+ "languageId": "python"
78
+ }
79
+ },
80
  "outputs": [],
81
  "source": [
82
  "#| export\n",
 
144
  " \"\"\"\n",
145
  " \n",
146
  " all_css = []\n",
147
+ " \n",
148
+ " # Sort buttons by app_type to match the dashboard layout\n",
149
+ " buttons = sorted(buttons, key=attrgetter('app_type'))\n",
150
+ " button_groups = {k: list(g) for k, g in groupby(buttons, key=attrgetter('app_type'))}\n",
151
+ " \n",
152
+ " for app_type, type_buttons in button_groups.items():\n",
153
+ " for button_idx, button in enumerate(type_buttons, 1):\n",
154
+ " btn_id = f\"btn_{app_type}_{button_idx}\"\n",
155
+ " css = css_template.format(btn_id=btn_id, image_url=button.image_url)\n",
156
+ " all_css.append(css)\n",
157
  " \n",
158
  " return \"\\n\".join(all_css)"
159
  ]
 
161
  {
162
  "cell_type": "code",
163
  "execution_count": null,
164
+ "metadata": {
165
+ "vscode": {
166
+ "languageId": "python"
167
+ }
168
+ },
169
  "outputs": [
170
  {
171
  "ename": "NameError",
 
193
  {
194
  "cell_type": "code",
195
  "execution_count": null,
196
+ "metadata": {
197
+ "vscode": {
198
+ "languageId": "python"
199
+ }
200
+ },
201
  "outputs": [
202
  {
203
  "ename": "NameError",
 
224
  " Button(\"Search\", \"img.jpg\", \"https://search.com\", \"Search\")\n",
225
  " ]\n",
226
  " css = generate_css(buttons)\n",
227
+ " test('#btn_ai_1', css.lower(), lambda x,y: x in y)\n",
228
+ " test('#btn_search_1', css.lower(), lambda x,y: x in y)\n",
229
  "\n",
230
  "test_generate_css()"
231
  ]
 
233
  {
234
  "cell_type": "code",
235
  "execution_count": null,
236
+ "metadata": {
237
+ "vscode": {
238
+ "languageId": "python"
239
+ }
240
+ },
241
  "outputs": [],
242
  "source": [
243
  "#| hide\n",
nbs/02_gradio_app.ipynb CHANGED
@@ -16,7 +16,11 @@
16
  {
17
  "cell_type": "code",
18
  "execution_count": null,
19
- "metadata": {},
 
 
 
 
20
  "outputs": [],
21
  "source": [
22
  "#| default_exp gradio_app"
@@ -25,7 +29,11 @@
25
  {
26
  "cell_type": "code",
27
  "execution_count": null,
28
- "metadata": {},
 
 
 
 
29
  "outputs": [
30
  {
31
  "ename": "ModuleNotFoundError",
@@ -43,6 +51,8 @@
43
  "#| export\n",
44
  "#| hide\n",
45
  "import gradio as gr\n",
 
 
46
  "from app_starter_gui.core import Button, load_buttons\n",
47
  "from app_starter_gui.css import generate_css"
48
  ]
@@ -50,7 +60,11 @@
50
  {
51
  "cell_type": "code",
52
  "execution_count": null,
53
- "metadata": {},
 
 
 
 
54
  "outputs": [],
55
  "source": [
56
  "#| hide\n",
@@ -60,7 +74,11 @@
60
  {
61
  "cell_type": "code",
62
  "execution_count": null,
63
- "metadata": {},
 
 
 
 
64
  "outputs": [],
65
  "source": [
66
  "#| export\n",
@@ -75,23 +93,39 @@
75
  " \"\"\"\n",
76
  " buttons = load_buttons(yaml_file)\n",
77
  " css = generate_css(buttons)\n",
 
 
 
78
  " \n",
79
  " with gr.Blocks(css=css) as blocks:\n",
80
- " with gr.Column():\n",
81
- " gr.HTML('<div class=\"button-grid\">' + \n",
82
- " ''.join([f'''\n",
83
- " <a href=\"{b.link_url}\" class=\"{b.app_type.lower()}\">\n",
84
- " <img src=\"{b.image_url}\" style=\"max-width:100%\"/>\n",
85
- " <p>{b.label}</p>\n",
86
- " </a>''' for b in buttons]) +\n",
87
- " '</div>')\n",
 
 
 
 
 
 
 
 
 
88
  " return blocks"
89
  ]
90
  },
91
  {
92
  "cell_type": "code",
93
  "execution_count": null,
94
- "metadata": {},
 
 
 
 
95
  "outputs": [],
96
  "source": [
97
  "# Example usage\n",
@@ -101,7 +135,11 @@
101
  {
102
  "cell_type": "code",
103
  "execution_count": null,
104
- "metadata": {},
 
 
 
 
105
  "outputs": [],
106
  "source": [
107
  "#| export\n",
@@ -119,7 +157,11 @@
119
  {
120
  "cell_type": "code",
121
  "execution_count": null,
122
- "metadata": {},
 
 
 
 
123
  "outputs": [],
124
  "source": [
125
  "#| hide\n",
 
16
  {
17
  "cell_type": "code",
18
  "execution_count": null,
19
+ "metadata": {
20
+ "vscode": {
21
+ "languageId": "python"
22
+ }
23
+ },
24
  "outputs": [],
25
  "source": [
26
  "#| default_exp gradio_app"
 
29
  {
30
  "cell_type": "code",
31
  "execution_count": null,
32
+ "metadata": {
33
+ "vscode": {
34
+ "languageId": "python"
35
+ }
36
+ },
37
  "outputs": [
38
  {
39
  "ename": "ModuleNotFoundError",
 
51
  "#| export\n",
52
  "#| hide\n",
53
  "import gradio as gr\n",
54
+ "from itertools import groupby\n",
55
+ "from operator import attrgetter\n",
56
  "from app_starter_gui.core import Button, load_buttons\n",
57
  "from app_starter_gui.css import generate_css"
58
  ]
 
60
  {
61
  "cell_type": "code",
62
  "execution_count": null,
63
+ "metadata": {
64
+ "vscode": {
65
+ "languageId": "python"
66
+ }
67
+ },
68
  "outputs": [],
69
  "source": [
70
  "#| hide\n",
 
74
  {
75
  "cell_type": "code",
76
  "execution_count": null,
77
+ "metadata": {
78
+ "vscode": {
79
+ "languageId": "python"
80
+ }
81
+ },
82
  "outputs": [],
83
  "source": [
84
  "#| export\n",
 
93
  " \"\"\"\n",
94
  " buttons = load_buttons(yaml_file)\n",
95
  " css = generate_css(buttons)\n",
96
+ "\n",
97
+ " buttons_sorted = sorted(buttons, key=attrgetter('app_type'))\n",
98
+ " button_groups = {k: list(g) for k, g in groupby(buttons_sorted, key=attrgetter('app_type'))}\n",
99
  " \n",
100
  " with gr.Blocks(css=css) as blocks:\n",
101
+ " with gr.Row():\n",
102
+ " # Create a column for each app_type\n",
103
+ " for app_type, type_buttons in button_groups.items():\n",
104
+ " with gr.Column():\n",
105
+ " gr.Markdown(f\"### {app_type}\")\n",
106
+ " for button_idx, button in enumerate(type_buttons):\n",
107
+ " btn = gr.Button(\n",
108
+ " value=button.label,\n",
109
+ " elem_id=f\"btn_{app_type}_{button_idx}\", # Make unique ID for each button\n",
110
+ " scale=1,\n",
111
+ " )\n",
112
+ " btn.click(\n",
113
+ " fn=None, \n",
114
+ " inputs=None, \n",
115
+ " outputs=None,\n",
116
+ " js=f\"() => {{ window.open('{button.link_url}', '_blank'); }}\"\n",
117
+ " )\n",
118
  " return blocks"
119
  ]
120
  },
121
  {
122
  "cell_type": "code",
123
  "execution_count": null,
124
+ "metadata": {
125
+ "vscode": {
126
+ "languageId": "python"
127
+ }
128
+ },
129
  "outputs": [],
130
  "source": [
131
  "# Example usage\n",
 
135
  {
136
  "cell_type": "code",
137
  "execution_count": null,
138
+ "metadata": {
139
+ "vscode": {
140
+ "languageId": "python"
141
+ }
142
+ },
143
  "outputs": [],
144
  "source": [
145
  "#| export\n",
 
157
  {
158
  "cell_type": "code",
159
  "execution_count": null,
160
+ "metadata": {
161
+ "vscode": {
162
+ "languageId": "python"
163
+ }
164
+ },
165
  "outputs": [],
166
  "source": [
167
  "#| hide\n",
test.ipynb ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 3,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "from app_starter_gui.css import generate_css\n",
10
+ "from app_starter_gui.core import Button, load_buttons"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": 4,
16
+ "metadata": {},
17
+ "outputs": [],
18
+ "source": [
19
+ "yaml_file = \"buttons.yaml\"\n",
20
+ "buttons = load_buttons(yaml_file)\n",
21
+ "css = generate_css(buttons)"
22
+ ]
23
+ },
24
+ {
25
+ "cell_type": "code",
26
+ "execution_count": 6,
27
+ "metadata": {},
28
+ "outputs": [
29
+ {
30
+ "name": "stdout",
31
+ "output_type": "stream",
32
+ "text": [
33
+ "\n",
34
+ " #btn1 { \n",
35
+ " height: 230px; /* Total height of button */\n",
36
+ " width: 200px;\n",
37
+ " border-radius: 15px;\n",
38
+ " display: flex;\n",
39
+ " flex-direction: column;\n",
40
+ " padding: 0;\n",
41
+ " margin: 0;\n",
42
+ " overflow: hidden;\n",
43
+ " transition: transform 0.2s, box-shadow 0.2s;\n",
44
+ " background: none;\n",
45
+ " }\n",
46
+ " \n",
47
+ " #btn1::before {\n",
48
+ " content: '';\n",
49
+ " height: 180px; /* Image height */\n",
50
+ " width: 100%;\n",
51
+ " background-size: cover;\n",
52
+ " background-position: center center;\n",
53
+ " background-repeat: no-repeat;\n",
54
+ " background-image: url('https://github.com/danielmiessler/fabric/blob/main/images/fabric-logo-gif.gif?raw=true');\n",
55
+ " transition: transform 0.2s;\n",
56
+ " margin: 0;\n",
57
+ " padding: 0;\n",
58
+ " display: block;\n",
59
+ " flex-shrink: 0;\n",
60
+ " position: relative;\n",
61
+ " top: 0;\n",
62
+ " border-radius: 15px 15px 0 0; /* Round top corners only */\n",
63
+ " }\n",
64
+ " \n",
65
+ " #btn1:hover {\n",
66
+ " transform: translateY(-5px);\n",
67
+ " box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n",
68
+ " }\n",
69
+ "\n",
70
+ " #btn1 > div {\n",
71
+ " height: 50px;\n",
72
+ " display: flex;\n",
73
+ " align-items: center;\n",
74
+ " justify-content: center;\n",
75
+ " }\n",
76
+ "\n",
77
+ " #btn1:hover::before {\n",
78
+ " transform: scale(1.05);\n",
79
+ " }\n",
80
+ " \n",
81
+ "\n",
82
+ " #btn2 { \n",
83
+ " height: 230px; /* Total height of button */\n",
84
+ " width: 200px;\n",
85
+ " border-radius: 15px;\n",
86
+ " display: flex;\n",
87
+ " flex-direction: column;\n",
88
+ " padding: 0;\n",
89
+ " margin: 0;\n",
90
+ " overflow: hidden;\n",
91
+ " transition: transform 0.2s, box-shadow 0.2s;\n",
92
+ " background: none;\n",
93
+ " }\n",
94
+ " \n",
95
+ " #btn2::before {\n",
96
+ " content: '';\n",
97
+ " height: 180px; /* Image height */\n",
98
+ " width: 100%;\n",
99
+ " background-size: cover;\n",
100
+ " background-position: center center;\n",
101
+ " background-repeat: no-repeat;\n",
102
+ " background-image: url('https://static1.srcdn.com/wordpress/wp-content/uploads/2020/06/Gloomhaven-Jaws-of-the-Lion-Hatchet.jpg');\n",
103
+ " transition: transform 0.2s;\n",
104
+ " margin: 0;\n",
105
+ " padding: 0;\n",
106
+ " display: block;\n",
107
+ " flex-shrink: 0;\n",
108
+ " position: relative;\n",
109
+ " top: 0;\n",
110
+ " border-radius: 15px 15px 0 0; /* Round top corners only */\n",
111
+ " }\n",
112
+ " \n",
113
+ " #btn2:hover {\n",
114
+ " transform: translateY(-5px);\n",
115
+ " box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n",
116
+ " }\n",
117
+ "\n",
118
+ " #btn2 > div {\n",
119
+ " height: 50px;\n",
120
+ " display: flex;\n",
121
+ " align-items: center;\n",
122
+ " justify-content: center;\n",
123
+ " }\n",
124
+ "\n",
125
+ " #btn2:hover::before {\n",
126
+ " transform: scale(1.05);\n",
127
+ " }\n",
128
+ " \n"
129
+ ]
130
+ }
131
+ ],
132
+ "source": [
133
+ "print(css)"
134
+ ]
135
+ }
136
+ ],
137
+ "metadata": {
138
+ "kernelspec": {
139
+ "display_name": ".venv",
140
+ "language": "python",
141
+ "name": "python3"
142
+ },
143
+ "language_info": {
144
+ "codemirror_mode": {
145
+ "name": "ipython",
146
+ "version": 3
147
+ },
148
+ "file_extension": ".py",
149
+ "mimetype": "text/x-python",
150
+ "name": "python",
151
+ "nbconvert_exporter": "python",
152
+ "pygments_lexer": "ipython3",
153
+ "version": "3.11.0rc1"
154
+ }
155
+ },
156
+ "nbformat": 4,
157
+ "nbformat_minor": 2
158
+ }