@esphome/compose-ui 0.1.0

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 xmlguy74
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,541 @@
1
+ import * as _esphome_compose from '@esphome/compose';
2
+ import { EspComposeElement } from '@esphome/compose';
3
+
4
+ /**
5
+ * Theme type definitions for the LVGL design system.
6
+ *
7
+ * A Theme is a compile-time configuration object that drives all visual
8
+ * token resolution in design system components. Third parties can create
9
+ * custom themes by implementing this interface.
10
+ */
11
+ type SpacingToken = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
12
+ type SizeToken = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
13
+ type RadiusToken = 'none' | 'sm' | 'md' | 'lg' | 'full';
14
+ type StatusToken = 'primary' | 'secondary' | 'success' | 'warning' | 'danger';
15
+ type TextVariant = 'title' | 'subtitle' | 'body' | 'caption';
16
+ interface FontDef {
17
+ /** Font family name (e.g. 'montserrat'). */
18
+ fontFamily: string;
19
+ /** Font size in pixels (e.g. 28). Resolved to `{fontFamily}_{fontSize}` for LVGL. */
20
+ fontSize: number;
21
+ }
22
+ interface SizeDimensions {
23
+ height: number;
24
+ fontSize: number;
25
+ paddingX: number;
26
+ paddingY: number;
27
+ }
28
+ interface StatusColors {
29
+ bg: string;
30
+ text: string;
31
+ bgPressed: string;
32
+ }
33
+ interface ThemeColors {
34
+ primary: StatusColors;
35
+ secondary: StatusColors;
36
+ success: StatusColors;
37
+ warning: StatusColors;
38
+ danger: StatusColors;
39
+ background: string;
40
+ surface: string;
41
+ surfaceAlt: string;
42
+ border: string;
43
+ textPrimary: string;
44
+ textSecondary: string;
45
+ textDisabled: string;
46
+ }
47
+ interface ThemeTypography {
48
+ title: FontDef;
49
+ subtitle: FontDef;
50
+ body: FontDef;
51
+ caption: FontDef;
52
+ }
53
+ interface Theme {
54
+ /** Human-readable theme name. */
55
+ name: string;
56
+ /** Color palette. */
57
+ colors: ThemeColors;
58
+ /** Typography scale. */
59
+ typography: ThemeTypography;
60
+ /** Spacing scale in pixels. */
61
+ spacing: Record<SpacingToken, number>;
62
+ /** Border radius scale in pixels. */
63
+ radii: Record<RadiusToken, number>;
64
+ /** Component size scale. */
65
+ sizes: Record<SizeToken, SizeDimensions>;
66
+ }
67
+
68
+ /** The theme context — defaults to `darkTheme` when no provider is present. */
69
+ declare const ThemeContext: _esphome_compose.Context<Theme>;
70
+ /** Read the active theme from the nearest `<ThemeProvider>`. */
71
+ declare function useTheme(): Theme;
72
+ /**
73
+ * Provide a theme to all descendant design-system components.
74
+ *
75
+ * @example
76
+ * <ThemeProvider value={lightTheme}>
77
+ * <Screen padding="lg">…</Screen>
78
+ * </ThemeProvider>
79
+ */
80
+ declare const ThemeProvider: (props: {
81
+ value: Theme;
82
+ children?: _esphome_compose.EspComposeElement | _esphome_compose.EspComposeElement[];
83
+ }) => _esphome_compose.EspComposeElement;
84
+
85
+ /**
86
+ * Default dark theme — designed for LVGL embedded displays.
87
+ *
88
+ * Optimised for small screens: high contrast, saturated accents,
89
+ * dark surfaces that reduce power on OLED and improve readability
90
+ * in varying ambient light.
91
+ */
92
+
93
+ declare const darkTheme: Theme;
94
+
95
+ /**
96
+ * Built-in light theme — designed for LVGL embedded displays.
97
+ *
98
+ * Light surfaces with dark text, suitable for well-lit environments.
99
+ * Shares spacing, radii and typography scale with the dark theme.
100
+ */
101
+
102
+ declare const lightTheme: Theme;
103
+
104
+ /**
105
+ * JSON theme import / export for interop.
106
+ */
107
+
108
+ /** Serialise a Theme to a JSON string. */
109
+ declare function themeToJSON(theme: Theme): string;
110
+ /** Parse a JSON string into a Theme object. */
111
+ declare function themeFromJSON(json: string): Theme;
112
+
113
+ /**
114
+ * Theme-aware token resolvers.
115
+ *
116
+ * All resolvers read from the active theme (set via `setTheme()`).
117
+ * Component code calls these instead of accessing tokens directly.
118
+ */
119
+
120
+ /** Resolve a spacing token or pass through a raw pixel value. */
121
+ declare function resolveSpacing(value: SpacingToken | number): number;
122
+ /** Resolve a component size token. */
123
+ declare function resolveSize(value: SizeToken): SizeDimensions;
124
+ /** Resolve a status color token. */
125
+ declare function resolveStatus(value: StatusToken): StatusColors;
126
+ /** Resolve a typography variant to a font definition. */
127
+ declare function resolveTypography(variant: TextVariant): FontDef;
128
+ /** Convert a `FontDef` to the LVGL `text_font` string (e.g. `montserrat_28`). */
129
+ declare function fontDefToLvgl(def: FontDef): string;
130
+ /** Resolve a radius token or pass through a raw pixel value. */
131
+ declare function resolveRadius(value: RadiusToken | number): number;
132
+
133
+ /**
134
+ * Intent constants for @esphome/compose-ui design system.
135
+ *
136
+ * These are owned by the UI package — the base SDK is unaware of them.
137
+ * Most DS components declare only `lvgl:widget` for LVGL container placement.
138
+ * These two intents enforce strict parent-child pairing.
139
+ */
140
+ /** Design system intents — structural parent-child constraints. */
141
+ declare const COMPOSE_UI_INTENTS: {
142
+ /** Col can only be placed inside Row. */
143
+ readonly COL: "compose-ui:col";
144
+ /** GridItem can only be placed inside Grid. */
145
+ readonly GRID_ITEM: "compose-ui:grid-item";
146
+ };
147
+
148
+ interface ScreenProps {
149
+ children?: EspComposeElement | EspComposeElement[];
150
+ /** Padding around the page content. Token name or pixel value. */
151
+ padding?: SpacingToken | number;
152
+ /** Skip this page in the page list. */
153
+ skip?: boolean;
154
+ /** Background color override (hex). If omitted, uses theme background. */
155
+ bgColor?: string;
156
+ /** Border width in pixels. Default: 0. */
157
+ borderWidth?: number;
158
+ /** Border color (hex). */
159
+ borderColor?: string;
160
+ }
161
+ /**
162
+ * Screen — a top-level LVGL page container.
163
+ *
164
+ * Applies the active theme's background color by default.
165
+ *
166
+ * @example
167
+ * <Screen padding="lg">
168
+ * <VStack gap="md">
169
+ * <Text variant="title">Home</Text>
170
+ * <Button text="Toggle" />
171
+ * </VStack>
172
+ * </Screen>
173
+ */
174
+ declare const Screen: _esphome_compose.IntentComponent<ScreenProps, readonly ["lvgl:widget"], readonly ["lvgl:widget"], undefined, undefined>;
175
+
176
+ type FlexAlign$1 = 'START' | 'CENTER' | 'END' | 'SPACE_BETWEEN' | 'SPACE_AROUND' | 'SPACE_EVENLY';
177
+ type CrossAlign$1 = 'START' | 'CENTER' | 'END' | 'STRETCH';
178
+ interface SpaceProps {
179
+ children?: EspComposeElement | EspComposeElement[];
180
+ /** Layout direction. Default: 'vertical'. */
181
+ direction?: 'horizontal' | 'vertical';
182
+ /** Gap between children. Token name or pixel value. */
183
+ gap?: SpacingToken | number;
184
+ /** Padding around the container. Token name or pixel value. */
185
+ padding?: SpacingToken | number;
186
+ /** Main axis alignment. */
187
+ align?: FlexAlign$1;
188
+ /** Cross axis alignment. */
189
+ crossAlign?: CrossAlign$1;
190
+ /** Enable wrapping (ROW_WRAP / COLUMN_WRAP). Default: false. */
191
+ wrap?: boolean;
192
+ /** Width. Numeric pixels, percentage string, or 'SIZE_CONTENT'. */
193
+ width?: number | string;
194
+ /** Height. Numeric pixels, percentage string, or 'SIZE_CONTENT'. */
195
+ height?: number | string;
196
+ /** Background color (hex). */
197
+ bgColor?: string;
198
+ /** Background opacity. */
199
+ bgOpa?: 'TRANSP' | 'COVER';
200
+ /** Border radius. */
201
+ radius?: number;
202
+ /** Border width in pixels. Default: 0. */
203
+ borderWidth?: number;
204
+ /** Border color (hex). */
205
+ borderColor?: string;
206
+ }
207
+ /**
208
+ * Flexible space layout — arranges children along a direction.
209
+ *
210
+ * Similar to AntD's `<Space>`. Defaults to vertical (column) layout.
211
+ * Supports wrapping via the `wrap` prop.
212
+ *
213
+ * @example
214
+ * <Space direction="horizontal" gap="md" align="SPACE_BETWEEN">
215
+ * <Text>Left</Text>
216
+ * <Text>Right</Text>
217
+ * </Space>
218
+ *
219
+ * <Space gap="lg" wrap>
220
+ * <Button text="A" />
221
+ * <Button text="B" />
222
+ * <Button text="C" />
223
+ * </Space>
224
+ */
225
+ declare const Space: _esphome_compose.IntentComponent<SpaceProps, readonly ["lvgl:widget"], readonly ["lvgl:widget"], undefined, true>;
226
+ /**
227
+ * Vertical stack layout — shorthand for `<Space direction="vertical">`.
228
+ *
229
+ * @example
230
+ * <VStack gap="md" padding="lg">
231
+ * <Text variant="title">Hello</Text>
232
+ * <Button text="Click me" />
233
+ * </VStack>
234
+ */
235
+ declare const VStack: _esphome_compose.IntentComponent<Omit<SpaceProps, "direction">, readonly ["lvgl:widget"], readonly ["lvgl:widget"], undefined, true>;
236
+ /**
237
+ * Horizontal stack layout — shorthand for `<Space direction="horizontal">`.
238
+ *
239
+ * @example
240
+ * <HStack gap="sm" align="SPACE_BETWEEN">
241
+ * <Text>Left</Text>
242
+ * <Text>Right</Text>
243
+ * </HStack>
244
+ */
245
+ declare const HStack: _esphome_compose.IntentComponent<Omit<SpaceProps, "direction">, readonly ["lvgl:widget"], readonly ["lvgl:widget"], undefined, true>;
246
+
247
+ type FlexAlign = 'START' | 'CENTER' | 'END' | 'SPACE_BETWEEN' | 'SPACE_AROUND' | 'SPACE_EVENLY';
248
+ type CrossAlign = 'START' | 'CENTER' | 'END' | 'STRETCH';
249
+ interface RowProps {
250
+ children?: EspComposeElement | EspComposeElement[];
251
+ /** Horizontal gutter (space between columns). Token or pixel value. */
252
+ gutter?: SpacingToken | number | [SpacingToken | number, SpacingToken | number];
253
+ /** Main-axis justify. Default: 'START'. */
254
+ justify?: FlexAlign;
255
+ /** Cross-axis alignment. Default: 'START'. */
256
+ align?: CrossAlign;
257
+ /** Whether row wraps. Default: true. */
258
+ wrap?: boolean;
259
+ /** Width. Default: '100%'. */
260
+ width?: number | string;
261
+ /** Height. */
262
+ height?: number | string;
263
+ /** Border width in pixels. Default: 0. */
264
+ borderWidth?: number;
265
+ /** Border color (hex). */
266
+ borderColor?: string;
267
+ }
268
+ /**
269
+ * Row — a horizontal flex container that wraps children.
270
+ *
271
+ * @example
272
+ * <Row gutter="md" justify="SPACE_BETWEEN">
273
+ * <Col span={12}><Text text="Left" /></Col>
274
+ * <Col span={12}><Text text="Right" /></Col>
275
+ * </Row>
276
+ */
277
+ declare const Row: _esphome_compose.IntentComponent<RowProps, readonly ["lvgl:widget"], readonly ["compose-ui:col"], undefined, true>;
278
+ interface ColProps {
279
+ children?: EspComposeElement | EspComposeElement[];
280
+ /**
281
+ * Proportional width (flex_grow value).
282
+ * Like AntD's `span` but using flex_grow instead of a 24-column grid.
283
+ * A Col with span={2} takes twice the space of span={1}.
284
+ * Default: 1.
285
+ */
286
+ span?: number;
287
+ /** Width override (disables flex_grow). */
288
+ width?: number | string;
289
+ /** Height. */
290
+ height?: number | string;
291
+ /** Border width in pixels. Default: 0. */
292
+ borderWidth?: number;
293
+ /** Border color (hex). */
294
+ borderColor?: string;
295
+ }
296
+ /**
297
+ * Col — a column within a Row that uses `flex_grow` for proportional sizing.
298
+ *
299
+ * @example
300
+ * <Row gutter="sm">
301
+ * <Col span={1}><Text text="1/3" /></Col>
302
+ * <Col span={2}><Text text="2/3" /></Col>
303
+ * </Row>
304
+ */
305
+ declare const Col: _esphome_compose.IntentComponent<ColProps, readonly ["compose-ui:col", "lvgl:widget"], readonly ["lvgl:widget"], undefined, true>;
306
+
307
+ /**
308
+ * Column/row track definition.
309
+ * - `FR(n)` — fractional unit (string, passed through to ESPHome)
310
+ * - number — fixed pixel size
311
+ * - 'SIZE_CONTENT' — auto-size to content
312
+ */
313
+ type TrackSize = string | number;
314
+ type GridAlign = 'START' | 'CENTER' | 'END' | 'STRETCH';
315
+ interface GridProps {
316
+ children?: EspComposeElement | EspComposeElement[];
317
+ /** Column track definitions. E.g. ['FR(1)', 'FR(2)', 200] */
318
+ columns: TrackSize[];
319
+ /** Row track definitions. E.g. ['FR(1)', 100] */
320
+ rows: TrackSize[];
321
+ /** Column gap. Token or pixels. */
322
+ columnGap?: SpacingToken | number;
323
+ /** Row gap. Token or pixels. */
324
+ rowGap?: SpacingToken | number;
325
+ /** Shorthand for equal column and row gap. */
326
+ gap?: SpacingToken | number;
327
+ /** Default column alignment for children. */
328
+ alignColumns?: GridAlign;
329
+ /** Default row alignment for children. */
330
+ alignRows?: GridAlign;
331
+ /** Width. */
332
+ width?: number | string;
333
+ /** Height. */
334
+ height?: number | string;
335
+ /** Background color. */
336
+ bgColor?: string;
337
+ /** Background opacity. */
338
+ bgOpa?: 'TRANSP' | 'COVER';
339
+ /** Border width in pixels. Default: 0. */
340
+ borderWidth?: number;
341
+ /** Border color (hex). */
342
+ borderColor?: string;
343
+ }
344
+ /**
345
+ * Grid — a native CSS Grid container for LVGL.
346
+ *
347
+ * @example
348
+ * <Grid columns={['FR(1)', 'FR(1)']} rows={['FR(1)', 'FR(1)']}>
349
+ * <GridItem col={0} row={0}><Text text="Top-left" /></GridItem>
350
+ * <GridItem col={1} row={0}><Text text="Top-right" /></GridItem>
351
+ * <GridItem col={0} row={1} colSpan={2}><Text text="Full bottom" /></GridItem>
352
+ * </Grid>
353
+ */
354
+ declare const Grid: _esphome_compose.IntentComponent<GridProps, readonly ["lvgl:widget"], readonly ["compose-ui:grid-item"], undefined, true>;
355
+ interface GridItemProps {
356
+ children?: EspComposeElement | EspComposeElement[];
357
+ /** Column position (0-based). */
358
+ col: number;
359
+ /** Row position (0-based). */
360
+ row: number;
361
+ /** Number of columns to span. Default: 1. */
362
+ colSpan?: number;
363
+ /** Number of rows to span. Default: 1. */
364
+ rowSpan?: number;
365
+ /** Column alignment override. */
366
+ colAlign?: GridAlign;
367
+ /** Row alignment override. */
368
+ rowAlign?: GridAlign;
369
+ /** Border width in pixels. Default: 0. */
370
+ borderWidth?: number;
371
+ /** Border color (hex). */
372
+ borderColor?: string;
373
+ }
374
+ /**
375
+ * GridItem — positions a child within a Grid.
376
+ *
377
+ * @example
378
+ * <GridItem col={0} row={0} colSpan={2}>
379
+ * <Text text="Spans two columns" />
380
+ * </GridItem>
381
+ */
382
+ declare const GridItem: _esphome_compose.IntentComponent<GridItemProps, readonly ["compose-ui:grid-item", "lvgl:widget"], readonly ["lvgl:widget"], undefined, true>;
383
+
384
+ interface TextProps {
385
+ children?: EspComposeElement | EspComposeElement[];
386
+ /** Typography variant. Determines font size. Default: 'body'. */
387
+ variant?: TextVariant;
388
+ /** Static text content. Use this or children. */
389
+ text?: string;
390
+ /** Text alignment within the label. */
391
+ align?: 'LEFT' | 'CENTER' | 'RIGHT' | 'AUTO';
392
+ /** Text color (hex). If omitted, uses theme textPrimary. */
393
+ color?: string;
394
+ /** Long text mode. */
395
+ longMode?: 'WRAP' | 'DOT' | 'SCROLL' | 'SCROLL_CIRCULAR' | 'CLIP';
396
+ /** X position (pixels). */
397
+ x?: number;
398
+ /** Y position (pixels). */
399
+ y?: number;
400
+ /** Width. */
401
+ width?: number | string;
402
+ }
403
+ /**
404
+ * Text — a styled label component.
405
+ *
406
+ * @example
407
+ * <Text variant="title">Living Room</Text>
408
+ * <Text variant="caption" color="#888888">Last updated: 5m ago</Text>
409
+ */
410
+ declare const Text: _esphome_compose.IntentComponent<TextProps, readonly ["lvgl:widget"], readonly [], undefined, undefined>;
411
+
412
+ type ButtonVariant = 'solid' | 'outline';
413
+ interface ButtonProps {
414
+ /** Button label text. */
415
+ text?: string;
416
+ /** Color scheme. Default: 'primary'. */
417
+ status?: StatusToken;
418
+ /** Size. Default: 'md'. */
419
+ size?: SizeToken;
420
+ /** Visual variant. Default: 'solid'. */
421
+ variant?: ButtonVariant;
422
+ /** X position (pixels). */
423
+ x?: number;
424
+ /** Y position (pixels). */
425
+ y?: number;
426
+ /** Width override. */
427
+ width?: number | string;
428
+ /** Height override. */
429
+ height?: number | string;
430
+ /** Press handler (ESPHome action). */
431
+ onPress?: unknown;
432
+ }
433
+ /**
434
+ * Button — a styled, clickable button with a label.
435
+ *
436
+ * @example
437
+ * <Button text="Toggle Light" status="primary" size="lg" />
438
+ * <Button text="Delete" status="danger" variant="outline" />
439
+ */
440
+ declare const Button: _esphome_compose.IntentComponent<ButtonProps, readonly ["lvgl:widget"], readonly [], undefined, undefined>;
441
+
442
+ interface CardProps {
443
+ children?: EspComposeElement | EspComposeElement[];
444
+ /** Padding inside the card. Default: 'md'. */
445
+ padding?: SpacingToken | number;
446
+ /** Corner radius. Default: 'md'. */
447
+ radius?: RadiusToken | number;
448
+ /** Background color (hex). Default: theme surfaceAlt. */
449
+ bgColor?: string;
450
+ /** Border color (hex). */
451
+ borderColor?: string;
452
+ /** Border width. Default: 0. */
453
+ borderWidth?: number;
454
+ /** Width. */
455
+ width?: number | string;
456
+ /** Height. */
457
+ height?: number | string;
458
+ /** Gap between children. Token name or pixel value. */
459
+ gap?: SpacingToken | number;
460
+ }
461
+ /**
462
+ * Card — a styled container with background and rounded corners.
463
+ *
464
+ * @example
465
+ * <Card>
466
+ * <Text variant="title">Living Room</Text>
467
+ * <SliderField label="Brightness" />
468
+ * </Card>
469
+ */
470
+ declare const Card: _esphome_compose.IntentComponent<CardProps, readonly ["lvgl:widget"], readonly ["lvgl:widget"], undefined, true>;
471
+
472
+ interface SliderFieldProps {
473
+ /** Label text displayed above the slider. */
474
+ label: string;
475
+ /** Bound value (sensor or entity reference). */
476
+ value?: unknown;
477
+ /** Change handler (ESPHome action). */
478
+ onChange?: unknown;
479
+ /** Minimum value. Default: 0. */
480
+ min?: number;
481
+ /** Maximum value. Default: 100. */
482
+ max?: number;
483
+ /** Gap between label and slider. Default: 'xs'. */
484
+ gap?: SpacingToken | number;
485
+ /** Width of the field container. */
486
+ width?: number | string;
487
+ }
488
+ /**
489
+ * SliderField — a label + slider composite.
490
+ *
491
+ * @example
492
+ * <SliderField label="Brightness" min={0} max={255} />
493
+ */
494
+ declare const SliderField: _esphome_compose.IntentComponent<SliderFieldProps, readonly ["lvgl:widget"], readonly [], undefined, undefined>;
495
+
496
+ /**
497
+ * SwitchField — a label + switch in a row layout.
498
+ *
499
+ * Compiles to a container with a label and a switch widget.
500
+ */
501
+ interface SwitchFieldProps {
502
+ /** Label text displayed next to the switch. */
503
+ label: string;
504
+ /** Bound value (sensor or entity reference). */
505
+ value?: unknown;
506
+ /** Change handler (ESPHome action). */
507
+ onChange?: unknown;
508
+ /** Width of the field container. */
509
+ width?: number | string;
510
+ }
511
+ /**
512
+ * SwitchField — a label + switch in a row layout.
513
+ *
514
+ * @example
515
+ * <SwitchField label="Lamp" />
516
+ */
517
+ declare const SwitchField: _esphome_compose.IntentComponent<SwitchFieldProps, readonly ["lvgl:widget"], readonly [], undefined, undefined>;
518
+
519
+ interface DropdownFieldProps {
520
+ /** Label text displayed above the dropdown. */
521
+ label: string;
522
+ /** Newline-separated option values (ESPHome LVGL format). */
523
+ options: string;
524
+ /** Bound selection index. */
525
+ value?: unknown;
526
+ /** Change handler (ESPHome action). */
527
+ onChange?: unknown;
528
+ /** Gap between label and dropdown. Default: 'xs'. */
529
+ gap?: SpacingToken | number;
530
+ /** Width of the field container. */
531
+ width?: number | string;
532
+ }
533
+ /**
534
+ * DropdownField — a label + dropdown composite.
535
+ *
536
+ * @example
537
+ * <DropdownField label="Mode" options={"Auto\nCool\nHeat"} />
538
+ */
539
+ declare const DropdownField: _esphome_compose.IntentComponent<DropdownFieldProps, readonly ["lvgl:widget"], readonly [], undefined, undefined>;
540
+
541
+ export { Button, COMPOSE_UI_INTENTS, Card, Col, DropdownField, type FontDef, Grid, GridItem, HStack, type RadiusToken, Row, Screen, type SizeDimensions, type SizeToken, SliderField, Space, type SpacingToken, type StatusColors, type StatusToken, SwitchField, Text, type TextVariant, type Theme, type ThemeColors, ThemeContext, ThemeProvider, type ThemeTypography, type TrackSize, VStack, darkTheme, fontDefToLvgl, lightTheme, resolveRadius, resolveSize, resolveSpacing, resolveStatus, resolveTypography, themeFromJSON, themeToJSON, useTheme };