@adia-ai/web-components 0.4.6 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -0
- package/USAGE.md +29 -9
- package/components/accordion/accordion.a2ui.json +3 -0
- package/components/accordion/accordion.d.ts +27 -0
- package/components/accordion/accordion.js +10 -117
- package/components/accordion/accordion.yaml +4 -0
- package/components/accordion/class.js +132 -0
- package/components/action-list/action-list.a2ui.json +3 -0
- package/components/action-list/action-list.d.ts +25 -0
- package/components/action-list/action-list.js +9 -140
- package/components/action-list/action-list.yaml +4 -0
- package/components/action-list/class.js +156 -0
- package/components/agent-artifact/agent-artifact.a2ui.json +4 -0
- package/components/agent-artifact/agent-artifact.d.ts +35 -0
- package/components/agent-artifact/agent-artifact.js +8 -181
- package/components/agent-artifact/agent-artifact.yaml +5 -0
- package/components/agent-artifact/class.js +200 -0
- package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +3 -0
- package/components/agent-feedback-bar/agent-feedback-bar.d.ts +33 -0
- package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
- package/components/agent-feedback-bar/agent-feedback-bar.yaml +4 -0
- package/components/agent-feedback-bar/class.js +162 -0
- package/components/agent-questions/agent-questions.a2ui.json +3 -0
- package/components/agent-questions/agent-questions.d.ts +33 -0
- package/components/agent-questions/agent-questions.js +8 -180
- package/components/agent-questions/agent-questions.yaml +4 -0
- package/components/agent-questions/class.js +199 -0
- package/components/agent-reasoning/agent-reasoning.a2ui.json +4 -0
- package/components/agent-reasoning/agent-reasoning.d.ts +37 -0
- package/components/agent-reasoning/agent-reasoning.js +8 -494
- package/components/agent-reasoning/agent-reasoning.yaml +5 -0
- package/components/agent-reasoning/class.js +513 -0
- package/components/agent-suggestions/agent-suggestions.a2ui.json +3 -0
- package/components/agent-suggestions/agent-suggestions.d.ts +31 -0
- package/components/agent-suggestions/agent-suggestions.js +8 -78
- package/components/agent-suggestions/agent-suggestions.yaml +4 -0
- package/components/agent-suggestions/class.js +97 -0
- package/components/agent-trace/agent-trace.a2ui.json +1 -0
- package/components/agent-trace/agent-trace.d.ts +29 -0
- package/components/alert/alert.a2ui.json +1 -0
- package/components/alert/alert.d.ts +39 -0
- package/components/alert/alert.js +8 -175
- package/components/alert/class.js +194 -0
- package/components/aside/aside.a2ui.json +1 -0
- package/components/avatar/avatar.a2ui.json +3 -0
- package/components/avatar/avatar.d.ts +28 -0
- package/components/avatar/avatar.js +9 -159
- package/components/avatar/avatar.yaml +4 -0
- package/components/avatar/class.js +173 -0
- package/components/badge/badge.a2ui.json +3 -0
- package/components/badge/badge.d.ts +28 -0
- package/components/badge/badge.js +9 -75
- package/components/badge/badge.yaml +4 -0
- package/components/badge/class.js +93 -0
- package/components/block/block.a2ui.json +1 -0
- package/components/block/block.d.ts +20 -0
- package/components/block/block.js +9 -15
- package/components/block/class.js +33 -0
- package/components/breadcrumb/breadcrumb.a2ui.json +5 -0
- package/components/breadcrumb/breadcrumb.d.ts +24 -0
- package/components/breadcrumb/breadcrumb.js +8 -113
- package/components/breadcrumb/breadcrumb.yaml +6 -0
- package/components/breadcrumb/class.js +132 -0
- package/components/button/button.a2ui.json +3 -0
- package/components/button/button.d.ts +44 -0
- package/components/button/button.js +15 -66
- package/components/button/button.yaml +5 -0
- package/components/button/class.js +80 -0
- package/components/calendar-picker/calendar-picker.a2ui.json +7 -1
- package/components/calendar-picker/calendar-picker.js +8 -332
- package/components/calendar-picker/calendar-picker.yaml +51 -177
- package/components/calendar-picker/class.js +351 -0
- package/components/canvas/canvas.a2ui.json +7 -1
- package/components/canvas/canvas.d.ts +33 -0
- package/components/canvas/canvas.yaml +29 -36
- package/components/card/card.a2ui.json +4 -0
- package/components/card/card.d.ts +37 -0
- package/components/card/card.js +9 -50
- package/components/card/card.yaml +171 -433
- package/components/card/class.js +68 -0
- package/components/chart/chart.a2ui.json +1 -0
- package/components/chart/chart.d.ts +55 -0
- package/components/chart/chart.js +8 -2131
- package/components/chart/class.js +2150 -0
- package/components/chart-legend/chart-legend.a2ui.json +4 -0
- package/components/chart-legend/chart-legend.d.ts +37 -0
- package/components/chart-legend/chart-legend.js +8 -197
- package/components/chart-legend/chart-legend.yaml +5 -0
- package/components/chart-legend/class.js +215 -0
- package/components/chat-thread/chat-thread.a2ui.json +1 -0
- package/components/chat-thread/chat-thread.d.ts +27 -0
- package/components/chat-thread/chat-thread.js +8 -157
- package/components/chat-thread/class.js +176 -0
- package/components/check/check.a2ui.json +1 -0
- package/components/check/check.js +11 -52
- package/components/check/class.js +68 -0
- package/components/code/class.js +501 -0
- package/components/code/code.a2ui.json +1 -0
- package/components/code/code.js +8 -482
- package/components/col/class.js +30 -0
- package/components/col/col.a2ui.json +1 -0
- package/components/col/col.d.ts +24 -0
- package/components/col/col.js +10 -13
- package/components/color-picker/class.js +550 -0
- package/components/color-picker/color-picker.a2ui.json +3 -0
- package/components/color-picker/color-picker.js +8 -531
- package/components/color-picker/color-picker.yaml +4 -0
- package/components/command/class.js +364 -0
- package/components/command/command.a2ui.json +4 -0
- package/components/command/command.d.ts +31 -0
- package/components/command/command.js +8 -345
- package/components/command/command.yaml +105 -124
- package/components/demo-toggle/class.js +153 -0
- package/components/demo-toggle/demo-toggle.a2ui.json +1 -0
- package/components/demo-toggle/demo-toggle.d.ts +33 -0
- package/components/demo-toggle/demo-toggle.js +8 -135
- package/components/description-list/class.js +86 -0
- package/components/description-list/description-list.a2ui.json +1 -0
- package/components/description-list/description-list.d.ts +22 -0
- package/components/description-list/description-list.js +8 -67
- package/components/divider/class.js +57 -0
- package/components/divider/divider.a2ui.json +1 -0
- package/components/divider/divider.d.ts +20 -0
- package/components/divider/divider.js +10 -40
- package/components/drawer/class.js +306 -0
- package/components/drawer/drawer.a2ui.json +1 -0
- package/components/drawer/drawer.d.ts +35 -0
- package/components/drawer/drawer.js +8 -287
- package/components/embed/class.js +73 -0
- package/components/embed/embed.a2ui.json +1 -0
- package/components/embed/embed.d.ts +24 -0
- package/components/embed/embed.js +9 -55
- package/components/empty-state/class.js +108 -0
- package/components/empty-state/empty-state.a2ui.json +3 -0
- package/components/empty-state/empty-state.d.ts +22 -0
- package/components/empty-state/empty-state.js +9 -90
- package/components/empty-state/empty-state.yaml +4 -0
- package/components/feed/class.js +381 -0
- package/components/feed/feed.a2ui.json +9 -1
- package/components/feed/feed.d.ts +29 -0
- package/components/feed/feed.js +9 -367
- package/components/feed/feed.yaml +8 -1
- package/components/field/class.js +266 -0
- package/components/field/field.a2ui.json +1 -0
- package/components/field/field.d.ts +24 -0
- package/components/field/field.js +8 -247
- package/components/fields/class.js +106 -0
- package/components/fields/fields.a2ui.json +1 -0
- package/components/fields/fields.d.ts +20 -0
- package/components/fields/fields.js +8 -87
- package/components/footer/footer.a2ui.json +1 -0
- package/components/grid/class.js +31 -0
- package/components/grid/grid.a2ui.json +1 -0
- package/components/grid/grid.d.ts +24 -0
- package/components/grid/grid.js +10 -14
- package/components/header/header.a2ui.json +1 -0
- package/components/heatmap/class.js +305 -0
- package/components/heatmap/heatmap.a2ui.json +1 -0
- package/components/heatmap/heatmap.d.ts +43 -0
- package/components/heatmap/heatmap.js +8 -286
- package/components/icon/class.js +54 -0
- package/components/icon/icon.a2ui.json +1 -0
- package/components/icon/icon.d.ts +24 -0
- package/components/icon/icon.js +13 -40
- package/components/image/class.js +112 -0
- package/components/image/image.a2ui.json +3 -0
- package/components/image/image.d.ts +34 -0
- package/components/image/image.js +9 -94
- package/components/image/image.yaml +4 -0
- package/components/index.js +8 -0
- package/components/input/class.js +773 -0
- package/components/input/input.a2ui.json +7 -0
- package/components/input/input.js +8 -755
- package/components/input/input.yaml +177 -442
- package/components/inspector/class.js +142 -0
- package/components/inspector/inspector.a2ui.json +13 -1
- package/components/inspector/inspector.d.ts +18 -0
- package/components/inspector/inspector.js +8 -124
- package/components/inspector/inspector.yaml +21 -30
- package/components/kbd/class.js +34 -0
- package/components/kbd/kbd.a2ui.json +4 -0
- package/components/kbd/kbd.d.ts +18 -0
- package/components/kbd/kbd.js +10 -17
- package/components/kbd/kbd.yaml +54 -185
- package/components/link/class.js +187 -0
- package/components/link/link.a2ui.json +1 -0
- package/components/link/link.d.ts +65 -0
- package/components/link/link.js +8 -168
- package/components/list/class.js +249 -0
- package/components/list/list.a2ui.json +3 -0
- package/components/list/list.d.ts +33 -0
- package/components/list/list.js +9 -231
- package/components/list/list.yaml +4 -0
- package/components/menu/class.js +332 -0
- package/components/menu/menu.a2ui.json +3 -0
- package/components/menu/menu.d.ts +31 -0
- package/components/menu/menu.js +11 -316
- package/components/menu/menu.yaml +4 -0
- package/components/modal/class.js +231 -0
- package/components/modal/modal.a2ui.json +6 -1
- package/components/modal/modal.d.ts +33 -0
- package/components/modal/modal.js +8 -212
- package/components/modal/modal.yaml +19 -39
- package/components/nav/class.js +150 -0
- package/components/nav/nav.a2ui.json +1 -0
- package/components/nav/nav.d.ts +41 -0
- package/components/nav/nav.js +8 -131
- package/components/nav-group/class.js +152 -0
- package/components/nav-group/nav-group.a2ui.json +1 -0
- package/components/nav-group/nav-group.d.ts +45 -0
- package/components/nav-group/nav-group.js +9 -134
- package/components/nav-item/class.js +86 -0
- package/components/nav-item/nav-item.a2ui.json +1 -0
- package/components/nav-item/nav-item.d.ts +47 -0
- package/components/nav-item/nav-item.js +10 -69
- package/components/noodles/class.js +510 -0
- package/components/noodles/noodles.a2ui.json +1 -0
- package/components/noodles/noodles.d.ts +47 -0
- package/components/noodles/noodles.js +9 -493
- package/components/option-card/class.js +167 -0
- package/components/option-card/option-card.a2ui.json +3 -0
- package/components/option-card/option-card.js +8 -149
- package/components/option-card/option-card.yaml +4 -0
- package/components/otp-input/class.js +180 -0
- package/components/otp-input/otp-input.a2ui.json +6 -1
- package/components/otp-input/otp-input.js +9 -162
- package/components/otp-input/otp-input.yaml +45 -174
- package/components/page/class.js +97 -0
- package/components/page/page.a2ui.json +1 -0
- package/components/page/page.d.ts +47 -0
- package/components/page/page.js +8 -79
- package/components/pagination/class.js +195 -0
- package/components/pagination/pagination.a2ui.json +1 -0
- package/components/pagination/pagination.d.ts +33 -0
- package/components/pagination/pagination.js +9 -177
- package/components/pane/class.js +186 -0
- package/components/pane/pane.a2ui.json +20 -2
- package/components/pane/pane.d.ts +41 -0
- package/components/pane/pane.js +8 -167
- package/components/pane/pane.yaml +64 -158
- package/components/pipeline-status/class.js +189 -0
- package/components/pipeline-status/pipeline-status.a2ui.json +8 -1
- package/components/pipeline-status/pipeline-status.d.ts +22 -0
- package/components/pipeline-status/pipeline-status.js +9 -172
- package/components/pipeline-status/pipeline-status.yaml +34 -72
- package/components/popover/class.js +194 -0
- package/components/popover/popover.a2ui.json +1 -0
- package/components/popover/popover.d.ts +24 -0
- package/components/popover/popover.js +9 -176
- package/components/progress/class.js +74 -0
- package/components/progress/progress.a2ui.json +4 -0
- package/components/progress/progress.d.ts +20 -0
- package/components/progress/progress.js +10 -57
- package/components/progress/progress.yaml +124 -287
- package/components/progress-row/class.js +110 -0
- package/components/progress-row/progress-row.a2ui.json +3 -0
- package/components/progress-row/progress-row.d.ts +24 -0
- package/components/progress-row/progress-row.js +8 -92
- package/components/progress-row/progress-row.yaml +4 -0
- package/components/radio/class.js +83 -0
- package/components/radio/radio.a2ui.json +1 -0
- package/components/radio/radio.js +11 -67
- package/components/range/class.js +194 -0
- package/components/range/range.a2ui.json +1 -0
- package/components/range/range.js +9 -176
- package/components/rating/class.js +148 -0
- package/components/rating/rating.a2ui.json +1 -0
- package/components/rating/rating.js +9 -130
- package/components/richtext/class.js +87 -0
- package/components/richtext/richtext.a2ui.json +8 -1
- package/components/richtext/richtext.d.ts +20 -0
- package/components/richtext/richtext.js +8 -68
- package/components/richtext/richtext.yaml +30 -65
- package/components/row/class.js +50 -0
- package/components/row/row.a2ui.json +1 -0
- package/components/row/row.d.ts +37 -0
- package/components/row/row.js +10 -33
- package/components/search/class.js +134 -0
- package/components/search/search.a2ui.json +1 -0
- package/components/search/search.js +10 -117
- package/components/section/section.a2ui.json +1 -0
- package/components/segment/class.js +62 -0
- package/components/segment/segment.a2ui.json +3 -0
- package/components/segment/segment.d.ts +26 -0
- package/components/segment/segment.js +10 -45
- package/components/segment/segment.yaml +4 -0
- package/components/segmented/class.js +165 -0
- package/components/segmented/segmented.a2ui.json +5 -0
- package/components/segmented/segmented.js +10 -148
- package/components/segmented/segmented.yaml +41 -59
- package/components/select/class.js +408 -0
- package/components/select/select.a2ui.json +3 -0
- package/components/select/select.js +15 -396
- package/components/select/select.yaml +4 -0
- package/components/skeleton/class.js +52 -0
- package/components/skeleton/skeleton.a2ui.json +1 -0
- package/components/skeleton/skeleton.d.ts +24 -0
- package/components/skeleton/skeleton.js +8 -34
- package/components/slider/class.js +184 -0
- package/components/slider/slider.a2ui.json +1 -0
- package/components/slider/slider.js +9 -166
- package/components/stack/class.js +28 -0
- package/components/stack/stack.a2ui.json +1 -0
- package/components/stack/stack.d.ts +18 -0
- package/components/stack/stack.js +10 -11
- package/components/stat/stat.a2ui.json +1 -0
- package/components/step-progress/class.js +98 -0
- package/components/step-progress/step-progress.a2ui.json +1 -0
- package/components/step-progress/step-progress.d.ts +28 -0
- package/components/step-progress/step-progress.js +8 -79
- package/components/stepper/class.js +126 -0
- package/components/stepper/stepper.a2ui.json +3 -0
- package/components/stepper/stepper.d.ts +20 -0
- package/components/stepper/stepper.js +9 -112
- package/components/stepper/stepper.yaml +4 -0
- package/components/stream/class.js +109 -0
- package/components/stream/stream.a2ui.json +1 -0
- package/components/stream/stream.d.ts +33 -0
- package/components/stream/stream.js +8 -90
- package/components/swatch/class.js +131 -0
- package/components/swatch/swatch.a2ui.json +1 -0
- package/components/swatch/swatch.d.ts +29 -0
- package/components/swatch/swatch.js +8 -112
- package/components/swiper/class.js +373 -0
- package/components/swiper/swiper.a2ui.json +7 -0
- package/components/swiper/swiper.d.ts +45 -0
- package/components/swiper/swiper.js +8 -354
- package/components/swiper/swiper.yaml +72 -212
- package/components/switch/class.js +63 -0
- package/components/switch/switch.a2ui.json +7 -1
- package/components/switch/switch.js +11 -47
- package/components/switch/switch.yaml +70 -265
- package/components/table/class.js +1453 -0
- package/components/table/table.a2ui.json +7 -0
- package/components/table/table.d.ts +55 -0
- package/components/table/table.js +8 -1435
- package/components/table/table.yaml +8 -0
- package/components/table-toolbar/class.js +680 -0
- package/components/table-toolbar/table-toolbar.a2ui.json +12 -0
- package/components/table-toolbar/table-toolbar.d.ts +49 -0
- package/components/table-toolbar/table-toolbar.js +8 -689
- package/components/table-toolbar/table-toolbar.yaml +13 -0
- package/components/tabs/class.js +242 -0
- package/components/tabs/tabs.a2ui.json +3 -0
- package/components/tabs/tabs.d.ts +31 -0
- package/components/tabs/tabs.js +8 -223
- package/components/tabs/tabs.yaml +4 -0
- package/components/tag/class.js +99 -0
- package/components/tag/tag.a2ui.json +1 -0
- package/components/tag/tag.d.ts +37 -0
- package/components/tag/tag.js +8 -80
- package/components/text/class.js +46 -0
- package/components/text/text.a2ui.json +1 -0
- package/components/text/text.d.ts +26 -0
- package/components/text/text.js +9 -28
- package/components/textarea/class.js +134 -0
- package/components/textarea/textarea.a2ui.json +1 -0
- package/components/textarea/textarea.js +11 -118
- package/components/timeline/class.js +176 -0
- package/components/timeline/timeline.a2ui.json +18 -1
- package/components/timeline/timeline.d.ts +36 -0
- package/components/timeline/timeline.js +9 -162
- package/components/timeline/timeline.yaml +14 -1
- package/components/toast/class.js +92 -0
- package/components/toast/toast.a2ui.json +1 -0
- package/components/toast/toast.d.ts +33 -0
- package/components/toast/toast.js +9 -76
- package/components/toggle-group/class.js +154 -0
- package/components/toggle-group/toggle-group.a2ui.json +1 -0
- package/components/toggle-group/toggle-group.d.ts +29 -0
- package/components/toggle-group/toggle-group.js +11 -140
- package/components/toggle-scheme/class.js +286 -0
- package/components/toggle-scheme/toggle-scheme.a2ui.json +3 -0
- package/components/toggle-scheme/toggle-scheme.d.ts +51 -0
- package/components/toggle-scheme/toggle-scheme.js +8 -268
- package/components/toggle-scheme/toggle-scheme.yaml +4 -0
- package/components/toolbar/class.js +388 -0
- package/components/toolbar/toolbar.a2ui.json +3 -0
- package/components/toolbar/toolbar.d.ts +24 -0
- package/components/toolbar/toolbar.js +10 -376
- package/components/toolbar/toolbar.yaml +4 -0
- package/components/tooltip/class.js +299 -0
- package/components/tooltip/tooltip.a2ui.json +1 -0
- package/components/tooltip/tooltip.d.ts +28 -0
- package/components/tooltip/tooltip.js +8 -280
- package/components/tree/class.js +245 -0
- package/components/tree/tree.a2ui.json +3 -0
- package/components/tree/tree.d.ts +25 -0
- package/components/tree/tree.js +9 -244
- package/components/tree/tree.yaml +4 -0
- package/components/upload/class.js +199 -0
- package/components/upload/upload.a2ui.json +1 -0
- package/components/upload/upload.js +11 -183
- package/core/icons-phosphor.js +93 -0
- package/core/icons.js +92 -90
- package/core/index.js +5 -0
- package/index.d.ts +160 -5
- package/index.js +7 -0
- package/package.json +7 -2
|
@@ -1,168 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<avatar-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `name` is a deprecated alias for `text` (warns on use).
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
* <avatar-ui text="Alice"></avatar-ui>
|
|
10
|
-
* <avatar-ui text="Bob"></avatar-ui>
|
|
11
|
-
* ...
|
|
12
|
-
* </avatar-group-ui>
|
|
7
|
+
* import { UIAvatar, UIAvatarGroup } from '@adia-ai/web-components/components/avatar/class';
|
|
13
8
|
*
|
|
14
|
-
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
15
10
|
*/
|
|
16
11
|
|
|
17
|
-
import {
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIAvatar, UIAvatarGroup } from './class.js';
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class UIAvatar extends UIElement {
|
|
22
|
-
static properties = {
|
|
23
|
-
src: { type: String, default: '', reflect: true },
|
|
24
|
-
text: { type: String, default: '', reflect: true },
|
|
25
|
-
name: { type: String, default: '', reflect: true }, // backcompat alias for text
|
|
26
|
-
icon: { type: String, default: '', reflect: true },
|
|
27
|
-
size: { type: String, default: 'md', reflect: true },
|
|
28
|
-
shape: { type: String, default: 'circle', reflect: true },
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/** Display string — `text` takes priority, `name` is backcompat alias */
|
|
32
|
-
get displayName() { return this.text || this.name; }
|
|
33
|
-
|
|
34
|
-
static template = () => null;
|
|
35
|
-
|
|
36
|
-
static #nameWarned = false;
|
|
37
|
-
|
|
38
|
-
#imgEl = null;
|
|
39
|
-
#initialsEl = null;
|
|
40
|
-
#iconEl = null;
|
|
41
|
-
|
|
42
|
-
connected() {
|
|
43
|
-
this.setAttribute('role', 'img');
|
|
44
|
-
if (this.name && !this.text && !UIAvatar.#nameWarned) {
|
|
45
|
-
UIAvatar.#nameWarned = true;
|
|
46
|
-
// eslint-disable-next-line no-console
|
|
47
|
-
console.warn(
|
|
48
|
-
`[AdiaUI] <avatar-ui name="…"> is deprecated — use text="…" instead. ` +
|
|
49
|
-
`Docs: https://ui-kit.exe.xyz/site/components/avatar`
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
render() {
|
|
55
|
-
if (!this.src && !this.displayName && !this.icon) return;
|
|
56
|
-
|
|
57
|
-
if (this.src) {
|
|
58
|
-
if (!this.#imgEl) {
|
|
59
|
-
this.#imgEl = document.createElement('img');
|
|
60
|
-
this.#imgEl.setAttribute('slot', 'img');
|
|
61
|
-
this.#imgEl.onerror = () => {
|
|
62
|
-
this.#imgEl.remove();
|
|
63
|
-
this.#imgEl = null;
|
|
64
|
-
this.#showInitials();
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
this.#imgEl.src = this.src;
|
|
68
|
-
this.#imgEl.alt = this.name || '';
|
|
69
|
-
if (!this.#imgEl.parentElement) this.appendChild(this.#imgEl);
|
|
70
|
-
|
|
71
|
-
// Remove initials when image is showing
|
|
72
|
-
if (this.#initialsEl) {
|
|
73
|
-
this.#initialsEl.remove();
|
|
74
|
-
this.#initialsEl = null;
|
|
75
|
-
}
|
|
76
|
-
} else if (this.icon) {
|
|
77
|
-
// Icon avatar (system events, non-person rep)
|
|
78
|
-
if (this.#imgEl) { this.#imgEl.remove(); this.#imgEl = null; }
|
|
79
|
-
if (this.#initialsEl) { this.#initialsEl.remove(); this.#initialsEl = null; }
|
|
80
|
-
if (!this.#iconEl) {
|
|
81
|
-
this.#iconEl = document.createElement('icon-ui');
|
|
82
|
-
this.#iconEl.setAttribute('slot', 'icon');
|
|
83
|
-
this.appendChild(this.#iconEl);
|
|
84
|
-
}
|
|
85
|
-
this.#iconEl.setAttribute('name', this.icon);
|
|
86
|
-
} else {
|
|
87
|
-
// No src / no icon — show initials
|
|
88
|
-
if (this.#imgEl) { this.#imgEl.remove(); this.#imgEl = null; }
|
|
89
|
-
if (this.#iconEl) { this.#iconEl.remove(); this.#iconEl = null; }
|
|
90
|
-
this.#showInitials();
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
this.setAttribute('aria-label', this.displayName || this.icon || '');
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
#showInitials() {
|
|
97
|
-
if (!this.displayName) return;
|
|
98
|
-
const initials = this.displayName
|
|
99
|
-
.split(/\s+/)
|
|
100
|
-
.map(w => w[0])
|
|
101
|
-
.join('')
|
|
102
|
-
.slice(0, 2)
|
|
103
|
-
.toUpperCase();
|
|
104
|
-
|
|
105
|
-
if (!this.#initialsEl) {
|
|
106
|
-
this.#initialsEl = document.createElement('span');
|
|
107
|
-
this.#initialsEl.setAttribute('slot', 'initials');
|
|
108
|
-
this.appendChild(this.#initialsEl);
|
|
109
|
-
}
|
|
110
|
-
this.#initialsEl.textContent = initials;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
customElements.define('avatar-ui', UIAvatar);
|
|
115
|
-
|
|
116
|
-
// ── Avatar Group ────────────────────────────────────────────
|
|
117
|
-
|
|
118
|
-
class UIAvatarGroup extends UIElement {
|
|
119
|
-
static properties = {
|
|
120
|
-
max: { type: Number, default: 5, reflect: true },
|
|
121
|
-
size: { type: String, default: '', reflect: true },
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
static template = () => null;
|
|
125
|
-
|
|
126
|
-
connected() {
|
|
127
|
-
this.setAttribute('role', 'group');
|
|
128
|
-
if (!this.hasAttribute('aria-label')) {
|
|
129
|
-
this.setAttribute('aria-label', 'Avatar group');
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
render() {
|
|
134
|
-
const avatars = [...this.querySelectorAll('avatar-ui')];
|
|
135
|
-
const max = this.max;
|
|
136
|
-
const overflow = avatars.length - max;
|
|
137
|
-
|
|
138
|
-
// Propagate size
|
|
139
|
-
if (this.size) {
|
|
140
|
-
for (const av of avatars) av.setAttribute('size', this.size);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Show/hide based on max
|
|
144
|
-
avatars.forEach((av, i) => {
|
|
145
|
-
av.style.display = i < max ? '' : 'none';
|
|
146
|
-
av.style.zIndex = String(avatars.length - i);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// Overflow counter
|
|
150
|
-
let counter = this.querySelector('[slot="overflow"]');
|
|
151
|
-
if (overflow > 0) {
|
|
152
|
-
if (!counter) {
|
|
153
|
-
counter = document.createElement('span');
|
|
154
|
-
counter.setAttribute('slot', 'overflow');
|
|
155
|
-
this.appendChild(counter);
|
|
156
|
-
}
|
|
157
|
-
counter.textContent = `+${overflow}`;
|
|
158
|
-
counter.setAttribute('aria-label', `${overflow} more`);
|
|
159
|
-
counter.style.zIndex = '0';
|
|
160
|
-
} else if (counter) {
|
|
161
|
-
counter.remove();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
customElements.define('avatar-group-ui', UIAvatarGroup);
|
|
15
|
+
defineIfFree('avatar-ui', UIAvatar);
|
|
16
|
+
defineIfFree('avatar-group-ui', UIAvatarGroup);
|
|
167
17
|
|
|
168
18
|
export { UIAvatar, UIAvatarGroup };
|
|
@@ -7,6 +7,10 @@ component: Avatar
|
|
|
7
7
|
category: display
|
|
8
8
|
version: 1
|
|
9
9
|
description: Avatar with image → initials → empty fallback chain.
|
|
10
|
+
# Per ADR-0027 — primitives that programmatically create other primitives
|
|
11
|
+
# do NOT auto-import them. Consumer (or demo shell) must explicitly import.
|
|
12
|
+
composes:
|
|
13
|
+
- icon-ui
|
|
10
14
|
props:
|
|
11
15
|
text:
|
|
12
16
|
description: Display string (full name or initials). Initials derive from spaces — first letter of each word, max 2.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<avatar-ui>` (+ co-located primitives).
|
|
3
|
+
*
|
|
4
|
+
* Importing this file gives you the class(es) without auto-registering the tag.
|
|
5
|
+
* Useful for test isolation, subclassing with tag-name override, or selective
|
|
6
|
+
* composition.
|
|
7
|
+
*
|
|
8
|
+
* The auto-register path stays at `@adia-ai/web-components/components/avatar`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <avatar-ui src="photo.jpg" text="Alice Smith" size="md" shape="circle"></avatar-ui>
|
|
16
|
+
*
|
|
17
|
+
* Fallback chain: image → initials → empty.
|
|
18
|
+
* If src fails to load, falls back to initials derived from text.
|
|
19
|
+
* `name` is a deprecated alias for `text` (warns on use).
|
|
20
|
+
*
|
|
21
|
+
* <avatar-group-ui max="4" size="md">
|
|
22
|
+
* <avatar-ui text="Alice"></avatar-ui>
|
|
23
|
+
* <avatar-ui text="Bob"></avatar-ui>
|
|
24
|
+
* ...
|
|
25
|
+
* </avatar-group-ui>
|
|
26
|
+
*
|
|
27
|
+
* Overlapping avatar stack with +N overflow counter.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { UIElement } from '../../core/element.js';
|
|
31
|
+
|
|
32
|
+
// ── Avatar ──────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
export class UIAvatar extends UIElement {
|
|
35
|
+
static properties = {
|
|
36
|
+
src: { type: String, default: '', reflect: true },
|
|
37
|
+
text: { type: String, default: '', reflect: true },
|
|
38
|
+
name: { type: String, default: '', reflect: true }, // backcompat alias for text
|
|
39
|
+
icon: { type: String, default: '', reflect: true },
|
|
40
|
+
size: { type: String, default: 'md', reflect: true },
|
|
41
|
+
shape: { type: String, default: 'circle', reflect: true },
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** Display string — `text` takes priority, `name` is backcompat alias */
|
|
45
|
+
get displayName() { return this.text || this.name; }
|
|
46
|
+
|
|
47
|
+
static template = () => null;
|
|
48
|
+
|
|
49
|
+
static #nameWarned = false;
|
|
50
|
+
|
|
51
|
+
#imgEl = null;
|
|
52
|
+
#initialsEl = null;
|
|
53
|
+
#iconEl = null;
|
|
54
|
+
|
|
55
|
+
connected() {
|
|
56
|
+
this.setAttribute('role', 'img');
|
|
57
|
+
if (this.name && !this.text && !UIAvatar.#nameWarned) {
|
|
58
|
+
UIAvatar.#nameWarned = true;
|
|
59
|
+
// eslint-disable-next-line no-console
|
|
60
|
+
console.warn(
|
|
61
|
+
`[AdiaUI] <avatar-ui name="…"> is deprecated — use text="…" instead. ` +
|
|
62
|
+
`Docs: https://ui-kit.exe.xyz/site/components/avatar`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
render() {
|
|
68
|
+
if (!this.src && !this.displayName && !this.icon) return;
|
|
69
|
+
|
|
70
|
+
if (this.src) {
|
|
71
|
+
if (!this.#imgEl) {
|
|
72
|
+
this.#imgEl = document.createElement('img');
|
|
73
|
+
this.#imgEl.setAttribute('slot', 'img');
|
|
74
|
+
this.#imgEl.onerror = () => {
|
|
75
|
+
this.#imgEl.remove();
|
|
76
|
+
this.#imgEl = null;
|
|
77
|
+
this.#showInitials();
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
this.#imgEl.src = this.src;
|
|
81
|
+
this.#imgEl.alt = this.name || '';
|
|
82
|
+
if (!this.#imgEl.parentElement) this.appendChild(this.#imgEl);
|
|
83
|
+
|
|
84
|
+
// Remove initials when image is showing
|
|
85
|
+
if (this.#initialsEl) {
|
|
86
|
+
this.#initialsEl.remove();
|
|
87
|
+
this.#initialsEl = null;
|
|
88
|
+
}
|
|
89
|
+
} else if (this.icon) {
|
|
90
|
+
// Icon avatar (system events, non-person rep)
|
|
91
|
+
if (this.#imgEl) { this.#imgEl.remove(); this.#imgEl = null; }
|
|
92
|
+
if (this.#initialsEl) { this.#initialsEl.remove(); this.#initialsEl = null; }
|
|
93
|
+
if (!this.#iconEl) {
|
|
94
|
+
this.#iconEl = document.createElement('icon-ui');
|
|
95
|
+
this.#iconEl.setAttribute('slot', 'icon');
|
|
96
|
+
this.appendChild(this.#iconEl);
|
|
97
|
+
}
|
|
98
|
+
this.#iconEl.setAttribute('name', this.icon);
|
|
99
|
+
} else {
|
|
100
|
+
// No src / no icon — show initials
|
|
101
|
+
if (this.#imgEl) { this.#imgEl.remove(); this.#imgEl = null; }
|
|
102
|
+
if (this.#iconEl) { this.#iconEl.remove(); this.#iconEl = null; }
|
|
103
|
+
this.#showInitials();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
this.setAttribute('aria-label', this.displayName || this.icon || '');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#showInitials() {
|
|
110
|
+
if (!this.displayName) return;
|
|
111
|
+
const initials = this.displayName
|
|
112
|
+
.split(/\s+/)
|
|
113
|
+
.map(w => w[0])
|
|
114
|
+
.join('')
|
|
115
|
+
.slice(0, 2)
|
|
116
|
+
.toUpperCase();
|
|
117
|
+
|
|
118
|
+
if (!this.#initialsEl) {
|
|
119
|
+
this.#initialsEl = document.createElement('span');
|
|
120
|
+
this.#initialsEl.setAttribute('slot', 'initials');
|
|
121
|
+
this.appendChild(this.#initialsEl);
|
|
122
|
+
}
|
|
123
|
+
this.#initialsEl.textContent = initials;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export class UIAvatarGroup extends UIElement {
|
|
128
|
+
static properties = {
|
|
129
|
+
max: { type: Number, default: 5, reflect: true },
|
|
130
|
+
size: { type: String, default: '', reflect: true },
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
static template = () => null;
|
|
134
|
+
|
|
135
|
+
connected() {
|
|
136
|
+
this.setAttribute('role', 'group');
|
|
137
|
+
if (!this.hasAttribute('aria-label')) {
|
|
138
|
+
this.setAttribute('aria-label', 'Avatar group');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
render() {
|
|
143
|
+
const avatars = [...this.querySelectorAll('avatar-ui')];
|
|
144
|
+
const max = this.max;
|
|
145
|
+
const overflow = avatars.length - max;
|
|
146
|
+
|
|
147
|
+
// Propagate size
|
|
148
|
+
if (this.size) {
|
|
149
|
+
for (const av of avatars) av.setAttribute('size', this.size);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Show/hide based on max
|
|
153
|
+
avatars.forEach((av, i) => {
|
|
154
|
+
av.style.display = i < max ? '' : 'none';
|
|
155
|
+
av.style.zIndex = String(avatars.length - i);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Overflow counter
|
|
159
|
+
let counter = this.querySelector('[slot="overflow"]');
|
|
160
|
+
if (overflow > 0) {
|
|
161
|
+
if (!counter) {
|
|
162
|
+
counter = document.createElement('span');
|
|
163
|
+
counter.setAttribute('slot', 'overflow');
|
|
164
|
+
this.appendChild(counter);
|
|
165
|
+
}
|
|
166
|
+
counter.textContent = `+${overflow}`;
|
|
167
|
+
counter.setAttribute('aria-label', `${overflow} more`);
|
|
168
|
+
counter.style.zIndex = '0';
|
|
169
|
+
} else if (counter) {
|
|
170
|
+
counter.remove();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<badge-ui>` — Inline pill-shaped badge/tag. Text rendered via CSS attr().
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/badge
|
|
5
|
+
*
|
|
6
|
+
* Type declarations generated by scripts/build/dts-codegen.mjs from
|
|
7
|
+
* the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
|
|
8
|
+
* run `npm run build:components`, then `npm run codegen:dts` to
|
|
9
|
+
* regenerate; or hand-author this file fully if rich event types are
|
|
10
|
+
* needed beyond what the yaml `events:` block can express.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { UIElement } from '../../core/element.js';
|
|
14
|
+
|
|
15
|
+
export class UIBadge extends UIElement {
|
|
16
|
+
/** Optional leading icon (any registered name). Use icon="dot" for chart-legend / status-pip chips. Inherits the variant's foreground color so the dot matches the label. */
|
|
17
|
+
icon: string;
|
|
18
|
+
/** Badge size */
|
|
19
|
+
size: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
20
|
+
/** Semantic status shorthand. Auto-maps to variant and sets text. `new` → success "New"; `updated` → info "Updated"; `deprecated` → warning "Deprecated"; `removed` → danger "Removed"; `beta` → accent "Beta". Use `variant` + `text` directly for custom chips. */
|
|
21
|
+
status: 'new' | 'updated' | 'deprecated' | 'removed' | 'beta';
|
|
22
|
+
/** Badge text content. Falls back to existing textContent. */
|
|
23
|
+
text: string;
|
|
24
|
+
/** Badge display text. Renderer routes this to the `text` attribute via CSS attr(text) on ::after. */
|
|
25
|
+
textContent: string;
|
|
26
|
+
/** Semantic color variant. */
|
|
27
|
+
variant: 'default' | 'accent' | 'info' | 'success' | 'warning' | 'danger' | 'primary' | 'muted' | 'neutral';
|
|
28
|
+
}
|
|
@@ -1,83 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* <badge-ui text="3" variant="danger" size="sm"></badge-ui>
|
|
4
|
-
* <badge-ui text="Organic" variant="accent" icon="dot"></badge-ui> ← chart legend chip
|
|
5
|
-
* <badge-ui status="beta"></badge-ui> ← status shorthand
|
|
2
|
+
* `<badge-ui>` — auto-registers the tag on import.
|
|
6
3
|
*
|
|
7
|
-
*
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
8
6
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* markers). Inherits the variant's foreground color so legend chips
|
|
13
|
-
* read as a single visual unit instead of icon + label collage.
|
|
14
|
-
* Status: semantic shorthand that auto-maps variant + text.
|
|
7
|
+
* import { UIBadge } from '@adia-ai/web-components/components/badge/class';
|
|
8
|
+
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
15
10
|
*/
|
|
16
11
|
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
const STATUS_MAP = {
|
|
20
|
-
new: { variant: 'success', text: 'New' },
|
|
21
|
-
updated: { variant: 'info', text: 'Updated' },
|
|
22
|
-
deprecated: { variant: 'warning', text: 'Deprecated' },
|
|
23
|
-
removed: { variant: 'danger', text: 'Removed' },
|
|
24
|
-
beta: { variant: 'accent', text: 'Beta' },
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
class UIBadge extends UIElement {
|
|
28
|
-
static properties = {
|
|
29
|
-
text: { type: String, default: '', reflect: true },
|
|
30
|
-
textContent: { type: String, default: '' },
|
|
31
|
-
variant: { type: String, default: 'default', reflect: true },
|
|
32
|
-
size: { type: String, default: 'md', reflect: true },
|
|
33
|
-
icon: { type: String, default: '', reflect: true },
|
|
34
|
-
status: { type: String, default: '', reflect: true },
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
static template = () => null;
|
|
38
|
-
|
|
39
|
-
connected() {
|
|
40
|
-
/* Default role is `status` (matches badge's "passive callout" semantic
|
|
41
|
-
— a screen reader announces the badge text as a state without
|
|
42
|
-
interrupting). Consumers that wire interactivity (e.g.
|
|
43
|
-
`<chart-legend-ui>` toggling series) are free to set
|
|
44
|
-
`role="button"` (or any other role) before connection — we don't
|
|
45
|
-
overwrite an explicit consumer choice. */
|
|
46
|
-
if (!this.hasAttribute('role')) {
|
|
47
|
-
this.setAttribute('role', 'status');
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
render() {
|
|
52
|
-
// Status shorthand wins over explicit variant/text while it's set —
|
|
53
|
-
// mixing is unsupported. Converges in one extra render pass.
|
|
54
|
-
if (this.status) {
|
|
55
|
-
const entry = STATUS_MAP[this.status];
|
|
56
|
-
if (entry) {
|
|
57
|
-
if (this.variant !== entry.variant) this.variant = entry.variant;
|
|
58
|
-
if (this.text !== entry.text) this.text = entry.text;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (this.text) this.setAttribute('aria-label', this.text);
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIBadge } from './class.js';
|
|
63
14
|
|
|
64
|
-
|
|
65
|
-
// icon-ui element handles loading + cleanup; we just `prepend` so the icon
|
|
66
|
-
// sits before the CSS-rendered text (text is `:scope::after { content }`).
|
|
67
|
-
if (this.icon) {
|
|
68
|
-
const existing = this.querySelector(':scope > icon-ui');
|
|
69
|
-
if (!existing || existing.getAttribute('name') !== this.icon) {
|
|
70
|
-
if (existing) existing.remove();
|
|
71
|
-
const iconEl = document.createElement('icon-ui');
|
|
72
|
-
iconEl.setAttribute('name', this.icon);
|
|
73
|
-
iconEl.setAttribute('size', 'sm');
|
|
74
|
-
this.prepend(iconEl);
|
|
75
|
-
}
|
|
76
|
-
} else {
|
|
77
|
-
this.querySelector(':scope > icon-ui')?.remove();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
customElements.define('badge-ui', UIBadge);
|
|
15
|
+
defineIfFree('badge-ui', UIBadge);
|
|
82
16
|
|
|
83
17
|
export { UIBadge };
|
|
@@ -7,6 +7,10 @@ component: Badge
|
|
|
7
7
|
category: display
|
|
8
8
|
version: 1
|
|
9
9
|
description: Inline pill-shaped badge/tag. Text rendered via CSS attr().
|
|
10
|
+
# Per ADR-0027 — primitives that programmatically create other primitives
|
|
11
|
+
# do NOT auto-import them. Consumer (or demo shell) must explicitly import.
|
|
12
|
+
composes:
|
|
13
|
+
- icon-ui
|
|
10
14
|
props:
|
|
11
15
|
icon:
|
|
12
16
|
description: Optional leading icon (any registered name). Use icon="dot" for chart-legend /
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<badge-ui>`.
|
|
3
|
+
*
|
|
4
|
+
* Importing this file gives you the class(es) without auto-registering the tag.
|
|
5
|
+
* Useful for test isolation, subclassing with tag-name override, or selective
|
|
6
|
+
* composition.
|
|
7
|
+
*
|
|
8
|
+
* The auto-register path stays at `@adia-ai/web-components/components/badge`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <badge-ui text="New" variant="accent"></badge-ui>
|
|
16
|
+
* <badge-ui text="3" variant="danger" size="sm"></badge-ui>
|
|
17
|
+
* <badge-ui text="Organic" variant="accent" icon="dot"></badge-ui> ← chart legend chip
|
|
18
|
+
* <badge-ui status="beta"></badge-ui> ← status shorthand
|
|
19
|
+
*
|
|
20
|
+
* Inline badge / tag. Pill-shaped, text rendered via CSS attr().
|
|
21
|
+
*
|
|
22
|
+
* Variants: default, accent, info, success, warning, danger, primary, muted, neutral
|
|
23
|
+
* Sizes: sm, md (default)
|
|
24
|
+
* Icon: optional leading icon (any registered icon name; "dot" for legend
|
|
25
|
+
* markers). Inherits the variant's foreground color so legend chips
|
|
26
|
+
* read as a single visual unit instead of icon + label collage.
|
|
27
|
+
* Status: semantic shorthand that auto-maps variant + text.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { UIElement } from '../../core/element.js';
|
|
31
|
+
|
|
32
|
+
const STATUS_MAP = {
|
|
33
|
+
new: { variant: 'success', text: 'New' },
|
|
34
|
+
updated: { variant: 'info', text: 'Updated' },
|
|
35
|
+
deprecated: { variant: 'warning', text: 'Deprecated' },
|
|
36
|
+
removed: { variant: 'danger', text: 'Removed' },
|
|
37
|
+
beta: { variant: 'accent', text: 'Beta' },
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export class UIBadge extends UIElement {
|
|
41
|
+
static properties = {
|
|
42
|
+
text: { type: String, default: '', reflect: true },
|
|
43
|
+
textContent: { type: String, default: '' },
|
|
44
|
+
variant: { type: String, default: 'default', reflect: true },
|
|
45
|
+
size: { type: String, default: 'md', reflect: true },
|
|
46
|
+
icon: { type: String, default: '', reflect: true },
|
|
47
|
+
status: { type: String, default: '', reflect: true },
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
static template = () => null;
|
|
51
|
+
|
|
52
|
+
connected() {
|
|
53
|
+
/* Default role is `status` (matches badge's "passive callout" semantic
|
|
54
|
+
— a screen reader announces the badge text as a state without
|
|
55
|
+
interrupting). Consumers that wire interactivity (e.g.
|
|
56
|
+
`<chart-legend-ui>` toggling series) are free to set
|
|
57
|
+
`role="button"` (or any other role) before connection — we don't
|
|
58
|
+
overwrite an explicit consumer choice. */
|
|
59
|
+
if (!this.hasAttribute('role')) {
|
|
60
|
+
this.setAttribute('role', 'status');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
render() {
|
|
65
|
+
// Status shorthand wins over explicit variant/text while it's set —
|
|
66
|
+
// mixing is unsupported. Converges in one extra render pass.
|
|
67
|
+
if (this.status) {
|
|
68
|
+
const entry = STATUS_MAP[this.status];
|
|
69
|
+
if (entry) {
|
|
70
|
+
if (this.variant !== entry.variant) this.variant = entry.variant;
|
|
71
|
+
if (this.text !== entry.text) this.text = entry.text;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (this.text) this.setAttribute('aria-label', this.text);
|
|
76
|
+
|
|
77
|
+
// Stamp / update the leading icon. Pattern mirrors button-ui so the same
|
|
78
|
+
// icon-ui element handles loading + cleanup; we just `prepend` so the icon
|
|
79
|
+
// sits before the CSS-rendered text (text is `:scope::after { content }`).
|
|
80
|
+
if (this.icon) {
|
|
81
|
+
const existing = this.querySelector(':scope > icon-ui');
|
|
82
|
+
if (!existing || existing.getAttribute('name') !== this.icon) {
|
|
83
|
+
if (existing) existing.remove();
|
|
84
|
+
const iconEl = document.createElement('icon-ui');
|
|
85
|
+
iconEl.setAttribute('name', this.icon);
|
|
86
|
+
iconEl.setAttribute('size', 'sm');
|
|
87
|
+
this.prepend(iconEl);
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
this.querySelector(':scope > icon-ui')?.remove();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<block-ui>` — Generic padded/margined content wrapper.
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/block
|
|
5
|
+
*
|
|
6
|
+
* Type declarations generated by scripts/build/dts-codegen.mjs from
|
|
7
|
+
* the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
|
|
8
|
+
* run `npm run build:components`, then `npm run codegen:dts` to
|
|
9
|
+
* regenerate; or hand-author this file fully if rich event types are
|
|
10
|
+
* needed beyond what the yaml `events:` block can express.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { UIElement } from '../../core/element.js';
|
|
14
|
+
|
|
15
|
+
export class UIBlock extends UIElement {
|
|
16
|
+
/** Margin size */
|
|
17
|
+
margin: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
18
|
+
/** Padding amount, maps to spacing tokens */
|
|
19
|
+
padding: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
20
|
+
}
|
|
@@ -1,23 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<block-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* import { UIBlock } from '@adia-ai/web-components/components/block/class';
|
|
8
|
+
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
class UIBlock extends UIElement {
|
|
14
|
-
static properties = {
|
|
15
|
-
padding: { type: String, default: 'md', reflect: true },
|
|
16
|
-
margin: { type: String, default: 'none', reflect: true },
|
|
17
|
-
};
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIBlock } from './class.js';
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
customElements.define('block-ui', UIBlock);
|
|
15
|
+
defineIfFree('block-ui', UIBlock);
|
|
22
16
|
|
|
23
17
|
export { UIBlock };
|