le-kit 0.4.0 → 0.5.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.
Files changed (126) hide show
  1. package/LLM_CONTEXT.md +1377 -0
  2. package/dist/cjs/le-bar_16.cjs.entry.js +15 -15
  3. package/dist/cjs/le-code-input.cjs.entry.js +181 -0
  4. package/dist/cjs/le-combobox.cjs.entry.js +1 -1
  5. package/dist/cjs/le-header-placeholder.cjs.entry.js +1 -1
  6. package/dist/cjs/le-kit.cjs.js +1 -1
  7. package/dist/cjs/le-multiselect.cjs.entry.js +3 -3
  8. package/dist/cjs/le-number-input.cjs.entry.js +1 -1
  9. package/dist/cjs/le-round-progress.cjs.entry.js +1 -1
  10. package/dist/cjs/le-segmented-control.cjs.entry.js +1 -1
  11. package/dist/cjs/le-stack.cjs.entry.js +1 -1
  12. package/dist/cjs/le-tab-bar.cjs.entry.js +1 -1
  13. package/dist/cjs/le-tab-panel.cjs.entry.js +2 -2
  14. package/dist/cjs/le-tab.cjs.entry.js +1 -1
  15. package/dist/cjs/le-tabs.cjs.entry.js +2 -2
  16. package/dist/cjs/le-tag.cjs.entry.js +1 -1
  17. package/dist/cjs/le-turntable.cjs.entry.js +1 -1
  18. package/dist/cjs/loader.cjs.js +1 -1
  19. package/dist/collection/collection-manifest.json +1 -0
  20. package/dist/collection/components/le-code-input/le-code-input.css +106 -0
  21. package/dist/collection/components/le-code-input/le-code-input.js +466 -0
  22. package/dist/collection/components/le-code-input/le-code-input.js.map +1 -0
  23. package/dist/collection/components/le-collapse/le-collapse.js +1 -1
  24. package/dist/collection/components/le-combobox/le-combobox.js +1 -1
  25. package/dist/collection/components/le-current-heading/le-current-heading.js +1 -1
  26. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +1 -1
  27. package/dist/collection/components/le-header/le-header.js +2 -2
  28. package/dist/collection/components/le-header-placeholder/le-header-placeholder.js +1 -1
  29. package/dist/collection/components/le-icon/le-icon.js +1 -1
  30. package/dist/collection/components/le-multiselect/le-multiselect.js +3 -3
  31. package/dist/collection/components/le-number-input/le-number-input.js +1 -1
  32. package/dist/collection/components/le-popover/le-popover.js +3 -3
  33. package/dist/collection/components/le-round-progress/le-round-progress.js +1 -1
  34. package/dist/collection/components/le-scroll-progress/le-scroll-progress.js +1 -1
  35. package/dist/collection/components/le-segmented-control/le-segmented-control.js +1 -1
  36. package/dist/collection/components/le-select/le-select.js +2 -2
  37. package/dist/collection/components/le-slot/le-slot.js +1 -1
  38. package/dist/collection/components/le-stack/le-stack.js +1 -1
  39. package/dist/collection/components/le-string-input/le-string-input.js +2 -2
  40. package/dist/collection/components/le-tab/le-tab.js +1 -1
  41. package/dist/collection/components/le-tab-bar/le-tab-bar.js +1 -1
  42. package/dist/collection/components/le-tab-panel/le-tab-panel.js +2 -2
  43. package/dist/collection/components/le-tabs/le-tabs.js +2 -2
  44. package/dist/collection/components/le-tag/le-tag.js +1 -1
  45. package/dist/collection/components/le-turntable/le-turntable.js +1 -1
  46. package/dist/collection/dist/components/assets/custom-elements.json +1248 -871
  47. package/dist/components/assets/custom-elements.json +1248 -871
  48. package/dist/components/le-button2.js +5 -5
  49. package/dist/components/le-code-input.d.ts +11 -0
  50. package/dist/components/le-code-input.js +265 -0
  51. package/dist/components/le-code-input.js.map +1 -0
  52. package/dist/components/le-collapse2.js +1 -1
  53. package/dist/components/le-combobox.js +1 -1
  54. package/dist/components/le-current-heading.js +1 -1
  55. package/dist/components/le-dropdown-base2.js +1 -1
  56. package/dist/components/le-header-placeholder.js +1 -1
  57. package/dist/components/le-header.js +2 -2
  58. package/dist/components/le-icon2.js +1 -1
  59. package/dist/components/le-multiselect.js +3 -3
  60. package/dist/components/le-number-input.js +1 -1
  61. package/dist/components/le-popover2.js +3 -3
  62. package/dist/components/le-round-progress.js +1 -1
  63. package/dist/components/le-scroll-progress.js +1 -1
  64. package/dist/components/le-segmented-control.js +1 -1
  65. package/dist/components/le-stack.js +1 -1
  66. package/dist/components/le-tab-bar.js +1 -1
  67. package/dist/components/le-tab-panel.js +2 -2
  68. package/dist/components/le-tab2.js +1 -1
  69. package/dist/components/le-tabs.js +2 -2
  70. package/dist/components/le-tag2.js +1 -1
  71. package/dist/components/le-turntable.js +1 -1
  72. package/dist/docs.json +442 -1
  73. package/dist/esm/le-bar_16.entry.js +15 -15
  74. package/dist/esm/le-code-input.entry.js +179 -0
  75. package/dist/esm/le-code-input.entry.js.map +1 -0
  76. package/dist/esm/le-combobox.entry.js +1 -1
  77. package/dist/esm/le-header-placeholder.entry.js +1 -1
  78. package/dist/esm/le-kit.js +1 -1
  79. package/dist/esm/le-multiselect.entry.js +3 -3
  80. package/dist/esm/le-number-input.entry.js +1 -1
  81. package/dist/esm/le-round-progress.entry.js +1 -1
  82. package/dist/esm/le-segmented-control.entry.js +1 -1
  83. package/dist/esm/le-stack.entry.js +1 -1
  84. package/dist/esm/le-tab-bar.entry.js +1 -1
  85. package/dist/esm/le-tab-panel.entry.js +2 -2
  86. package/dist/esm/le-tab.entry.js +1 -1
  87. package/dist/esm/le-tabs.entry.js +2 -2
  88. package/dist/esm/le-tag.entry.js +1 -1
  89. package/dist/esm/le-turntable.entry.js +1 -1
  90. package/dist/esm/loader.js +1 -1
  91. package/dist/le-kit/dist/components/assets/custom-elements.json +1248 -871
  92. package/dist/le-kit/le-kit.esm.js +1 -1
  93. package/dist/le-kit/{p-c4975e66.entry.js → p-24112ca3.entry.js} +2 -2
  94. package/dist/le-kit/{p-3f26be75.entry.js → p-2c6d080d.entry.js} +2 -2
  95. package/dist/le-kit/p-516c8531.entry.js +2 -0
  96. package/dist/le-kit/{p-69dd089a.entry.js → p-6b69f9a2.entry.js} +2 -2
  97. package/dist/le-kit/{p-6da2d81a.entry.js → p-6d14306f.entry.js} +2 -2
  98. package/dist/le-kit/{p-7201ae65.entry.js → p-7bcdf2d4.entry.js} +2 -2
  99. package/dist/le-kit/{p-36f126bb.entry.js → p-7cf1e23c.entry.js} +2 -2
  100. package/dist/le-kit/{p-d449a88b.entry.js → p-85f2fd4d.entry.js} +2 -2
  101. package/dist/le-kit/{p-d1eee582.entry.js → p-ab6c1def.entry.js} +2 -2
  102. package/dist/le-kit/{p-3f31e31b.entry.js → p-ae4ead64.entry.js} +2 -2
  103. package/dist/le-kit/{p-33a24394.entry.js → p-b05d4511.entry.js} +2 -2
  104. package/dist/le-kit/{p-9863d6fb.entry.js → p-b6ac02ff.entry.js} +2 -2
  105. package/dist/le-kit/{p-cd38c01b.entry.js → p-c24769e2.entry.js} +2 -2
  106. package/dist/le-kit/{p-bf66757c.entry.js → p-dc0445ad.entry.js} +2 -2
  107. package/dist/le-kit/p-eb5286f2.entry.js +2 -0
  108. package/dist/le-kit/p-eb5286f2.entry.js.map +1 -0
  109. package/dist/types/components/le-code-input/le-code-input.d.ts +102 -0
  110. package/dist/types/components.d.ts +183 -0
  111. package/package.json +7 -5
  112. package/dist/le-kit/p-7a60bfff.entry.js +0 -2
  113. /package/dist/le-kit/{p-c4975e66.entry.js.map → p-24112ca3.entry.js.map} +0 -0
  114. /package/dist/le-kit/{p-3f26be75.entry.js.map → p-2c6d080d.entry.js.map} +0 -0
  115. /package/dist/le-kit/{p-7a60bfff.entry.js.map → p-516c8531.entry.js.map} +0 -0
  116. /package/dist/le-kit/{p-69dd089a.entry.js.map → p-6b69f9a2.entry.js.map} +0 -0
  117. /package/dist/le-kit/{p-6da2d81a.entry.js.map → p-6d14306f.entry.js.map} +0 -0
  118. /package/dist/le-kit/{p-7201ae65.entry.js.map → p-7bcdf2d4.entry.js.map} +0 -0
  119. /package/dist/le-kit/{p-36f126bb.entry.js.map → p-7cf1e23c.entry.js.map} +0 -0
  120. /package/dist/le-kit/{p-d449a88b.entry.js.map → p-85f2fd4d.entry.js.map} +0 -0
  121. /package/dist/le-kit/{p-d1eee582.entry.js.map → p-ab6c1def.entry.js.map} +0 -0
  122. /package/dist/le-kit/{p-3f31e31b.entry.js.map → p-ae4ead64.entry.js.map} +0 -0
  123. /package/dist/le-kit/{p-33a24394.entry.js.map → p-b05d4511.entry.js.map} +0 -0
  124. /package/dist/le-kit/{p-9863d6fb.entry.js.map → p-b6ac02ff.entry.js.map} +0 -0
  125. /package/dist/le-kit/{p-cd38c01b.entry.js.map → p-c24769e2.entry.js.map} +0 -0
  126. /package/dist/le-kit/{p-bf66757c.entry.js.map → p-dc0445ad.entry.js.map} +0 -0
package/LLM_CONTEXT.md ADDED
@@ -0,0 +1,1377 @@
1
+ # Le-Kit Component Reference
2
+
3
+ This file is auto-generated and contains documentation for all Le-Kit web components. It is intended to be used as context for AI coding assistants.
4
+
5
+ ## Table of Contents
6
+
7
+ - [le-bar](#le-bar)
8
+ - [le-box](#le-box)
9
+ - [le-button](#le-button)
10
+ - [le-card](#le-card)
11
+ - [le-checkbox](#le-checkbox)
12
+ - [le-code-input](#le-code-input)
13
+ - [le-collapse](#le-collapse)
14
+ - [le-combobox](#le-combobox)
15
+ - [le-component](#le-component)
16
+ - [le-current-heading](#le-current-heading)
17
+ - [le-dropdown-base](#le-dropdown-base)
18
+ - [le-header](#le-header)
19
+ - [le-header-placeholder](#le-header-placeholder)
20
+ - [le-icon](#le-icon)
21
+ - [le-multiselect](#le-multiselect)
22
+ - [le-navigation](#le-navigation)
23
+ - [le-number-input](#le-number-input)
24
+ - [le-popover](#le-popover)
25
+ - [le-popup](#le-popup)
26
+ - [le-round-progress](#le-round-progress)
27
+ - [le-scroll-progress](#le-scroll-progress)
28
+ - [le-segmented-control](#le-segmented-control)
29
+ - [le-select](#le-select)
30
+ - [le-side-panel](#le-side-panel)
31
+ - [le-side-panel-toggle](#le-side-panel-toggle)
32
+ - [le-slot](#le-slot)
33
+ - [le-stack](#le-stack)
34
+ - [le-string-input](#le-string-input)
35
+ - [le-tab](#le-tab)
36
+ - [le-tab-bar](#le-tab-bar)
37
+ - [le-tab-panel](#le-tab-panel)
38
+ - [le-tabs](#le-tabs)
39
+ - [le-tag](#le-tag)
40
+ - [le-text](#le-text)
41
+ - [le-turntable](#le-turntable)
42
+
43
+ ---
44
+
45
+ ## <le-bar>
46
+
47
+ A flexible bar component that handles overflow gracefully.
48
+
49
+ Items are slotted children. The bar measures which items fit on the first
50
+ row and handles overflow according to the `overflow` prop.
51
+
52
+ ### Properties
53
+
54
+ | Name | Type | Default | Description |
55
+ |------|------|---------|-------------|
56
+ | `el` | `HTMLElement` | | |
57
+ | `overflow` | `'more' \| 'scroll' \| 'hamburger' \| 'wrap'` | `'more'` | Overflow behavior when items don't fit on one row. - `more`: Overflow items appear in a "more" dropdown - `scroll`: Items scroll horizontally with optional arrows - `hamburger`: All items go into a hamburger menu if any overflow - `wrap`: Items wrap to additional rows |
58
+ | `alignItems` | `'start' \| 'end' \| 'center' \| 'stretch'` | `'start'` | Alignment of items within the bar (maps to justify-content). |
59
+ | `arrows` | `boolean` | `false` | Show scroll arrows when overflow is "scroll". |
60
+ | `disablePopover` | `boolean` | `false` | Disable the internal overflow popover. When true, the bar still detects overflow and hides items, but doesn't render its own popover. Use this when providing custom overflow handling via the leBarOverflowChange event. |
61
+ | `minVisibleItems` | `number` | `0` | Minimum number of visible items required when using "more" overflow mode. If fewer items would be visible, the bar falls back to hamburger mode. Only applies when overflow is "more". |
62
+ | `showAllMenu` | `boolean \| 'start' \| 'end'` | `false` | Show an "all items" menu button. - `false`: Don't show - `true` or `'end'`: Show at end - `'start'`: Show at start |
63
+
64
+ ### Events
65
+
66
+ | Event | Type | Description |
67
+ |-------|------|-------------|
68
+ | `leBarOverflowChange` | `EventEmitter<LeBarOverflowChangeDetail>` | Emitted when overflow state changes. |
69
+
70
+ ### Slots
71
+
72
+ | Name | Description |
73
+ |------|-------------|
74
+ | Default | Bar items (children will be measured for overflow) |
75
+ | `"more"` | Custom "more" button content |
76
+ | `"hamburger"` | Custom hamburger button content |
77
+ | `"start-arrow"` | Custom left scroll arrow |
78
+ | `"end-arrow"` | Custom right scroll arrow |
79
+ | `"all-menu"` | Custom "show all" menu button |
80
+
81
+ ---
82
+
83
+ ## <le-box>
84
+
85
+ A flexible box component for use as a flex item within le-stack.
86
+
87
+ `le-box` wraps content and provides flex item properties like grow, shrink,
88
+ basis, and self-alignment. It can also control its internal content alignment.
89
+
90
+ ### Properties
91
+
92
+ | Name | Type | Default | Description |
93
+ |------|------|---------|-------------|
94
+ | `el` | `HTMLElement` | | |
95
+ | `grow` | `number` | `0` | Flex grow factor - how much the item should grow relative to siblings |
96
+ | `shrink` | `number` | `1` | Flex shrink factor - how much the item should shrink relative to siblings |
97
+ | `basis` | `string` | `'auto'` | Flex basis - initial size before growing/shrinking (e.g., '200px', '25%', 'auto') |
98
+ | `width` | `string \| undefined` | | Width of the box (CSS value like '100px', '50%', 'auto') |
99
+ | `height` | `string \| undefined` | | Height of the box (CSS value) |
100
+ | `minWidth` | `string \| undefined` | | Minimum width constraint |
101
+ | `maxWidth` | `string \| undefined` | | Maximum width constraint |
102
+ | `minHeight` | `string \| undefined` | | Minimum height constraint |
103
+ | `maxHeight` | `string \| undefined` | | Maximum height constraint |
104
+ | `background` | `string \| undefined` | | Background color or CSS value (e.g., '#f0f0f0', 'var(--le-color-primary-light)') |
105
+ | `borderRadius` | `string \| undefined` | | Border radius (e.g., '8px', 'var(--le-radius-md)') |
106
+ | `border` | `string \| undefined` | | Border style (e.g., '1px solid #ccc', '2px dashed var(--le-color-border)') |
107
+ | `alignSelf` | `'auto' \| 'start' \| 'center' \| 'end' \| 'stretch' \| 'baseline'` | `'auto'` | Self-alignment override for this item on the cross axis |
108
+ | `alignContent` | `'start' \| 'center' \| 'end' \| 'stretch'` | `'stretch'` | Internal horizontal alignment of content |
109
+ | `justifyContent` | `'start' \| 'center' \| 'end' \| 'stretch'` | `'start'` | Internal vertical alignment of content |
110
+ | `padding` | `string \| undefined` | | Padding inside the box (CSS value like '8px', '1rem') |
111
+ | `order` | `number \| undefined` | | Order in the flex container (lower values come first) |
112
+ | `displayFlex` | `boolean` | `false` | Whether to display box content as flex (for internal alignment) |
113
+ | `innerDirection` | `'horizontal' \| 'vertical'` | `'vertical'` | Direction of internal flex layout when displayFlex is true |
114
+ | `innerGap` | `string \| undefined` | | Gap between internal flex items when displayFlex is true |
115
+
116
+ ### Slots
117
+
118
+ | Name | Description |
119
+ |------|-------------|
120
+ | Default | Default slot for box content |
121
+
122
+ ### CSS Variables
123
+
124
+ | Name | Description |
125
+ |------|-------------|
126
+ | `--le-box-bg` | Background color |
127
+ | `--le-box-padding` | Padding inside the box |
128
+ | `--le-box-border-radius` | Border radius |
129
+
130
+ ---
131
+
132
+ ## <le-button>
133
+
134
+ A flexible button component with multiple variants and states.
135
+
136
+ ### Properties
137
+
138
+ | Name | Type | Default | Description |
139
+ |------|------|---------|-------------|
140
+ | `el` | `HTMLElement` | | |
141
+ | `mode` | `'default' \| 'admin'` | | Mode of the popover should be 'default' for internal use |
142
+ | `variant` | `'solid' \| 'outlined' \| 'clear' \| 'system'` | `'solid'` | Button variant style |
143
+ | `color` | `'primary' \| 'secondary' \| 'success' \| 'warning' \| 'danger' \| 'info'` | `'primary'` | Button color theme (uses theme semantic colors) |
144
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Button size |
145
+ | `selected` | `boolean` | `false` | Whether the button is in a selected/active state |
146
+ | `fullWidth` | `boolean` | `false` | Whether the button takes full width of its container |
147
+ | `iconOnly` | `string \| Node \| undefined` | | Icon only button image or emoji if this prop is set, the button will render only the icon slot |
148
+ | `iconStart` | `string \| Node \| undefined` | | Start icon image or emoji |
149
+ | `iconEnd` | `string \| Node \| undefined` | | End icon image or emoji |
150
+ | `disabled` | `boolean` | `false` | Whether the button is disabled |
151
+ | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` | The button type attribute |
152
+ | `href` | `string \| undefined` | | Optional href to make the button act as a link |
153
+ | `target` | `string \| undefined` | | Link target when href is set |
154
+ | `align` | `'start' \| 'center' \| 'space-between' \| 'end'` | `'center'` | Alignment of the button label without the end icon |
155
+
156
+ ### Events
157
+
158
+ | Event | Type | Description |
159
+ |-------|------|-------------|
160
+ | `click` | `EventEmitter<MouseEvent>` | Emitted when the button is clicked. This is a custom event that wraps the native click but ensures the target is the le-button. |
161
+
162
+ ### Slots
163
+
164
+ | Name | Description |
165
+ |------|-------------|
166
+ | Default | Button text content |
167
+ | `"icon-only"` | Icon for icon-only buttons |
168
+
169
+ ### CSS Variables
170
+
171
+ | Name | Description |
172
+ |------|-------------|
173
+ | `--le-button-bg` | Button background color |
174
+ | `--le-button-color` | Button text color |
175
+ | `--le-button-border-radius` | Button border radius |
176
+ | `--le-button-padding-x` | Button horizontal padding |
177
+ | `--le-button-padding-y` | Button vertical padding |
178
+
179
+ ---
180
+
181
+ ## <le-card>
182
+
183
+ A flexible card component with header, content, and footer slots.
184
+
185
+ The card uses le-slot wrappers for each slot area. In admin mode,
186
+ le-slot shows placeholders for CMS editing. In default mode,
187
+ le-slot acts as a transparent passthrough.
188
+
189
+ ### Properties
190
+
191
+ | Name | Type | Default | Description |
192
+ |------|------|---------|-------------|
193
+ | `el` | `HTMLElement` | | |
194
+ | `variant` | `'default' \| 'outlined' \| 'elevated'` | `'default'` | Card variant style |
195
+ | `interactive` | `boolean` | `false` | Whether the card is interactive (clickable) |
196
+
197
+ ### Slots
198
+
199
+ | Name | Description |
200
+ |------|-------------|
201
+ | `"header"` | Card header content (title, actions) |
202
+ | Default | Default slot for main card content |
203
+ | `"footer"` | Card footer content (buttons, links) |
204
+
205
+ ### CSS Variables
206
+
207
+ | Name | Description |
208
+ |------|-------------|
209
+ | `--le-card-bg` | Card background color |
210
+ | `--le-card-border-radius` | Card border radius |
211
+ | `--le-card-shadow` | Card box shadow |
212
+ | `--le-card-padding` | Card content padding |
213
+
214
+ ---
215
+
216
+ ## <le-checkbox>
217
+
218
+ A checkbox component with support for labels, descriptions, and external IDs.
219
+
220
+ ### Properties
221
+
222
+ | Name | Type | Default | Description |
223
+ |------|------|---------|-------------|
224
+ | `el` | `HTMLElement` | | |
225
+ | `checked` | `boolean` | `false` | Whether the checkbox is checked |
226
+ | `disabled` | `boolean` | `false` | Whether the checkbox is disabled |
227
+ | `name` | `string` | | The name of the checkbox input |
228
+ | `value` | `string` | | The value of the checkbox input |
229
+ | `externalId` | `string` | | External ID for linking with external systems (e.g. database ID, PDF form field ID) |
230
+
231
+ ### Events
232
+
233
+ | Event | Type | Description |
234
+ |-------|------|-------------|
235
+ | `change` | `EventEmitter<{ checked: boolean; value: string; name: string; externalId: string }>` | Emitted when the checked state changes |
236
+
237
+ ### Slots
238
+
239
+ | Name | Description |
240
+ |------|-------------|
241
+ | Default | The label text for the checkbox |
242
+ | `"description"` | Additional description text displayed below the label |
243
+
244
+ ### CSS Variables
245
+
246
+ | Name | Description |
247
+ |------|-------------|
248
+ | `--le-checkbox-size` | Size of the checkbox input |
249
+ | `--le-checkbox-color` | Color of the checkbox when checked |
250
+ | `--le-checkbox-label-color` | Color of the label text |
251
+ | `--le-checkbox-desc-color` | Color of the description text |
252
+
253
+ ---
254
+
255
+ ## <le-code-input>
256
+
257
+ A one-time code input component with individual frames for each character.
258
+ Supports standard copy/paste and range selection behaviors.
259
+
260
+ ### Properties
261
+
262
+ | Name | Type | Default | Description |
263
+ |------|------|---------|-------------|
264
+ | `el` | `HTMLElement` | | |
265
+ | `value` | `string` | `''` | The value of the input |
266
+ | `name` | `string` | | The name of the input |
267
+ | `label` | `string` | | Label for the input |
268
+ | `length` | `number` | `6` | Length of the code (number of characters) |
269
+ | `description` | `string \| undefined` | | Description text displayed below the input in case there is a more complex markup, it can be provided via slot as well |
270
+ | `type` | `'text' \| 'number'` | `'text'` | The type of code (numeric or alphanumeric) This affects the keyboard layout on mobile devices. |
271
+ | `disabled` | `boolean` | `false` | Whether the input is disabled |
272
+ | `readonly` | `boolean` | `false` | Whether the input is read-only |
273
+ | `externalId` | `string` | | External ID for linking with external systems |
274
+ | `error` | `boolean` | `false` | Internal validation state (can be set externally manually or via simple check) |
275
+
276
+ ### Events
277
+
278
+ | Event | Type | Description |
279
+ |-------|------|-------------|
280
+ | `leChange` | `EventEmitter<{ value: string; name: string; externalId: string }>` | Emitted when the value changes (on blur or Enter) |
281
+ | `leInput` | `EventEmitter<{ value: string; name: string; externalId: string }>` | Emitted when the input value changes (on keystroke) |
282
+ | `leFocus` | `EventEmitter<void>` | Emitted when the input is focused |
283
+ | `leBlur` | `EventEmitter<void>` | Emitted when the input is blurred |
284
+
285
+ ### Slots
286
+
287
+ | Name | Description |
288
+ |------|-------------|
289
+ | `"description"` | Additional description text displayed below the input |
290
+
291
+ ### CSS Variables
292
+
293
+ | Name | Description |
294
+ |------|-------------|
295
+ | `--le-code-box-size` | Size of each character box (default: 40px width, 48px height) |
296
+ | `--le-input-bg` | Input background color |
297
+ | `--le-input-color` | Input text color |
298
+ | `--le-input-border` | Input border style |
299
+ | `--le-input-border-focus` | Input border style when focused |
300
+ | `--le-input-border-error` | Input border style when invalid |
301
+ | `--le-input-radius` | Input border radius |
302
+
303
+ ---
304
+
305
+ ## <le-collapse>
306
+
307
+ Animated show/hide wrapper.
308
+
309
+ Supports height collapse (auto->0) and/or fading.
310
+ Can optionally listen to the nearest `le-header` shrink events.
311
+
312
+ ### Properties
313
+
314
+ | Name | Type | Default | Description |
315
+ |------|------|---------|-------------|
316
+ | `el` | `HTMLElement` | | |
317
+ | `closed` | `boolean` | `false` | Since Stencil boolean props default to `false` when the attribute is missing. instead of `open` defaulting to `true`, using a `closed` prop. |
318
+ | `scrollDown` | `boolean` | `false` | Whether the content should scroll down from the top when open. |
319
+ | `noFading` | `boolean` | `false` | Stop fading the content when collapsing/expanding. |
320
+ | `collapseOnHeaderShrink` | `boolean` | `false` | If true, collapse/expand based on the nearest header shrink event. |
321
+
322
+ ### Slots
323
+
324
+ | Name | Description |
325
+ |------|-------------|
326
+ | Default | Content to animate |
327
+
328
+ ### CSS Variables
329
+
330
+ | Name | Description |
331
+ |------|-------------|
332
+ | `--le-collapse-duration` | Transition duration |
333
+
334
+ ---
335
+
336
+ ## <le-combobox>
337
+
338
+ A combobox component with searchable dropdown.
339
+
340
+ Combines a text input with a dropdown list, allowing users to
341
+ filter options by typing or select from the list.
342
+
343
+ ### Properties
344
+
345
+ | Name | Type | Default | Description |
346
+ |------|------|---------|-------------|
347
+ | `el` | `HTMLElement` | | |
348
+ | `options` | `LeOption[] \| string` | `[]` | The options to display in the dropdown. |
349
+ | `value` | `LeOptionValue \| undefined` | | The currently selected value. |
350
+ | `placeholder` | `string` | `'Type to search...'` | Placeholder text for the input. |
351
+ | `disabled` | `boolean` | `false` | Whether the combobox is disabled. |
352
+ | `required` | `boolean` | `false` | Whether selection is required. |
353
+ | `name` | `string \| undefined` | | Name attribute for form submission. |
354
+ | `fullWidth` | `boolean` | `false` | Whether the multiselect should take full width of its container. |
355
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Size variant of the combobox. |
356
+ | `allowCustom` | `boolean` | `false` | Whether to allow custom values not in the options list. |
357
+ | `minSearchLength` | `number` | `0` | Minimum characters before showing filtered results. |
358
+ | `emptyText` | `string` | `'No results found'` | Text to show when no options match the search. |
359
+ | `open` | `boolean` | `false` | Whether the dropdown is currently open. |
360
+
361
+ ### Events
362
+
363
+ | Event | Type | Description |
364
+ |-------|------|-------------|
365
+ | `leChange` | `EventEmitter<LeOptionSelectDetail>` | Emitted when the selected value changes. |
366
+ | `leInput` | `EventEmitter<{ value: string }>` | Emitted when the input value changes (for custom values). |
367
+ | `leOpen` | `EventEmitter<void>` | Emitted when the dropdown opens. |
368
+ | `leClose` | `EventEmitter<void>` | Emitted when the dropdown closes. |
369
+
370
+ ---
371
+
372
+ ## <le-component>
373
+
374
+ Component wrapper for admin mode editing.
375
+
376
+ This component is used internally by other components to provide admin-mode
377
+ editing capabilities. It wraps the component's rendered output and shows
378
+ a settings popover for editing properties.
379
+
380
+ In default mode, it acts as a simple passthrough (display: contents).
381
+ In admin mode, it shows a border, component name header, and settings popover.
382
+
383
+ The host element is found automatically by traversing up through the shadow DOM.
384
+
385
+ Usage inside a component's render method:
386
+ ```tsx
387
+ render() {
388
+ return (
389
+ <le-component component="le-card">
390
+ <Host>...</Host>
391
+ </le-component>
392
+ );
393
+ }
394
+ ```
395
+
396
+ ### Properties
397
+
398
+ | Name | Type | Default | Description |
399
+ |------|------|---------|-------------|
400
+ | `el` | `HTMLElement` | | |
401
+ | `component` | `string` | | The tag name of the component (e.g., 'le-card'). Used to look up property metadata and display the component name. |
402
+ | `displayName` | `string \| undefined` | | Optional display name for the component. If not provided, the tag name will be formatted as the display name. |
403
+ | `hostClass` | `string \| undefined` | | Classes to apply to the host element. Allows parent components to pass their styling classes. |
404
+ | `hostStyle` | `{ [key: string]: string } \| undefined` | | Inline styles to apply to the host element. Allows parent components to pass dynamic styles (e.g., flex properties). |
405
+
406
+ ### Slots
407
+
408
+ | Name | Description |
409
+ |------|-------------|
410
+ | Default | The component's rendered content |
411
+
412
+ ---
413
+
414
+ ## <le-current-heading>
415
+
416
+ Shows a "smart" header title based on what has scrolled out of view.
417
+
418
+ When `selector` matches multiple elements, the title becomes the last element
419
+ (top-to-bottom) that has fully scrolled out above the viewport.
420
+
421
+ ### Properties
422
+
423
+ | Name | Type | Default | Description |
424
+ |------|------|---------|-------------|
425
+ | `el` | `HTMLElement` | | |
426
+ | `selector` | `string` | `''` | CSS selector for page title/headings to watch (e.g. `.page-title`, `main h2`). |
427
+
428
+ ### Slots
429
+
430
+ | Name | Description |
431
+ |------|-------------|
432
+ | Default | Optional fallback content if no watched title is active |
433
+
434
+ ---
435
+
436
+ ## <le-dropdown-base>
437
+
438
+ Internal dropdown base component that provides shared functionality
439
+ for select, combobox, and multiselect components.
440
+
441
+ Wraps le-popover for positioning and provides:
442
+ - Option list rendering with groups
443
+ - Keyboard navigation (↑↓, Enter, Escape, Home/End)
444
+ - Option filtering support
445
+ - Single and multi-select modes
446
+
447
+ ### Properties
448
+
449
+ | Name | Type | Default | Description |
450
+ |------|------|---------|-------------|
451
+ | `el` | `HTMLElement` | | |
452
+ | `options` | `LeOption[]` | `[]` | The options to display in the dropdown. |
453
+ | `value` | `LeOptionValue \| LeOptionValue[] \| undefined` | | Current value(s) - single value or array for multiselect. |
454
+ | `multiple` | `boolean` | `false` | Whether multiple selection is allowed. |
455
+ | `open` | `boolean` | `false` | Whether the dropdown is open. |
456
+ | `disabled` | `boolean` | `false` | Whether the dropdown is disabled. |
457
+ | `filterFn` | `(option: LeOption, query: string) => boolean \| undefined` | | Filter function for options. Return true to include the option. |
458
+ | `filterQuery` | `string` | `''` | Current filter query string. |
459
+ | `emptyText` | `string` | `'No options'` | Placeholder text when no options match filter. |
460
+ | `showCheckboxes` | `boolean` | `true` | Whether to show checkboxes for multiselect mode. |
461
+ | `maxHeight` | `string` | `'300px'` | Maximum height of the dropdown list. |
462
+ | `width` | `string \| undefined` | | Width of the dropdown. If not set, matches trigger width. |
463
+ | `fullWidth` | `boolean` | `false` | Sets the dropdown to full width of the trigger. |
464
+ | `closeOnClickOutside` | `boolean` | `true` | Whether to close the dropdown when clicking outside. (used to support combobox with input focus) |
465
+
466
+ ### Events
467
+
468
+ | Event | Type | Description |
469
+ |-------|------|-------------|
470
+ | `leOptionSelect` | `EventEmitter<LeOptionSelectDetail>` | Emitted when an option is selected. |
471
+ | `leDropdownOpen` | `EventEmitter<void>` | Emitted when the dropdown opens. |
472
+ | `leDropdownClose` | `EventEmitter<void>` | Emitted when the dropdown closes. |
473
+
474
+ ### Slots
475
+
476
+ | Name | Description |
477
+ |------|-------------|
478
+ | `"trigger"` | The element that triggers the dropdown |
479
+
480
+ ---
481
+
482
+ ## <le-header>
483
+
484
+ A functional page header with scroll-aware behaviors.
485
+
486
+ Features:
487
+ - Static (default), sticky, or fixed positioning
488
+ - Optional shrink-on-scroll behavior via `shrink-offset`
489
+ - Optional reveal-on-scroll-up via `reveal-on-scroll` (sticky only)
490
+
491
+ Slots:
492
+ - `start`: left side (logo/back button)
493
+ - `title`: centered/primary title content
494
+ - `end`: right side actions
495
+ - default: extra content row (e.g., tabs/search) rendered below main row
496
+
497
+ ### Properties
498
+
499
+ | Name | Type | Default | Description |
500
+ |------|------|---------|-------------|
501
+ | `el` | `HTMLElement` | | |
502
+ | `isStatic` | `boolean` | `false` | Force static positioning (default). Ignored if `sticky` or `fixed` are true. |
503
+ | `sticky` | `boolean` | `false` | Sticky positioning (in-flow). Ignored if `fixed` is true. |
504
+ | `fixed` | `boolean` | `false` | Fixed positioning (out-of-flow). Takes precedence over `sticky`/`static`. |
505
+ | `revealOnScroll` | `string \| undefined` | | Sticky-only reveal behavior (hide on scroll down, show on scroll up). - missing/false: disabled - true/empty attribute: enabled with default threshold (16) - number (as string): enabled and used as threshold |
506
+ | `shrinkOffset` | `string \| undefined` | | Shrink trigger. - missing/0: disabled - number (px): shrink when scrollY >= that value (but never before header height) - css var name (e.g. --foo): shrink when scrollY >= resolved var value - selector (e.g. .page-title): shrink when that element scrolls out of view above the viewport |
507
+ | `expandOnHover` | `boolean` | `false` | If true, expand the header when hovered |
508
+
509
+ ### Events
510
+
511
+ | Event | Type | Description |
512
+ |-------|------|-------------|
513
+ | `leHeaderState` | `EventEmitter<{
514
+ y: number;
515
+ direction: 'up' \| 'down';
516
+ revealed: boolean;
517
+ shrunk: boolean;
518
+ }>` | Emits whenever scroll-driven state changes. |
519
+ | `leHeaderShrinkChange` | `EventEmitter<{ shrunk: boolean; y: number }>` | Emits when the header shrinks/expands (only on change). |
520
+ | `leHeaderVisibilityChange` | `EventEmitter<{ visible: boolean; y: number }>` | Emits when the header hides/shows (only on change). |
521
+
522
+ ### Slots
523
+
524
+ | Name | Description |
525
+ |------|-------------|
526
+ | `"start"` | Start area content |
527
+ | `"title"` | Title content |
528
+ | `"end"` | End area content |
529
+ | Default | Optional secondary row content |
530
+
531
+ ### CSS Variables
532
+
533
+ | Name | Description |
534
+ |------|-------------|
535
+ | `--le-header-bg` | Background (color/gradient) |
536
+ | `--le-header-color` | Text color |
537
+ | `--le-header-border` | Border (e.g. 1px solid ...) |
538
+ | `--le-header-shadow` | Shadow/elevation |
539
+ | `--le-header-max-width` | Inner content max width |
540
+ | `--le-header-padding-x` | Horizontal padding |
541
+ | `--le-header-padding-y` | Vertical padding |
542
+ | `--le-header-gap` | Gap between zones |
543
+ | `--le-header-height` | Base height (main row) |
544
+ | `--le-header-height-condensed` | Condensed height when shrunk |
545
+ | `--le-header-transition` | Transition timing |
546
+ | `--le-header-z` | Z-index (fixed mode) |
547
+
548
+ ---
549
+
550
+ ## <le-header-placeholder>
551
+
552
+ Placeholder for `le-header`.
553
+
554
+ Reserves space using the global CSS variable `--le-header-height`.
555
+ The header component updates that variable when it renders.
556
+
557
+ ### CSS Variables
558
+
559
+ | Name | Description |
560
+ |------|-------------|
561
+ | `--le-header-height` | Published header height (px) |
562
+
563
+ ---
564
+
565
+ ## <le-icon>
566
+
567
+ ### Properties
568
+
569
+ | Name | Type | Default | Description |
570
+ |------|------|---------|-------------|
571
+ | `el` | `HTMLElement` | | |
572
+ | `name` | `string` | `null` | Name of the icon to display. Corresponds to a JSON file in the assets folder. For example, "search" will load the "search.json" file. |
573
+ | `size` | `number` | `16` | Size of the icon in pixels. Default is 16. |
574
+
575
+ ---
576
+
577
+ ## <le-multiselect>
578
+
579
+ A multiselect component for selecting multiple options.
580
+
581
+ Displays selected items as tags with optional search filtering.
582
+
583
+ ### Properties
584
+
585
+ | Name | Type | Default | Description |
586
+ |------|------|---------|-------------|
587
+ | `el` | `HTMLElement` | | |
588
+ | `options` | `LeOption[] \| string` | `[]` | The options to display in the dropdown. |
589
+ | `value` | `LeOptionValue[]` | `[]` | The currently selected values. |
590
+ | `placeholder` | `string` | `'Select options...'` | Placeholder text when no options are selected. |
591
+ | `disabled` | `boolean` | `false` | Whether the multiselect is disabled. |
592
+ | `required` | `boolean` | `false` | Whether selection is required. |
593
+ | `name` | `string \| undefined` | | Name attribute for form submission. |
594
+ | `fullWidth` | `boolean` | `false` | Whether the multiselect should take full width of its container. |
595
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Size variant of the multiselect. |
596
+ | `maxSelections` | `number \| undefined` | | Maximum number of selections allowed. |
597
+ | `showSelectAll` | `boolean \| string \| string[]` | `false` | Whether to show a "Select All" option. Also accepts a string or array of strings to customize the label(s). |
598
+ | `searchable` | `boolean` | `false` | Whether the input is searchable. |
599
+ | `emptyText` | `string` | `'No results found'` | Text to show when no options match the search. |
600
+ | `open` | `boolean` | `false` | Whether the dropdown is currently open. |
601
+
602
+ ### Events
603
+
604
+ | Event | Type | Description |
605
+ |-------|------|-------------|
606
+ | `leChange` | `EventEmitter<LeMultiOptionSelectDetail>` | Emitted when the selected values change. |
607
+ | `leOpen` | `EventEmitter<void>` | Emitted when the dropdown opens. |
608
+ | `leClose` | `EventEmitter<void>` | Emitted when the dropdown closes. |
609
+
610
+ ---
611
+
612
+ ## <le-navigation>
613
+
614
+ Navigation component with vertical (tree) and horizontal (menu) layouts.
615
+
616
+ - Accepts items as `LeOption[]` or a JSON string.
617
+ - Supports hierarchical items via `children`.
618
+ - Supports persisted expansion via `open` on items.
619
+
620
+ ### Properties
621
+
622
+ | Name | Type | Default | Description |
623
+ |------|------|---------|-------------|
624
+ | `el` | `HTMLElement` | | |
625
+ | `items` | `LeOption[] \| string` | `[]` | Navigation items. Can be passed as an array or JSON string (same pattern as le-select). |
626
+ | `orientation` | `'vertical' \| 'horizontal'` | `'horizontal'` | Layout orientation. |
627
+ | `wrap` | `boolean` | `false` | Horizontal wrapping behavior. If false, overflow behavior depends on `overflowMode`. |
628
+ | `overflowMode` | `'more' \| 'hamburger'` | `'more'` | Overflow behavior for horizontal, non-wrapping menus. - more: moves overflow items into a "More" popover - hamburger: turns the whole nav into a hamburger popover |
629
+ | `minVisibleItemsForMore` | `number` | `2` | Minimum number of visible top-level items required to use the "More" overflow. If fewer would be visible, the navigation falls back to hamburger. |
630
+ | `align` | `'start' \| 'end' \| 'center' \| 'space-between'` | `'start'` | Alignment of the menu items within the navigation bar. |
631
+ | `activeUrl` | `string` | `''` | Active url for automatic selection. |
632
+ | `searchable` | `boolean` | `false` | Enables a search input for the vertical navigation. |
633
+ | `searchPlaceholder` | `string` | `'Search...'` | Placeholder text for the search input. |
634
+ | `emptyText` | `string` | `'No results found'` | Text shown when no items match the filter. |
635
+ | `submenuSearchable` | `boolean` | `false` | Whether submenu popovers should include a filter input. |
636
+
637
+ ### Events
638
+
639
+ | Event | Type | Description |
640
+ |-------|------|-------------|
641
+ | `leNavItemSelect` | `EventEmitter<LeNavigationItemSelectDetail>` | Fired when a navigation item is activated. This event is cancelable. Call `event.preventDefault()` to prevent default browser navigation and implement custom routing. |
642
+ | `leNavItemToggle` | `EventEmitter<LeNavigationItemToggleDetail>` | Fired when a tree branch is toggled. |
643
+
644
+ ### Slots
645
+
646
+ | Name | Description |
647
+ |------|-------------|
648
+ | `"hamburger-trigger"` | Custom trigger contents for the hamburger button |
649
+ | `"more-trigger"` | Custom trigger contents for the "More" button |
650
+
651
+ ---
652
+
653
+ ## <le-number-input>
654
+
655
+ A number input component with validation, keyboard controls, and custom spinners.
656
+
657
+ ### Properties
658
+
659
+ | Name | Type | Default | Description |
660
+ |------|------|---------|-------------|
661
+ | `el` | `HTMLElement` | | |
662
+ | `value` | `number` | | The value of the input |
663
+ | `name` | `string` | | The name of the input |
664
+ | `label` | `string` | | Label for the input |
665
+ | `placeholder` | `string` | | Placeholder text |
666
+ | `min` | `number \| undefined` | | Minimum allowed value |
667
+ | `max` | `number \| undefined` | | Maximum allowed value |
668
+ | `step` | `number` | `1` | Step value for increment/decrement |
669
+ | `required` | `boolean` | `false` | Whether the input is required |
670
+ | `disabled` | `boolean` | `false` | Whether the input is disabled |
671
+ | `readonly` | `boolean` | `false` | Whether the input is read-only |
672
+ | `iconStart` | `string \| undefined` | | Icon for the start icon |
673
+ | `showSpinners` | `boolean` | `true` | Whether to show the spinner controls |
674
+ | `externalId` | `string` | | External ID for linking with external systems |
675
+
676
+ ### Events
677
+
678
+ | Event | Type | Description |
679
+ |-------|------|-------------|
680
+ | `leChange` | `EventEmitter<{ value: number; name: string; externalId: string; isValid: boolean }>` | Emitted when the value changes (on blur or Enter) |
681
+ | `leInput` | `EventEmitter<{ value: number; name: string; externalId: string; isValid: boolean }>` | Emitted when the input value changes (on keystroke/spin) |
682
+
683
+ ### Slots
684
+
685
+ | Name | Description |
686
+ |------|-------------|
687
+ | Default | The label text for the input |
688
+ | `"description"` | Additional description text displayed below the input |
689
+ | `"icon-start"` | Icon to display at the start of the input |
690
+
691
+ ### CSS Variables
692
+
693
+ | Name | Description |
694
+ |------|-------------|
695
+ | `--le-input-bg` | Input background color |
696
+ | `--le-input-color` | Input text color |
697
+ | `--le-input-border` | Input border style |
698
+ | `--le-input-border-focus` | Input border style when focused |
699
+ | `--le-input-border-error` | Input border style when invalid |
700
+ | `--le-input-radius` | Input border radius |
701
+ | `--le-input-padding` | Input padding |
702
+
703
+ ---
704
+
705
+ ## <le-popover>
706
+
707
+ A popover component for displaying floating content.
708
+
709
+ Uses the native HTML Popover API for proper layering with dialogs
710
+ and other top-layer elements. Falls back gracefully in older browsers.
711
+
712
+ ### Properties
713
+
714
+ | Name | Type | Default | Description |
715
+ |------|------|---------|-------------|
716
+ | `el` | `HTMLElement` | | |
717
+ | `mode` | `'default' \| 'admin'` | | Mode of the popover should be 'default' for internal use |
718
+ | `open` | `boolean` | `false` | Whether the popover is currently open |
719
+ | `position` | `'top' \| 'bottom' \| 'left' \| 'right' \| 'auto'` | `'bottom'` | Position of the popover relative to its trigger |
720
+ | `align` | `'start' \| 'center' \| 'end'` | `'start'` | Alignment of the popover |
721
+ | `popoverTitle` | `string \| undefined` | | Optional title for the popover header |
722
+ | `showClose` | `boolean` | `true` | Whether to show a close button in the header |
723
+ | `closeOnClickOutside` | `boolean` | `true` | Whether clicking outside closes the popover |
724
+ | `closeOnEscape` | `boolean` | `true` | Whether pressing Escape closes the popover |
725
+ | `offset` | `number` | `8` | Offset from the trigger element (in pixels) |
726
+ | `width` | `string \| undefined` | | Fixed width for the popover (e.g., '300px', '20rem') |
727
+ | `minWidth` | `string \| undefined` | `'200px'` | Minimum width for the popover (e.g., '200px', '15rem') |
728
+ | `maxWidth` | `string \| undefined` | | Maximum width for the popover (e.g., '400px', '25rem') |
729
+ | `triggerFullWidth` | `boolean` | `false` | Should the popover's trigger take full width of its container |
730
+
731
+ ### Events
732
+
733
+ | Event | Type | Description |
734
+ |-------|------|-------------|
735
+ | `lePopoverOpen` | `EventEmitter<void>` | Emitted when the popover opens |
736
+ | `lePopoverClose` | `EventEmitter<void>` | Emitted when the popover closes |
737
+
738
+ ### Slots
739
+
740
+ | Name | Description |
741
+ |------|-------------|
742
+ | Default | Content to display inside the popover |
743
+ | `"trigger"` | Element that triggers the popover (optional) |
744
+
745
+ ---
746
+
747
+ ## <le-popup>
748
+
749
+ A flexible popup/dialog component for alerts, confirms, prompts, and custom content.
750
+
751
+ Uses the native HTML <dialog> element for proper modal behavior, accessibility,
752
+ and focus management. Can be used declaratively in HTML or programmatically
753
+ via leAlert(), leConfirm(), lePrompt().
754
+
755
+ ### Properties
756
+
757
+ | Name | Type | Default | Description |
758
+ |------|------|---------|-------------|
759
+ | `el` | `HTMLElement` | | |
760
+ | `mode` | `LeKitMode` | `'default'` | The mode of the Le Kit (e.g., 'default' or 'admin') |
761
+ | `open` | `boolean` | `false` | Whether the popup is currently visible |
762
+ | `type` | `PopupType` | `'alert'` | Type of popup: alert (OK only), confirm (OK/Cancel), prompt (input + OK/Cancel), custom |
763
+ | `popupTitle` | `string \| undefined` | | Optional title for the popup header |
764
+ | `message` | `string \| undefined` | | Message text to display (for alert/confirm/prompt types) |
765
+ | `modal` | `boolean` | `true` | Whether the popup is modal (blocks interaction with page behind) |
766
+ | `position` | `PopupPosition` | `'center'` | Position of the popup on screen |
767
+ | `confirmText` | `string` | `'OK'` | Text for the confirm/OK button |
768
+ | `cancelText` | `string` | `'Cancel'` | Text for the cancel button |
769
+ | `placeholder` | `string` | `''` | Placeholder text for prompt input |
770
+ | `defaultValue` | `string` | `''` | Default value for prompt input |
771
+ | `closeOnBackdrop` | `boolean` | `true` | Whether clicking the backdrop closes the popup (modal only) |
772
+ | `inputValue` | `string` | `''` | Internal state for prompt input value |
773
+
774
+ ### Events
775
+
776
+ | Event | Type | Description |
777
+ |-------|------|-------------|
778
+ | `leConfirm` | `EventEmitter<PopupResult>` | Emitted when the popup is confirmed (OK clicked) |
779
+ | `leCancel` | `EventEmitter<PopupResult>` | Emitted when the popup is cancelled (Cancel clicked or dismissed) |
780
+ | `leOpen` | `EventEmitter<void>` | Emitted when the popup opens |
781
+ | `leClose` | `EventEmitter<PopupResult>` | Emitted when the popup closes |
782
+
783
+ ### Slots
784
+
785
+ | Name | Description |
786
+ |------|-------------|
787
+ | Default | Default slot for custom body content |
788
+ | `"header"` | Custom header content (replaces title) |
789
+ | `"footer"` | Custom footer content (replaces default buttons) |
790
+
791
+ ---
792
+
793
+ ## <le-round-progress>
794
+
795
+ ### Properties
796
+
797
+ | Name | Type | Default | Description |
798
+ |------|------|---------|-------------|
799
+ | `el` | `HTMLElement` | | |
800
+ | `value` | `number` | `0` | |
801
+ | `padding` | `number` | `0` | |
802
+ | `paths` | `string` | | |
803
+ | `progressPaths` | `any[]` | | |
804
+ | `params` | `{
805
+ width: number;
806
+ diameter: number;
807
+ circumference: number;
808
+ }` | | |
809
+
810
+ ---
811
+
812
+ ## <le-scroll-progress>
813
+
814
+ Displays scroll progress as a simple bar.
815
+
816
+ If `track-scroll-progress` is present without a value, tracks the full document.
817
+ If it is a selector string, tracks progress within the matched element.
818
+
819
+ ### Properties
820
+
821
+ | Name | Type | Default | Description |
822
+ |------|------|---------|-------------|
823
+ | `el` | `HTMLElement` | | |
824
+ | `trackScrollProgress` | `string \| undefined` | | Boolean or selector string. |
825
+
826
+ ### CSS Variables
827
+
828
+ | Name | Description |
829
+ |------|-------------|
830
+ | `--le-scroll-progress-height` | Bar height |
831
+ | `--le-scroll-progress-bg` | Track background |
832
+ | `--le-scroll-progress-fill` | Fill color |
833
+ | `--le-scroll-progress-sticky-top` | If sticky, stop position to parent top |
834
+ | `--le-scroll-progress-fixed-top` | If fixed, distance from window top |
835
+ | `--le-scroll-progress-fixed-left` | If fixed, distance from window left |
836
+ | `--le-scroll-progress-fixed-right` | If fixed, distance from window right |
837
+ | `--le-scroll-progress-z` | Z-index of the progress bar (1001 by default, above header) |
838
+
839
+ ---
840
+
841
+ ## <le-segmented-control>
842
+
843
+ A segmented control component (iOS-style toggle buttons).
844
+
845
+ Perfect for toggling between a small set of related options.
846
+
847
+ ### Properties
848
+
849
+ | Name | Type | Default | Description |
850
+ |------|------|---------|-------------|
851
+ | `el` | `HTMLElement` | | |
852
+ | `options` | `LeOption[]` | `[]` | Array of options for the segmented control. |
853
+ | `value` | `LeOptionValue \| undefined` | | The value of the currently selected option. |
854
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Size of the control. |
855
+ | `overflow` | `'auto' \| 'hidden' \| 'visible' \| 'scroll'` | `'auto'` | Scroll behavior for overflowing tabs. |
856
+ | `fullWidth` | `boolean` | `false` | Whether the control should take full width. |
857
+ | `disabled` | `boolean` | `false` | Whether the control is disabled. |
858
+
859
+ ### Events
860
+
861
+ | Event | Type | Description |
862
+ |-------|------|-------------|
863
+ | `leChange` | `EventEmitter<LeOptionSelectDetail>` | Emitted when the selection changes. |
864
+
865
+ ### CSS Variables
866
+
867
+ | Name | Description |
868
+ |------|-------------|
869
+ | `--le-segmented-bg` | Background color of the control |
870
+ | `--le-segmented-padding` | Padding around segments |
871
+ | `--le-segmented-gap` | Gap between segments |
872
+ | `--le-segmented-radius` | Border radius of the control |
873
+
874
+ ---
875
+
876
+ ## <le-select>
877
+
878
+ A select dropdown component for single selection.
879
+
880
+ ### Properties
881
+
882
+ | Name | Type | Default | Description |
883
+ |------|------|---------|-------------|
884
+ | `el` | `HTMLElement` | | |
885
+ | `options` | `LeOption[] \| string` | `[]` | The options to display in the dropdown. |
886
+ | `value` | `LeOptionValue \| undefined` | | The currently selected value. |
887
+ | `placeholder` | `string` | `'Select an option'` | Placeholder text when no option is selected. |
888
+ | `disabled` | `boolean` | `false` | Whether the select is disabled. |
889
+ | `required` | `boolean` | `false` | Whether selection is required. |
890
+ | `name` | `string \| undefined` | | Name attribute for form submission. |
891
+ | `fullWidth` | `boolean` | `false` | Whether the select should take full width of its container. |
892
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Size variant of the select. |
893
+ | `variant` | `'default' \| 'outlined' \| 'solid'` | `'default'` | Visual variant of the select. |
894
+ | `searchable` | `boolean` | `false` | Whether the input is searchable. |
895
+ | `emptyText` | `string` | `'No results found'` | Text to show when no options match the search. |
896
+ | `open` | `boolean` | `false` | Whether the dropdown is currently open. |
897
+
898
+ ### Events
899
+
900
+ | Event | Type | Description |
901
+ |-------|------|-------------|
902
+ | `change` | `EventEmitter<LeOptionSelectDetail>` | Emitted when the selected value changes. |
903
+ | `leOpen` | `EventEmitter<void>` | Emitted when the dropdown opens. |
904
+ | `leClose` | `EventEmitter<void>` | Emitted when the dropdown closes. |
905
+
906
+ ---
907
+
908
+ ## <le-side-panel>
909
+
910
+ ### Properties
911
+
912
+ | Name | Type | Default | Description |
913
+ |------|------|---------|-------------|
914
+ | `el` | `HTMLElement` | | |
915
+ | `panelId` | `string \| undefined` | | Optional id used to match toggle requests. If set, the panel only responds to toggle events with the same `panelId`. |
916
+ | `side` | `LeSidePanelSide` | `'start'` | Which side the panel is attached to. |
917
+ | `collapseAt` | `string \| undefined` | | Width breakpoint (in px or a CSS var like `--le-breakpoint-md`) below which the panel enters "narrow" mode. |
918
+ | `narrowBehavior` | `LeSidePanelNarrowBehavior` | `'overlay'` | Behavior when in narrow mode. |
919
+ | `open` | `boolean` | `false` | Panel open state for narrow mode. - overlay: controls modal drawer visibility - push: controls whether panel is shown (non-modal) |
920
+ | `collapsed` | `boolean` | `false` | Panel collapsed state for wide mode (fully hidden). |
921
+ | `panelWidth` | `number` | `280` | Default panel width in pixels. |
922
+ | `minPanelWidth` | `number` | `220` | Minimum allowed width when resizable. |
923
+ | `maxPanelWidth` | `number` | `420` | Maximum allowed width when resizable. |
924
+ | `resizable` | `boolean` | `false` | Allows users to resize the panel by dragging its edge. |
925
+ | `persistKey` | `string \| undefined` | | When set, panel width + collapsed state are persisted in localStorage. |
926
+ | `showCloseButton` | `boolean` | `true` | Show a close button inside the panel (primarily used in narrow overlay mode). |
927
+ | `autoShowOnWide` | `boolean` | `true` | When crossing to wide mode, automatically show the panel (collapsed=false). |
928
+ | `autoHideOnNarrow` | `boolean` | `true` | When crossing to narrow mode, automatically hide the panel (open=false). |
929
+ | `panelLabel` | `string` | `'Navigation'` | Accessible label for the panel navigation region. |
930
+
931
+ ### Events
932
+
933
+ | Event | Type | Description |
934
+ |-------|------|-------------|
935
+ | `leSidePanelOpenChange` | `EventEmitter<{ open: boolean; panelId?: string }>` | |
936
+ | `leSidePanelCollapsedChange` | `EventEmitter<{ collapsed: boolean; panelId?: string }>` | |
937
+ | `leSidePanelWidthChange` | `EventEmitter<{ width: number; panelId?: string }>` | |
938
+
939
+ ---
940
+
941
+ ## <le-side-panel-toggle>
942
+
943
+ ### Properties
944
+
945
+ | Name | Type | Default | Description |
946
+ |------|------|---------|-------------|
947
+ | `el` | `HTMLElement` | | |
948
+ | `panelId` | `string \| undefined` | | Optional id used to target a specific panel. |
949
+ | `action` | `LeSidePanelToggleAction` | `'toggle'` | Action to emit. Default toggles the panel. |
950
+ | `shortcut` | `string \| undefined` | | Optional keyboard shortcut like `Mod+B` or `Alt+N`. |
951
+ | `disabled` | `boolean` | `false` | Disables the toggle. |
952
+ | `mode` | `'default' \| 'admin'` | | |
953
+ | `variant` | `'solid' \| 'outlined' \| 'clear' \| 'system'` | `'solid'` | |
954
+ | `color` | `'primary' \| 'secondary' \| 'success' \| 'warning' \| 'danger' \| 'info'` | `'primary'` | |
955
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | |
956
+ | `selected` | `boolean` | `false` | |
957
+ | `fullWidth` | `boolean` | `false` | |
958
+ | `iconOnly` | `string \| Node \| undefined` | | |
959
+ | `iconStart` | `string \| Node \| undefined` | | |
960
+ | `iconEnd` | `string \| Node \| undefined` | | |
961
+ | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` | |
962
+ | `href` | `string \| undefined` | | |
963
+ | `target` | `string \| undefined` | | |
964
+ | `align` | `'start' \| 'center' \| 'space-between' \| 'end'` | `'center'` | |
965
+
966
+ ### Events
967
+
968
+ | Event | Type | Description |
969
+ |-------|------|-------------|
970
+ | `leSidePanelRequestToggle` | `EventEmitter<LeSidePanelRequestToggleDetail>` | |
971
+
972
+ ---
973
+
974
+ ## <le-slot>
975
+
976
+ Slot placeholder component for admin/CMS mode.
977
+
978
+ This component renders a visual placeholder for slots when in admin mode,
979
+ allowing CMS systems to show available drop zones for content or inline editing.
980
+
981
+ In non-admin mode, this component renders nothing and acts as a passthrough.
982
+
983
+ ### Properties
984
+
985
+ | Name | Type | Default | Description |
986
+ |------|------|---------|-------------|
987
+ | `el` | `HTMLElement` | | |
988
+ | `type` | `'slot' \| 'text' \| 'textarea'` | `'slot'` | The type of slot content. - `slot`: Default, shows a dropzone for components (default) - `text`: Shows a single-line text input - `textarea`: Shows a multi-line text area |
989
+ | `name` | `string` | `''` | The name of the slot this placeholder represents. Should match the slot name in the parent component. |
990
+ | `label` | `string \| undefined` | | Label to display in admin mode. If not provided, the slot name will be used. |
991
+ | `description` | `string \| undefined` | | Description of what content this slot accepts. Shown in admin mode to guide content editors. |
992
+ | `allowedComponents` | `string \| undefined` | | Comma-separated list of allowed component tags for this slot. Used by CMS to filter available components. |
993
+ | `multiple` | `boolean` | `true` | Whether multiple components can be dropped in this slot. |
994
+ | `required` | `boolean` | `false` | Whether this slot is required to have content. |
995
+ | `placeholder` | `string \| undefined` | | Placeholder text for text/textarea inputs in admin mode. |
996
+ | `tag` | `string \| undefined` | | The HTML tag to create when there's no slotted element. Used with type="text" or type="textarea" to auto-create elements. |
997
+ | `slotStyle` | `string \| undefined` | | CSS styles for the slot dropzone container. Useful for layouts - e.g., "flex-direction: row" for horizontal stacks. Only applies in admin mode for type="slot". |
998
+
999
+ ### Events
1000
+
1001
+ | Event | Type | Description |
1002
+ |-------|------|-------------|
1003
+ | `leSlotChange` | `EventEmitter<{ name: string; value: string; isValid: boolean }>` | Emitted when text content changes in admin mode. The event detail contains the new text value and validity. |
1004
+
1005
+ ### Slots
1006
+
1007
+ | Name | Description |
1008
+ |------|-------------|
1009
+ | Default | Default slot for placeholder content or drop zone UI |
1010
+
1011
+ ---
1012
+
1013
+ ## <le-stack>
1014
+
1015
+ A flexible stack layout component using CSS flexbox.
1016
+
1017
+ `le-stack` arranges its children in a row (horizontal) or column (vertical)
1018
+ with configurable spacing, alignment, and wrapping behavior. Perfect for
1019
+ creating responsive layouts.
1020
+
1021
+ ### Properties
1022
+
1023
+ | Name | Type | Default | Description |
1024
+ |------|------|---------|-------------|
1025
+ | `el` | `HTMLElement` | | |
1026
+ | `direction` | `'horizontal' \| 'vertical'` | `'horizontal'` | Direction of the stack layout |
1027
+ | `gap` | `string \| undefined` | | Gap between items (CSS value like '8px', '1rem', 'var(--le-space-md)') |
1028
+ | `align` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'baseline'` | `'stretch'` | Alignment of items on the cross axis |
1029
+ | `justify` | `'start' \| 'center' \| 'end' \| 'space-between' \| 'space-around' \| 'space-evenly'` | `'start'` | Distribution of items on the main axis |
1030
+ | `wrap` | `boolean` | `false` | Whether items should wrap to multiple lines |
1031
+ | `alignContent` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'space-between' \| 'space-around'` | `'stretch'` | Alignment of wrapped lines (only applies when wrap is true) |
1032
+ | `reverse` | `boolean` | `false` | Whether to reverse the order of items |
1033
+ | `maxItems` | `number \| undefined` | | Maximum number of items allowed in the stack (for CMS validation) |
1034
+ | `fullWidth` | `boolean` | `false` | Whether the stack should take full width of its container |
1035
+ | `fullHeight` | `boolean` | `false` | Whether the stack should take full height of its container |
1036
+ | `padding` | `string \| undefined` | | Padding inside the stack container (CSS value) |
1037
+
1038
+ ### Slots
1039
+
1040
+ | Name | Description |
1041
+ |------|-------------|
1042
+ | Default | Default slot for stack items (le-box components recommended) |
1043
+
1044
+ ### CSS Variables
1045
+
1046
+ | Name | Description |
1047
+ |------|-------------|
1048
+ | `--le-stack-gap` | Gap between items (defaults to var(--le-space-md)) |
1049
+
1050
+ ---
1051
+
1052
+ ## <le-string-input>
1053
+
1054
+ A text input component with support for labels, descriptions, icons, and external IDs.
1055
+
1056
+ ### Properties
1057
+
1058
+ | Name | Type | Default | Description |
1059
+ |------|------|---------|-------------|
1060
+ | `el` | `HTMLElement` | | |
1061
+ | `inputRef` | `(el: HTMLInputElement) => void \| undefined` | | Pass the ref of the input element to the parent component |
1062
+ | `mode` | `'default' \| 'admin'` | | Mode of the popover should be 'default' for internal use |
1063
+ | `value` | `string` | | The value of the input |
1064
+ | `name` | `string` | | The name of the input |
1065
+ | `type` | `'text' \| 'email' \| 'password' \| 'tel' \| 'url'` | `'text'` | The type of the input (text, email, password, etc.) |
1066
+ | `label` | `string` | | Label for the input |
1067
+ | `iconStart` | `string` | | Icon for the start icon |
1068
+ | `iconEnd` | `string` | | Icon for the end icon |
1069
+ | `placeholder` | `string` | | Placeholder text |
1070
+ | `hideDescription` | `boolean` | `false` | Hide description slot |
1071
+ | `disabled` | `boolean` | `false` | Whether the input is disabled |
1072
+ | `readonly` | `boolean` | `false` | Whether the input is read-only |
1073
+ | `externalId` | `string` | | External ID for linking with external systems |
1074
+
1075
+ ### Events
1076
+
1077
+ | Event | Type | Description |
1078
+ |-------|------|-------------|
1079
+ | `change` | `EventEmitter<{
1080
+ value: string;
1081
+ name: string;
1082
+ externalId: string;
1083
+ }>` | Emitted when the value changes (on blur or Enter) |
1084
+ | `input` | `EventEmitter<{
1085
+ value: string;
1086
+ name: string;
1087
+ externalId: string;
1088
+ }>` | Emitted when the input value changes (on keystroke) |
1089
+
1090
+ ### Slots
1091
+
1092
+ | Name | Description |
1093
+ |------|-------------|
1094
+ | Default | The label text for the input |
1095
+ | `"description"` | Additional description text displayed below the input |
1096
+ | `"icon-start"` | Icon to display at the start of the input |
1097
+ | `"icon-end"` | Icon to display at the end of the input |
1098
+
1099
+ ### CSS Variables
1100
+
1101
+ | Name | Description |
1102
+ |------|-------------|
1103
+ | `--le-input-bg` | Input background color |
1104
+ | `--le-input-color` | Input text color |
1105
+ | `--le-input-border` | Input border style |
1106
+ | `--le-input-border-focus` | Input border style when focused |
1107
+ | `--le-input-radius` | Input border radius |
1108
+ | `--le-input-padding` | Input padding |
1109
+
1110
+ ---
1111
+
1112
+ ## <le-tab>
1113
+
1114
+ A flexible tab component with multiple variants and states.
1115
+
1116
+ ### Properties
1117
+
1118
+ | Name | Type | Default | Description |
1119
+ |------|------|---------|-------------|
1120
+ | `el` | `HTMLElement` | | |
1121
+ | `mode` | `'default' \| 'admin'` | | Mode of the popover should be 'default' for internal use |
1122
+ | `label` | `string \| undefined` | | Label if it is not provided via slot |
1123
+ | `value` | `string \| undefined` | | Value of the tab, defaults to label if not provided |
1124
+ | `variant` | `'underlined' \| 'solid' \| 'pills' \| 'enclosed' \| 'icon-only'` | `'underlined'` | Tab variant style |
1125
+ | `position` | `'top' \| 'bottom' \| 'start' \| 'end'` | `'top'` | Position of the tabs when used within a le-tabs component |
1126
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Tab size |
1127
+ | `focusable` | `boolean` | `true` | Whether the tab can get focus needed for accessibility when used in custom tab implementations |
1128
+ | `selected` | `boolean` | `false` | Whether the tab is in a selected/active state |
1129
+ | `fullWidth` | `boolean` | `false` | Whether the tab takes full width of its container |
1130
+ | `icon` | `string \| Node \| undefined` | | Icon only tab image or emoji if this prop is set, the tab will render only the icon slot |
1131
+ | `showLabel` | `boolean` | `false` | Whether to show the label when in icon-only mode |
1132
+ | `iconStart` | `string \| Node \| undefined` | | Start icon image or emoji |
1133
+ | `iconEnd` | `string \| Node \| undefined` | | End icon image or emoji |
1134
+ | `disabled` | `boolean` | `false` | Whether the tab is disabled |
1135
+ | `href` | `string \| undefined` | | Optional href to make the tab act as a link |
1136
+ | `target` | `string \| undefined` | | Link target when href is set |
1137
+ | `align` | `'start' \| 'center' \| 'space-between' \| 'end'` | `'center'` | Alignment of the tab label without the end icon |
1138
+
1139
+ ### Events
1140
+
1141
+ | Event | Type | Description |
1142
+ |-------|------|-------------|
1143
+ | `click` | `EventEmitter<PointerEvent>` | Emitted when the tab is clicked. This is a custom event that wraps the native click but ensures the target is the le-tab. |
1144
+
1145
+ ### Slots
1146
+
1147
+ | Name | Description |
1148
+ |------|-------------|
1149
+ | Default | Tab text content |
1150
+ | `"icon-only"` | Icon for icon-only tabs |
1151
+
1152
+ ### CSS Variables
1153
+
1154
+ | Name | Description |
1155
+ |------|-------------|
1156
+ | `--le-tab-bg` | Tab background color |
1157
+ | `--le-tab-color` | Tab text color |
1158
+ | `--le-tab-border-radius` | Tab border radius |
1159
+ | `--le-tab-padding-x` | Tab horizontal padding |
1160
+ | `--le-tab-padding-y` | Tab vertical padding |
1161
+
1162
+ ---
1163
+
1164
+ ## <le-tab-bar>
1165
+
1166
+ A presentational tab bar component without panels.
1167
+
1168
+ Use this for navigation/routing scenarios where you manage the content
1169
+ externally based on the selection events. For tabs with built-in panels,
1170
+ use `le-tabs` instead.
1171
+
1172
+ ### Properties
1173
+
1174
+ | Name | Type | Default | Description |
1175
+ |------|------|---------|-------------|
1176
+ | `el` | `HTMLElement` | | |
1177
+ | `tabs` | `LeOption[]` | `[]` | Array of tab options defining the tabs to display. |
1178
+ | `selected` | `LeOptionValue \| undefined` | | The value of the currently selected tab. |
1179
+ | `fullWidth` | `boolean` | `true` | Whether tabs should stretch to fill available width. |
1180
+ | `showLabels` | `boolean` | `false` | Whether to show labels in icon-only mode. |
1181
+ | `position` | `'top' \| 'bottom'` | `'top'` | Position of the tab bar. |
1182
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Size of the tabs. |
1183
+ | `bordered` | `boolean` | `true` | Whether to show a border below the tab bar. |
1184
+
1185
+ ### Events
1186
+
1187
+ | Event | Type | Description |
1188
+ |-------|------|-------------|
1189
+ | `leTabChange` | `EventEmitter<LeOptionSelectDetail>` | Emitted when the selected tab changes. |
1190
+
1191
+ ### CSS Variables
1192
+
1193
+ | Name | Description |
1194
+ |------|-------------|
1195
+ | `--le-tab-bar-border-color` | Border color |
1196
+ | `--le-tab-bar-gap` | Gap between tabs |
1197
+ | `--le-tab-bar-indicator-color` | Active indicator color |
1198
+ | `--le-tab-bar-padding-x` | Horizontal padding for tabs |
1199
+ | `--le-tab-bar-padding-y` | Vertical padding for tabs |
1200
+
1201
+ ---
1202
+
1203
+ ## <le-tab-panel>
1204
+
1205
+ A tab panel component used as a child of le-tabs.
1206
+
1207
+ Each le-tab-panel defines both the tab button label and the panel content.
1208
+ The parent le-tabs component automatically reads these panels and creates
1209
+ the tab interface.
1210
+
1211
+ ### Properties
1212
+
1213
+ | Name | Type | Default | Description |
1214
+ |------|------|---------|-------------|
1215
+ | `el` | `HTMLLeTabPanelElement` | | |
1216
+ | `label` | `string` | | The label displayed in the tab button. |
1217
+ | `value` | `string \| undefined` | | The value used to identify this tab. Defaults to the label if not provided. |
1218
+ | `iconStart` | `string \| undefined` | | Icon displayed at the start of the tab button. Can be an emoji, URL, or icon class. |
1219
+ | `iconEnd` | `string \| undefined` | | Icon displayed at the end of the tab button. |
1220
+ | `disabled` | `boolean` | `false` | Whether this tab is disabled. |
1221
+ | `lazy` | `boolean` | `false` | Whether to render the panel content only when active (lazy loading). When true, content is not rendered until the tab is first selected. When false (default), content is always in DOM but hidden when inactive. |
1222
+ | `active` | `boolean` | `false` | Internal: Whether this panel is currently active (set by parent le-tabs) |
1223
+ | `hasBeenActive` | `boolean` | `false` | Internal: Track if panel has ever been activated (for lazy rendering) |
1224
+
1225
+ ### Slots
1226
+
1227
+ | Name | Description |
1228
+ |------|-------------|
1229
+ | Default | Default slot for panel content |
1230
+
1231
+ ---
1232
+
1233
+ ## <le-tabs>
1234
+
1235
+ A flexible tabs component for organizing content into tabbed panels.
1236
+
1237
+ Supports two modes:
1238
+ 1. **Declarative**: Use `<le-tab-panel>` children to define tabs and content
1239
+ 2. **Programmatic**: Use the `tabs` prop with named slots for content
1240
+
1241
+ Full keyboard navigation and ARIA support included.
1242
+
1243
+ ### Properties
1244
+
1245
+ | Name | Type | Default | Description |
1246
+ |------|------|---------|-------------|
1247
+ | `el` | `HTMLElement` | | |
1248
+ | `tabs` | `LeOption[]` | `[]` | Array of tab options (programmatic mode). If le-tab-panel children exist, they take precedence. |
1249
+ | `selected` | `LeOptionValue \| undefined` | | The value of the currently selected tab. If not provided, defaults to the first tab. |
1250
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | Orientation of the tabs. |
1251
+ | `position` | `'start' \| 'end'` | `'start'` | Position of the tabs relative to the panels. |
1252
+ | `variant` | `'underlined' \| 'solid' \| 'pills' \| 'enclosed' \| 'icon-only'` | `'underlined'` | Tab variant style. |
1253
+ | `fullWidth` | `boolean` | `false` | Whether tabs should stretch to fill available width. |
1254
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Size of the tabs. |
1255
+ | `wrap` | `boolean` | `false` | Wrap the tabs if they exceed container width. |
1256
+ | `overflow` | `'auto' \| 'hidden' \| 'visible' \| 'scroll'` | `'auto'` | Scroll behavior for overflowing tabs. |
1257
+
1258
+ ### Events
1259
+
1260
+ | Event | Type | Description |
1261
+ |-------|------|-------------|
1262
+ | `leTabChange` | `EventEmitter<LeOptionSelectDetail>` | Emitted when the selected tab changes. |
1263
+
1264
+ ### Slots
1265
+
1266
+ | Name | Description |
1267
+ |------|-------------|
1268
+ | Default | Default slot for le-tab-panel children (declarative mode) |
1269
+ | `"panel-{value}"` | Named slots for panel content (programmatic mode) |
1270
+
1271
+ ### CSS Variables
1272
+
1273
+ | Name | Description |
1274
+ |------|-------------|
1275
+ | `--le-tabs-border-color` | Border color for tab list |
1276
+ | `--le-tabs-gap` | Gap between tabs |
1277
+ | `--le-tabs-indicator-color` | Active tab indicator color |
1278
+ | `--le-tabs-padding-x` | Horizontal padding for tab buttons |
1279
+ | `--le-tabs-padding-y` | Vertical padding for tab buttons |
1280
+
1281
+ ---
1282
+
1283
+ ## <le-tag>
1284
+
1285
+ A tag/chip component for displaying labels with optional dismiss functionality.
1286
+
1287
+ ### Properties
1288
+
1289
+ | Name | Type | Default | Description |
1290
+ |------|------|---------|-------------|
1291
+ | `label` | `string` | | The text label to display in the tag. |
1292
+ | `mode` | `'default' \| 'admin'` | | Mode of the popover should be 'default' for internal use |
1293
+ | `icon` | `string \| undefined` | | Icon to display before the label. Can be an emoji, URL, or icon name. |
1294
+ | `dismissible` | `boolean` | `false` | Whether the tag can be dismissed (shows close button). |
1295
+ | `disabled` | `boolean` | `false` | Whether the tag is disabled. |
1296
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | The size of the tag. |
1297
+ | `variant` | `'default' \| 'primary' \| 'success' \| 'warning' \| 'danger'` | `'default'` | The visual variant of the tag. |
1298
+
1299
+ ### Events
1300
+
1301
+ | Event | Type | Description |
1302
+ |-------|------|-------------|
1303
+ | `leDismiss` | `EventEmitter<void>` | Emitted when the dismiss button is clicked. |
1304
+
1305
+ ### Slots
1306
+
1307
+ | Name | Description |
1308
+ |------|-------------|
1309
+ | Default | Default slot for custom content (overrides label prop) |
1310
+
1311
+ ---
1312
+
1313
+ ## <le-text>
1314
+
1315
+ A text component with rich text editing capabilities in admin mode.
1316
+
1317
+ `le-text` renders semantic text elements (headings, paragraphs, code, quotes)
1318
+ and provides a Notion-like rich text editor in admin mode with formatting
1319
+ toolbar for bold, italic, links, and paragraph type selection.
1320
+
1321
+ ### Properties
1322
+
1323
+ | Name | Type | Default | Description |
1324
+ |------|------|---------|-------------|
1325
+ | `el` | `HTMLElement` | | |
1326
+ | `variant` | `\| 'p'
1327
+ \| 'h1'
1328
+ \| 'h2'
1329
+ \| 'h3'
1330
+ \| 'h4'
1331
+ \| 'h5'
1332
+ \| 'h6'
1333
+ \| 'code'
1334
+ \| 'quote'
1335
+ \| 'label'
1336
+ \| 'small'` | `'p'` | The semantic variant/type of text element |
1337
+ | `align` | `'left' \| 'center' \| 'right' \| 'justify'` | `'left'` | Text alignment |
1338
+ | `color` | `string \| undefined` | | Text color (CSS value or theme token) |
1339
+ | `truncate` | `boolean` | `false` | Whether the text should truncate with ellipsis |
1340
+ | `maxLines` | `number \| undefined` | | Maximum number of lines before truncating (requires truncate=true) |
1341
+
1342
+ ### Slots
1343
+
1344
+ | Name | Description |
1345
+ |------|-------------|
1346
+ | Default | Default slot for text content |
1347
+
1348
+ ### CSS Variables
1349
+
1350
+ | Name | Description |
1351
+ |------|-------------|
1352
+ | `--le-text-color` | Text color |
1353
+ | `--le-text-font-size` | Font size |
1354
+ | `--le-text-line-height` | Line height |
1355
+ | `--le-text-font-weight` | Font weight |
1356
+
1357
+ ---
1358
+
1359
+ ## <le-turntable>
1360
+
1361
+ ### Properties
1362
+
1363
+ | Name | Type | Default | Description |
1364
+ |------|------|---------|-------------|
1365
+ | `el` | `HTMLElement` | | |
1366
+ | `center` | `string` | `'center'` | |
1367
+ | `value` | `number` | `0` | |
1368
+ | `rotating` | `boolean` | `false` | Internal state using properties instead of |
1369
+ | `centerX` | `number` | | |
1370
+ | `centerY` | `number` | | |
1371
+ | `pageX` | `number` | | |
1372
+ | `pageY` | `number` | | |
1373
+ | `currentAngle` | `number` | `0` | |
1374
+ | `startAngle` | `number` | | |
1375
+
1376
+ ---
1377
+