aliabid94 HF staff commited on
Commit
1c309ab
1 Parent(s): d12878b

Upload folder using huggingface_hub

Browse files
README.md CHANGED
@@ -1,9 +1,9 @@
1
 
2
  ---
3
  tags: [gradio-custom-component,gradio-template-Column,Modal, Popup]
4
- title: gradio_modal V0.0.1
5
- colorFrom: yellow
6
- colorTo: purple
7
  sdk: docker
8
  pinned: false
9
  license: apache-2.0
 
1
 
2
  ---
3
  tags: [gradio-custom-component,gradio-template-Column,Modal, Popup]
4
+ title: gradio_modal V0.0.2
5
+ colorFrom: gray
6
+ colorTo: indigo
7
  sdk: docker
8
  pinned: false
9
  license: apache-2.0
app.py CHANGED
@@ -17,4 +17,5 @@ with gr.Blocks() as demo:
17
  gr.Markdown("Hello world!")
18
  show_btn.click(lambda: Modal(visible=True), None, modal)
19
 
20
- demo.launch()
 
 
17
  gr.Markdown("Hello world!")
18
  show_btn.click(lambda: Modal(visible=True), None, modal)
19
 
20
+ if __name__ == "__main__":
21
+ demo.launch()
requirements.txt CHANGED
@@ -1 +1 @@
1
- gradio_modal==0.0.1
 
1
+ gradio_modal==0.0.2
space.py CHANGED
@@ -3,7 +3,7 @@ import gradio as gr
3
  from app import demo as app
4
  import os
5
 
6
- _docs = {'Modal': {'description': 'Modal is a layout element within Blocks that will show its content in a popup above other content.\n from gradio_modal import Modal\n with gr.Blocks() as demo:\n with Modal():\n text1 = gr.Textbox()\n text2 = gr.Textbox()\n btn = gr.Button("Button")', 'members': {'__init__': {'visible': {'type': 'bool', 'default': 'False', 'description': 'If False, column will be hidden.'}, 'elem_id': {'type': 'str | None', 'default': 'None', 'description': 'An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'elem_classes': {'type': 'list[str] | str | None', 'default': 'None', 'description': 'An optional string or list of strings that are assigned as the class of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'allow_user_close': {'type': 'bool', 'default': 'True', 'description': 'If True, user can close the modal (by clicking outside, clicking the X, or the escape key).'}, 'render': {'type': 'bool', 'default': 'True', 'description': 'If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.'}}, 'postprocess': {}}, 'events': {}}, '__meta__': {'additional_interfaces': {}}}
7
 
8
  abs_path = os.path.join(os.path.dirname(__file__), "css.css")
9
 
@@ -21,7 +21,7 @@ with gr.Blocks(
21
  # `gradio_modal`
22
 
23
  <div style="display: flex; gap: 7px;">
24
- <img alt="Static Badge" src="https://img.shields.io/badge/version%20-%200.0.1%20-%20orange">
25
  </div>
26
 
27
  A popup modal component
@@ -38,25 +38,25 @@ pip install gradio_modal
38
  ## Usage
39
 
40
  ```python
41
-
42
  import gradio as gr
43
  from gradio_modal import Modal
44
 
45
-
46
  with gr.Blocks() as demo:
47
- gr.Markdown("### Main Page")
48
- gr.Textbox("lorem ipsum " * 1000, lines=10)
49
-
50
- with Modal(visible=True) as modal:
51
- gr.Markdown("# License Agreement")
52
- gr.Textbox(value="This is the license agreement. Please read it carefully. " * 5, lines=12)
53
- close_btn = gr.Button("Close Modal")
54
- close_btn.click(lambda: Modal(visible=False), None, modal)
55
-
56
- show_btn = gr.Button("Show Modal")
 
 
 
57
  show_btn.click(lambda: Modal(visible=True), None, modal)
58
 
59
-
60
  if __name__ == "__main__":
61
  demo.launch()
62
 
@@ -73,6 +73,10 @@ if __name__ == "__main__":
73
  gr.ParamViewer(value=_docs["Modal"]["members"]["__init__"], linkify=[])
74
 
75
 
 
 
 
 
76
 
77
 
78
 
 
3
  from app import demo as app
4
  import os
5
 
6
+ _docs = {'Modal': {'description': 'Modal is a layout element within Blocks that will show its content in a popup above other content.\n from gradio_modal import Modal\n with gr.Blocks() as demo:\n with Modal():\n text1 = gr.Textbox()\n text2 = gr.Textbox()\n btn = gr.Button("Button")', 'members': {'__init__': {'visible': {'type': 'bool', 'default': 'False', 'description': 'If False, modal will be hidden.'}, 'elem_id': {'type': 'str | None', 'default': 'None', 'description': 'An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'elem_classes': {'type': 'list[str] | str | None', 'default': 'None', 'description': 'An optional string or list of strings that are assigned as the class of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'allow_user_close': {'type': 'bool', 'default': 'True', 'description': 'If True, user can close the modal (by clicking outside, clicking the X, or the escape key).'}, 'render': {'type': 'bool', 'default': 'True', 'description': 'If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.'}}, 'postprocess': {}}, 'events': {'blur': {'type': None, 'default': None, 'description': 'This listener is triggered when the Modal is unfocused/blurred.'}}}, '__meta__': {'additional_interfaces': {}}}
7
 
8
  abs_path = os.path.join(os.path.dirname(__file__), "css.css")
9
 
 
21
  # `gradio_modal`
22
 
23
  <div style="display: flex; gap: 7px;">
24
+ <a href="https://pypi.org/project/gradio_modal/" target="_blank"><img alt="PyPI - Version" src="https://img.shields.io/pypi/v/gradio_modal"></a>
25
  </div>
26
 
27
  A popup modal component
 
38
  ## Usage
39
 
40
  ```python
 
41
  import gradio as gr
42
  from gradio_modal import Modal
43
 
 
44
  with gr.Blocks() as demo:
45
+ with gr.Tab("Tab 1"):
46
+ text_1 = gr.Textbox(label="Input 1")
47
+ text_2 = gr.Textbox(label="Input 2")
48
+ text_1.submit(lambda x:x, text_1, text_2)
49
+ show_btn = gr.Button("Show Modal")
50
+ gr.Examples(
51
+ [["Text 1", "Text 2"], ["Text 3", "Text 4"]],
52
+ inputs=[text_1, text_2],
53
+ )
54
+ with gr.Tab("Tab 2"):
55
+ gr.Markdown("This is tab 2")
56
+ with Modal(visible=False) as modal:
57
+ gr.Markdown("Hello world!")
58
  show_btn.click(lambda: Modal(visible=True), None, modal)
59
 
 
60
  if __name__ == "__main__":
61
  demo.launch()
62
 
 
73
  gr.ParamViewer(value=_docs["Modal"]["members"]["__init__"], linkify=[])
74
 
75
 
76
+ gr.Markdown("### Events")
77
+ gr.ParamViewer(value=_docs["Modal"]["events"], linkify=['Event'])
78
+
79
+
80
 
81
 
82
 
src/README.md CHANGED
@@ -1,6 +1,6 @@
1
 
2
  # `gradio_modal`
3
- <img alt="Static Badge" src="https://img.shields.io/badge/version%20-%200.0.1%20-%20orange">
4
 
5
  A popup modal component
6
 
@@ -13,25 +13,25 @@ pip install gradio_modal
13
  ## Usage
14
 
15
  ```python
16
-
17
  import gradio as gr
18
  from gradio_modal import Modal
19
 
20
-
21
  with gr.Blocks() as demo:
22
- gr.Markdown("### Main Page")
23
- gr.Textbox("lorem ipsum " * 1000, lines=10)
24
-
25
- with Modal(visible=True) as modal:
26
- gr.Markdown("# License Agreement")
27
- gr.Textbox(value="This is the license agreement. Please read it carefully. " * 5, lines=12)
28
- close_btn = gr.Button("Close Modal")
29
- close_btn.click(lambda: Modal(visible=False), None, modal)
30
-
31
- show_btn = gr.Button("Show Modal")
 
 
 
32
  show_btn.click(lambda: Modal(visible=True), None, modal)
33
 
34
-
35
  if __name__ == "__main__":
36
  demo.launch()
37
 
@@ -61,7 +61,7 @@ bool
61
 
62
  </td>
63
  <td align="left"><code>False</code></td>
64
- <td align="left">If False, column will be hidden.</td>
65
  </tr>
66
 
67
  <tr>
@@ -118,5 +118,11 @@ bool
118
  </tbody></table>
119
 
120
 
 
 
 
 
 
 
121
 
122
 
 
1
 
2
  # `gradio_modal`
3
+ <a href="https://pypi.org/project/gradio_modal/" target="_blank"><img alt="PyPI - Version" src="https://img.shields.io/pypi/v/gradio_modal"></a>
4
 
5
  A popup modal component
6
 
 
13
  ## Usage
14
 
15
  ```python
 
16
  import gradio as gr
17
  from gradio_modal import Modal
18
 
 
19
  with gr.Blocks() as demo:
20
+ with gr.Tab("Tab 1"):
21
+ text_1 = gr.Textbox(label="Input 1")
22
+ text_2 = gr.Textbox(label="Input 2")
23
+ text_1.submit(lambda x:x, text_1, text_2)
24
+ show_btn = gr.Button("Show Modal")
25
+ gr.Examples(
26
+ [["Text 1", "Text 2"], ["Text 3", "Text 4"]],
27
+ inputs=[text_1, text_2],
28
+ )
29
+ with gr.Tab("Tab 2"):
30
+ gr.Markdown("This is tab 2")
31
+ with Modal(visible=False) as modal:
32
+ gr.Markdown("Hello world!")
33
  show_btn.click(lambda: Modal(visible=True), None, modal)
34
 
 
35
  if __name__ == "__main__":
36
  demo.launch()
37
 
 
61
 
62
  </td>
63
  <td align="left"><code>False</code></td>
64
+ <td align="left">If False, modal will be hidden.</td>
65
  </tr>
66
 
67
  <tr>
 
118
  </tbody></table>
119
 
120
 
121
+ ### Events
122
+
123
+ | name | description |
124
+ |:-----|:------------|
125
+ | `blur` | This listener is triggered when the Modal is unfocused/blurred. |
126
+
127
 
128
 
src/backend/gradio_modal/templates/component/index.js CHANGED
@@ -11,8 +11,8 @@ const {
11
  insert: ee,
12
  safe_not_equal: le,
13
  set_dynamic_element_data: z,
14
- set_style: u,
15
- toggle_class: b,
16
  transition_in: U,
17
  transition_out: F,
18
  update_slot_base: te
@@ -53,24 +53,24 @@ function fe(f) {
53
  ), i && i.c(), z(
54
  /*tag*/
55
  f[14]
56
- )(e, s), b(
57
  e,
58
  "hidden",
59
  /*visible*/
60
  f[10] === !1
61
- ), b(
62
  e,
63
  "padded",
64
  /*padding*/
65
  f[6]
66
- ), b(
67
  e,
68
  "border_focus",
69
  /*border_mode*/
70
  f[5] === "focus"
71
- ), b(e, "hide-container", !/*explicit_call*/
72
  f[8] && !/*container*/
73
- f[9]), u(
74
  e,
75
  "height",
76
  /*get_dimension*/
@@ -78,7 +78,7 @@ function fe(f) {
78
  /*height*/
79
  f[0]
80
  )
81
- ), u(e, "width", typeof /*width*/
82
  f[1] == "number" ? `calc(min(${/*width*/
83
  f[1]}px, 100%))` : (
84
  /*get_dimension*/
@@ -86,23 +86,23 @@ function fe(f) {
86
  /*width*/
87
  f[1]
88
  )
89
- )), u(
90
  e,
91
  "border-style",
92
  /*variant*/
93
  f[4]
94
- ), u(
95
  e,
96
  "overflow",
97
  /*allow_overflow*/
98
  f[11] ? "visible" : "hidden"
99
- ), u(
100
  e,
101
  "flex-grow",
102
  /*scale*/
103
  f[12]
104
- ), u(e, "min-width", `calc(min(${/*min_width*/
105
- f[13]}px, 100%))`), u(e, "border-width", "var(--block-border-width)");
106
  },
107
  m(t, o) {
108
  ee(t, e, o), i && i.m(e, null), a = !0;
@@ -143,25 +143,25 @@ function fe(f) {
143
  (!a || o & /*elem_classes*/
144
  8 && l !== (l = "block " + /*elem_classes*/
145
  t[3].join(" ") + " svelte-1t38q2d")) && { class: l }
146
- ])), b(
147
  e,
148
  "hidden",
149
  /*visible*/
150
  t[10] === !1
151
- ), b(
152
  e,
153
  "padded",
154
  /*padding*/
155
  t[6]
156
- ), b(
157
  e,
158
  "border_focus",
159
  /*border_mode*/
160
  t[5] === "focus"
161
- ), b(e, "hide-container", !/*explicit_call*/
162
  t[8] && !/*container*/
163
  t[9]), o & /*height*/
164
- 1 && u(
165
  e,
166
  "height",
167
  /*get_dimension*/
@@ -170,7 +170,7 @@ function fe(f) {
170
  t[0]
171
  )
172
  ), o & /*width*/
173
- 2 && u(e, "width", typeof /*width*/
174
  t[1] == "number" ? `calc(min(${/*width*/
175
  t[1]}px, 100%))` : (
176
  /*get_dimension*/
@@ -179,25 +179,25 @@ function fe(f) {
179
  t[1]
180
  )
181
  )), o & /*variant*/
182
- 16 && u(
183
  e,
184
  "border-style",
185
  /*variant*/
186
  t[4]
187
  ), o & /*allow_overflow*/
188
- 2048 && u(
189
  e,
190
  "overflow",
191
  /*allow_overflow*/
192
  t[11] ? "visible" : "hidden"
193
  ), o & /*scale*/
194
- 4096 && u(
195
  e,
196
  "flex-grow",
197
  /*scale*/
198
  t[12]
199
  ), o & /*min_width*/
200
- 8192 && u(e, "min-width", `calc(min(${/*min_width*/
201
  t[13]}px, 100%))`);
202
  },
203
  i(t) {
@@ -239,7 +239,7 @@ function ne(f) {
239
  };
240
  }
241
  function ae(f, e, l) {
242
- let { $$slots: a = {}, $$scope: n } = e, { height: i = void 0 } = e, { width: d = void 0 } = e, { elem_id: s = "" } = e, { elem_classes: t = [] } = e, { variant: o = "solid" } = e, { border_mode: m = "base" } = e, { padding: h = !0 } = e, { type: c = "normal" } = e, { test_id: r = void 0 } = e, { explicit_call: S = !1 } = e, { container: B = !0 } = e, { visible: L = !0 } = e, { allow_overflow: T = !0 } = e, { scale: E = null } = e, { min_width: M = 0 } = e, P = c === "fieldset" ? "fieldset" : "div";
243
  const Q = (_) => {
244
  if (_ !== void 0) {
245
  if (typeof _ == "number")
@@ -249,17 +249,17 @@ function ae(f, e, l) {
249
  }
250
  };
251
  return f.$$set = (_) => {
252
- "height" in _ && l(0, i = _.height), "width" in _ && l(1, d = _.width), "elem_id" in _ && l(2, s = _.elem_id), "elem_classes" in _ && l(3, t = _.elem_classes), "variant" in _ && l(4, o = _.variant), "border_mode" in _ && l(5, m = _.border_mode), "padding" in _ && l(6, h = _.padding), "type" in _ && l(16, c = _.type), "test_id" in _ && l(7, r = _.test_id), "explicit_call" in _ && l(8, S = _.explicit_call), "container" in _ && l(9, B = _.container), "visible" in _ && l(10, L = _.visible), "allow_overflow" in _ && l(11, T = _.allow_overflow), "scale" in _ && l(12, E = _.scale), "min_width" in _ && l(13, M = _.min_width), "$$scope" in _ && l(17, n = _.$$scope);
253
  }, [
254
  i,
255
  d,
256
  s,
257
  t,
258
  o,
259
- m,
260
- h,
 
261
  r,
262
- S,
263
  B,
264
  L,
265
  T,
@@ -609,7 +609,7 @@ se.reduce(
609
  );
610
  const {
611
  SvelteComponent: _e,
612
- attr: w,
613
  create_slot: de,
614
  detach: oe,
615
  element: ce,
@@ -619,8 +619,8 @@ const {
619
  insert: be,
620
  null_to_empty: D,
621
  safe_not_equal: ge,
622
- set_style: y,
623
- toggle_class: g,
624
  transition_in: he,
625
  transition_out: ve,
626
  update_slot_base: we
@@ -640,36 +640,36 @@ function ye(f) {
640
  );
641
  return {
642
  c() {
643
- e = ce("div"), d && d.c(), w(
644
  e,
645
  "id",
646
  /*elem_id*/
647
  f[3]
648
- ), w(e, "class", l = D(
649
  /*elem_classes*/
650
  f[4].join(" ")
651
- ) + " svelte-1m1obck"), g(
652
  e,
653
  "gap",
654
  /*gap*/
655
  f[1]
656
- ), g(
657
  e,
658
  "compact",
659
  /*variant*/
660
  f[6] === "compact"
661
- ), g(
662
  e,
663
  "panel",
664
  /*variant*/
665
  f[6] === "panel"
666
- ), g(e, "hide", !/*visible*/
667
- f[5]), y(
668
  e,
669
  "flex-grow",
670
  /*scale*/
671
  f[0]
672
- ), y(e, "min-width", a);
673
  },
674
  m(s, t) {
675
  be(s, e, t), d && d.m(e, null), n = !0;
@@ -694,7 +694,7 @@ function ye(f) {
694
  ),
695
  null
696
  ), (!n || t & /*elem_id*/
697
- 8) && w(
698
  e,
699
  "id",
700
  /*elem_id*/
@@ -703,35 +703,35 @@ function ye(f) {
703
  16 && l !== (l = D(
704
  /*elem_classes*/
705
  s[4].join(" ")
706
- ) + " svelte-1m1obck")) && w(e, "class", l), (!n || t & /*elem_classes, gap*/
707
- 18) && g(
708
  e,
709
  "gap",
710
  /*gap*/
711
  s[1]
712
  ), (!n || t & /*elem_classes, variant*/
713
- 80) && g(
714
  e,
715
  "compact",
716
  /*variant*/
717
  s[6] === "compact"
718
  ), (!n || t & /*elem_classes, variant*/
719
- 80) && g(
720
  e,
721
  "panel",
722
  /*variant*/
723
  s[6] === "panel"
724
  ), (!n || t & /*elem_classes, visible*/
725
- 48) && g(e, "hide", !/*visible*/
726
  s[5]), t & /*scale*/
727
- 1 && y(
728
  e,
729
  "flex-grow",
730
  /*scale*/
731
  s[0]
732
  ), t & /*min_width*/
733
  4 && a !== (a = `calc(min(${/*min_width*/
734
- s[2]}px, 100%))`) && y(e, "min-width", a);
735
  },
736
  i(s) {
737
  n || (he(d, s), n = !0);
@@ -745,10 +745,10 @@ function ye(f) {
745
  };
746
  }
747
  function ke(f, e, l) {
748
- let { $$slots: a = {}, $$scope: n } = e, { scale: i = null } = e, { gap: d = !0 } = e, { min_width: s = 0 } = e, { elem_id: t = "" } = e, { elem_classes: o = [] } = e, { visible: m = !0 } = e, { variant: h = "default" } = e;
749
  return f.$$set = (c) => {
750
- "scale" in c && l(0, i = c.scale), "gap" in c && l(1, d = c.gap), "min_width" in c && l(2, s = c.min_width), "elem_id" in c && l(3, t = c.elem_id), "elem_classes" in c && l(4, o = c.elem_classes), "visible" in c && l(5, m = c.visible), "variant" in c && l(6, h = c.variant), "$$scope" in c && l(7, n = c.$$scope);
751
- }, [i, d, s, t, o, m, h, n, a];
752
  }
753
  let je = class extends _e {
754
  constructor(e) {
@@ -771,39 +771,39 @@ const {
771
  create_component: G,
772
  create_slot: Se,
773
  destroy_component: J,
774
- detach: j,
775
- element: k,
776
  get_all_dirty_from_scope: Be,
777
  get_slot_changes: Le,
778
  init: Te,
779
- insert: C,
780
  listen: K,
781
  mount_component: O,
782
  noop: Ee,
783
  safe_not_equal: Me,
784
  space: ze,
785
  toggle_class: H,
786
- transition_in: q,
787
- transition_out: I,
788
  update_slot_base: Ae
789
  } = window.__gradio__svelte__internal;
790
  function N(f) {
791
  let e, l, a;
792
  return {
793
  c() {
794
- e = k("div"), e.innerHTML = '<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L9 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9 1L1 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>', v(e, "class", "close svelte-ra5mg6");
795
  },
796
  m(n, i) {
797
- C(n, e, i), l || (a = K(
798
  e,
799
  "click",
800
- /*click_handler*/
801
- f[6]
802
  ), l = !0);
803
  },
804
  p: Ee,
805
  d(n) {
806
- n && j(e), l = !1, a();
807
  }
808
  };
809
  }
@@ -811,12 +811,12 @@ function De(f) {
811
  let e;
812
  const l = (
813
  /*#slots*/
814
- f[5].default
815
  ), a = Se(
816
  l,
817
  f,
818
  /*$$scope*/
819
- f[9],
820
  null
821
  );
822
  return {
@@ -828,30 +828,30 @@ function De(f) {
828
  },
829
  p(n, i) {
830
  a && a.p && (!e || i & /*$$scope*/
831
- 512) && Ae(
832
  a,
833
  l,
834
  n,
835
  /*$$scope*/
836
- n[9],
837
  e ? Le(
838
  l,
839
  /*$$scope*/
840
- n[9],
841
  i,
842
  null
843
  ) : Be(
844
  /*$$scope*/
845
- n[9]
846
  ),
847
  null
848
  );
849
  },
850
  i(n) {
851
- e || (q(a, n), e = !0);
852
  },
853
  o(n) {
854
- I(a, n), e = !1;
855
  },
856
  d(n) {
857
  a && a.d(n);
@@ -873,23 +873,23 @@ function He(f) {
873
  n && n.c(), e = ze(), G(l.$$.fragment);
874
  },
875
  m(i, d) {
876
- n && n.m(i, d), C(i, e, d), O(l, i, d), a = !0;
877
  },
878
  p(i, d) {
879
  /*allow_user_close*/
880
  i[3] ? n ? n.p(i, d) : (n = N(i), n.c(), n.m(e.parentNode, e)) : n && (n.d(1), n = null);
881
  const s = {};
882
  d & /*$$scope*/
883
- 512 && (s.$$scope = { dirty: d, ctx: i }), l.$set(s);
884
  },
885
  i(i) {
886
- a || (q(l.$$.fragment, i), a = !0);
887
  },
888
  o(i) {
889
- I(l.$$.fragment, i), a = !1;
890
  },
891
  d(i) {
892
- i && j(e), n && n.d(i), J(l, i);
893
  }
894
  };
895
  }
@@ -903,7 +903,7 @@ function Ne(f) {
903
  }
904
  }), {
905
  c() {
906
- e = k("div"), l = k("div"), G(a.$$.fragment), v(l, "class", "modal-container svelte-ra5mg6"), v(e, "class", n = "modal " + /*elem_classes*/
907
  f[2].join(" ") + " svelte-ra5mg6"), v(
908
  e,
909
  "id",
@@ -913,17 +913,17 @@ function Ne(f) {
913
  f[0]);
914
  },
915
  m(t, o) {
916
- C(t, e, o), qe(e, l), O(a, l, null), f[7](e), i = !0, d || (s = K(
917
  e,
918
  "click",
919
- /*click_handler_1*/
920
- f[8]
921
  ), d = !0);
922
  },
923
  p(t, [o]) {
924
- const m = {};
925
- o & /*$$scope, visible, allow_user_close*/
926
- 521 && (m.$$scope = { dirty: o, ctx: t }), a.$set(m), (!i || o & /*elem_classes*/
927
  4 && n !== (n = "modal " + /*elem_classes*/
928
  t[2].join(" ") + " svelte-ra5mg6")) && v(e, "class", n), (!i || o & /*elem_id*/
929
  2) && v(
@@ -936,42 +936,45 @@ function Ne(f) {
936
  t[0]);
937
  },
938
  i(t) {
939
- i || (q(a.$$.fragment, t), i = !0);
940
  },
941
  o(t) {
942
- I(a.$$.fragment, t), i = !1;
943
  },
944
  d(t) {
945
- t && j(e), J(a), f[7](null), d = !1, s();
946
  }
947
  };
948
  }
949
  function Ue(f, e, l) {
950
- let { $$slots: a = {}, $$scope: n } = e, { elem_id: i = "" } = e, { elem_classes: d = [] } = e, { visible: s = !1 } = e, { allow_user_close: t = !0 } = e, o = null;
 
 
 
951
  document.addEventListener("keydown", (r) => {
952
- t && r.key === "Escape" && l(0, s = !1);
953
  });
954
- const m = () => l(0, s = !1);
955
- function h(r) {
956
  Ie[r ? "unshift" : "push"](() => {
957
- o = r, l(4, o);
958
  });
959
  }
960
- const c = (r) => {
961
- t && r.target === o && l(0, s = !1);
962
  };
963
  return f.$$set = (r) => {
964
- "elem_id" in r && l(1, i = r.elem_id), "elem_classes" in r && l(2, d = r.elem_classes), "visible" in r && l(0, s = r.visible), "allow_user_close" in r && l(3, t = r.allow_user_close), "$$scope" in r && l(9, n = r.$$scope);
965
  }, [
966
  s,
967
  i,
968
  d,
969
  t,
 
 
970
  o,
971
  a,
972
- m,
973
- h,
974
  c,
 
975
  n
976
  ];
977
  }
@@ -981,7 +984,8 @@ class Ge extends Ce {
981
  elem_id: 1,
982
  elem_classes: 2,
983
  visible: 0,
984
- allow_user_close: 3
 
985
  });
986
  }
987
  }
 
11
  insert: ee,
12
  safe_not_equal: le,
13
  set_dynamic_element_data: z,
14
+ set_style: m,
15
+ toggle_class: g,
16
  transition_in: U,
17
  transition_out: F,
18
  update_slot_base: te
 
53
  ), i && i.c(), z(
54
  /*tag*/
55
  f[14]
56
+ )(e, s), g(
57
  e,
58
  "hidden",
59
  /*visible*/
60
  f[10] === !1
61
+ ), g(
62
  e,
63
  "padded",
64
  /*padding*/
65
  f[6]
66
+ ), g(
67
  e,
68
  "border_focus",
69
  /*border_mode*/
70
  f[5] === "focus"
71
+ ), g(e, "hide-container", !/*explicit_call*/
72
  f[8] && !/*container*/
73
+ f[9]), m(
74
  e,
75
  "height",
76
  /*get_dimension*/
 
78
  /*height*/
79
  f[0]
80
  )
81
+ ), m(e, "width", typeof /*width*/
82
  f[1] == "number" ? `calc(min(${/*width*/
83
  f[1]}px, 100%))` : (
84
  /*get_dimension*/
 
86
  /*width*/
87
  f[1]
88
  )
89
+ )), m(
90
  e,
91
  "border-style",
92
  /*variant*/
93
  f[4]
94
+ ), m(
95
  e,
96
  "overflow",
97
  /*allow_overflow*/
98
  f[11] ? "visible" : "hidden"
99
+ ), m(
100
  e,
101
  "flex-grow",
102
  /*scale*/
103
  f[12]
104
+ ), m(e, "min-width", `calc(min(${/*min_width*/
105
+ f[13]}px, 100%))`), m(e, "border-width", "var(--block-border-width)");
106
  },
107
  m(t, o) {
108
  ee(t, e, o), i && i.m(e, null), a = !0;
 
143
  (!a || o & /*elem_classes*/
144
  8 && l !== (l = "block " + /*elem_classes*/
145
  t[3].join(" ") + " svelte-1t38q2d")) && { class: l }
146
+ ])), g(
147
  e,
148
  "hidden",
149
  /*visible*/
150
  t[10] === !1
151
+ ), g(
152
  e,
153
  "padded",
154
  /*padding*/
155
  t[6]
156
+ ), g(
157
  e,
158
  "border_focus",
159
  /*border_mode*/
160
  t[5] === "focus"
161
+ ), g(e, "hide-container", !/*explicit_call*/
162
  t[8] && !/*container*/
163
  t[9]), o & /*height*/
164
+ 1 && m(
165
  e,
166
  "height",
167
  /*get_dimension*/
 
170
  t[0]
171
  )
172
  ), o & /*width*/
173
+ 2 && m(e, "width", typeof /*width*/
174
  t[1] == "number" ? `calc(min(${/*width*/
175
  t[1]}px, 100%))` : (
176
  /*get_dimension*/
 
179
  t[1]
180
  )
181
  )), o & /*variant*/
182
+ 16 && m(
183
  e,
184
  "border-style",
185
  /*variant*/
186
  t[4]
187
  ), o & /*allow_overflow*/
188
+ 2048 && m(
189
  e,
190
  "overflow",
191
  /*allow_overflow*/
192
  t[11] ? "visible" : "hidden"
193
  ), o & /*scale*/
194
+ 4096 && m(
195
  e,
196
  "flex-grow",
197
  /*scale*/
198
  t[12]
199
  ), o & /*min_width*/
200
+ 8192 && m(e, "min-width", `calc(min(${/*min_width*/
201
  t[13]}px, 100%))`);
202
  },
203
  i(t) {
 
239
  };
240
  }
241
  function ae(f, e, l) {
242
+ let { $$slots: a = {}, $$scope: n } = e, { height: i = void 0 } = e, { width: d = void 0 } = e, { elem_id: s = "" } = e, { elem_classes: t = [] } = e, { variant: o = "solid" } = e, { border_mode: u = "base" } = e, { padding: b = !0 } = e, { type: c = "normal" } = e, { test_id: w = void 0 } = e, { explicit_call: r = !1 } = e, { container: B = !0 } = e, { visible: L = !0 } = e, { allow_overflow: T = !0 } = e, { scale: E = null } = e, { min_width: M = 0 } = e, P = c === "fieldset" ? "fieldset" : "div";
243
  const Q = (_) => {
244
  if (_ !== void 0) {
245
  if (typeof _ == "number")
 
249
  }
250
  };
251
  return f.$$set = (_) => {
252
+ "height" in _ && l(0, i = _.height), "width" in _ && l(1, d = _.width), "elem_id" in _ && l(2, s = _.elem_id), "elem_classes" in _ && l(3, t = _.elem_classes), "variant" in _ && l(4, o = _.variant), "border_mode" in _ && l(5, u = _.border_mode), "padding" in _ && l(6, b = _.padding), "type" in _ && l(16, c = _.type), "test_id" in _ && l(7, w = _.test_id), "explicit_call" in _ && l(8, r = _.explicit_call), "container" in _ && l(9, B = _.container), "visible" in _ && l(10, L = _.visible), "allow_overflow" in _ && l(11, T = _.allow_overflow), "scale" in _ && l(12, E = _.scale), "min_width" in _ && l(13, M = _.min_width), "$$scope" in _ && l(17, n = _.$$scope);
253
  }, [
254
  i,
255
  d,
256
  s,
257
  t,
258
  o,
259
+ u,
260
+ b,
261
+ w,
262
  r,
 
263
  B,
264
  L,
265
  T,
 
609
  );
610
  const {
611
  SvelteComponent: _e,
612
+ attr: y,
613
  create_slot: de,
614
  detach: oe,
615
  element: ce,
 
619
  insert: be,
620
  null_to_empty: D,
621
  safe_not_equal: ge,
622
+ set_style: k,
623
+ toggle_class: h,
624
  transition_in: he,
625
  transition_out: ve,
626
  update_slot_base: we
 
640
  );
641
  return {
642
  c() {
643
+ e = ce("div"), d && d.c(), y(
644
  e,
645
  "id",
646
  /*elem_id*/
647
  f[3]
648
+ ), y(e, "class", l = D(
649
  /*elem_classes*/
650
  f[4].join(" ")
651
+ ) + " svelte-1m1obck"), h(
652
  e,
653
  "gap",
654
  /*gap*/
655
  f[1]
656
+ ), h(
657
  e,
658
  "compact",
659
  /*variant*/
660
  f[6] === "compact"
661
+ ), h(
662
  e,
663
  "panel",
664
  /*variant*/
665
  f[6] === "panel"
666
+ ), h(e, "hide", !/*visible*/
667
+ f[5]), k(
668
  e,
669
  "flex-grow",
670
  /*scale*/
671
  f[0]
672
+ ), k(e, "min-width", a);
673
  },
674
  m(s, t) {
675
  be(s, e, t), d && d.m(e, null), n = !0;
 
694
  ),
695
  null
696
  ), (!n || t & /*elem_id*/
697
+ 8) && y(
698
  e,
699
  "id",
700
  /*elem_id*/
 
703
  16 && l !== (l = D(
704
  /*elem_classes*/
705
  s[4].join(" ")
706
+ ) + " svelte-1m1obck")) && y(e, "class", l), (!n || t & /*elem_classes, gap*/
707
+ 18) && h(
708
  e,
709
  "gap",
710
  /*gap*/
711
  s[1]
712
  ), (!n || t & /*elem_classes, variant*/
713
+ 80) && h(
714
  e,
715
  "compact",
716
  /*variant*/
717
  s[6] === "compact"
718
  ), (!n || t & /*elem_classes, variant*/
719
+ 80) && h(
720
  e,
721
  "panel",
722
  /*variant*/
723
  s[6] === "panel"
724
  ), (!n || t & /*elem_classes, visible*/
725
+ 48) && h(e, "hide", !/*visible*/
726
  s[5]), t & /*scale*/
727
+ 1 && k(
728
  e,
729
  "flex-grow",
730
  /*scale*/
731
  s[0]
732
  ), t & /*min_width*/
733
  4 && a !== (a = `calc(min(${/*min_width*/
734
+ s[2]}px, 100%))`) && k(e, "min-width", a);
735
  },
736
  i(s) {
737
  n || (he(d, s), n = !0);
 
745
  };
746
  }
747
  function ke(f, e, l) {
748
+ let { $$slots: a = {}, $$scope: n } = e, { scale: i = null } = e, { gap: d = !0 } = e, { min_width: s = 0 } = e, { elem_id: t = "" } = e, { elem_classes: o = [] } = e, { visible: u = !0 } = e, { variant: b = "default" } = e;
749
  return f.$$set = (c) => {
750
+ "scale" in c && l(0, i = c.scale), "gap" in c && l(1, d = c.gap), "min_width" in c && l(2, s = c.min_width), "elem_id" in c && l(3, t = c.elem_id), "elem_classes" in c && l(4, o = c.elem_classes), "visible" in c && l(5, u = c.visible), "variant" in c && l(6, b = c.variant), "$$scope" in c && l(7, n = c.$$scope);
751
+ }, [i, d, s, t, o, u, b, n, a];
752
  }
753
  let je = class extends _e {
754
  constructor(e) {
 
771
  create_component: G,
772
  create_slot: Se,
773
  destroy_component: J,
774
+ detach: C,
775
+ element: j,
776
  get_all_dirty_from_scope: Be,
777
  get_slot_changes: Le,
778
  init: Te,
779
+ insert: q,
780
  listen: K,
781
  mount_component: O,
782
  noop: Ee,
783
  safe_not_equal: Me,
784
  space: ze,
785
  toggle_class: H,
786
+ transition_in: I,
787
+ transition_out: S,
788
  update_slot_base: Ae
789
  } = window.__gradio__svelte__internal;
790
  function N(f) {
791
  let e, l, a;
792
  return {
793
  c() {
794
+ e = j("div"), e.innerHTML = '<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L9 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9 1L1 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>', v(e, "class", "close svelte-ra5mg6");
795
  },
796
  m(n, i) {
797
+ q(n, e, i), l || (a = K(
798
  e,
799
  "click",
800
+ /*close*/
801
+ f[5]
802
  ), l = !0);
803
  },
804
  p: Ee,
805
  d(n) {
806
+ n && C(e), l = !1, a();
807
  }
808
  };
809
  }
 
811
  let e;
812
  const l = (
813
  /*#slots*/
814
+ f[7].default
815
  ), a = Se(
816
  l,
817
  f,
818
  /*$$scope*/
819
+ f[10],
820
  null
821
  );
822
  return {
 
828
  },
829
  p(n, i) {
830
  a && a.p && (!e || i & /*$$scope*/
831
+ 1024) && Ae(
832
  a,
833
  l,
834
  n,
835
  /*$$scope*/
836
+ n[10],
837
  e ? Le(
838
  l,
839
  /*$$scope*/
840
+ n[10],
841
  i,
842
  null
843
  ) : Be(
844
  /*$$scope*/
845
+ n[10]
846
  ),
847
  null
848
  );
849
  },
850
  i(n) {
851
+ e || (I(a, n), e = !0);
852
  },
853
  o(n) {
854
+ S(a, n), e = !1;
855
  },
856
  d(n) {
857
  a && a.d(n);
 
873
  n && n.c(), e = ze(), G(l.$$.fragment);
874
  },
875
  m(i, d) {
876
+ n && n.m(i, d), q(i, e, d), O(l, i, d), a = !0;
877
  },
878
  p(i, d) {
879
  /*allow_user_close*/
880
  i[3] ? n ? n.p(i, d) : (n = N(i), n.c(), n.m(e.parentNode, e)) : n && (n.d(1), n = null);
881
  const s = {};
882
  d & /*$$scope*/
883
+ 1024 && (s.$$scope = { dirty: d, ctx: i }), l.$set(s);
884
  },
885
  i(i) {
886
+ a || (I(l.$$.fragment, i), a = !0);
887
  },
888
  o(i) {
889
+ S(l.$$.fragment, i), a = !1;
890
  },
891
  d(i) {
892
+ i && C(e), n && n.d(i), J(l, i);
893
  }
894
  };
895
  }
 
903
  }
904
  }), {
905
  c() {
906
+ e = j("div"), l = j("div"), G(a.$$.fragment), v(l, "class", "modal-container svelte-ra5mg6"), v(e, "class", n = "modal " + /*elem_classes*/
907
  f[2].join(" ") + " svelte-ra5mg6"), v(
908
  e,
909
  "id",
 
913
  f[0]);
914
  },
915
  m(t, o) {
916
+ q(t, e, o), qe(e, l), O(a, l, null), f[8](e), i = !0, d || (s = K(
917
  e,
918
  "click",
919
+ /*click_handler*/
920
+ f[9]
921
  ), d = !0);
922
  },
923
  p(t, [o]) {
924
+ const u = {};
925
+ o & /*$$scope, allow_user_close*/
926
+ 1032 && (u.$$scope = { dirty: o, ctx: t }), a.$set(u), (!i || o & /*elem_classes*/
927
  4 && n !== (n = "modal " + /*elem_classes*/
928
  t[2].join(" ") + " svelte-ra5mg6")) && v(e, "class", n), (!i || o & /*elem_id*/
929
  2) && v(
 
936
  t[0]);
937
  },
938
  i(t) {
939
+ i || (I(a.$$.fragment, t), i = !0);
940
  },
941
  o(t) {
942
+ S(a.$$.fragment, t), i = !1;
943
  },
944
  d(t) {
945
+ t && C(e), J(a), f[8](null), d = !1, s();
946
  }
947
  };
948
  }
949
  function Ue(f, e, l) {
950
+ let { $$slots: a = {}, $$scope: n } = e, { elem_id: i = "" } = e, { elem_classes: d = [] } = e, { visible: s = !1 } = e, { allow_user_close: t = !0 } = e, { gradio: o } = e, u = null;
951
+ const b = () => {
952
+ l(0, s = !1), o.dispatch("blur");
953
+ };
954
  document.addEventListener("keydown", (r) => {
955
+ t && r.key === "Escape" && b();
956
  });
957
+ function c(r) {
 
958
  Ie[r ? "unshift" : "push"](() => {
959
+ u = r, l(4, u);
960
  });
961
  }
962
+ const w = (r) => {
963
+ t && r.target === u && b();
964
  };
965
  return f.$$set = (r) => {
966
+ "elem_id" in r && l(1, i = r.elem_id), "elem_classes" in r && l(2, d = r.elem_classes), "visible" in r && l(0, s = r.visible), "allow_user_close" in r && l(3, t = r.allow_user_close), "gradio" in r && l(6, o = r.gradio), "$$scope" in r && l(10, n = r.$$scope);
967
  }, [
968
  s,
969
  i,
970
  d,
971
  t,
972
+ u,
973
+ b,
974
  o,
975
  a,
 
 
976
  c,
977
+ w,
978
  n
979
  ];
980
  }
 
984
  elem_id: 1,
985
  elem_classes: 2,
986
  visible: 0,
987
+ allow_user_close: 3,
988
+ gradio: 6
989
  });
990
  }
991
  }
src/demo/app.py CHANGED
@@ -17,4 +17,5 @@ with gr.Blocks() as demo:
17
  gr.Markdown("Hello world!")
18
  show_btn.click(lambda: Modal(visible=True), None, modal)
19
 
20
- demo.launch()
 
 
17
  gr.Markdown("Hello world!")
18
  show_btn.click(lambda: Modal(visible=True), None, modal)
19
 
20
+ if __name__ == "__main__":
21
+ demo.launch()
src/demo/space.py CHANGED
@@ -3,7 +3,7 @@ import gradio as gr
3
  from app import demo as app
4
  import os
5
 
6
- _docs = {'Modal': {'description': 'Modal is a layout element within Blocks that will show its content in a popup above other content.\n from gradio_modal import Modal\n with gr.Blocks() as demo:\n with Modal():\n text1 = gr.Textbox()\n text2 = gr.Textbox()\n btn = gr.Button("Button")', 'members': {'__init__': {'visible': {'type': 'bool', 'default': 'False', 'description': 'If False, column will be hidden.'}, 'elem_id': {'type': 'str | None', 'default': 'None', 'description': 'An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'elem_classes': {'type': 'list[str] | str | None', 'default': 'None', 'description': 'An optional string or list of strings that are assigned as the class of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'allow_user_close': {'type': 'bool', 'default': 'True', 'description': 'If True, user can close the modal (by clicking outside, clicking the X, or the escape key).'}, 'render': {'type': 'bool', 'default': 'True', 'description': 'If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.'}}, 'postprocess': {}}, 'events': {}}, '__meta__': {'additional_interfaces': {}}}
7
 
8
  abs_path = os.path.join(os.path.dirname(__file__), "css.css")
9
 
@@ -21,7 +21,7 @@ with gr.Blocks(
21
  # `gradio_modal`
22
 
23
  <div style="display: flex; gap: 7px;">
24
- <img alt="Static Badge" src="https://img.shields.io/badge/version%20-%200.0.1%20-%20orange">
25
  </div>
26
 
27
  A popup modal component
@@ -38,25 +38,25 @@ pip install gradio_modal
38
  ## Usage
39
 
40
  ```python
41
-
42
  import gradio as gr
43
  from gradio_modal import Modal
44
 
45
-
46
  with gr.Blocks() as demo:
47
- gr.Markdown("### Main Page")
48
- gr.Textbox("lorem ipsum " * 1000, lines=10)
49
-
50
- with Modal(visible=True) as modal:
51
- gr.Markdown("# License Agreement")
52
- gr.Textbox(value="This is the license agreement. Please read it carefully. " * 5, lines=12)
53
- close_btn = gr.Button("Close Modal")
54
- close_btn.click(lambda: Modal(visible=False), None, modal)
55
-
56
- show_btn = gr.Button("Show Modal")
 
 
 
57
  show_btn.click(lambda: Modal(visible=True), None, modal)
58
 
59
-
60
  if __name__ == "__main__":
61
  demo.launch()
62
 
@@ -73,6 +73,10 @@ if __name__ == "__main__":
73
  gr.ParamViewer(value=_docs["Modal"]["members"]["__init__"], linkify=[])
74
 
75
 
 
 
 
 
76
 
77
 
78
 
 
3
  from app import demo as app
4
  import os
5
 
6
+ _docs = {'Modal': {'description': 'Modal is a layout element within Blocks that will show its content in a popup above other content.\n from gradio_modal import Modal\n with gr.Blocks() as demo:\n with Modal():\n text1 = gr.Textbox()\n text2 = gr.Textbox()\n btn = gr.Button("Button")', 'members': {'__init__': {'visible': {'type': 'bool', 'default': 'False', 'description': 'If False, modal will be hidden.'}, 'elem_id': {'type': 'str | None', 'default': 'None', 'description': 'An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'elem_classes': {'type': 'list[str] | str | None', 'default': 'None', 'description': 'An optional string or list of strings that are assigned as the class of this component in the HTML DOM. Can be used for targeting CSS styles.'}, 'allow_user_close': {'type': 'bool', 'default': 'True', 'description': 'If True, user can close the modal (by clicking outside, clicking the X, or the escape key).'}, 'render': {'type': 'bool', 'default': 'True', 'description': 'If False, component will not render be rendered in the Blocks context. Should be used if the intention is to assign event listeners now but render the component later.'}}, 'postprocess': {}}, 'events': {'blur': {'type': None, 'default': None, 'description': 'This listener is triggered when the Modal is unfocused/blurred.'}}}, '__meta__': {'additional_interfaces': {}}}
7
 
8
  abs_path = os.path.join(os.path.dirname(__file__), "css.css")
9
 
 
21
  # `gradio_modal`
22
 
23
  <div style="display: flex; gap: 7px;">
24
+ <a href="https://pypi.org/project/gradio_modal/" target="_blank"><img alt="PyPI - Version" src="https://img.shields.io/pypi/v/gradio_modal"></a>
25
  </div>
26
 
27
  A popup modal component
 
38
  ## Usage
39
 
40
  ```python
 
41
  import gradio as gr
42
  from gradio_modal import Modal
43
 
 
44
  with gr.Blocks() as demo:
45
+ with gr.Tab("Tab 1"):
46
+ text_1 = gr.Textbox(label="Input 1")
47
+ text_2 = gr.Textbox(label="Input 2")
48
+ text_1.submit(lambda x:x, text_1, text_2)
49
+ show_btn = gr.Button("Show Modal")
50
+ gr.Examples(
51
+ [["Text 1", "Text 2"], ["Text 3", "Text 4"]],
52
+ inputs=[text_1, text_2],
53
+ )
54
+ with gr.Tab("Tab 2"):
55
+ gr.Markdown("This is tab 2")
56
+ with Modal(visible=False) as modal:
57
+ gr.Markdown("Hello world!")
58
  show_btn.click(lambda: Modal(visible=True), None, modal)
59
 
 
60
  if __name__ == "__main__":
61
  demo.launch()
62
 
 
73
  gr.ParamViewer(value=_docs["Modal"]["members"]["__init__"], linkify=[])
74
 
75
 
76
+ gr.Markdown("### Events")
77
+ gr.ParamViewer(value=_docs["Modal"]["events"], linkify=['Event'])
78
+
79
+
80
 
81
 
82
 
src/pyproject.toml CHANGED
@@ -8,7 +8,7 @@ build-backend = "hatchling.build"
8
 
9
  [project]
10
  name = "gradio_modal"
11
- version = "0.0.1"
12
  description = "A popup modal component"
13
  readme = "README.md"
14
  license = "MIT"
@@ -36,7 +36,7 @@ classifiers = [
36
  dev = ["build", "twine"]
37
 
38
  [tool.hatch.build]
39
- artifacts = ["/backend/gradio_modal/templates", "*.pyi", "backend/gradio_modal/templates", "backend/gradio_modal/templates"]
40
 
41
  [tool.hatch.build.targets.wheel]
42
  packages = ["/backend/gradio_modal"]
 
8
 
9
  [project]
10
  name = "gradio_modal"
11
+ version = "0.0.2"
12
  description = "A popup modal component"
13
  readme = "README.md"
14
  license = "MIT"
 
36
  dev = ["build", "twine"]
37
 
38
  [tool.hatch.build]
39
+ artifacts = ["/backend/gradio_modal/templates", "*.pyi", "backend/gradio_modal/templates", "backend/gradio_modal/templates", "backend/gradio_modal/templates", "backend/gradio_modal/templates"]
40
 
41
  [tool.hatch.build.targets.wheel]
42
  packages = ["/backend/gradio_modal"]