eidosui 0.5.0__tar.gz → 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. {eidosui-0.5.0 → eidosui-0.7.0}/PKG-INFO +1 -1
  2. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/__init__.py +2 -2
  3. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/components/__init__.py +2 -1
  4. eidosui-0.7.0/eidos/components/tabs.py +140 -0
  5. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/css/styles.css +107 -0
  6. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/styles.py +27 -4
  7. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/tags.py +37 -220
  8. {eidosui-0.5.0 → eidosui-0.7.0}/pyproject.toml +1 -1
  9. {eidosui-0.5.0 → eidosui-0.7.0}/.gitignore +0 -0
  10. {eidosui-0.5.0 → eidosui-0.7.0}/LICENSE +0 -0
  11. {eidosui-0.5.0 → eidosui-0.7.0}/README.md +0 -0
  12. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/components/headers.py +0 -0
  13. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/components/navigation.py +0 -0
  14. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/components/table.py +0 -0
  15. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/css/themes/dark.css +0 -0
  16. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/css/themes/eidos-variables.css +0 -0
  17. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/css/themes/light.css +0 -0
  18. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/js/eidos.js +0 -0
  19. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/plugins/__init__.py +0 -0
  20. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/plugins/markdown/__init__.py +0 -0
  21. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/plugins/markdown/components.py +0 -0
  22. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/plugins/markdown/css/markdown.css +0 -0
  23. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/plugins/markdown/extensions/__init__.py +0 -0
  24. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/plugins/markdown/extensions/alerts.py +0 -0
  25. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/plugins/markdown/renderer.py +0 -0
  26. {eidosui-0.5.0 → eidosui-0.7.0}/eidos/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eidosui
3
- Version: 0.5.0
3
+ Version: 0.7.0
4
4
  Summary: A modern, Tailwind CSS-based UI library for air development
5
5
  Project-URL: Homepage, https://github.com/isaac-flath/EidosUI
6
6
  Project-URL: Repository, https://github.com/isaac-flath/EidosUI
@@ -15,7 +15,7 @@ from . import styles
15
15
 
16
16
  # Import components
17
17
  from .components import DataTable, EidosHeaders, NavBar
18
- from .styles import buttons, semantic, tables, typography
18
+ from .styles import buttons, lists, tables, typography
19
19
  from .tags import (
20
20
  # Headings
21
21
  H1,
@@ -148,7 +148,7 @@ __all__ = [
148
148
  "styles",
149
149
  "buttons",
150
150
  "typography",
151
- "semantic",
151
+ "lists",
152
152
  "tables",
153
153
  # Components
154
154
  "DataTable",
@@ -6,5 +6,6 @@ Higher-level components built on top of the base tags.
6
6
  from .headers import EidosHeaders
7
7
  from .navigation import NavBar
8
8
  from .table import DataTable
9
+ from .tabs import TabContainer, TabList, TabPanel, Tabs
9
10
 
10
- __all__ = ["DataTable", "NavBar", "EidosHeaders"]
11
+ __all__ = ["DataTable", "NavBar", "EidosHeaders", "TabContainer", "TabList", "TabPanel", "Tabs"]
@@ -0,0 +1,140 @@
1
+ from air import Button, Div, Tag
2
+
3
+ from .. import styles
4
+ from ..utils import stringify
5
+
6
+
7
+ def TabContainer(
8
+ initial_tab_url: str,
9
+ cls: str = "",
10
+ target_id: str = "tabs",
11
+ ) -> Tag:
12
+ """HTMX-based tab container that loads tabs dynamically.
13
+
14
+ Args:
15
+ initial_tab_url: URL to load the initial tab content
16
+ cls: Additional classes for the container
17
+ target_id: ID for the tab container (default: "tabs")
18
+
19
+ Returns:
20
+ Tag: The tab container that will be populated via HTMX
21
+
22
+ Example:
23
+ TabContainer("/settings/general")
24
+ """
25
+ return Div(
26
+ id=target_id,
27
+ hx_get=initial_tab_url,
28
+ hx_trigger="load delay:100ms",
29
+ hx_target=f"#{target_id}",
30
+ hx_swap="innerHTML",
31
+ class_=stringify(styles.tabs.container, cls),
32
+ )
33
+
34
+
35
+ def TabList(
36
+ *tabs: tuple[str, str],
37
+ selected: int = 0,
38
+ tab_cls: str = "",
39
+ hx_target: str = "#tabs",
40
+ hx_swap: str = "innerHTML",
41
+ ) -> Tag:
42
+ """HTMX-based tab list for server-rendered tabs.
43
+
44
+ Args:
45
+ *tabs: Variable number of (label, url) tuples
46
+ selected: Index of the selected tab (0-based)
47
+ tab_cls: Additional classes for tab buttons
48
+ hx_target: HTMX target for tab content (default: "#tabs")
49
+ hx_swap: HTMX swap method (default: "innerHTML")
50
+
51
+ Returns:
52
+ Tag: The tab list component
53
+
54
+ Example:
55
+ TabList(
56
+ ("General", "/settings/general"),
57
+ ("Security", "/settings/security"),
58
+ ("Advanced", "/settings/advanced"),
59
+ selected=0
60
+ )
61
+ """
62
+ tab_buttons = []
63
+
64
+ for i, (label, url) in enumerate(tabs):
65
+ is_selected = i == selected
66
+
67
+ tab_button = Button(
68
+ label,
69
+ hx_get=url,
70
+ hx_target=hx_target,
71
+ hx_swap=hx_swap,
72
+ role="tab",
73
+ aria_selected="true" if is_selected else "false",
74
+ aria_controls="tab-content",
75
+ class_=stringify(
76
+ styles.tabs.tab,
77
+ styles.tabs.tab_active if is_selected else "",
78
+ tab_cls
79
+ ),
80
+ )
81
+ tab_buttons.append(tab_button)
82
+
83
+ return Div(
84
+ *tab_buttons,
85
+ role="tablist",
86
+ class_=styles.tabs.list,
87
+ )
88
+
89
+
90
+ def TabPanel(
91
+ content: Tag,
92
+ panel_cls: str = "",
93
+ ) -> Tag:
94
+ """Tab panel content wrapper.
95
+
96
+ Args:
97
+ content: The content to display in the tab panel
98
+ panel_cls: Additional classes for the panel
99
+
100
+ Returns:
101
+ Tag: The tab panel component
102
+ """
103
+ return Div(
104
+ content,
105
+ id="tab-content",
106
+ role="tabpanel",
107
+ class_=stringify(styles.tabs.panel, styles.tabs.panel_active, panel_cls),
108
+ )
109
+
110
+
111
+ def Tabs(
112
+ tab_list: Tag,
113
+ tab_panel: Tag,
114
+ cls: str = "",
115
+ ) -> Tag:
116
+ """Complete tab component with list and panel.
117
+
118
+ Args:
119
+ tab_list: The TabList component
120
+ tab_panel: The TabPanel component
121
+ cls: Additional classes for the container
122
+
123
+ Returns:
124
+ Tag: The complete tabs component
125
+
126
+ Example:
127
+ # In your route handler:
128
+ tab_list = TabList(
129
+ ("General", "/settings/general"),
130
+ ("Security", "/settings/security"),
131
+ selected=0
132
+ )
133
+ tab_panel = TabPanel(general_settings_content)
134
+ return Tabs(tab_list, tab_panel)
135
+ """
136
+ return Div(
137
+ tab_list,
138
+ tab_panel,
139
+ class_=stringify(styles.tabs.container, cls),
140
+ )
@@ -475,4 +475,111 @@
475
475
  transform: translateY(0);
476
476
  opacity: 1;
477
477
  }
478
+ }
479
+
480
+ /* List Styles */
481
+ .eidos-ul {
482
+ list-style-type: disc;
483
+ margin: var(--space-md) 0;
484
+ padding-left: var(--space-xl);
485
+ color: var(--color-text);
486
+ }
487
+
488
+ .eidos-ol {
489
+ list-style-type: decimal;
490
+ margin: var(--space-md) 0;
491
+ padding-left: var(--space-xl);
492
+ color: var(--color-text);
493
+ }
494
+
495
+ .eidos-li {
496
+ margin-bottom: var(--space-xs);
497
+ line-height: var(--line-height-relaxed);
498
+ }
499
+
500
+ /* Nested lists */
501
+ .eidos-ul .eidos-ul,
502
+ .eidos-ul .eidos-ol,
503
+ .eidos-ol .eidos-ul,
504
+ .eidos-ol .eidos-ol {
505
+ margin: var(--space-xs) 0;
506
+ }
507
+
508
+ /* Remove bottom margin from last list item */
509
+ .eidos-li:last-child {
510
+ margin-bottom: 0;
511
+ }
512
+
513
+ /* List item hover effect for interactive lists */
514
+ .eidos-li-interactive {
515
+ padding: var(--space-xs) var(--space-sm);
516
+ margin-left: calc(var(--space-xl) * -1);
517
+ margin-right: calc(var(--space-sm) * -1);
518
+ padding-left: var(--space-xl);
519
+ border-radius: var(--radius-sm);
520
+ transition: background-color var(--transition-fast);
521
+ cursor: pointer;
522
+ }
523
+
524
+ .eidos-li-interactive:hover {
525
+ background-color: var(--color-surface);
526
+ }
527
+
528
+ /* Tabs Component */
529
+ .eidos-tabs {
530
+ position: relative;
531
+ }
532
+
533
+ .eidos-tabs-list {
534
+ display: flex;
535
+ border-bottom: 1px solid var(--color-border);
536
+ overflow-x: auto;
537
+ scrollbar-width: thin;
538
+ -webkit-overflow-scrolling: touch;
539
+ }
540
+
541
+ .eidos-tab {
542
+ padding: var(--space-sm) var(--space-lg);
543
+ border-bottom: 2px solid transparent;
544
+ color: var(--color-text-muted);
545
+ text-decoration: none;
546
+ white-space: nowrap;
547
+ transition: all var(--transition-fast);
548
+ position: relative;
549
+ top: 1px;
550
+ }
551
+
552
+ .eidos-tab:hover {
553
+ color: var(--color-text);
554
+ }
555
+
556
+ .eidos-tab:focus {
557
+ outline: 2px solid var(--color-focus);
558
+ outline-offset: -2px;
559
+ }
560
+
561
+ .eidos-tab-active {
562
+ color: var(--color-primary);
563
+ border-bottom-color: var(--color-primary);
564
+ }
565
+
566
+ .eidos-tab-panel {
567
+ padding: var(--space-lg) 0;
568
+ display: none;
569
+ }
570
+
571
+ .eidos-tab-panel-active {
572
+ display: block;
573
+ }
574
+
575
+ /* HTMX-enhanced transitions */
576
+ .eidos-tabs.htmx-swapping .eidos-tab-panel {
577
+ opacity: 0;
578
+ transform: translateY(-4px);
579
+ }
580
+
581
+ .eidos-tabs.htmx-settling .eidos-tab-panel {
582
+ opacity: 1;
583
+ transform: translateY(0);
584
+ transition: opacity var(--transition-normal), transform var(--transition-normal);
478
585
  }
@@ -40,9 +40,6 @@ class Typography:
40
40
  h6: Final[str] = "eidos-h6"
41
41
 
42
42
 
43
- class Semantic:
44
- """Semantic HTML element CSS classes from styles.css."""
45
-
46
43
  # Text formatting
47
44
  strong: Final[str] = "eidos-strong"
48
45
  i: Final[str] = "eidos-i"
@@ -80,6 +77,15 @@ class Semantic:
80
77
  figcaption: Final[str] = "eidos-figcaption"
81
78
 
82
79
 
80
+ class Lists:
81
+ """List-related CSS classes from styles.css."""
82
+
83
+ ul: Final[str] = "eidos-ul"
84
+ ol: Final[str] = "eidos-ol"
85
+ li: Final[str] = "eidos-li"
86
+ li_interactive: Final[str] = "eidos-li-interactive"
87
+
88
+
83
89
  class Tables:
84
90
  """Table-related CSS classes from styles.css."""
85
91
 
@@ -97,8 +103,25 @@ class Tables:
97
103
  td: Final[str] = "eidos-td"
98
104
 
99
105
 
106
+ class Tabs:
107
+ """Tab-related CSS classes from styles.css."""
108
+
109
+ # Container and structure
110
+ container: Final[str] = "eidos-tabs"
111
+ list: Final[str] = "eidos-tabs-list"
112
+
113
+ # Tab elements
114
+ tab: Final[str] = "eidos-tab"
115
+ tab_active: Final[str] = "eidos-tab-active"
116
+
117
+ # Panel elements
118
+ panel: Final[str] = "eidos-tab-panel"
119
+ panel_active: Final[str] = "eidos-tab-panel-active"
120
+
121
+
100
122
  # Create singleton instance for easy access
101
123
  buttons = Buttons()
102
124
  typography = Typography()
103
- semantic = Semantic()
104
125
  tables = Tables()
126
+ lists = Lists()
127
+ tabs = Tabs()
@@ -1,130 +1,10 @@
1
1
  from typing import Any
2
2
 
3
3
  import air
4
-
4
+ from air.tags import *
5
5
  from . import styles
6
6
  from .utils import stringify
7
7
 
8
- # Define exports for this module
9
- __all__ = [
10
- # Custom EidosUI components
11
- "Button",
12
- "H1",
13
- "H2",
14
- "H3",
15
- "H4",
16
- "H5",
17
- "H6",
18
- "Body",
19
- # Semantic components with styling
20
- "Strong",
21
- "I",
22
- "Small",
23
- "Del",
24
- "Abbr",
25
- "Var",
26
- "Mark",
27
- "Time",
28
- "Code",
29
- "Pre",
30
- "Kbd",
31
- "Samp",
32
- "Blockquote",
33
- "Cite",
34
- "Address",
35
- "Hr",
36
- "Details",
37
- "Summary",
38
- "Dl",
39
- "Dt",
40
- "Dd",
41
- "Figure",
42
- "Figcaption",
43
- # Table components with styling
44
- "Table",
45
- "Thead",
46
- "Tbody",
47
- "Tfoot",
48
- "Tr",
49
- "Th",
50
- "Td",
51
- # Pass-through HTML tags from air.tags
52
- "A",
53
- "Area",
54
- "Article",
55
- "Aside",
56
- "Audio",
57
- "B",
58
- "Base",
59
- "Bdi",
60
- "Bdo",
61
- "Br",
62
- "Canvas",
63
- "Caption",
64
- "Col",
65
- "Colgroup",
66
- "Data",
67
- "Datalist",
68
- "Dfn",
69
- "Dialog",
70
- "Div",
71
- "Em",
72
- "Embed",
73
- "Fieldset",
74
- "Footer",
75
- "Form",
76
- "Head",
77
- "Header",
78
- "Hgroup",
79
- "Html",
80
- "Iframe",
81
- "Img",
82
- "Input",
83
- "Ins",
84
- "Label",
85
- "Legend",
86
- "Li",
87
- "Link",
88
- "Main",
89
- "Map",
90
- "Menu",
91
- "Meta",
92
- "Meter",
93
- "Nav",
94
- "Noscript",
95
- "Object",
96
- "Ol",
97
- "Optgroup",
98
- "Option",
99
- "Output",
100
- "P",
101
- "Param",
102
- "Picture",
103
- "Progress",
104
- "Q",
105
- "Rp",
106
- "Rt",
107
- "Ruby",
108
- "S",
109
- "Script",
110
- "Search",
111
- "Section",
112
- "Select",
113
- "Source",
114
- "Span",
115
- "Style",
116
- "Sub",
117
- "Sup",
118
- "Template",
119
- "Textarea",
120
- "Title",
121
- "Track",
122
- "U",
123
- "Ul",
124
- "Video",
125
- "Wbr",
126
- ]
127
-
128
8
 
129
9
  def Button(
130
10
  *content: Any,
@@ -214,19 +94,19 @@ def Body(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) ->
214
94
 
215
95
 
216
96
  def Strong(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
217
- return air.Strong(*content, class_=stringify(styles.semantic.strong, class_), **kwargs)
97
+ return air.Strong(*content, class_=stringify(styles.typography.strong, class_), **kwargs)
218
98
 
219
99
 
220
100
  def I(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
221
- return air.I(*content, class_=stringify(styles.semantic.i, class_), **kwargs)
101
+ return air.I(*content, class_=stringify(styles.typography.i, class_), **kwargs)
222
102
 
223
103
 
224
104
  def Small(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
225
- return air.Small(*content, class_=stringify(styles.semantic.small, class_), **kwargs)
105
+ return air.Small(*content, class_=stringify(styles.typography.small, class_), **kwargs)
226
106
 
227
107
 
228
108
  def Del(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
229
- return air.Del(*content, class_=stringify(styles.semantic.del_, class_), **kwargs)
109
+ return air.Del(*content, class_=stringify(styles.typography.del_, class_), **kwargs)
230
110
 
231
111
 
232
112
  def Abbr(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
@@ -242,79 +122,79 @@ def Abbr(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) ->
242
122
  Example:
243
123
  Abbr("HTML", title="Hyper Text Markup Language")
244
124
  """
245
- return air.Abbr(*content, class_=stringify(styles.semantic.abbr, class_), **kwargs)
125
+ return air.Abbr(*content, class_=stringify(styles.typography.abbr, class_), **kwargs)
246
126
 
247
127
 
248
128
  def Var(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
249
- return air.Var(*content, class_=stringify(styles.semantic.var, class_), **kwargs)
129
+ return air.Var(*content, class_=stringify(styles.typography.var, class_), **kwargs)
250
130
 
251
131
 
252
132
  def Mark(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
253
- return air.Mark(*content, class_=stringify(styles.semantic.mark, class_), **kwargs)
133
+ return air.Mark(*content, class_=stringify(styles.typography.mark, class_), **kwargs)
254
134
 
255
135
 
256
136
  def Time(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
257
- return air.Time(*content, class_=stringify(styles.semantic.time, class_), **kwargs)
137
+ return air.Time(*content, class_=stringify(styles.typography.time, class_), **kwargs)
258
138
 
259
139
 
260
140
  def Code(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
261
- return air.Code(*content, class_=stringify(styles.semantic.code, class_), **kwargs)
141
+ return air.Code(*content, class_=stringify(styles.typography.code, class_), **kwargs)
262
142
 
263
143
 
264
144
  def Pre(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
265
- return air.Pre(*content, class_=stringify(styles.semantic.pre, class_), **kwargs)
145
+ return air.Pre(*content, class_=stringify(styles.typography.pre, class_), **kwargs)
266
146
 
267
147
 
268
148
  def Kbd(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
269
- return air.Kbd(*content, class_=stringify(styles.semantic.kbd, class_), **kwargs)
149
+ return air.Kbd(*content, class_=stringify(styles.typography.kbd, class_), **kwargs)
270
150
 
271
151
 
272
152
  def Samp(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
273
- return air.Samp(*content, class_=stringify(styles.semantic.samp, class_), **kwargs)
153
+ return air.Samp(*content, class_=stringify(styles.typography.samp, class_), **kwargs)
274
154
 
275
155
 
276
156
  def Blockquote(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
277
- return air.Blockquote(*content, class_=stringify(styles.semantic.blockquote, class_), **kwargs)
157
+ return air.Blockquote(*content, class_=stringify(styles.typography.blockquote, class_), **kwargs)
278
158
 
279
159
 
280
160
  def Cite(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
281
- return air.Cite(*content, class_=stringify(styles.semantic.cite, class_), **kwargs)
161
+ return air.Cite(*content, class_=stringify(styles.typography.cite, class_), **kwargs)
282
162
 
283
163
 
284
164
  def Address(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
285
- return air.Address(*content, class_=stringify(styles.semantic.address, class_), **kwargs)
165
+ return air.Address(*content, class_=stringify(styles.typography.address, class_), **kwargs)
286
166
 
287
167
 
288
168
  def Hr(class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
289
- return air.Hr(class_=stringify(styles.semantic.hr, class_), **kwargs)
169
+ return air.Hr(class_=stringify(styles.typography.hr, class_), **kwargs)
290
170
 
291
171
 
292
172
  def Details(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
293
- return air.Details(*content, class_=stringify(styles.semantic.details, class_), **kwargs)
173
+ return air.Details(*content, class_=stringify(styles.typography.details, class_), **kwargs)
294
174
 
295
175
 
296
176
  def Summary(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
297
- return air.Summary(*content, class_=stringify(styles.semantic.summary, class_), **kwargs)
177
+ return air.Summary(*content, class_=stringify(styles.typography.summary, class_), **kwargs)
298
178
 
299
179
 
300
180
  def Dl(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
301
- return air.Dl(*content, class_=stringify(styles.semantic.dl, class_), **kwargs)
181
+ return air.Dl(*content, class_=stringify(styles.typography.dl, class_), **kwargs)
302
182
 
303
183
 
304
184
  def Dt(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
305
- return air.Dt(*content, class_=stringify(styles.semantic.dt, class_), **kwargs)
185
+ return air.Dt(*content, class_=stringify(styles.typography.dt, class_), **kwargs)
306
186
 
307
187
 
308
188
  def Dd(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
309
- return air.Dd(*content, class_=stringify(styles.semantic.dd, class_), **kwargs)
189
+ return air.Dd(*content, class_=stringify(styles.typography.dd, class_), **kwargs)
310
190
 
311
191
 
312
192
  def Figure(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
313
- return air.Figure(*content, class_=stringify(styles.semantic.figure, class_), **kwargs)
193
+ return air.Figure(*content, class_=stringify(styles.typography.figure, class_), **kwargs)
314
194
 
315
195
 
316
196
  def Figcaption(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
317
- return air.Figcaption(*content, class_=stringify(styles.semantic.figcaption, class_), **kwargs)
197
+ return air.Figcaption(*content, class_=stringify(styles.typography.figcaption, class_), **kwargs)
318
198
 
319
199
 
320
200
  # Table elements with styling
@@ -355,81 +235,18 @@ def Td(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> a
355
235
  return air.Td(*content, class_=stringify(styles.tables.td, class_), **kwargs)
356
236
 
357
237
 
238
+ def Ul(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
239
+ return air.Ul(*content, class_=stringify(styles.lists.ul, class_), **kwargs)
240
+
241
+
242
+ def Ol(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
243
+ return air.Ol(*content, class_=stringify(styles.lists.ol, class_), **kwargs)
244
+
245
+
246
+ def Li(*content: Any, class_: str | list[str] | None = None, **kwargs: Any) -> air.Tag:
247
+ return air.Li(*content, class_=stringify(styles.lists.li, class_), **kwargs)
248
+
249
+
250
+
358
251
  # Pass-through tags from air.tags
359
252
  # Import all standard HTML tags that don't have custom styling
360
- from air.tags import (
361
- A,
362
- Area,
363
- Article,
364
- Aside,
365
- Audio,
366
- B,
367
- Base,
368
- Bdi,
369
- Bdo,
370
- Br,
371
- Canvas,
372
- Caption,
373
- Col,
374
- Colgroup,
375
- Data,
376
- Datalist,
377
- Dfn,
378
- Dialog,
379
- Div,
380
- Em,
381
- Embed,
382
- Fieldset,
383
- Footer,
384
- Form,
385
- Head,
386
- Header,
387
- Hgroup,
388
- Html,
389
- Iframe,
390
- Img,
391
- Input,
392
- Ins,
393
- Label,
394
- Legend,
395
- Li,
396
- Link,
397
- Main,
398
- Map,
399
- Menu,
400
- Meta,
401
- Meter,
402
- Nav,
403
- Noscript,
404
- Object,
405
- Ol,
406
- Optgroup,
407
- Option,
408
- Output,
409
- P,
410
- Param,
411
- Picture,
412
- Progress,
413
- Q,
414
- Rp,
415
- Rt,
416
- Ruby,
417
- S,
418
- Script,
419
- Search,
420
- Section,
421
- Select,
422
- Source,
423
- Span,
424
- Style,
425
- Sub,
426
- Sup,
427
- Template,
428
- Textarea,
429
- Title,
430
- Track,
431
- U,
432
- Ul,
433
- Video,
434
- Wbr,
435
- )
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "eidosui"
7
- version = "0.5.0"
7
+ version = "0.7.0"
8
8
  description = "A modern, Tailwind CSS-based UI library for air development"
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes