luxen-ui 0.14.0 → 0.15.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 (111) hide show
  1. package/README.md +2 -1
  2. package/bin/cli.mjs +6 -0
  3. package/cdn/chunks/unsafe-html.js +2 -0
  4. package/cdn/chunks/unsafe-html.js.map +1 -0
  5. package/cdn/custom-elements.json +782 -363
  6. package/cdn/elements/combobox/combobox.d.ts +1 -4
  7. package/cdn/elements/combobox/combobox.d.ts.map +1 -1
  8. package/cdn/elements/combobox/combobox.js +14 -14
  9. package/cdn/elements/combobox/combobox.js.map +1 -1
  10. package/cdn/elements/dropdown/dropdown.d.ts.map +1 -1
  11. package/cdn/elements/dropdown/dropdown.js +1 -1
  12. package/cdn/elements/dropdown/dropdown.js.map +1 -1
  13. package/cdn/elements/select/index.d.ts +2 -0
  14. package/cdn/elements/select/index.d.ts.map +1 -0
  15. package/cdn/elements/select/index.js +2 -0
  16. package/cdn/elements/select/index.js.map +1 -0
  17. package/cdn/elements/select/select.d.ts +144 -0
  18. package/cdn/elements/select/select.d.ts.map +1 -0
  19. package/cdn/elements/select/select.js +124 -0
  20. package/cdn/elements/select/select.js.map +1 -0
  21. package/cdn/elements/tabs/tabs.d.ts +3 -1
  22. package/cdn/elements/tabs/tabs.d.ts.map +1 -1
  23. package/cdn/elements/tabs/tabs.js.map +1 -1
  24. package/cdn/elements/tag/index.d.ts +2 -0
  25. package/cdn/elements/tag/index.d.ts.map +1 -0
  26. package/cdn/elements/tag/index.js +2 -0
  27. package/cdn/elements/tag/index.js.map +1 -0
  28. package/cdn/elements/tag/tag.d.ts +58 -0
  29. package/cdn/elements/tag/tag.d.ts.map +1 -0
  30. package/cdn/elements/tag/tag.js +24 -0
  31. package/cdn/elements/tag/tag.js.map +1 -0
  32. package/cdn/elements/tooltip/tooltip.d.ts.map +1 -1
  33. package/cdn/elements/tooltip/tooltip.js +2 -2
  34. package/cdn/elements/tooltip/tooltip.js.map +1 -1
  35. package/cdn/registry.d.ts +1 -1
  36. package/cdn/registry.d.ts.map +1 -1
  37. package/cdn/registry.js.map +1 -1
  38. package/cdn/shared/controllers/listbox-nav.d.ts +56 -0
  39. package/cdn/shared/controllers/listbox-nav.d.ts.map +1 -0
  40. package/cdn/shared/controllers/listbox-nav.js +2 -0
  41. package/cdn/shared/controllers/listbox-nav.js.map +1 -0
  42. package/cdn/shared/localize.d.ts +2 -0
  43. package/cdn/shared/localize.d.ts.map +1 -1
  44. package/cdn/shared/localize.js.map +1 -1
  45. package/cdn/standalone.css +39 -21
  46. package/cdn/standalone.js +33 -27
  47. package/cdn/standalone.js.map +1 -1
  48. package/cdn/styles/elements/select.css +11 -3
  49. package/cdn/styles/elements/tabs/enclosed.css +14 -9
  50. package/cdn/styles/elements/tabs/line.css +14 -9
  51. package/cdn/translations/en.d.ts.map +1 -1
  52. package/cdn/translations/en.js +1 -1
  53. package/cdn/translations/en.js.map +1 -1
  54. package/dist/css/elements/select.css +11 -3
  55. package/dist/css/elements/tabs/enclosed.css +14 -9
  56. package/dist/css/elements/tabs/line.css +14 -9
  57. package/dist/custom-elements.json +782 -363
  58. package/dist/elements/combobox/combobox.d.ts +1 -4
  59. package/dist/elements/combobox/combobox.d.ts.map +1 -1
  60. package/dist/elements/combobox/combobox.js +29 -68
  61. package/dist/elements/dropdown/dropdown.d.ts.map +1 -1
  62. package/dist/elements/dropdown/dropdown.js +17 -2
  63. package/dist/elements/select/index.d.ts +2 -0
  64. package/dist/elements/select/index.d.ts.map +1 -0
  65. package/dist/elements/select/index.js +4 -0
  66. package/dist/elements/select/select.css +370 -0
  67. package/dist/elements/select/select.d.ts +145 -0
  68. package/dist/elements/select/select.d.ts.map +1 -0
  69. package/dist/elements/select/select.js +603 -0
  70. package/dist/elements/tabs/tabs.d.ts +3 -1
  71. package/dist/elements/tabs/tabs.d.ts.map +1 -1
  72. package/dist/elements/tabs/tabs.js +3 -1
  73. package/dist/elements/tag/index.d.ts +2 -0
  74. package/dist/elements/tag/index.d.ts.map +1 -0
  75. package/dist/elements/tag/index.js +4 -0
  76. package/dist/elements/tag/tag.css +166 -0
  77. package/dist/elements/tag/tag.d.ts +58 -0
  78. package/dist/elements/tag/tag.d.ts.map +1 -0
  79. package/dist/elements/tag/tag.js +136 -0
  80. package/dist/elements/tooltip/tooltip.css +28 -5
  81. package/dist/elements/tooltip/tooltip.d.ts.map +1 -1
  82. package/dist/elements/tooltip/tooltip.js +41 -3
  83. package/dist/metadata/index.json +272 -64
  84. package/dist/metadata/select.json +168 -62
  85. package/dist/metadata/tabs.json +2 -2
  86. package/dist/metadata/tag.json +102 -0
  87. package/dist/metadata/tooltip.json +1 -1
  88. package/dist/registry.d.ts +1 -1
  89. package/dist/registry.d.ts.map +1 -1
  90. package/dist/shared/controllers/listbox-nav.d.ts +56 -0
  91. package/dist/shared/controllers/listbox-nav.d.ts.map +1 -0
  92. package/dist/shared/controllers/listbox-nav.js +100 -0
  93. package/dist/shared/localize.d.ts +2 -0
  94. package/dist/shared/localize.d.ts.map +1 -1
  95. package/dist/templates/elements/select.md +180 -59
  96. package/dist/templates/elements/tabs.md +31 -6
  97. package/dist/templates/elements/tag.md +121 -0
  98. package/dist/templates/elements/tooltip.md +2 -0
  99. package/dist/translations/en.d.ts.map +1 -1
  100. package/dist/translations/en.js +2 -0
  101. package/elements.json +11 -3
  102. package/package.json +1 -1
  103. package/postcss-plugin-prefix.js +10 -0
  104. package/templates/SKILL.md.tpl +4 -0
  105. package/templates/choosing-elements.md.tpl +170 -0
  106. package/cdn/elements/select/select.meta.d.ts +0 -35
  107. package/cdn/elements/select/select.meta.d.ts.map +0 -1
  108. package/cdn/elements/select/select.meta.js +0 -0
  109. package/dist/elements/select/select.meta.d.ts +0 -35
  110. package/dist/elements/select/select.meta.d.ts.map +0 -1
  111. package/dist/elements/select/select.meta.js +0 -41
@@ -172,181 +172,6 @@
172
172
  }
173
173
  ]
174
174
  },
175
- {
176
- "kind": "javascript-module",
177
- "path": "src/html/elements/avatar/avatar.ts",
178
- "declarations": [
179
- {
180
- "kind": "class",
181
- "description": "",
182
- "name": "Avatar",
183
- "cssProperties": [
184
- {
185
- "description": "Box size (any length). Set it inline (e.g. `style=\"--size: 20px\"`) for an arbitrary size beyond the `size` token scale; the font then follows proportionally. The `size` attribute sets it to the matching token.",
186
- "name": "--size",
187
- "default": "40px"
188
- },
189
- {
190
- "description": "Background fill color for initials and the default icon.",
191
- "name": "--color"
192
- },
193
- {
194
- "description": "Initials/icon color over `--color`. Defaults to an auto-derived readable color; set it to enforce a specific brand color (overrides the automatic choice).",
195
- "name": "--text-color"
196
- },
197
- {
198
- "description": "Set to `circle` for a fully circular avatar (default is a rounded square).",
199
- "name": "--appearance"
200
- }
201
- ],
202
- "cssParts": [
203
- {
204
- "description": "The avatar container that paints `--color`; style it (e.g. `color`) to override the auto-derived text color.",
205
- "name": "base"
206
- }
207
- ],
208
- "members": [
209
- {
210
- "kind": "field",
211
- "name": "src",
212
- "type": {
213
- "text": "string"
214
- },
215
- "default": "''",
216
- "description": "Image URL. Falls back to initials (then the default icon) if it fails to load.",
217
- "attribute": "src"
218
- },
219
- {
220
- "kind": "field",
221
- "name": "name",
222
- "type": {
223
- "text": "string"
224
- },
225
- "default": "''",
226
- "description": "Name used as the accessible label and to derive the initials fallback.",
227
- "attribute": "name"
228
- },
229
- {
230
- "kind": "field",
231
- "name": "size",
232
- "type": {
233
- "text": "string"
234
- },
235
- "default": "'md'",
236
- "description": "Avatar size: `xs`, `sm`, `md` (default), `lg`, or `xl`.",
237
- "attribute": "size",
238
- "reflects": true
239
- },
240
- {
241
- "kind": "field",
242
- "name": "badge",
243
- "type": {
244
- "text": "number"
245
- },
246
- "default": "0",
247
- "description": "Count shown in the corner badge. `0` hides the badge.",
248
- "attribute": "badge"
249
- },
250
- {
251
- "kind": "field",
252
- "name": "interactive",
253
- "type": {
254
- "text": "boolean"
255
- },
256
- "default": "false",
257
- "description": "Render as a `<button>` with focus ring and hover states.",
258
- "attribute": "interactive",
259
- "reflects": true
260
- }
261
- ],
262
- "attributes": [
263
- {
264
- "name": "src",
265
- "type": {
266
- "text": "string"
267
- },
268
- "default": "''",
269
- "description": "Image URL. Falls back to initials (then the default icon) if it fails to load.",
270
- "fieldName": "src"
271
- },
272
- {
273
- "name": "name",
274
- "type": {
275
- "text": "string"
276
- },
277
- "default": "''",
278
- "description": "Name used as the accessible label and to derive the initials fallback.",
279
- "fieldName": "name"
280
- },
281
- {
282
- "name": "size",
283
- "type": {
284
- "text": "string"
285
- },
286
- "default": "'md'",
287
- "description": "Avatar size: `xs`, `sm`, `md` (default), `lg`, or `xl`.",
288
- "fieldName": "size"
289
- },
290
- {
291
- "name": "badge",
292
- "type": {
293
- "text": "number"
294
- },
295
- "default": "0",
296
- "description": "Count shown in the corner badge. `0` hides the badge.",
297
- "fieldName": "badge"
298
- },
299
- {
300
- "name": "interactive",
301
- "type": {
302
- "text": "boolean"
303
- },
304
- "default": "false",
305
- "description": "Render as a `<button>` with focus ring and hover states.",
306
- "fieldName": "interactive"
307
- }
308
- ],
309
- "superclass": {
310
- "name": "LuxenElement",
311
- "module": "/src/html/shared/luxen-element.js"
312
- },
313
- "tagName": "l-avatar",
314
- "customElement": true,
315
- "summary": "An avatar component for displaying user images, initials, or a default icon.",
316
- "_cssClasses": [
317
- {
318
- "name": ".l-avatar-group",
319
- "description": "Flex wrapper that overlaps a row of stacked avatars."
320
- }
321
- ]
322
- }
323
- ],
324
- "exports": [
325
- {
326
- "kind": "js",
327
- "name": "Avatar",
328
- "declaration": {
329
- "name": "Avatar",
330
- "module": "src/html/elements/avatar/avatar.ts"
331
- }
332
- }
333
- ]
334
- },
335
- {
336
- "kind": "javascript-module",
337
- "path": "src/html/elements/avatar/index.ts",
338
- "declarations": [],
339
- "exports": [
340
- {
341
- "kind": "js",
342
- "name": "*",
343
- "declaration": {
344
- "name": "*",
345
- "module": "src/html/elements/avatar/avatar.js"
346
- }
347
- }
348
- ]
349
- },
350
175
  {
351
176
  "kind": "javascript-module",
352
177
  "path": "src/html/elements/alert-dialog/alert-dialog.ts",
@@ -827,6 +652,181 @@
827
652
  }
828
653
  ]
829
654
  },
655
+ {
656
+ "kind": "javascript-module",
657
+ "path": "src/html/elements/avatar/avatar.ts",
658
+ "declarations": [
659
+ {
660
+ "kind": "class",
661
+ "description": "",
662
+ "name": "Avatar",
663
+ "cssProperties": [
664
+ {
665
+ "description": "Box size (any length). Set it inline (e.g. `style=\"--size: 20px\"`) for an arbitrary size beyond the `size` token scale; the font then follows proportionally. The `size` attribute sets it to the matching token.",
666
+ "name": "--size",
667
+ "default": "40px"
668
+ },
669
+ {
670
+ "description": "Background fill color for initials and the default icon.",
671
+ "name": "--color"
672
+ },
673
+ {
674
+ "description": "Initials/icon color over `--color`. Defaults to an auto-derived readable color; set it to enforce a specific brand color (overrides the automatic choice).",
675
+ "name": "--text-color"
676
+ },
677
+ {
678
+ "description": "Set to `circle` for a fully circular avatar (default is a rounded square).",
679
+ "name": "--appearance"
680
+ }
681
+ ],
682
+ "cssParts": [
683
+ {
684
+ "description": "The avatar container that paints `--color`; style it (e.g. `color`) to override the auto-derived text color.",
685
+ "name": "base"
686
+ }
687
+ ],
688
+ "members": [
689
+ {
690
+ "kind": "field",
691
+ "name": "src",
692
+ "type": {
693
+ "text": "string"
694
+ },
695
+ "default": "''",
696
+ "description": "Image URL. Falls back to initials (then the default icon) if it fails to load.",
697
+ "attribute": "src"
698
+ },
699
+ {
700
+ "kind": "field",
701
+ "name": "name",
702
+ "type": {
703
+ "text": "string"
704
+ },
705
+ "default": "''",
706
+ "description": "Name used as the accessible label and to derive the initials fallback.",
707
+ "attribute": "name"
708
+ },
709
+ {
710
+ "kind": "field",
711
+ "name": "size",
712
+ "type": {
713
+ "text": "string"
714
+ },
715
+ "default": "'md'",
716
+ "description": "Avatar size: `xs`, `sm`, `md` (default), `lg`, or `xl`.",
717
+ "attribute": "size",
718
+ "reflects": true
719
+ },
720
+ {
721
+ "kind": "field",
722
+ "name": "badge",
723
+ "type": {
724
+ "text": "number"
725
+ },
726
+ "default": "0",
727
+ "description": "Count shown in the corner badge. `0` hides the badge.",
728
+ "attribute": "badge"
729
+ },
730
+ {
731
+ "kind": "field",
732
+ "name": "interactive",
733
+ "type": {
734
+ "text": "boolean"
735
+ },
736
+ "default": "false",
737
+ "description": "Render as a `<button>` with focus ring and hover states.",
738
+ "attribute": "interactive",
739
+ "reflects": true
740
+ }
741
+ ],
742
+ "attributes": [
743
+ {
744
+ "name": "src",
745
+ "type": {
746
+ "text": "string"
747
+ },
748
+ "default": "''",
749
+ "description": "Image URL. Falls back to initials (then the default icon) if it fails to load.",
750
+ "fieldName": "src"
751
+ },
752
+ {
753
+ "name": "name",
754
+ "type": {
755
+ "text": "string"
756
+ },
757
+ "default": "''",
758
+ "description": "Name used as the accessible label and to derive the initials fallback.",
759
+ "fieldName": "name"
760
+ },
761
+ {
762
+ "name": "size",
763
+ "type": {
764
+ "text": "string"
765
+ },
766
+ "default": "'md'",
767
+ "description": "Avatar size: `xs`, `sm`, `md` (default), `lg`, or `xl`.",
768
+ "fieldName": "size"
769
+ },
770
+ {
771
+ "name": "badge",
772
+ "type": {
773
+ "text": "number"
774
+ },
775
+ "default": "0",
776
+ "description": "Count shown in the corner badge. `0` hides the badge.",
777
+ "fieldName": "badge"
778
+ },
779
+ {
780
+ "name": "interactive",
781
+ "type": {
782
+ "text": "boolean"
783
+ },
784
+ "default": "false",
785
+ "description": "Render as a `<button>` with focus ring and hover states.",
786
+ "fieldName": "interactive"
787
+ }
788
+ ],
789
+ "superclass": {
790
+ "name": "LuxenElement",
791
+ "module": "/src/html/shared/luxen-element.js"
792
+ },
793
+ "tagName": "l-avatar",
794
+ "customElement": true,
795
+ "summary": "An avatar component for displaying user images, initials, or a default icon.",
796
+ "_cssClasses": [
797
+ {
798
+ "name": ".l-avatar-group",
799
+ "description": "Flex wrapper that overlaps a row of stacked avatars."
800
+ }
801
+ ]
802
+ }
803
+ ],
804
+ "exports": [
805
+ {
806
+ "kind": "js",
807
+ "name": "Avatar",
808
+ "declaration": {
809
+ "name": "Avatar",
810
+ "module": "src/html/elements/avatar/avatar.ts"
811
+ }
812
+ }
813
+ ]
814
+ },
815
+ {
816
+ "kind": "javascript-module",
817
+ "path": "src/html/elements/avatar/index.ts",
818
+ "declarations": [],
819
+ "exports": [
820
+ {
821
+ "kind": "js",
822
+ "name": "*",
823
+ "declaration": {
824
+ "name": "*",
825
+ "module": "src/html/elements/avatar/avatar.js"
826
+ }
827
+ }
828
+ ]
829
+ },
830
830
  {
831
831
  "kind": "javascript-module",
832
832
  "path": "src/html/elements/badge/badge.ts",
@@ -1032,97 +1032,6 @@
1032
1032
  }
1033
1033
  ]
1034
1034
  },
1035
- {
1036
- "kind": "javascript-module",
1037
- "path": "src/html/elements/button-group/button-group.ts",
1038
- "declarations": [
1039
- {
1040
- "kind": "class",
1041
- "description": "",
1042
- "name": "ButtonGroup",
1043
- "members": [
1044
- {
1045
- "kind": "field",
1046
- "name": "label",
1047
- "type": {
1048
- "text": "string | undefined"
1049
- },
1050
- "description": "Accessible label announced for the group. Not displayed on screen.",
1051
- "attribute": "label",
1052
- "reflects": true
1053
- },
1054
- {
1055
- "kind": "field",
1056
- "name": "orientation",
1057
- "type": {
1058
- "text": "ButtonGroupOrientation"
1059
- },
1060
- "default": "'horizontal'",
1061
- "description": "Layout direction of the buttons. Visual only (drives the CSS via the\nreflected attribute): ARIA 1.2 does not allow `aria-orientation` on\n`role=\"group\"`, so no ARIA attribute is set.",
1062
- "attribute": "orientation",
1063
- "reflects": true
1064
- }
1065
- ],
1066
- "attributes": [
1067
- {
1068
- "name": "label",
1069
- "type": {
1070
- "text": "string | undefined"
1071
- },
1072
- "description": "Accessible label announced for the group. Not displayed on screen.",
1073
- "fieldName": "label"
1074
- },
1075
- {
1076
- "name": "orientation",
1077
- "type": {
1078
- "text": "ButtonGroupOrientation"
1079
- },
1080
- "default": "'horizontal'",
1081
- "description": "Layout direction of the buttons. Visual only (drives the CSS via the\nreflected attribute): ARIA 1.2 does not allow `aria-orientation` on\n`role=\"group\"`, so no ARIA attribute is set.",
1082
- "fieldName": "orientation"
1083
- }
1084
- ],
1085
- "superclass": {
1086
- "name": "LuxenElement",
1087
- "module": "/src/html/shared/luxen-element.js"
1088
- },
1089
- "tagName": "l-button-group",
1090
- "customElement": true,
1091
- "summary": "Visually joins related `.l-button` elements into a single segmented\ncontrol. The joined appearance is pure CSS; this element adds the group\nsemantics (`role=\"group\"`, `aria-label`).",
1092
- "examples": [
1093
- {
1094
- "language": "html",
1095
- "code": "<l-button-group label=\"Alignment\">\n <button class=\"l-button\">Left</button>\n <button class=\"l-button\">Center</button>\n <button class=\"l-button\">Right</button>\n</l-button-group>"
1096
- }
1097
- ]
1098
- }
1099
- ],
1100
- "exports": [
1101
- {
1102
- "kind": "js",
1103
- "name": "ButtonGroup",
1104
- "declaration": {
1105
- "name": "ButtonGroup",
1106
- "module": "src/html/elements/button-group/button-group.ts"
1107
- }
1108
- }
1109
- ]
1110
- },
1111
- {
1112
- "kind": "javascript-module",
1113
- "path": "src/html/elements/button-group/index.ts",
1114
- "declarations": [],
1115
- "exports": [
1116
- {
1117
- "kind": "js",
1118
- "name": "*",
1119
- "declaration": {
1120
- "name": "*",
1121
- "module": "src/html/elements/button-group/button-group.js"
1122
- }
1123
- }
1124
- ]
1125
- },
1126
1035
  {
1127
1036
  "kind": "javascript-module",
1128
1037
  "path": "src/html/elements/button/button.meta.ts",
@@ -1246,21 +1155,97 @@
1246
1155
  "description": "Visual variant. Default is the secondary style."
1247
1156
  },
1248
1157
  {
1249
- "name": "data-size",
1250
- "values": [
1251
- "sm",
1252
- "lg",
1253
- "xl"
1254
- ],
1255
- "description": "Control size. Default is md."
1256
- },
1158
+ "name": "data-size",
1159
+ "values": [
1160
+ "sm",
1161
+ "lg",
1162
+ "xl"
1163
+ ],
1164
+ "description": "Control size. Default is md."
1165
+ },
1166
+ {
1167
+ "name": "data-icon-only",
1168
+ "description": "Icon-only mode (square button, width equals height). Auto-detected for a single icon child."
1169
+ },
1170
+ {
1171
+ "name": "data-press-effect",
1172
+ "description": "Press effect (scale + translate on active)."
1173
+ }
1174
+ ]
1175
+ }
1176
+ ],
1177
+ "exports": [
1178
+ {
1179
+ "kind": "js",
1180
+ "name": "ButtonMeta",
1181
+ "declaration": {
1182
+ "name": "ButtonMeta",
1183
+ "module": "src/html/elements/button/button.meta.ts"
1184
+ }
1185
+ }
1186
+ ]
1187
+ },
1188
+ {
1189
+ "kind": "javascript-module",
1190
+ "path": "src/html/elements/button-group/button-group.ts",
1191
+ "declarations": [
1192
+ {
1193
+ "kind": "class",
1194
+ "description": "",
1195
+ "name": "ButtonGroup",
1196
+ "members": [
1197
+ {
1198
+ "kind": "field",
1199
+ "name": "label",
1200
+ "type": {
1201
+ "text": "string | undefined"
1202
+ },
1203
+ "description": "Accessible label announced for the group. Not displayed on screen.",
1204
+ "attribute": "label",
1205
+ "reflects": true
1206
+ },
1207
+ {
1208
+ "kind": "field",
1209
+ "name": "orientation",
1210
+ "type": {
1211
+ "text": "ButtonGroupOrientation"
1212
+ },
1213
+ "default": "'horizontal'",
1214
+ "description": "Layout direction of the buttons. Visual only (drives the CSS via the\nreflected attribute): ARIA 1.2 does not allow `aria-orientation` on\n`role=\"group\"`, so no ARIA attribute is set.",
1215
+ "attribute": "orientation",
1216
+ "reflects": true
1217
+ }
1218
+ ],
1219
+ "attributes": [
1257
1220
  {
1258
- "name": "data-icon-only",
1259
- "description": "Icon-only mode (square button, width equals height). Auto-detected for a single icon child."
1221
+ "name": "label",
1222
+ "type": {
1223
+ "text": "string | undefined"
1224
+ },
1225
+ "description": "Accessible label announced for the group. Not displayed on screen.",
1226
+ "fieldName": "label"
1260
1227
  },
1261
1228
  {
1262
- "name": "data-press-effect",
1263
- "description": "Press effect (scale + translate on active)."
1229
+ "name": "orientation",
1230
+ "type": {
1231
+ "text": "ButtonGroupOrientation"
1232
+ },
1233
+ "default": "'horizontal'",
1234
+ "description": "Layout direction of the buttons. Visual only (drives the CSS via the\nreflected attribute): ARIA 1.2 does not allow `aria-orientation` on\n`role=\"group\"`, so no ARIA attribute is set.",
1235
+ "fieldName": "orientation"
1236
+ }
1237
+ ],
1238
+ "superclass": {
1239
+ "name": "LuxenElement",
1240
+ "module": "/src/html/shared/luxen-element.js"
1241
+ },
1242
+ "tagName": "l-button-group",
1243
+ "customElement": true,
1244
+ "summary": "Visually joins related `.l-button` elements into a single segmented\ncontrol. The joined appearance is pure CSS; this element adds the group\nsemantics (`role=\"group\"`, `aria-label`).",
1245
+ "examples": [
1246
+ {
1247
+ "language": "html",
1248
+ "code": "<l-button-group label=\"Alignment\">\n <button class=\"l-button\">Left</button>\n <button class=\"l-button\">Center</button>\n <button class=\"l-button\">Right</button>\n</l-button-group>"
1264
1249
  }
1265
1250
  ]
1266
1251
  }
@@ -1268,10 +1253,25 @@
1268
1253
  "exports": [
1269
1254
  {
1270
1255
  "kind": "js",
1271
- "name": "ButtonMeta",
1256
+ "name": "ButtonGroup",
1272
1257
  "declaration": {
1273
- "name": "ButtonMeta",
1274
- "module": "src/html/elements/button/button.meta.ts"
1258
+ "name": "ButtonGroup",
1259
+ "module": "src/html/elements/button-group/button-group.ts"
1260
+ }
1261
+ }
1262
+ ]
1263
+ },
1264
+ {
1265
+ "kind": "javascript-module",
1266
+ "path": "src/html/elements/button-group/index.ts",
1267
+ "declarations": [],
1268
+ "exports": [
1269
+ {
1270
+ "kind": "js",
1271
+ "name": "*",
1272
+ "declaration": {
1273
+ "name": "*",
1274
+ "module": "src/html/elements/button-group/button-group.js"
1275
1275
  }
1276
1276
  }
1277
1277
  ]
@@ -6031,125 +6031,351 @@
6031
6031
  },
6032
6032
  {
6033
6033
  "kind": "javascript-module",
6034
- "path": "src/html/elements/select/select.meta.ts",
6034
+ "path": "src/html/elements/select/index.ts",
6035
+ "declarations": [],
6036
+ "exports": [
6037
+ {
6038
+ "kind": "js",
6039
+ "name": "*",
6040
+ "declaration": {
6041
+ "name": "*",
6042
+ "module": "src/html/elements/select/select.js"
6043
+ }
6044
+ }
6045
+ ]
6046
+ },
6047
+ {
6048
+ "kind": "javascript-module",
6049
+ "path": "src/html/elements/select/select.ts",
6035
6050
  "declarations": [
6036
6051
  {
6037
6052
  "kind": "class",
6038
- "description": "",
6039
- "name": "SelectMeta",
6053
+ "description": "Fired when the selection changes. Bubbles; not composed.",
6054
+ "name": "SelectChangeEvent",
6055
+ "members": [
6056
+ {
6057
+ "kind": "field",
6058
+ "name": "value",
6059
+ "type": {
6060
+ "text": "string | string[]"
6061
+ },
6062
+ "readonly": true,
6063
+ "description": "The selected value (single mode) or values (multiple mode).",
6064
+ "default": "value"
6065
+ }
6066
+ ],
6067
+ "superclass": {
6068
+ "name": "Event",
6069
+ "module": "src/html/elements/select/select.ts"
6070
+ }
6071
+ },
6072
+ {
6073
+ "kind": "class",
6074
+ "description": "Fired as the user types in the search box. Bubbles; not composed.",
6075
+ "name": "SelectInputEvent",
6076
+ "members": [
6077
+ {
6078
+ "kind": "field",
6079
+ "name": "value",
6080
+ "type": {
6081
+ "text": "string"
6082
+ },
6083
+ "readonly": true,
6084
+ "description": "The current query text.",
6085
+ "default": "value"
6086
+ }
6087
+ ],
6088
+ "superclass": {
6089
+ "name": "Event",
6090
+ "module": "src/html/elements/select/select.ts"
6091
+ }
6092
+ },
6093
+ {
6094
+ "kind": "class",
6095
+ "description": "A button-triggered, searchable select. A trigger shows the current selection,\nopening a popover with a search box and a `role=\"listbox\"` of options authored\nas a native `<datalist>` of `<option>` — the same authoring surface as\n`l-combobox` and the native `.l-select`. Form-associated.",
6096
+ "name": "Select",
6040
6097
  "cssProperties": [
6041
6098
  {
6042
- "description": "Control height (set via `data-size` or directly).",
6043
- "name": "--height",
6044
- "default": "var(--l-form-control-height)"
6099
+ "description": "Control height. Defaults to the form-control height.",
6100
+ "name": "--height"
6045
6101
  },
6046
6102
  {
6047
- "description": "Trigger border radius.",
6048
- "name": "--border-radius",
6049
- "default": "var(--l-form-control-border-radius)"
6103
+ "description": "Trigger + panel radius.",
6104
+ "name": "--border-radius"
6105
+ },
6106
+ {
6107
+ "description": "Panel background.",
6108
+ "name": "--background"
6109
+ }
6110
+ ],
6111
+ "cssParts": [
6112
+ {
6113
+ "description": "The host wrapper.",
6114
+ "name": "base"
6115
+ },
6116
+ {
6117
+ "description": "The button that opens the listbox.",
6118
+ "name": "trigger"
6119
+ },
6120
+ {
6121
+ "description": "The selection display inside the trigger.",
6122
+ "name": "value"
6123
+ },
6124
+ {
6125
+ "description": "The trigger chevron.",
6126
+ "name": "chevron"
6127
+ },
6128
+ {
6129
+ "description": "The clear button.",
6130
+ "name": "clear"
6131
+ },
6132
+ {
6133
+ "description": "The floating popover panel.",
6134
+ "name": "panel"
6135
+ },
6136
+ {
6137
+ "description": "The search input.",
6138
+ "name": "search"
6139
+ },
6140
+ {
6141
+ "description": "The options container.",
6142
+ "name": "listbox"
6143
+ },
6144
+ {
6145
+ "description": "Each option row.",
6146
+ "name": "option"
6147
+ },
6148
+ {
6149
+ "description": "The \"no results\" message.",
6150
+ "name": "empty"
6151
+ }
6152
+ ],
6153
+ "members": [
6154
+ {
6155
+ "kind": "field",
6156
+ "name": "placeholder",
6157
+ "type": {
6158
+ "text": "string"
6159
+ },
6160
+ "default": "''",
6161
+ "description": "Placeholder shown in the trigger when nothing is selected.",
6162
+ "attribute": "placeholder"
6163
+ },
6164
+ {
6165
+ "kind": "field",
6166
+ "name": "label",
6167
+ "type": {
6168
+ "text": "string"
6169
+ },
6170
+ "default": "''",
6171
+ "description": "Accessible label for the trigger.",
6172
+ "attribute": "label"
6173
+ },
6174
+ {
6175
+ "kind": "field",
6176
+ "name": "size",
6177
+ "type": {
6178
+ "text": "SelectSize"
6179
+ },
6180
+ "default": "'md'",
6181
+ "description": "Control size.",
6182
+ "attribute": "size",
6183
+ "reflects": true
6184
+ },
6185
+ {
6186
+ "kind": "field",
6187
+ "name": "searchable",
6188
+ "type": {
6189
+ "text": "boolean"
6190
+ },
6191
+ "default": "false",
6192
+ "description": "Show a filter box inside the popover (opt-in, for long lists).",
6193
+ "attribute": "searchable",
6194
+ "reflects": true
6195
+ },
6196
+ {
6197
+ "kind": "field",
6198
+ "name": "withClear",
6199
+ "type": {
6200
+ "text": "boolean"
6201
+ },
6202
+ "default": "false",
6203
+ "description": "Show a button to clear the value.",
6204
+ "attribute": "with-clear",
6205
+ "reflects": true
6206
+ },
6207
+ {
6208
+ "kind": "field",
6209
+ "name": "placement",
6210
+ "type": {
6211
+ "text": "Placement"
6212
+ },
6213
+ "default": "'bottom-start'",
6214
+ "description": "Panel placement relative to the trigger.",
6215
+ "attribute": "placement"
6216
+ },
6217
+ {
6218
+ "kind": "field",
6219
+ "name": "multiple",
6220
+ "type": {
6221
+ "text": "boolean"
6222
+ },
6223
+ "default": "false",
6224
+ "description": "Allow selecting multiple values — renders chips and submits one entry per value.",
6225
+ "attribute": "multiple",
6226
+ "reflects": true
6227
+ },
6228
+ {
6229
+ "kind": "field",
6230
+ "name": "filter",
6231
+ "type": {
6232
+ "text": "SelectFilter"
6233
+ },
6234
+ "default": "defaultFilter",
6235
+ "description": "Override the option filter. `(item, query) => boolean`."
6236
+ },
6237
+ {
6238
+ "kind": "field",
6239
+ "name": "value",
6240
+ "type": {
6241
+ "text": "string | string[]"
6242
+ },
6243
+ "description": "The selected value (single mode) or array of values (multiple mode)."
6244
+ },
6245
+ {
6246
+ "kind": "field",
6247
+ "name": "validationTarget",
6248
+ "readonly": true
6249
+ },
6250
+ {
6251
+ "kind": "method",
6252
+ "name": "formResetCallback"
6253
+ },
6254
+ {
6255
+ "kind": "method",
6256
+ "name": "formStateRestoreCallback",
6257
+ "parameters": [
6258
+ {
6259
+ "name": "state",
6260
+ "type": {
6261
+ "text": "string"
6262
+ }
6263
+ }
6264
+ ]
6050
6265
  },
6051
6266
  {
6052
- "description": "Chevron color.",
6053
- "name": "--caret-color",
6054
- "default": "var(--l-form-control-placeholder-color)"
6267
+ "kind": "method",
6268
+ "name": "show"
6055
6269
  },
6056
6270
  {
6057
- "description": "Chevron mask image; override with any `url()` to re-skin.",
6058
- "name": "--caret-icon",
6059
- "default": "mdi:chevron-down"
6271
+ "kind": "method",
6272
+ "name": "hide",
6273
+ "parameters": [
6274
+ {
6275
+ "name": "{ focusTrigger = true }",
6276
+ "default": "{}"
6277
+ }
6278
+ ]
6060
6279
  }
6061
6280
  ],
6062
6281
  "events": [
6063
6282
  {
6064
6283
  "name": "change",
6065
- "description": "Fires when an option is selected.",
6284
+ "description": "Fired when the selection changes. Bubbles. Not cancelable. Properties: `value: string | string[]`.",
6066
6285
  "cancelable": false
6067
6286
  },
6068
6287
  {
6069
6288
  "name": "input",
6070
- "description": "Fires when the value changes.",
6289
+ "description": "Fired as the user types in the search box. Bubbles. Not cancelable. Properties: `value: string` (the query).",
6071
6290
  "cancelable": false
6072
- }
6073
- ],
6074
- "attributes": [
6075
- {
6076
- "description": "xs | sm | md | lg | xl — Control height on the shared `--l-size-control-*` scale (default `md`).",
6077
- "name": "data-size"
6078
6291
  },
6079
6292
  {
6080
- "description": "Disables the select.",
6081
- "name": "disabled"
6082
- },
6083
- {
6084
- "description": "Marks the field as required.",
6085
- "name": "required"
6293
+ "name": "show",
6294
+ "description": "Fired before the listbox opens. Cancelable.",
6295
+ "cancelable": true
6086
6296
  },
6087
6297
  {
6088
- "description": "Allows multiple selections.",
6089
- "name": "multiple"
6298
+ "name": "hide",
6299
+ "description": "Fired before the listbox closes. Cancelable.",
6300
+ "cancelable": true
6090
6301
  }
6091
6302
  ],
6092
- "summary": "A styled native `<select>` using the customizable `base-select` appearance.",
6093
- "examples": [
6303
+ "attributes": [
6094
6304
  {
6095
- "title": "Basic",
6096
- "language": "html",
6097
- "code": "<select class=\"l-select\">\n<option class=\"l-select-item\">One</option>\n<option class=\"l-select-item\">Two</option>\n</select>"
6098
- }
6099
- ],
6100
- "_cssClasses": [
6305
+ "name": "placeholder",
6306
+ "type": {
6307
+ "text": "string"
6308
+ },
6309
+ "default": "''",
6310
+ "description": "Placeholder shown in the trigger when nothing is selected.",
6311
+ "fieldName": "placeholder"
6312
+ },
6101
6313
  {
6102
- "name": ".l-select",
6103
- "description": "Base select element with `appearance: base-select`."
6314
+ "name": "label",
6315
+ "type": {
6316
+ "text": "string"
6317
+ },
6318
+ "default": "''",
6319
+ "description": "Accessible label for the trigger.",
6320
+ "fieldName": "label"
6104
6321
  },
6105
6322
  {
6106
- "name": ".l-select-item",
6107
- "description": "Option styling with checkmark indicator."
6323
+ "name": "size",
6324
+ "type": {
6325
+ "text": "SelectSize"
6326
+ },
6327
+ "default": "'md'",
6328
+ "description": "Control size.",
6329
+ "fieldName": "size"
6108
6330
  },
6109
6331
  {
6110
- "name": ".l-select-item-media",
6111
- "description": "Leading image/icon inside a rich option."
6332
+ "name": "searchable",
6333
+ "type": {
6334
+ "text": "boolean"
6335
+ },
6336
+ "default": "false",
6337
+ "description": "Show a filter box inside the popover (opt-in, for long lists).",
6338
+ "fieldName": "searchable"
6112
6339
  },
6113
6340
  {
6114
- "name": ".l-select-item-text",
6115
- "description": "Column wrapper stacking title + description."
6341
+ "name": "with-clear",
6342
+ "type": {
6343
+ "text": "boolean"
6344
+ },
6345
+ "default": "false",
6346
+ "description": "Show a button to clear the value.",
6347
+ "fieldName": "withClear"
6116
6348
  },
6117
6349
  {
6118
- "name": ".l-select-item-title",
6119
- "description": "Primary label of a rich option."
6350
+ "name": "placement",
6351
+ "type": {
6352
+ "text": "Placement"
6353
+ },
6354
+ "default": "'bottom-start'",
6355
+ "description": "Panel placement relative to the trigger.",
6356
+ "fieldName": "placement"
6120
6357
  },
6121
6358
  {
6122
- "name": ".l-select-item-description",
6123
- "description": "Secondary line of a rich option (hidden in the trigger)."
6359
+ "name": "multiple",
6360
+ "type": {
6361
+ "text": "boolean"
6362
+ },
6363
+ "default": "false",
6364
+ "description": "Allow selecting multiple values — renders chips and submits one entry per value.",
6365
+ "fieldName": "multiple"
6124
6366
  }
6125
6367
  ],
6126
- "customElement": false,
6127
- "_native": true,
6128
- "_nativeTag": "select",
6129
- "selector": ".l-select",
6130
- "_attributes": [
6131
- {
6132
- "name": "data-size",
6133
- "values": [
6134
- "xs",
6135
- "sm",
6136
- "md",
6137
- "lg",
6138
- "xl"
6139
- ],
6140
- "description": "Control height on the shared `--l-size-control-*` scale (default `md`)."
6141
- },
6142
- {
6143
- "name": "disabled",
6144
- "description": "Disables the select."
6145
- },
6146
- {
6147
- "name": "required",
6148
- "description": "Marks the field as required."
6149
- },
6368
+ "superclass": {
6369
+ "name": "LuxenFormAssociatedElement",
6370
+ "module": "/src/html/shared/luxen-form-associated-element.js"
6371
+ },
6372
+ "tagName": "l-select",
6373
+ "customElement": true,
6374
+ "summary": "A searchable select with a button trigger and a popover listbox.",
6375
+ "examples": [
6150
6376
  {
6151
- "name": "multiple",
6152
- "description": "Allows multiple selections."
6377
+ "language": "html",
6378
+ "code": "<l-select label=\"Country\" name=\"country\" placeholder=\"Select a country…\">\n <datalist>\n <option value=\"us\">United States</option>\n <option value=\"fr\" selected>France</option>\n </datalist>\n</l-select>"
6153
6379
  }
6154
6380
  ]
6155
6381
  }
@@ -6157,10 +6383,26 @@
6157
6383
  "exports": [
6158
6384
  {
6159
6385
  "kind": "js",
6160
- "name": "SelectMeta",
6386
+ "name": "SelectChangeEvent",
6387
+ "declaration": {
6388
+ "name": "SelectChangeEvent",
6389
+ "module": "src/html/elements/select/select.ts"
6390
+ }
6391
+ },
6392
+ {
6393
+ "kind": "js",
6394
+ "name": "SelectInputEvent",
6161
6395
  "declaration": {
6162
- "name": "SelectMeta",
6163
- "module": "src/html/elements/select/select.meta.ts"
6396
+ "name": "SelectInputEvent",
6397
+ "module": "src/html/elements/select/select.ts"
6398
+ }
6399
+ },
6400
+ {
6401
+ "kind": "js",
6402
+ "name": "Select",
6403
+ "declaration": {
6404
+ "name": "Select",
6405
+ "module": "src/html/elements/select/select.ts"
6164
6406
  }
6165
6407
  }
6166
6408
  ]
@@ -8181,8 +8423,9 @@
8181
8423
  "summary": "A tabs component that progressively enhances light DOM markup\nwith ARIA roles, keyboard navigation, and animated indicators.",
8182
8424
  "examples": [
8183
8425
  {
8426
+ "title": "Mark the initially-active tab with `aria-selected=\"true\"` so it is styled as",
8184
8427
  "language": "html",
8185
- "code": "<l-tabs variant=\"enclosed\">\n <div>\n <button>Tab 1</button>\n <button>Tab 2</button>\n </div>\n <div>Content 1</div>\n <div>Content 2</div>\n</l-tabs>"
8428
+ "code": "selected before the script upgrades the element (progressive enhancement).\n```html\n<l-tabs variant=\"enclosed\">\n <div>\n <button aria-selected=\"true\">Tab 1</button>\n <button>Tab 2</button>\n </div>\n <div>Content 1</div>\n <div>Content 2</div>\n</l-tabs>\n```"
8186
8429
  }
8187
8430
  ]
8188
8431
  }
@@ -8206,6 +8449,181 @@
8206
8449
  }
8207
8450
  ]
8208
8451
  },
8452
+ {
8453
+ "kind": "javascript-module",
8454
+ "path": "src/html/elements/tag/index.ts",
8455
+ "declarations": [],
8456
+ "exports": [
8457
+ {
8458
+ "kind": "js",
8459
+ "name": "*",
8460
+ "declaration": {
8461
+ "name": "*",
8462
+ "module": "src/html/elements/tag/tag.js"
8463
+ }
8464
+ }
8465
+ ]
8466
+ },
8467
+ {
8468
+ "kind": "javascript-module",
8469
+ "path": "src/html/elements/tag/tag.ts",
8470
+ "declarations": [
8471
+ {
8472
+ "kind": "class",
8473
+ "description": "Fired when the user asks to remove the tag — clicking the × button, or\npressing Backspace/Delete while it is focused. Cancelable: call\n`preventDefault()` to keep the tag (the controlling host then manages the\nlist itself); otherwise the tag removes itself from the DOM. Does not bubble.",
8474
+ "name": "TagRemoveEvent",
8475
+ "superclass": {
8476
+ "name": "Event",
8477
+ "module": "src/html/elements/tag/tag.ts"
8478
+ }
8479
+ },
8480
+ {
8481
+ "kind": "class",
8482
+ "description": "A compact chip for tokens, filters, and multi-select values. Shadow DOM so its\nstyles are self-contained and it renders correctly **anywhere**, including\ninside another element's shadow root (e.g. the `<l-select>` multi-select\ntrigger).",
8483
+ "name": "Tag",
8484
+ "cssProperties": [
8485
+ {
8486
+ "description": "Corner radius. Defaults to a full pill.",
8487
+ "name": "--border-radius"
8488
+ },
8489
+ {
8490
+ "description": "Chip background.",
8491
+ "name": "--background"
8492
+ },
8493
+ {
8494
+ "description": "Text color.",
8495
+ "name": "--color"
8496
+ }
8497
+ ],
8498
+ "cssParts": [
8499
+ {
8500
+ "description": "The chip container.",
8501
+ "name": "base"
8502
+ },
8503
+ {
8504
+ "description": "The label wrapper.",
8505
+ "name": "content"
8506
+ },
8507
+ {
8508
+ "description": "The remove button.",
8509
+ "name": "remove"
8510
+ }
8511
+ ],
8512
+ "slots": [
8513
+ {
8514
+ "description": "The tag label.",
8515
+ "name": ""
8516
+ },
8517
+ {
8518
+ "description": "Leading content, e.g. an `<l-icon>` or `<l-avatar>`.",
8519
+ "name": "prefix"
8520
+ }
8521
+ ],
8522
+ "members": [
8523
+ {
8524
+ "kind": "field",
8525
+ "name": "size",
8526
+ "type": {
8527
+ "text": "TagSize"
8528
+ },
8529
+ "default": "'md'",
8530
+ "description": "Tag size: `sm`, `md` (default), or `lg`.",
8531
+ "attribute": "size",
8532
+ "reflects": true
8533
+ },
8534
+ {
8535
+ "kind": "field",
8536
+ "name": "removable",
8537
+ "type": {
8538
+ "text": "boolean"
8539
+ },
8540
+ "default": "false",
8541
+ "description": "Show a remove button (and enable Backspace/Delete removal).",
8542
+ "attribute": "removable",
8543
+ "reflects": true
8544
+ },
8545
+ {
8546
+ "kind": "field",
8547
+ "name": "disabled",
8548
+ "type": {
8549
+ "text": "boolean"
8550
+ },
8551
+ "default": "false",
8552
+ "description": "Disable the tag — dims it and blocks removal.",
8553
+ "attribute": "disabled",
8554
+ "reflects": true
8555
+ }
8556
+ ],
8557
+ "events": [
8558
+ {
8559
+ "name": "remove",
8560
+ "description": "Fired when the user removes the tag (× click or Backspace/Delete). Cancelable; if not prevented the tag removes itself. Not composed, does not bubble.",
8561
+ "cancelable": true
8562
+ }
8563
+ ],
8564
+ "attributes": [
8565
+ {
8566
+ "name": "size",
8567
+ "type": {
8568
+ "text": "TagSize"
8569
+ },
8570
+ "default": "'md'",
8571
+ "description": "Tag size: `sm`, `md` (default), or `lg`.",
8572
+ "fieldName": "size"
8573
+ },
8574
+ {
8575
+ "name": "removable",
8576
+ "type": {
8577
+ "text": "boolean"
8578
+ },
8579
+ "default": "false",
8580
+ "description": "Show a remove button (and enable Backspace/Delete removal).",
8581
+ "fieldName": "removable"
8582
+ },
8583
+ {
8584
+ "name": "disabled",
8585
+ "type": {
8586
+ "text": "boolean"
8587
+ },
8588
+ "default": "false",
8589
+ "description": "Disable the tag — dims it and blocks removal.",
8590
+ "fieldName": "disabled"
8591
+ }
8592
+ ],
8593
+ "superclass": {
8594
+ "name": "LuxenElement",
8595
+ "module": "/src/html/shared/luxen-element.js"
8596
+ },
8597
+ "tagName": "l-tag",
8598
+ "customElement": true,
8599
+ "summary": "A compact, optionally removable chip.",
8600
+ "examples": [
8601
+ {
8602
+ "language": "html",
8603
+ "code": "<l-tag removable>Design</l-tag>"
8604
+ }
8605
+ ]
8606
+ }
8607
+ ],
8608
+ "exports": [
8609
+ {
8610
+ "kind": "js",
8611
+ "name": "TagRemoveEvent",
8612
+ "declaration": {
8613
+ "name": "TagRemoveEvent",
8614
+ "module": "src/html/elements/tag/tag.ts"
8615
+ }
8616
+ },
8617
+ {
8618
+ "kind": "js",
8619
+ "name": "Tag",
8620
+ "declaration": {
8621
+ "name": "Tag",
8622
+ "module": "src/html/elements/tag/tag.ts"
8623
+ }
8624
+ }
8625
+ ]
8626
+ },
8209
8627
  {
8210
8628
  "kind": "javascript-module",
8211
8629
  "path": "src/html/elements/textarea/textarea.meta.ts",
@@ -8774,7 +9192,8 @@
8774
9192
  },
8775
9193
  "default": "''",
8776
9194
  "description": "The HTML id of the element triggering the tooltip.",
8777
- "attribute": "for"
9195
+ "attribute": "for",
9196
+ "reflects": true
8778
9197
  },
8779
9198
  {
8780
9199
  "kind": "field",