@brightspot/ui 1.4.0 → 1.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 (104) hide show
  1. package/README.md +12 -0
  2. package/dist/components/avatar/Avatar.d.ts +1 -1
  3. package/dist/components/avatar/Avatar.d.ts.map +1 -1
  4. package/dist/components/avatar/Avatar.js +3 -1
  5. package/dist/components/avatar/Avatar.js.map +1 -1
  6. package/dist/components/popover/Popover.d.ts +161 -0
  7. package/dist/components/popover/Popover.d.ts.map +1 -0
  8. package/dist/components/popover/Popover.js +436 -0
  9. package/dist/components/popover/Popover.js.map +1 -0
  10. package/dist/components/widget/Widget.css +104 -0
  11. package/dist/components/widget/Widget.d.ts +170 -0
  12. package/dist/components/widget/Widget.d.ts.map +1 -0
  13. package/dist/components/widget/Widget.js +434 -0
  14. package/dist/components/widget/Widget.js.map +1 -0
  15. package/dist/custom-elements.json +604 -101
  16. package/dist/global.d.ts +5 -0
  17. package/dist/storybook/assets/{Avatar.stories-DrhezTR1.js → Avatar.stories-CPVNxsaA.js} +37 -32
  18. package/dist/storybook/assets/AvatarGroup.stories-Bl65NGHl.js +225 -0
  19. package/dist/storybook/assets/{Badge.stories-DtJcBfOR.js → Badge.stories-Bbnc6fRy.js} +1 -1
  20. package/dist/storybook/assets/{Button.stories-BKUfLgSY.js → Button.stories-CRJ5n2y4.js} +1 -1
  21. package/dist/storybook/assets/{CircularProgress.stories-dpmD-XJT.js → CircularProgress.stories-D9vBj3JJ.js} +1 -1
  22. package/dist/storybook/assets/{ClipboardMixin.stories-C0pnQ7BY.js → ClipboardMixin.stories-Dm-Jm4yb.js} +7 -7
  23. package/dist/storybook/assets/Color-6BZIO3FS-BcNIJY1U.js +1 -0
  24. package/dist/storybook/assets/{Colors.stories-bKK25qgF.js → Colors.stories-B9_090wL.js} +1 -1
  25. package/dist/storybook/assets/ComponentStatesMixin-ChiFBCuo.js +1 -0
  26. package/dist/storybook/assets/{ComponentStatesMixin.stories-9mRp2zuB.js → ComponentStatesMixin.stories-DHv9MHmE.js} +3 -3
  27. package/dist/storybook/assets/{CopyToClipboard.stories-BW3oaT1i.js → CopyToClipboard.stories-gtJlTP1l.js} +1 -1
  28. package/dist/storybook/assets/{Debounce.stories-BXx3CKvQ.js → Debounce.stories-BBNX7mJA.js} +3 -3
  29. package/dist/storybook/assets/DocsRenderer-LL677BLK-D-E99pXl.js +758 -0
  30. package/dist/storybook/assets/{Events.stories-PBeiuWQn.js → Events.stories-DDmydlh_.js} +1 -1
  31. package/dist/storybook/assets/{Heading.stories-Djkl0MoC.js → Heading.stories-BLGfko-i.js} +1 -1
  32. package/dist/storybook/assets/{Icon.stories-Cam1fyud.js → Icon.stories-BHnAGcFF.js} +1 -1
  33. package/dist/storybook/assets/{LinearProgress.stories-BDNoYIJu.js → LinearProgress.stories-Dx26a0P_.js} +1 -1
  34. package/dist/storybook/assets/Popover.stories-CbqpY6YR.js +431 -0
  35. package/dist/storybook/assets/ReadyMixin-BHiHoIbr.js +1 -0
  36. package/dist/storybook/assets/{Rtc.stories-BrTAIAi1.js → Rtc.stories-CAjDv_Ub.js} +3 -3
  37. package/dist/storybook/assets/{ScrollShadow.stories-DHcKhkag.js → ScrollShadow.stories-BSV4U-tq.js} +1 -1
  38. package/dist/storybook/assets/{Throttle.stories-cSYT_BXu.js → Throttle.stories-kaxXQ8RZ.js} +8 -8
  39. package/dist/storybook/assets/Tooltip.stories-CsxXkztr.js +143 -0
  40. package/dist/storybook/assets/Widget.stories-DqATHnSq.js +233 -0
  41. package/dist/storybook/assets/WithTooltip-65CFNBJE-BtbbFYSA.js +9 -0
  42. package/dist/storybook/assets/custom-element-UsVr97OX.js +1 -0
  43. package/dist/storybook/assets/formatter-EIJCOSYU-C87Csnpu.js +1 -0
  44. package/dist/storybook/assets/if-defined-COHr0XBn.js +1 -0
  45. package/dist/storybook/assets/{iframe-BMxUFmpF.css → iframe-BkDGeDre.css} +1 -1
  46. package/dist/storybook/assets/iframe-CcloOV09.js +1061 -0
  47. package/dist/storybook/assets/index-DP7vnJf7.js +1 -0
  48. package/dist/storybook/assets/onFind-DqriYjEB.js +1 -0
  49. package/dist/storybook/assets/onFind.stories-BxvoC-Z-.js +1069 -0
  50. package/dist/storybook/assets/{onRemove.stories-C7W9KyRr.js → onRemove.stories-Dwoixzb0.js} +3 -3
  51. package/dist/storybook/assets/{onVisible.stories-CIl6R0q4.js → onVisible.stories-CinmRF9w.js} +10 -10
  52. package/dist/storybook/assets/syntaxhighlighter-ED5Y7EFY-BHLkDkOn.js +6 -0
  53. package/dist/storybook/iframe.html +57 -39
  54. package/dist/storybook/index.html +11 -4
  55. package/dist/storybook/index.json +1 -1
  56. package/dist/storybook/project.json +1 -1
  57. package/dist/storybook/sb-addons/docs-1/manager-bundle.js +1 -1
  58. package/dist/storybook/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +112 -290
  59. package/dist/storybook/sb-addons/vitest-2/manager-bundle.js +3 -0
  60. package/dist/storybook/sb-manager/globals-runtime.js +60754 -66346
  61. package/dist/storybook/sb-manager/globals.js +2 -3
  62. package/dist/storybook/sb-manager/manager-stores.js +23 -0
  63. package/dist/storybook/sb-manager/runtime.js +12983 -11699
  64. package/dist/storybook/vite-inject-mocker-entry.js +2 -2
  65. package/dist/tailwind-plugin-popover.d.ts +2 -0
  66. package/dist/tailwind-plugin-popover.d.ts.map +1 -0
  67. package/dist/tailwind-plugin-popover.js +177 -0
  68. package/dist/tailwind-plugin-popover.js.map +1 -0
  69. package/dist/tailwind-plugin-popover.ts +202 -0
  70. package/dist/tailwind-plugin-tooltip.d.ts +2 -0
  71. package/dist/tailwind-plugin-tooltip.d.ts.map +1 -0
  72. package/dist/tailwind-plugin-tooltip.js +184 -0
  73. package/dist/tailwind-plugin-tooltip.js.map +1 -0
  74. package/dist/tailwind-plugin-tooltip.ts +209 -0
  75. package/dist/util/EventEmitterMixin.d.ts +11 -0
  76. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  77. package/dist/util/EventEmitterMixin.js +1 -1
  78. package/dist/util/EventEmitterMixin.js.map +1 -1
  79. package/dist/util/TooltipController.d.ts +37 -0
  80. package/dist/util/TooltipController.d.ts.map +1 -0
  81. package/dist/util/TooltipController.js +133 -0
  82. package/dist/util/TooltipController.js.map +1 -0
  83. package/dist/util/TooltipMixin.d.ts +42 -0
  84. package/dist/util/TooltipMixin.d.ts.map +1 -0
  85. package/dist/util/TooltipMixin.js +401 -0
  86. package/dist/util/TooltipMixin.js.map +1 -0
  87. package/dist/util/onFind.d.ts +1 -0
  88. package/dist/util/onFind.d.ts.map +1 -1
  89. package/dist/util/onFind.js +73 -48
  90. package/dist/util/onFind.js.map +1 -1
  91. package/dist/util/onVisible.d.ts.map +1 -1
  92. package/dist/util/onVisible.js +13 -2
  93. package/dist/util/onVisible.js.map +1 -1
  94. package/package.json +12 -5
  95. package/dist/storybook/assets/AvatarGroup.stories-DrlxT-mF.js +0 -211
  96. package/dist/storybook/assets/Color-64QXVMR3-Dnd9S2a1.js +0 -1
  97. package/dist/storybook/assets/ComponentStatesMixin-C2HZ9ZFb.js +0 -1
  98. package/dist/storybook/assets/WithTooltip-SK46ZJ2J-Df0E-KJO.js +0 -825
  99. package/dist/storybook/assets/formatter-OMEEQ6HG-DFa_WTfb.js +0 -1
  100. package/dist/storybook/assets/iframe-lTczLWsL.js +0 -1064
  101. package/dist/storybook/assets/index-yMswRDPh.js +0 -1
  102. package/dist/storybook/assets/onFind-C6olvKHR.js +0 -1
  103. package/dist/storybook/assets/onFind.stories-DfW54CDE.js +0 -284
  104. package/dist/storybook/assets/syntaxhighlighter-CAVLW7PM-DoI0ixeu.js +0 -6
@@ -140,6 +140,10 @@
140
140
  }
141
141
  ],
142
142
  "mixins": [
143
+ {
144
+ "name": "TooltipMixin",
145
+ "module": "/src/util/TooltipMixin.js"
146
+ },
143
147
  {
144
148
  "name": "EventEmitterMixin",
145
149
  "module": "/src/util/EventEmitterMixin.js"
@@ -291,67 +295,45 @@
291
295
  },
292
296
  {
293
297
  "kind": "javascript-module",
294
- "path": "src/components/badge/Badge.ts",
298
+ "path": "src/components/circular-progress/CircularProgress.ts",
295
299
  "declarations": [
296
300
  {
297
301
  "kind": "class",
298
- "description": "A badge component for highlighting important information.\n\nBadges help highlight notifications, status, or new messages.\nPrimarily used for communicating secondary or additional information.",
299
- "name": "Badge",
302
+ "description": "A circular progress indicator for showing loading states or progress.",
303
+ "name": "CircularProgress",
300
304
  "cssProperties": [
301
305
  {
302
- "description": "Text color (overrides theme color)",
303
- "name": "--badge-color-foreground"
304
- },
305
- {
306
- "description": "Background color (overrides theme color)",
307
- "name": "--badge-color-background"
308
- },
309
- {
310
- "description": "Border radius size (overrides shape default, default: 999px)",
311
- "name": "--badge-radius-size"
312
- },
313
- {
314
- "description": "Horizontal padding (overrides size default)",
315
- "name": "--badge-px"
306
+ "description": "Custom progress indicator color (overrides theme color)",
307
+ "name": "--progress-color"
316
308
  },
317
309
  {
318
- "description": "Vertical padding (overrides size default)",
319
- "name": "--badge-py"
310
+ "description": "Track/background color (overrides default gray-100)",
311
+ "name": "--track-color"
320
312
  },
321
313
  {
322
- "description": "Size of the dot affordance (default: 6px)",
323
- "name": "--badge-dot-size"
314
+ "description": "Custom size in pixels (overrides size preset)",
315
+ "name": "--progress-size"
324
316
  }
325
317
  ],
326
318
  "members": [
327
319
  {
328
320
  "kind": "field",
329
- "name": "variant",
330
- "type": {
331
- "text": "'info' | 'primary' | 'error' | 'success' | 'warning'"
332
- },
333
- "default": "'info'",
334
- "description": "Style of the badge.\n- 'info': Informational (default)\n- 'primary': Primary action or emphasis\n- 'error': Error or danger state\n- 'success': Success or completion state\n- 'warning': Warning or caution state",
335
- "attribute": "variant"
336
- },
337
- {
338
- "kind": "field",
339
- "name": "dot",
321
+ "name": "indeterminate",
340
322
  "type": {
341
323
  "text": "boolean"
342
324
  },
343
- "default": "false",
344
- "description": "Should a dot be displayed before the label?",
345
- "attribute": "dot"
325
+ "default": "true",
326
+ "description": "Whether the progress indicator is indeterminate (animated spinner).\nWhen false, shows determinate progress based on the progress value.",
327
+ "attribute": "indeterminate"
346
328
  },
347
329
  {
348
330
  "kind": "field",
349
331
  "name": "size",
350
332
  "type": {
351
- "text": "string"
333
+ "text": "'sm' | 'md' | 'lg'"
352
334
  },
353
335
  "default": "'sm'",
354
- "description": "Size variant.\n- 'sm': Small (default)\n- 'md': Medium\n- 'lg': Large",
336
+ "description": "Size variant.\n- 'sm': Small (16px) - default\n- 'md': Medium (32px)\n- 'lg': Large (48px)",
355
337
  "attribute": "size"
356
338
  }
357
339
  ],
@@ -361,42 +343,43 @@
361
343
  "text": "CustomEvent"
362
344
  },
363
345
  "description": "Fired after first render and initialization",
364
- "name": "btu-badge-ready"
365
- }
366
- ],
367
- "attributes": [
346
+ "name": "btu-progress-ready"
347
+ },
368
348
  {
369
- "name": "variant",
370
349
  "type": {
371
- "text": "'info' | 'primary' | 'error' | 'success' | 'warning'"
350
+ "text": "CustomEvent"
372
351
  },
373
- "default": "'info'",
374
- "description": "Style of the badge.\n- 'info': Informational (default)\n- 'primary': Primary action or emphasis\n- 'error': Error or danger state\n- 'success': Success or completion state\n- 'warning': Warning or caution state",
375
- "fieldName": "variant",
376
- "attribute": "variant"
377
- },
352
+ "description": "Fired when determinate progress reaches 100",
353
+ "name": "btu-progress-complete"
354
+ }
355
+ ],
356
+ "attributes": [
378
357
  {
379
- "name": "dot",
358
+ "name": "indeterminate",
380
359
  "type": {
381
360
  "text": "boolean"
382
361
  },
383
- "default": "false",
384
- "description": "Should a dot be displayed before the label?",
385
- "fieldName": "dot",
386
- "attribute": "dot"
362
+ "default": "true",
363
+ "description": "Whether the progress indicator is indeterminate (animated spinner).\nWhen false, shows determinate progress based on the progress value.",
364
+ "fieldName": "indeterminate",
365
+ "attribute": "indeterminate"
387
366
  },
388
367
  {
389
368
  "name": "size",
390
369
  "type": {
391
- "text": "string"
370
+ "text": "'sm' | 'md' | 'lg'"
392
371
  },
393
372
  "default": "'sm'",
394
- "description": "Size variant.\n- 'sm': Small (default)\n- 'md': Medium\n- 'lg': Large",
373
+ "description": "Size variant.\n- 'sm': Small (16px) - default\n- 'md': Medium (32px)\n- 'lg': Large (48px)",
395
374
  "fieldName": "size",
396
375
  "attribute": "size"
397
376
  }
398
377
  ],
399
378
  "mixins": [
379
+ {
380
+ "name": "ProgressMixin",
381
+ "module": "/src/util/ProgressMixin.js"
382
+ },
400
383
  {
401
384
  "name": "EventEmitterMixin",
402
385
  "module": "/src/util/EventEmitterMixin.js"
@@ -410,7 +393,7 @@
410
393
  "name": "LitElement",
411
394
  "package": "lit"
412
395
  },
413
- "tagName": "btu-badge",
396
+ "tagName": "btu-circular-progress",
414
397
  "customElement": true
415
398
  }
416
399
  ],
@@ -419,61 +402,83 @@
419
402
  "kind": "js",
420
403
  "name": "default",
421
404
  "declaration": {
422
- "name": "Badge",
423
- "module": "src/components/badge/Badge.ts"
405
+ "name": "CircularProgress",
406
+ "module": "src/components/circular-progress/CircularProgress.ts"
424
407
  }
425
408
  },
426
409
  {
427
410
  "kind": "custom-element-definition",
428
- "name": "btu-badge",
411
+ "name": "btu-circular-progress",
429
412
  "declaration": {
430
- "name": "Badge",
431
- "module": "src/components/badge/Badge.ts"
413
+ "name": "CircularProgress",
414
+ "module": "src/components/circular-progress/CircularProgress.ts"
432
415
  }
433
416
  }
434
417
  ]
435
418
  },
436
419
  {
437
420
  "kind": "javascript-module",
438
- "path": "src/components/circular-progress/CircularProgress.ts",
421
+ "path": "src/components/badge/Badge.ts",
439
422
  "declarations": [
440
423
  {
441
424
  "kind": "class",
442
- "description": "A circular progress indicator for showing loading states or progress.",
443
- "name": "CircularProgress",
425
+ "description": "A badge component for highlighting important information.\n\nBadges help highlight notifications, status, or new messages.\nPrimarily used for communicating secondary or additional information.",
426
+ "name": "Badge",
444
427
  "cssProperties": [
445
428
  {
446
- "description": "Custom progress indicator color (overrides theme color)",
447
- "name": "--progress-color"
429
+ "description": "Text color (overrides theme color)",
430
+ "name": "--badge-color-foreground"
448
431
  },
449
432
  {
450
- "description": "Track/background color (overrides default gray-100)",
451
- "name": "--track-color"
433
+ "description": "Background color (overrides theme color)",
434
+ "name": "--badge-color-background"
452
435
  },
453
436
  {
454
- "description": "Custom size in pixels (overrides size preset)",
455
- "name": "--progress-size"
437
+ "description": "Border radius size (overrides shape default, default: 999px)",
438
+ "name": "--badge-radius-size"
439
+ },
440
+ {
441
+ "description": "Horizontal padding (overrides size default)",
442
+ "name": "--badge-px"
443
+ },
444
+ {
445
+ "description": "Vertical padding (overrides size default)",
446
+ "name": "--badge-py"
447
+ },
448
+ {
449
+ "description": "Size of the dot affordance (default: 6px)",
450
+ "name": "--badge-dot-size"
456
451
  }
457
452
  ],
458
453
  "members": [
459
454
  {
460
455
  "kind": "field",
461
- "name": "indeterminate",
456
+ "name": "variant",
457
+ "type": {
458
+ "text": "'info' | 'primary' | 'error' | 'success' | 'warning'"
459
+ },
460
+ "default": "'info'",
461
+ "description": "Style of the badge.\n- 'info': Informational (default)\n- 'primary': Primary action or emphasis\n- 'error': Error or danger state\n- 'success': Success or completion state\n- 'warning': Warning or caution state",
462
+ "attribute": "variant"
463
+ },
464
+ {
465
+ "kind": "field",
466
+ "name": "dot",
462
467
  "type": {
463
468
  "text": "boolean"
464
469
  },
465
- "default": "true",
466
- "description": "Whether the progress indicator is indeterminate (animated spinner).\nWhen false, shows determinate progress based on the progress value.",
467
- "attribute": "indeterminate"
470
+ "default": "false",
471
+ "description": "Should a dot be displayed before the label?",
472
+ "attribute": "dot"
468
473
  },
469
474
  {
470
475
  "kind": "field",
471
476
  "name": "size",
472
477
  "type": {
473
- "text": "'sm' | 'md' | 'lg'"
478
+ "text": "string"
474
479
  },
475
480
  "default": "'sm'",
476
- "description": "Size variant.\n- 'sm': Small (16px) - default\n- 'md': Medium (32px)\n- 'lg': Large (48px)",
481
+ "description": "Size variant.\n- 'sm': Small (default)\n- 'md': Medium\n- 'lg': Large",
477
482
  "attribute": "size"
478
483
  }
479
484
  ],
@@ -483,43 +488,42 @@
483
488
  "text": "CustomEvent"
484
489
  },
485
490
  "description": "Fired after first render and initialization",
486
- "name": "btu-progress-ready"
487
- },
488
- {
489
- "type": {
490
- "text": "CustomEvent"
491
- },
492
- "description": "Fired when determinate progress reaches 100",
493
- "name": "btu-progress-complete"
491
+ "name": "btu-badge-ready"
494
492
  }
495
493
  ],
496
494
  "attributes": [
497
495
  {
498
- "name": "indeterminate",
496
+ "name": "variant",
497
+ "type": {
498
+ "text": "'info' | 'primary' | 'error' | 'success' | 'warning'"
499
+ },
500
+ "default": "'info'",
501
+ "description": "Style of the badge.\n- 'info': Informational (default)\n- 'primary': Primary action or emphasis\n- 'error': Error or danger state\n- 'success': Success or completion state\n- 'warning': Warning or caution state",
502
+ "fieldName": "variant",
503
+ "attribute": "variant"
504
+ },
505
+ {
506
+ "name": "dot",
499
507
  "type": {
500
508
  "text": "boolean"
501
509
  },
502
- "default": "true",
503
- "description": "Whether the progress indicator is indeterminate (animated spinner).\nWhen false, shows determinate progress based on the progress value.",
504
- "fieldName": "indeterminate",
505
- "attribute": "indeterminate"
510
+ "default": "false",
511
+ "description": "Should a dot be displayed before the label?",
512
+ "fieldName": "dot",
513
+ "attribute": "dot"
506
514
  },
507
515
  {
508
516
  "name": "size",
509
517
  "type": {
510
- "text": "'sm' | 'md' | 'lg'"
518
+ "text": "string"
511
519
  },
512
520
  "default": "'sm'",
513
- "description": "Size variant.\n- 'sm': Small (16px) - default\n- 'md': Medium (32px)\n- 'lg': Large (48px)",
521
+ "description": "Size variant.\n- 'sm': Small (default)\n- 'md': Medium\n- 'lg': Large",
514
522
  "fieldName": "size",
515
523
  "attribute": "size"
516
524
  }
517
525
  ],
518
526
  "mixins": [
519
- {
520
- "name": "ProgressMixin",
521
- "module": "/src/util/ProgressMixin.js"
522
- },
523
527
  {
524
528
  "name": "EventEmitterMixin",
525
529
  "module": "/src/util/EventEmitterMixin.js"
@@ -533,7 +537,7 @@
533
537
  "name": "LitElement",
534
538
  "package": "lit"
535
539
  },
536
- "tagName": "btu-circular-progress",
540
+ "tagName": "btu-badge",
537
541
  "customElement": true
538
542
  }
539
543
  ],
@@ -542,16 +546,16 @@
542
546
  "kind": "js",
543
547
  "name": "default",
544
548
  "declaration": {
545
- "name": "CircularProgress",
546
- "module": "src/components/circular-progress/CircularProgress.ts"
549
+ "name": "Badge",
550
+ "module": "src/components/badge/Badge.ts"
547
551
  }
548
552
  },
549
553
  {
550
554
  "kind": "custom-element-definition",
551
- "name": "btu-circular-progress",
555
+ "name": "btu-badge",
552
556
  "declaration": {
553
- "name": "CircularProgress",
554
- "module": "src/components/circular-progress/CircularProgress.ts"
557
+ "name": "Badge",
558
+ "module": "src/components/badge/Badge.ts"
555
559
  }
556
560
  }
557
561
  ]
@@ -881,6 +885,505 @@
881
885
  }
882
886
  }
883
887
  ]
888
+ },
889
+ {
890
+ "kind": "javascript-module",
891
+ "path": "src/components/popover/Popover.ts",
892
+ "declarations": [
893
+ {
894
+ "kind": "class",
895
+ "description": "A popover component for displaying rich interactive content anchored to a trigger element.\n\nUses the native HTML Popover API for top-layer rendering, light dismiss (click-outside\nand Escape for click triggers), and focus management. CSS anchor positioning handles\nviewport-aware placement.\n\nFor click triggers (`popover=\"auto\"`), the browser provides:\n- Light dismiss (Escape key and click-outside)\n- Top-layer rendering (no z-index needed)\n- Focus restoration on close\n- `autofocus` support — add `autofocus` to an element inside `slot=\"content\"`\n to have it receive focus when the popover opens",
896
+ "name": "Popover",
897
+ "slots": [
898
+ {
899
+ "description": "The element that activates the popover",
900
+ "name": "trigger"
901
+ },
902
+ {
903
+ "description": "Rich HTML content displayed inside the popover panel",
904
+ "name": "content"
905
+ }
906
+ ],
907
+ "members": [
908
+ {
909
+ "kind": "field",
910
+ "name": "position",
911
+ "type": {
912
+ "text": "'top' | 'bottom' | 'left' | 'right'"
913
+ },
914
+ "default": "'bottom'",
915
+ "description": "Position relative to the trigger element.\nAuto-flips when constrained by the viewport.",
916
+ "attribute": "position"
917
+ },
918
+ {
919
+ "kind": "field",
920
+ "name": "trigger",
921
+ "type": {
922
+ "text": "'click' | 'hover' | 'focus'"
923
+ },
924
+ "default": "'click'",
925
+ "description": "How the popover is activated.\n- 'click': Toggle on click with light dismiss\n- 'hover': Show on mouseenter with delay\n- 'focus': Show on focusin",
926
+ "attribute": "trigger"
927
+ },
928
+ {
929
+ "kind": "field",
930
+ "name": "delay",
931
+ "type": {
932
+ "text": "number"
933
+ },
934
+ "default": "300",
935
+ "description": "Show delay in milliseconds (hover trigger only).",
936
+ "attribute": "delay"
937
+ },
938
+ {
939
+ "kind": "field",
940
+ "name": "offset",
941
+ "type": {
942
+ "text": "PopoverOffset | null"
943
+ },
944
+ "default": "null",
945
+ "description": "Gap between trigger and popover (sm=4px, md=8px, lg=12px, xl=16px).",
946
+ "attribute": "offset"
947
+ },
948
+ {
949
+ "kind": "field",
950
+ "name": "noArrow",
951
+ "type": {
952
+ "text": "boolean"
953
+ },
954
+ "default": "false",
955
+ "description": "Hide the arrow pseudo-element.",
956
+ "attribute": "no-arrow"
957
+ },
958
+ {
959
+ "kind": "field",
960
+ "name": "open",
961
+ "type": {
962
+ "text": "boolean"
963
+ },
964
+ "default": "false",
965
+ "description": "Programmatic open/close state (reflected).",
966
+ "attribute": "open",
967
+ "reflects": true
968
+ },
969
+ {
970
+ "kind": "field",
971
+ "name": "panelLabel",
972
+ "type": {
973
+ "text": "string"
974
+ },
975
+ "default": "''",
976
+ "description": "Accessible label for the popover panel (applied as aria-label on the dialog).",
977
+ "attribute": "panel-label"
978
+ },
979
+ {
980
+ "kind": "field",
981
+ "name": "_onTriggerMouseLeave",
982
+ "privacy": "private"
983
+ },
984
+ {
985
+ "kind": "field",
986
+ "name": "_onTriggerFocusIn",
987
+ "privacy": "private"
988
+ },
989
+ {
990
+ "kind": "field",
991
+ "name": "_onTriggerFocusOut",
992
+ "privacy": "private"
993
+ },
994
+ {
995
+ "kind": "field",
996
+ "name": "_onPanelMouseEnter",
997
+ "privacy": "private"
998
+ },
999
+ {
1000
+ "kind": "field",
1001
+ "name": "_onPanelMouseLeave",
1002
+ "privacy": "private"
1003
+ },
1004
+ {
1005
+ "kind": "field",
1006
+ "name": "_onNativeToggle",
1007
+ "privacy": "private"
1008
+ },
1009
+ {
1010
+ "kind": "field",
1011
+ "name": "_onKeyDown",
1012
+ "privacy": "private"
1013
+ }
1014
+ ],
1015
+ "events": [
1016
+ {
1017
+ "type": {
1018
+ "text": "CustomEvent"
1019
+ },
1020
+ "description": "Fired when the popover opens",
1021
+ "name": "btu-popover-show"
1022
+ },
1023
+ {
1024
+ "type": {
1025
+ "text": "CustomEvent"
1026
+ },
1027
+ "description": "Fired when the popover closes",
1028
+ "name": "btu-popover-hide"
1029
+ }
1030
+ ],
1031
+ "attributes": [
1032
+ {
1033
+ "name": "position",
1034
+ "type": {
1035
+ "text": "'top' | 'bottom' | 'left' | 'right'"
1036
+ },
1037
+ "default": "'bottom'",
1038
+ "description": "Position relative to the trigger element.\nAuto-flips when constrained by the viewport.",
1039
+ "fieldName": "position",
1040
+ "attribute": "position"
1041
+ },
1042
+ {
1043
+ "name": "trigger",
1044
+ "type": {
1045
+ "text": "'click' | 'hover' | 'focus'"
1046
+ },
1047
+ "default": "'click'",
1048
+ "description": "How the popover is activated.\n- 'click': Toggle on click with light dismiss\n- 'hover': Show on mouseenter with delay\n- 'focus': Show on focusin",
1049
+ "fieldName": "trigger",
1050
+ "attribute": "trigger"
1051
+ },
1052
+ {
1053
+ "name": "delay",
1054
+ "type": {
1055
+ "text": "number"
1056
+ },
1057
+ "default": "300",
1058
+ "description": "Show delay in milliseconds (hover trigger only).",
1059
+ "fieldName": "delay",
1060
+ "attribute": "delay"
1061
+ },
1062
+ {
1063
+ "name": "offset",
1064
+ "type": {
1065
+ "text": "PopoverOffset | null"
1066
+ },
1067
+ "default": "null",
1068
+ "description": "Gap between trigger and popover (sm=4px, md=8px, lg=12px, xl=16px).",
1069
+ "fieldName": "offset",
1070
+ "attribute": "offset"
1071
+ },
1072
+ {
1073
+ "name": "noArrow",
1074
+ "type": {
1075
+ "text": "boolean"
1076
+ },
1077
+ "default": "false",
1078
+ "description": "Hide the arrow pseudo-element.",
1079
+ "fieldName": "noArrow"
1080
+ },
1081
+ {
1082
+ "name": "open",
1083
+ "type": {
1084
+ "text": "boolean"
1085
+ },
1086
+ "default": "false",
1087
+ "description": "Programmatic open/close state (reflected).",
1088
+ "fieldName": "open",
1089
+ "attribute": "open"
1090
+ },
1091
+ {
1092
+ "name": "panel-label",
1093
+ "type": {
1094
+ "text": "string"
1095
+ },
1096
+ "default": "''",
1097
+ "description": "Accessible label for the popover panel (applied as aria-label on the dialog).",
1098
+ "fieldName": "panelLabel",
1099
+ "attribute": "panel-label"
1100
+ },
1101
+ {
1102
+ "name": "no-arrow",
1103
+ "type": {
1104
+ "text": "boolean"
1105
+ },
1106
+ "default": "false",
1107
+ "description": "Hide the arrow pseudo-element.",
1108
+ "attribute": "noArrow",
1109
+ "fieldName": "noArrow"
1110
+ }
1111
+ ],
1112
+ "mixins": [
1113
+ {
1114
+ "name": "EventEmitterMixin",
1115
+ "module": "/src/util/EventEmitterMixin.js"
1116
+ },
1117
+ {
1118
+ "name": "ReadyMixin",
1119
+ "module": "/src/util/ReadyMixin.js"
1120
+ }
1121
+ ],
1122
+ "superclass": {
1123
+ "name": "LitElement",
1124
+ "package": "lit"
1125
+ },
1126
+ "tagName": "btu-popover",
1127
+ "customElement": true
1128
+ }
1129
+ ],
1130
+ "exports": [
1131
+ {
1132
+ "kind": "js",
1133
+ "name": "default",
1134
+ "declaration": {
1135
+ "name": "Popover",
1136
+ "module": "src/components/popover/Popover.ts"
1137
+ }
1138
+ },
1139
+ {
1140
+ "kind": "custom-element-definition",
1141
+ "name": "btu-popover",
1142
+ "declaration": {
1143
+ "name": "Popover",
1144
+ "module": "src/components/popover/Popover.ts"
1145
+ }
1146
+ }
1147
+ ]
1148
+ },
1149
+ {
1150
+ "kind": "javascript-module",
1151
+ "path": "src/components/widget/Widget.ts",
1152
+ "declarations": [
1153
+ {
1154
+ "kind": "class",
1155
+ "description": "A widget component for displaying content with header, body, and footer sections.\n\n## Architecture: Light DOM + Manager Pattern\n\nThis component uses **Light DOM** (no Shadow Root) with the **Manager Pattern**:\n- User-provided children are physically moved into internal containers\n- Movement is based on `slot` attributes (pseudo-slots)\n- The `onFind` utility automatically redistributes dynamically-added content\n\n### Node Redistribution Rules\n- `slot=\"controls\"` → Moved to header actions area (before system buttons)\n- `slot=\"footer\"` → Moved to footer container\n- *(no slot)* → Moved to body container (default)\n\n## Features\n\n- **Collapsible**: Optional chevron toggle to hide/show body and footer\n- **Fullscreen**: Optional maximize button for fullscreen mode via `:state(fullscreen)` custom state\n- **Dynamic Content**: `onFind` handles content added after initialization\n- **Accessible**: Full ARIA support and keyboard navigation\n- **Themeable**: CSS custom properties for colors and spacing\n\n## Accessibility\n\n- **Collapse toggle**: `aria-expanded`, `aria-controls`, `aria-label`\n- **Fullscreen toggle**: `aria-pressed`, `aria-label`\n- **Body region**: `role=\"region\"`, `aria-labelledby` linking to heading\n- **Tab order**: Natural flow via physical DOM placement\n- **Collapsed content**: Hidden via `inert` attribute and CSS grid collapse",
1156
+ "name": "Widget",
1157
+ "cssProperties": [
1158
+ {
1159
+ "description": "Body and footer background color (default: --btu-theme-white)",
1160
+ "name": "--widget-background"
1161
+ },
1162
+ {
1163
+ "description": "Widget border and dividers (default: 1px solid gray-200)",
1164
+ "name": "--widget-border"
1165
+ },
1166
+ {
1167
+ "description": "Header background color (default: transparent)",
1168
+ "name": "--header-background"
1169
+ }
1170
+ ],
1171
+ "slots": [
1172
+ {
1173
+ "description": "Default pseudo-slot: elements without slot attribute are moved to body",
1174
+ "name": ""
1175
+ },
1176
+ {
1177
+ "description": "Pseudo-slot: buttons/actions moved to header actions area",
1178
+ "name": "controls"
1179
+ },
1180
+ {
1181
+ "description": "Pseudo-slot: content moved to footer container",
1182
+ "name": "footer"
1183
+ }
1184
+ ],
1185
+ "members": [
1186
+ {
1187
+ "kind": "field",
1188
+ "name": "_idCounter",
1189
+ "type": {
1190
+ "text": "number"
1191
+ },
1192
+ "privacy": "private",
1193
+ "static": true,
1194
+ "default": "0"
1195
+ },
1196
+ {
1197
+ "kind": "field",
1198
+ "name": "_internals",
1199
+ "privacy": "private"
1200
+ },
1201
+ {
1202
+ "kind": "field",
1203
+ "name": "heading",
1204
+ "type": {
1205
+ "text": "string"
1206
+ },
1207
+ "default": "''",
1208
+ "description": "Heading text displayed in the header.",
1209
+ "attribute": "heading"
1210
+ },
1211
+ {
1212
+ "kind": "field",
1213
+ "name": "collapsible",
1214
+ "type": {
1215
+ "text": "boolean"
1216
+ },
1217
+ "default": "false",
1218
+ "description": "Whether the widget can be collapsed/expanded.\nWhen true, a chevron toggle button appears in the header.",
1219
+ "attribute": "collapsible"
1220
+ },
1221
+ {
1222
+ "kind": "field",
1223
+ "name": "collapsed",
1224
+ "type": {
1225
+ "text": "boolean"
1226
+ },
1227
+ "default": "false",
1228
+ "description": "Whether the widget is currently collapsed.\nWhen true, body and footer are hidden. Implies collapsible.",
1229
+ "attribute": "collapsed"
1230
+ },
1231
+ {
1232
+ "kind": "field",
1233
+ "name": "fullscreenable",
1234
+ "type": {
1235
+ "text": "boolean"
1236
+ },
1237
+ "default": "false",
1238
+ "description": "Whether the widget can enter fullscreen mode.\nWhen true, a fullscreen toggle button appears in the header.",
1239
+ "attribute": "fullscreenable"
1240
+ },
1241
+ {
1242
+ "kind": "field",
1243
+ "name": "_isFullscreen",
1244
+ "type": {
1245
+ "text": "boolean"
1246
+ },
1247
+ "privacy": "private",
1248
+ "default": "false"
1249
+ },
1250
+ {
1251
+ "kind": "field",
1252
+ "name": "_collapseTooltip",
1253
+ "privacy": "private",
1254
+ "default": "new TooltipController(this, { target: 'button[data-tooltip=\"collapse\"]', text: () => (this.collapsed ? 'Expand' : 'Collapse'), position: 'bottom', noArrow: true, offset: 'sm', })"
1255
+ },
1256
+ {
1257
+ "kind": "field",
1258
+ "name": "_fullscreenTooltip",
1259
+ "privacy": "private",
1260
+ "default": "new TooltipController(this, { target: 'button[data-tooltip=\"fullscreen\"]', text: () => (this._isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'), position: 'bottom', noArrow: true, offset: 'sm', })"
1261
+ },
1262
+ {
1263
+ "kind": "field",
1264
+ "name": "isFullscreen",
1265
+ "type": {
1266
+ "text": "boolean"
1267
+ },
1268
+ "description": "Whether the widget is currently in fullscreen mode (read-only).\nUse `btu-widget-fullscreen-changed` event to react to changes.",
1269
+ "readonly": true
1270
+ }
1271
+ ],
1272
+ "events": [
1273
+ {
1274
+ "type": {
1275
+ "text": "CustomEvent"
1276
+ },
1277
+ "description": "Fired after first render and redistribution",
1278
+ "name": "btu-widget-ready"
1279
+ },
1280
+ {
1281
+ "type": {
1282
+ "text": "CustomEvent<{collapsed: boolean}>"
1283
+ },
1284
+ "description": "Fired when collapsed state changes",
1285
+ "name": "btu-widget-collapse-changed"
1286
+ },
1287
+ {
1288
+ "type": {
1289
+ "text": "CustomEvent<{fullscreen: boolean}>"
1290
+ },
1291
+ "description": "Fired when fullscreen state changes",
1292
+ "name": "btu-widget-fullscreen-changed"
1293
+ }
1294
+ ],
1295
+ "attributes": [
1296
+ {
1297
+ "name": "heading",
1298
+ "type": {
1299
+ "text": "string"
1300
+ },
1301
+ "default": "''",
1302
+ "description": "Heading text displayed in the header.",
1303
+ "fieldName": "heading",
1304
+ "attribute": "heading"
1305
+ },
1306
+ {
1307
+ "name": "collapsible",
1308
+ "type": {
1309
+ "text": "boolean"
1310
+ },
1311
+ "default": "false",
1312
+ "description": "Whether the widget can be collapsed/expanded.\nWhen true, a chevron toggle button appears in the header.",
1313
+ "fieldName": "collapsible",
1314
+ "attribute": "collapsible"
1315
+ },
1316
+ {
1317
+ "name": "collapsed",
1318
+ "type": {
1319
+ "text": "boolean"
1320
+ },
1321
+ "default": "false",
1322
+ "description": "Whether the widget is currently collapsed.\nWhen true, body and footer are hidden. Implies collapsible.",
1323
+ "fieldName": "collapsed",
1324
+ "attribute": "collapsed"
1325
+ },
1326
+ {
1327
+ "name": "fullscreenable",
1328
+ "type": {
1329
+ "text": "boolean"
1330
+ },
1331
+ "default": "false",
1332
+ "description": "Whether the widget can enter fullscreen mode.\nWhen true, a fullscreen toggle button appears in the header.",
1333
+ "fieldName": "fullscreenable",
1334
+ "attribute": "fullscreenable"
1335
+ },
1336
+ {
1337
+ "description": "When set, collapsed state is automatically persisted to LocalStorage",
1338
+ "name": "id"
1339
+ }
1340
+ ],
1341
+ "cssStates": [
1342
+ {
1343
+ "description": "Applied when the widget is collapsed, targetable via :state(collapsed)",
1344
+ "name": "collapsed"
1345
+ },
1346
+ {
1347
+ "description": "Applied when the widget is in fullscreen mode, targetable via :state(fullscreen)",
1348
+ "name": "fullscreen"
1349
+ }
1350
+ ],
1351
+ "mixins": [
1352
+ {
1353
+ "name": "EventEmitterMixin",
1354
+ "module": "/src/util/EventEmitterMixin.js"
1355
+ },
1356
+ {
1357
+ "name": "ReadyMixin",
1358
+ "module": "/src/util/ReadyMixin.js"
1359
+ }
1360
+ ],
1361
+ "superclass": {
1362
+ "name": "LitElement",
1363
+ "package": "lit"
1364
+ },
1365
+ "tagName": "btu-widget",
1366
+ "customElement": true
1367
+ }
1368
+ ],
1369
+ "exports": [
1370
+ {
1371
+ "kind": "js",
1372
+ "name": "default",
1373
+ "declaration": {
1374
+ "name": "Widget",
1375
+ "module": "src/components/widget/Widget.ts"
1376
+ }
1377
+ },
1378
+ {
1379
+ "kind": "custom-element-definition",
1380
+ "name": "btu-widget",
1381
+ "declaration": {
1382
+ "name": "Widget",
1383
+ "module": "src/components/widget/Widget.ts"
1384
+ }
1385
+ }
1386
+ ]
884
1387
  }
885
1388
  ]
886
1389
  }