@brandsync/wc 0.0.8 → 0.0.9

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 (193) hide show
  1. package/custom-elements.json +1808 -353
  2. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  3. package/dist/brandsync-wc/p-0d64ea40.entry.js +1 -0
  4. package/dist/brandsync-wc/{p-c63d16e1.entry.js → p-1515498e.entry.js} +1 -1
  5. package/dist/brandsync-wc/p-16a54578.entry.js +1 -0
  6. package/dist/brandsync-wc/p-18af02df.entry.js +1 -0
  7. package/dist/brandsync-wc/p-30a0e168.entry.js +1 -0
  8. package/dist/brandsync-wc/p-3dacae70.entry.js +1 -0
  9. package/dist/brandsync-wc/p-5333bb5a.entry.js +1 -0
  10. package/dist/brandsync-wc/p-575ce905.entry.js +1 -0
  11. package/dist/brandsync-wc/{p-dd0fea0e.entry.js → p-7776b57b.entry.js} +1 -1
  12. package/dist/brandsync-wc/{p-260bd201.entry.js → p-805644e4.entry.js} +1 -1
  13. package/dist/brandsync-wc/{p-f88d9a6e.entry.js → p-8a78d6ea.entry.js} +1 -1
  14. package/dist/brandsync-wc/p-8d12ed96.entry.js +1 -0
  15. package/dist/brandsync-wc/p-94ed898a.entry.js +1 -0
  16. package/dist/brandsync-wc/{p-9e5d2211.entry.js → p-96f374be.entry.js} +1 -1
  17. package/dist/brandsync-wc/{p-ab5cc7af.entry.js → p-a34f460d.entry.js} +1 -1
  18. package/dist/brandsync-wc/p-bc72439a.entry.js +1 -0
  19. package/dist/brandsync-wc/{p-76eca100.entry.js → p-ce0914a7.entry.js} +1 -1
  20. package/dist/brandsync-wc/{p-5a0fe72e.entry.js → p-d682675e.entry.js} +1 -1
  21. package/dist/brandsync-wc/p-dad4a92c.entry.js +1 -0
  22. package/dist/brandsync-wc/{p-cfc3421b.entry.js → p-dd747a12.entry.js} +1 -1
  23. package/dist/brandsync-wc/{p-2742ecef.entry.js → p-eb4d87f0.entry.js} +1 -1
  24. package/dist/cjs/brandsync-wc.cjs.js +1 -1
  25. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +17 -0
  26. package/dist/cjs/bs-ai-greeting.cjs.entry.js +24 -0
  27. package/dist/cjs/bs-ai-thinking.cjs.entry.js +1 -1
  28. package/dist/cjs/bs-attachment-list.cjs.entry.js +47 -0
  29. package/dist/cjs/bs-attachment.cjs.entry.js +46 -0
  30. package/dist/cjs/bs-badge.cjs.entry.js +1 -1
  31. package/dist/cjs/bs-button-skeleton.cjs.entry.js +1 -1
  32. package/dist/cjs/bs-button.cjs.entry.js +1 -1
  33. package/dist/cjs/bs-card.cjs.entry.js +1 -1
  34. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +94 -0
  35. package/dist/cjs/bs-chatbot-header.cjs.entry.js +1 -1
  36. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +1 -1
  37. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +38 -0
  38. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +1 -1
  39. package/dist/cjs/bs-composer-status-banner.cjs.entry.js +43 -0
  40. package/dist/cjs/bs-composer.cjs.entry.js +16 -2
  41. package/dist/cjs/bs-data-table.cjs.entry.js +2 -2
  42. package/dist/cjs/bs-input.cjs.entry.js +270 -4
  43. package/dist/cjs/{bs-menu-item.cjs.entry.js → bs-menu_2.cjs.entry.js} +14 -1
  44. package/dist/cjs/bs-source-link.cjs.entry.js +39 -0
  45. package/dist/cjs/bs-tooltip.cjs.entry.js +1 -1
  46. package/dist/cjs/loader.cjs.js +1 -1
  47. package/dist/collection/collection-manifest.json +8 -0
  48. package/dist/collection/components/bs-ai-chatbot/bs-ai-chatbot.stories.js +180 -0
  49. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.cmp.test.js +14 -0
  50. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.css +27 -0
  51. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +41 -0
  52. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.stories.js +15 -0
  53. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.cmp.test.js +22 -0
  54. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.css +53 -0
  55. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +103 -0
  56. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.stories.js +23 -0
  57. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  58. package/dist/collection/components/bs-attachment/bs-attachment.cmp.test.js +41 -0
  59. package/dist/collection/components/bs-attachment/bs-attachment.css +184 -0
  60. package/dist/collection/components/bs-attachment/bs-attachment.js +230 -0
  61. package/dist/collection/components/bs-attachment/bs-attachment.stories.js +58 -0
  62. package/dist/collection/components/bs-attachment-list/bs-attachment-list.cmp.test.js +28 -0
  63. package/dist/collection/components/bs-attachment-list/bs-attachment-list.css +56 -0
  64. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +105 -0
  65. package/dist/collection/components/bs-attachment-list/bs-attachment-list.stories.js +47 -0
  66. package/dist/collection/components/bs-badge/bs-badge.js +1 -1
  67. package/dist/collection/components/bs-button/bs-button.js +1 -1
  68. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +1 -1
  69. package/dist/collection/components/bs-card/bs-card.js +1 -1
  70. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.cmp.test.js +73 -0
  71. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.css +253 -0
  72. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +324 -0
  73. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.stories.js +54 -0
  74. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +1 -1
  75. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +1 -1
  76. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.cmp.test.js +34 -0
  77. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.css +106 -0
  78. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +142 -0
  79. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.stories.js +44 -0
  80. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +1 -1
  81. package/dist/collection/components/bs-composer/bs-composer.cmp.test.js +12 -0
  82. package/dist/collection/components/bs-composer/bs-composer.css +10 -0
  83. package/dist/collection/components/bs-composer/bs-composer.js +25 -1
  84. package/dist/collection/components/bs-composer/bs-composer.stories.js +13 -0
  85. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.cmp.test.js +42 -0
  86. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.css +173 -0
  87. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.js +270 -0
  88. package/dist/collection/components/bs-composer-status-banner/bs-composer-status-banner.stories.js +75 -0
  89. package/dist/collection/components/bs-data-table/bs-data-table.js +2 -2
  90. package/dist/collection/components/bs-input/bs-input.cmp.test.js +296 -0
  91. package/dist/collection/components/bs-input/bs-input.css +333 -23
  92. package/dist/collection/components/bs-input/bs-input.js +647 -11
  93. package/dist/collection/components/bs-input/bs-input.stories.js +128 -1
  94. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  95. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  96. package/dist/collection/components/bs-source-link/bs-source-link.cmp.test.js +42 -0
  97. package/dist/collection/components/bs-source-link/bs-source-link.css +114 -0
  98. package/dist/collection/components/bs-source-link/bs-source-link.js +192 -0
  99. package/dist/collection/components/bs-source-link/bs-source-link.stories.js +33 -0
  100. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  101. package/dist/components/bs-ai-disclaimer.d.ts +11 -0
  102. package/dist/components/bs-ai-disclaimer.js +1 -0
  103. package/dist/components/bs-ai-greeting.d.ts +11 -0
  104. package/dist/components/bs-ai-greeting.js +1 -0
  105. package/dist/components/bs-ai-thinking.js +1 -1
  106. package/dist/components/bs-attachment-list.d.ts +11 -0
  107. package/dist/components/bs-attachment-list.js +1 -0
  108. package/dist/components/bs-attachment.d.ts +11 -0
  109. package/dist/components/bs-attachment.js +1 -0
  110. package/dist/components/bs-badge.js +1 -1
  111. package/dist/components/bs-button-skeleton.js +1 -1
  112. package/dist/components/bs-button.js +1 -1
  113. package/dist/components/bs-card.js +1 -1
  114. package/dist/components/bs-chatbot-feedback.d.ts +11 -0
  115. package/dist/components/bs-chatbot-feedback.js +1 -0
  116. package/dist/components/bs-chatbot-header.js +1 -1
  117. package/dist/components/bs-chatbot-response-action.js +1 -1
  118. package/dist/components/bs-chatbot-sources-drawer.d.ts +11 -0
  119. package/dist/components/bs-chatbot-sources-drawer.js +1 -0
  120. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  121. package/dist/components/bs-composer-status-banner.d.ts +11 -0
  122. package/dist/components/bs-composer-status-banner.js +1 -0
  123. package/dist/components/bs-composer.js +1 -1
  124. package/dist/components/bs-data-table.js +1 -1
  125. package/dist/components/bs-input.js +1 -1
  126. package/dist/components/bs-menu-item.js +1 -1
  127. package/dist/components/bs-menu.js +1 -1
  128. package/dist/components/bs-source-link.d.ts +11 -0
  129. package/dist/components/bs-source-link.js +1 -0
  130. package/dist/components/bs-tooltip.js +1 -1
  131. package/dist/components/{p-CoC4LQCI.js → p-Cz2nfz2j.js} +1 -1
  132. package/dist/components/p-DndQiCMP.js +1 -0
  133. package/dist/components/p-_vXDfB3V.js +1 -0
  134. package/dist/esm/brandsync-wc.js +1 -1
  135. package/dist/esm/bs-ai-disclaimer.entry.js +15 -0
  136. package/dist/esm/bs-ai-greeting.entry.js +22 -0
  137. package/dist/esm/bs-ai-thinking.entry.js +1 -1
  138. package/dist/esm/bs-attachment-list.entry.js +45 -0
  139. package/dist/esm/bs-attachment.entry.js +44 -0
  140. package/dist/esm/bs-badge.entry.js +1 -1
  141. package/dist/esm/bs-button-skeleton.entry.js +1 -1
  142. package/dist/esm/bs-button.entry.js +1 -1
  143. package/dist/esm/bs-card.entry.js +1 -1
  144. package/dist/esm/bs-chatbot-feedback.entry.js +92 -0
  145. package/dist/esm/bs-chatbot-header.entry.js +1 -1
  146. package/dist/esm/bs-chatbot-response-action.entry.js +1 -1
  147. package/dist/esm/bs-chatbot-sources-drawer.entry.js +36 -0
  148. package/dist/esm/bs-chatbot-suggestion-button.entry.js +1 -1
  149. package/dist/esm/bs-composer-status-banner.entry.js +41 -0
  150. package/dist/esm/bs-composer.entry.js +17 -3
  151. package/dist/esm/bs-data-table.entry.js +2 -2
  152. package/dist/esm/bs-input.entry.js +271 -5
  153. package/dist/esm/{bs-menu-item.entry.js → bs-menu_2.entry.js} +15 -3
  154. package/dist/esm/bs-source-link.entry.js +37 -0
  155. package/dist/esm/bs-tooltip.entry.js +1 -1
  156. package/dist/esm/loader.js +1 -1
  157. package/dist/types/components/bs-ai-chatbot/bs-ai-chatbot.stories.d.ts +18 -0
  158. package/dist/types/components/bs-ai-disclaimer/bs-ai-disclaimer.cmp.test.d.ts +1 -0
  159. package/dist/types/components/bs-ai-disclaimer/bs-ai-disclaimer.d.ts +26 -0
  160. package/dist/types/components/bs-ai-disclaimer/bs-ai-disclaimer.stories.d.ts +8 -0
  161. package/dist/types/components/bs-ai-greeting/bs-ai-greeting.cmp.test.d.ts +1 -0
  162. package/dist/types/components/bs-ai-greeting/bs-ai-greeting.d.ts +42 -0
  163. package/dist/types/components/bs-ai-greeting/bs-ai-greeting.stories.d.ts +10 -0
  164. package/dist/types/components/bs-attachment/bs-attachment.cmp.test.d.ts +1 -0
  165. package/dist/types/components/bs-attachment/bs-attachment.d.ts +59 -0
  166. package/dist/types/components/bs-attachment/bs-attachment.stories.d.ts +17 -0
  167. package/dist/types/components/bs-attachment-list/bs-attachment-list.cmp.test.d.ts +1 -0
  168. package/dist/types/components/bs-attachment-list/bs-attachment-list.d.ts +42 -0
  169. package/dist/types/components/bs-attachment-list/bs-attachment-list.stories.d.ts +10 -0
  170. package/dist/types/components/bs-chatbot-feedback/bs-chatbot-feedback.cmp.test.d.ts +1 -0
  171. package/dist/types/components/bs-chatbot-feedback/bs-chatbot-feedback.d.ts +90 -0
  172. package/dist/types/components/bs-chatbot-feedback/bs-chatbot-feedback.stories.d.ts +16 -0
  173. package/dist/types/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.cmp.test.d.ts +1 -0
  174. package/dist/types/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.d.ts +54 -0
  175. package/dist/types/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.stories.d.ts +10 -0
  176. package/dist/types/components/bs-composer/bs-composer.d.ts +14 -0
  177. package/dist/types/components/bs-composer/bs-composer.stories.d.ts +1 -0
  178. package/dist/types/components/bs-composer-status-banner/bs-composer-status-banner.cmp.test.d.ts +1 -0
  179. package/dist/types/components/bs-composer-status-banner/bs-composer-status-banner.d.ts +88 -0
  180. package/dist/types/components/bs-composer-status-banner/bs-composer-status-banner.stories.d.ts +20 -0
  181. package/dist/types/components/bs-input/bs-input.d.ts +139 -6
  182. package/dist/types/components/bs-input/bs-input.stories.d.ts +19 -0
  183. package/dist/types/components/bs-source-link/bs-source-link.cmp.test.d.ts +1 -0
  184. package/dist/types/components/bs-source-link/bs-source-link.d.ts +51 -0
  185. package/dist/types/components/bs-source-link/bs-source-link.stories.d.ts +13 -0
  186. package/dist/types/components.d.ts +1746 -19
  187. package/package.json +1 -1
  188. package/dist/brandsync-wc/p-6abdfaf0.entry.js +0 -1
  189. package/dist/brandsync-wc/p-6c1fa4da.entry.js +0 -1
  190. package/dist/brandsync-wc/p-a12d0a60.entry.js +0 -1
  191. package/dist/brandsync-wc/p-f5f443e2.entry.js +0 -1
  192. package/dist/cjs/bs-menu.cjs.entry.js +0 -17
  193. package/dist/esm/bs-menu.entry.js +0 -15
@@ -0,0 +1,184 @@
1
+ :host {
2
+ display: inline-block;
3
+ --bs-attachment-size: 112px;
4
+ --bs-attachment-radius: var(--bs-border-radius-100);
5
+ --bs-attachment-border-color: var(--bs-border-default);
6
+ --bs-attachment-card-bg: var(--bs-surface-base);
7
+ --bs-attachment-filename-color: var(--bs-text-default);
8
+ --bs-attachment-badge-bg-pdf: var(--bs-badge-bg-error);
9
+ --bs-attachment-badge-bg-document: var(--bs-badge-bg-info);
10
+ --bs-attachment-remove-bg: var(--bs-button-neutral-container);
11
+ --bs-attachment-remove-hover: var(--bs-button-neutral-hover);
12
+ --bs-attachment-remove-pressed: var(--bs-button-neutral-pressed);
13
+ --bs-attachment-remove-focus: var(--bs-border-neutral-focus);
14
+ }
15
+
16
+ .bs-attachment {
17
+ box-sizing: border-box;
18
+ position: relative;
19
+ display: inline-flex;
20
+ font-family: inherit;
21
+ }
22
+
23
+ /* --- Image thumbnail --- */
24
+
25
+ .bs-attachment__thumbnail {
26
+ position: relative;
27
+ width: var(--bs-attachment-size);
28
+ height: var(--bs-attachment-size);
29
+ border-radius: var(--bs-attachment-radius);
30
+ overflow: hidden;
31
+ }
32
+
33
+ .bs-attachment--loading .bs-attachment__thumbnail {
34
+ border: var(--bs-border-width-thin) solid var(--bs-attachment-border-color);
35
+ }
36
+
37
+ .bs-attachment__image {
38
+ display: block;
39
+ width: 100%;
40
+ height: 100%;
41
+ object-fit: cover;
42
+ }
43
+
44
+ .bs-attachment--loading .bs-attachment__image {
45
+ filter: blur(2px);
46
+ }
47
+
48
+ .bs-attachment__spinner--overlay {
49
+ position: absolute;
50
+ top: 50%;
51
+ left: 50%;
52
+ }
53
+
54
+ /* --- PDF / document card --- */
55
+
56
+ .bs-attachment__card {
57
+ box-sizing: border-box;
58
+ display: flex;
59
+ flex-direction: column;
60
+ align-items: flex-start;
61
+ gap: var(--bs-spacing-100);
62
+ width: var(--bs-attachment-size);
63
+ height: var(--bs-attachment-size);
64
+ padding: var(--bs-spacing-100);
65
+ background: var(--bs-attachment-card-bg);
66
+ border: var(--bs-border-width-thin) solid var(--bs-attachment-border-color);
67
+ border-radius: var(--bs-attachment-radius);
68
+ }
69
+
70
+ .bs-attachment__filename {
71
+ margin: 0;
72
+ flex: 1 0 0;
73
+ min-height: 0;
74
+ width: 100%;
75
+ overflow: hidden;
76
+ color: var(--bs-attachment-filename-color);
77
+ font-size: var(--bs-font-size-xs);
78
+ line-height: calc(var(--bs-line-height-caption-sm) * 1px);
79
+ text-overflow: ellipsis;
80
+ word-break: break-word;
81
+ }
82
+
83
+ .bs-attachment__badge {
84
+ box-sizing: border-box;
85
+ display: inline-flex;
86
+ align-items: center;
87
+ justify-content: center;
88
+ flex-shrink: 0;
89
+ padding: var(--bs-spacing-50);
90
+ border-radius: var(--bs-border-radius-50);
91
+ }
92
+
93
+ .bs-attachment__badge--pdf {
94
+ background: var(--bs-attachment-badge-bg-pdf);
95
+ }
96
+
97
+ .bs-attachment__badge--document {
98
+ background: var(--bs-attachment-badge-bg-document);
99
+ }
100
+
101
+ /* --- Remove button --- */
102
+
103
+ .bs-attachment__remove {
104
+ box-sizing: border-box;
105
+ position: absolute;
106
+ top: var(--bs-spacing-50);
107
+ right: var(--bs-spacing-50);
108
+ display: inline-flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+ width: 20px;
112
+ height: 20px;
113
+ padding: 0;
114
+ background: var(--bs-attachment-remove-bg);
115
+ border: none;
116
+ border-radius: var(--bs-border-radius-50);
117
+ color: var(--bs-icon-default);
118
+ cursor: pointer;
119
+ opacity: 0;
120
+ pointer-events: none;
121
+ transition: background-color var(--bs-duration-fast) var(--bs-easing-standard), opacity var(--bs-duration-fast) var(--bs-easing-standard);
122
+ }
123
+
124
+ .bs-attachment__remove:hover {
125
+ background: var(--bs-attachment-remove-hover);
126
+ }
127
+
128
+ .bs-attachment__remove:active {
129
+ background: var(--bs-attachment-remove-pressed);
130
+ }
131
+
132
+ .bs-attachment:hover .bs-attachment__remove,
133
+ .bs-attachment:focus-within .bs-attachment__remove {
134
+ opacity: 1;
135
+ pointer-events: auto;
136
+ }
137
+
138
+ .bs-attachment__remove:focus-visible {
139
+ outline: 2px solid var(--bs-attachment-remove-focus);
140
+ outline-offset: 1px;
141
+ }
142
+
143
+ /* --- Spinner --- */
144
+
145
+ .bs-attachment__spinner {
146
+ display: inline-block;
147
+ box-sizing: border-box;
148
+ border: 2px solid rgba(255, 255, 255, 0.35);
149
+ border-top-color: var(--bs-white);
150
+ border-radius: 50%;
151
+ animation: bs-attachment-spin 0.8s linear infinite;
152
+ }
153
+
154
+ /* The overlay variant is also positioned via `transform: translate(-50%, -50%)` (see
155
+ * .bs-attachment__spinner--overlay) for centering. `bs-attachment-spin`'s keyframes only define
156
+ * `transform` at the "to" stop, so the browser would interpolate from that static translate to a
157
+ * bare rotate() -- different transform functions, decomposed into a matrix and interpolated,
158
+ * producing a lateral swoop instead of an in-place spin. This compound selector (higher
159
+ * specificity than either single-class rule, so it applies regardless of source order) swaps in
160
+ * a keyframe set that bakes the same translate into every stop, so only the rotation animates. */
161
+ .bs-attachment__spinner.bs-attachment__spinner--overlay {
162
+ animation-name: bs-attachment-spin-centered;
163
+ }
164
+
165
+ @keyframes bs-attachment-spin {
166
+ to {
167
+ transform: rotate(360deg);
168
+ }
169
+ }
170
+
171
+ @keyframes bs-attachment-spin-centered {
172
+ from {
173
+ transform: translate(-50%, -50%) rotate(0deg);
174
+ }
175
+ to {
176
+ transform: translate(-50%, -50%) rotate(360deg);
177
+ }
178
+ }
179
+
180
+ @media (prefers-reduced-motion: reduce) {
181
+ .bs-attachment__spinner {
182
+ animation: none;
183
+ }
184
+ }
@@ -0,0 +1,230 @@
1
+ import { h } from "@stencil/core";
2
+ /**
3
+ * A single file attachment preview for `bs-composer` -- an image thumbnail, or a filename card
4
+ * with a colored file-type badge (PDF/Document), with an optional upload-in-progress spinner and
5
+ * a hover/focus-revealed remove button.
6
+ *
7
+ * ## When to use
8
+ * - Rendered by the consuming app for each file a user has attached to a Genie AI chat message,
9
+ * typically alongside or inside `bs-composer`.
10
+ *
11
+ * ## When not to use
12
+ * - A generic file-upload control -- this is a preview-only presentational component. The
13
+ * consuming app owns the actual file picker/upload logic and drives `loading` from that state.
14
+ *
15
+ * @part thumbnail - The image thumbnail wrapper (type="image" only).
16
+ * @part card - The filename card (type="pdf" / type="document" only).
17
+ * @part filename - The truncated filename text inside the card.
18
+ * @part badge - The colored file-type badge inside the card.
19
+ * @part remove - The remove button.
20
+ * @prop --bs-attachment-size - Width/height of the image thumbnail and of the card. Defaults to 112px.
21
+ * @prop --bs-attachment-radius - Corner radius of the thumbnail/card. Aliased to
22
+ * `--bs-border-radius-100`.
23
+ * @prop --bs-attachment-border-color - Border color of the card / loading image wrap. Aliased to
24
+ * `--bs-border-default`.
25
+ * @prop --bs-attachment-card-bg - Card background. Aliased to `--bs-surface-base`.
26
+ * @prop --bs-attachment-filename-color - Filename text color. Aliased to `--bs-text-default`.
27
+ * @prop --bs-attachment-badge-bg-pdf - PDF badge background. Aliased to `--bs-badge-bg-error`.
28
+ * @prop --bs-attachment-badge-bg-document - Document badge background. Aliased to
29
+ * `--bs-badge-bg-info`.
30
+ * @prop --bs-attachment-remove-bg - Remove button (neutral icon button) default background.
31
+ * Aliased to `--bs-button-neutral-container`.
32
+ * @prop --bs-attachment-remove-hover - Remove button hover background. Aliased to
33
+ * `--bs-button-neutral-hover`.
34
+ * @prop --bs-attachment-remove-pressed - Remove button active/pressed background. Aliased to
35
+ * `--bs-button-neutral-pressed`.
36
+ * @prop --bs-attachment-remove-focus - Remove button focus outline color. Aliased to
37
+ * `--bs-border-neutral-focus`.
38
+ */
39
+ export class BsAttachment {
40
+ /** Which kind of attachment preview to render. */
41
+ type = 'image';
42
+ /** The filename shown on the card. Only used when `type` is "pdf" or "document". */
43
+ fileName = 'Attachment';
44
+ /** The thumbnail image URL. Only used when `type` is "image". */
45
+ imageSrc;
46
+ /** Accessible alt text for the image thumbnail. Only used when `type` is "image". */
47
+ imageAlt = '';
48
+ /** Shows an upload-in-progress spinner (blurred + overlaid for images, in the badge for files). */
49
+ loading = false;
50
+ /** Whether the hover/focus-revealed remove button is rendered at all. */
51
+ removable = true;
52
+ /** Fires when the remove button is clicked. */
53
+ bsRemove;
54
+ onRemoveClick = () => {
55
+ this.bsRemove.emit();
56
+ };
57
+ render() {
58
+ const isImage = this.type === 'image';
59
+ return (h("div", { key: '7cebfc51b0453ac6c1fa57d38856b4b54f15def9', class: { 'bs-attachment': true, 'bs-attachment--loading': this.loading }, "aria-busy": this.loading ? 'true' : 'false' }, isImage ? this.renderImage() : this.renderCard(), this.removable && (h("button", { key: '935eb0f9507a9c9d24a1a6121c2fcd0575ac9d16', type: "button", part: "remove", class: "bs-attachment__remove", "aria-label": "Remove attachment", onClick: this.onRemoveClick }, h(CloseIcon, { key: '00e45c411ec831a66dd29d039568f57fc97b3930' })))));
60
+ }
61
+ renderImage() {
62
+ return (h("div", { part: "thumbnail", class: "bs-attachment__thumbnail" }, h("img", { class: "bs-attachment__image", src: this.imageSrc, alt: this.imageAlt }), this.loading && h(Spinner, { class: "bs-attachment__spinner bs-attachment__spinner--overlay", size: 16 })));
63
+ }
64
+ renderCard() {
65
+ return (h("div", { part: "card", class: "bs-attachment__card" }, h("p", { part: "filename", class: "bs-attachment__filename" }, this.fileName), h("span", { part: "badge", class: `bs-attachment__badge bs-attachment__badge--${this.type}` }, this.loading ? h(Spinner, { size: 16 }) : this.type === 'pdf' ? h(FilePdfIcon, null) : h(FileDocIcon, null))));
66
+ }
67
+ static get is() { return "bs-attachment"; }
68
+ static get encapsulation() { return "shadow"; }
69
+ static get originalStyleUrls() {
70
+ return {
71
+ "$": ["bs-attachment.css"]
72
+ };
73
+ }
74
+ static get styleUrls() {
75
+ return {
76
+ "$": ["bs-attachment.css"]
77
+ };
78
+ }
79
+ static get properties() {
80
+ return {
81
+ "type": {
82
+ "type": "string",
83
+ "mutable": false,
84
+ "complexType": {
85
+ "original": "BsAttachmentType",
86
+ "resolved": "\"document\" | \"image\" | \"pdf\"",
87
+ "references": {
88
+ "BsAttachmentType": {
89
+ "location": "local",
90
+ "path": "/Users/vivka/brandsync-web-components/src/components/bs-attachment/bs-attachment.tsx",
91
+ "id": "src/components/bs-attachment/bs-attachment.tsx::BsAttachmentType"
92
+ }
93
+ }
94
+ },
95
+ "required": false,
96
+ "optional": false,
97
+ "docs": {
98
+ "tags": [],
99
+ "text": "Which kind of attachment preview to render."
100
+ },
101
+ "getter": false,
102
+ "setter": false,
103
+ "reflect": false,
104
+ "attribute": "type",
105
+ "defaultValue": "'image'"
106
+ },
107
+ "fileName": {
108
+ "type": "string",
109
+ "mutable": false,
110
+ "complexType": {
111
+ "original": "string",
112
+ "resolved": "string",
113
+ "references": {}
114
+ },
115
+ "required": false,
116
+ "optional": false,
117
+ "docs": {
118
+ "tags": [],
119
+ "text": "The filename shown on the card. Only used when `type` is \"pdf\" or \"document\"."
120
+ },
121
+ "getter": false,
122
+ "setter": false,
123
+ "reflect": false,
124
+ "attribute": "file-name",
125
+ "defaultValue": "'Attachment'"
126
+ },
127
+ "imageSrc": {
128
+ "type": "string",
129
+ "mutable": false,
130
+ "complexType": {
131
+ "original": "string",
132
+ "resolved": "string",
133
+ "references": {}
134
+ },
135
+ "required": false,
136
+ "optional": true,
137
+ "docs": {
138
+ "tags": [],
139
+ "text": "The thumbnail image URL. Only used when `type` is \"image\"."
140
+ },
141
+ "getter": false,
142
+ "setter": false,
143
+ "reflect": false,
144
+ "attribute": "image-src"
145
+ },
146
+ "imageAlt": {
147
+ "type": "string",
148
+ "mutable": false,
149
+ "complexType": {
150
+ "original": "string",
151
+ "resolved": "string",
152
+ "references": {}
153
+ },
154
+ "required": false,
155
+ "optional": false,
156
+ "docs": {
157
+ "tags": [],
158
+ "text": "Accessible alt text for the image thumbnail. Only used when `type` is \"image\"."
159
+ },
160
+ "getter": false,
161
+ "setter": false,
162
+ "reflect": false,
163
+ "attribute": "image-alt",
164
+ "defaultValue": "''"
165
+ },
166
+ "loading": {
167
+ "type": "boolean",
168
+ "mutable": false,
169
+ "complexType": {
170
+ "original": "boolean",
171
+ "resolved": "boolean",
172
+ "references": {}
173
+ },
174
+ "required": false,
175
+ "optional": false,
176
+ "docs": {
177
+ "tags": [],
178
+ "text": "Shows an upload-in-progress spinner (blurred + overlaid for images, in the badge for files)."
179
+ },
180
+ "getter": false,
181
+ "setter": false,
182
+ "reflect": false,
183
+ "attribute": "loading",
184
+ "defaultValue": "false"
185
+ },
186
+ "removable": {
187
+ "type": "boolean",
188
+ "mutable": false,
189
+ "complexType": {
190
+ "original": "boolean",
191
+ "resolved": "boolean",
192
+ "references": {}
193
+ },
194
+ "required": false,
195
+ "optional": false,
196
+ "docs": {
197
+ "tags": [],
198
+ "text": "Whether the hover/focus-revealed remove button is rendered at all."
199
+ },
200
+ "getter": false,
201
+ "setter": false,
202
+ "reflect": false,
203
+ "attribute": "removable",
204
+ "defaultValue": "true"
205
+ }
206
+ };
207
+ }
208
+ static get events() {
209
+ return [{
210
+ "method": "bsRemove",
211
+ "name": "bsRemove",
212
+ "bubbles": true,
213
+ "cancelable": true,
214
+ "composed": true,
215
+ "docs": {
216
+ "tags": [],
217
+ "text": "Fires when the remove button is clicked."
218
+ },
219
+ "complexType": {
220
+ "original": "void",
221
+ "resolved": "void",
222
+ "references": {}
223
+ }
224
+ }];
225
+ }
226
+ }
227
+ const Spinner = ({ class: className, size = 16 }) => (h("span", { class: `bs-attachment__spinner ${className ?? ''}`, style: { width: `${size}px`, height: `${size}px` }, role: "status", "aria-label": "Uploading" }));
228
+ const CloseIcon = () => (h("svg", { width: "8", height: "8", viewBox: "0 0 8 8", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true" }, h("path", { d: "M6.25 1.75L1.75 6.25", stroke: "currentColor", "stroke-width": "0.666667", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M6.25 6.25L1.75 1.75", stroke: "currentColor", "stroke-width": "0.666667", "stroke-linecap": "round", "stroke-linejoin": "round" })));
229
+ const FilePdfIcon = () => (h("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true" }, h("path", { d: "M13.5 9.5H11.5V13", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M13 11.5H11.5", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M3 12H4C4.33152 12 4.64946 11.8683 4.88388 11.6339C5.1183 11.3995 5.25 11.0815 5.25 10.75C5.25 10.4185 5.1183 10.1005 4.88388 9.86612C4.64946 9.6317 4.33152 9.5 4 9.5H3V13", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M7 9.5V13H8C8.46413 13 8.90925 12.8156 9.23744 12.4874C9.56563 12.1592 9.75 11.7141 9.75 11.25C9.75 10.7859 9.56563 10.3408 9.23744 10.0126C8.90925 9.68437 8.46413 9.5 8 9.5H7Z", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M3 7V2.5C3 2.36739 3.05268 2.24021 3.14645 2.14645C3.24021 2.05268 3.36739 2 3.5 2H9.5L13 5.5V7", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M9.5 2V5.5H13", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" })));
230
+ const FileDocIcon = () => (h("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true" }, h("path", { d: "M2.25 9.5V13H3.25C3.71413 13 4.15925 12.8156 4.48744 12.4874C4.81563 12.1592 5 11.7141 5 11.25C5 10.7859 4.81563 10.3408 4.48744 10.0126C4.15925 9.68437 3.71413 9.5 3.25 9.5H2.25Z", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M13.5 12.5544C13.3724 12.6928 13.2179 12.8038 13.046 12.8804C12.874 12.957 12.6882 12.9977 12.5 13C11.6712 13 11 12.2163 11 11.25C11 10.2837 11.6712 9.5 12.5 9.5C12.6882 9.50228 12.874 9.54298 13.046 9.61961C13.2179 9.69624 13.3724 9.80718 13.5 9.94563", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M3 7V2.5C3 2.36739 3.05268 2.24021 3.14645 2.14645C3.24021 2.05268 3.36739 2 3.5 2H9.5L13 5.5V7", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M9.5 2V5.5H13", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { d: "M8 13C8.82843 13 9.5 12.2165 9.5 11.25C9.5 10.2835 8.82843 9.5 8 9.5C7.17157 9.5 6.5 10.2835 6.5 11.25C6.5 12.2165 7.17157 13 8 13Z", stroke: "white", "stroke-linecap": "round", "stroke-linejoin": "round" })));
@@ -0,0 +1,58 @@
1
+ import { html } from "lit";
2
+ import { componentDescription, propDescription } from "../../stories-utils";
3
+ const SAMPLE_IMAGE = 'https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=200&h=200&fit=crop';
4
+ const meta = {
5
+ title: 'Genie AI Components/bs-attachment',
6
+ parameters: { docs: { description: { component: componentDescription('bs-attachment') } } },
7
+ render: args => html `
8
+ <bs-attachment
9
+ type=${args.type}
10
+ file-name=${args.fileName}
11
+ image-src=${args.imageSrc}
12
+ ?loading=${args.loading}
13
+ ?removable=${args.removable}
14
+ ></bs-attachment>
15
+ `,
16
+ argTypes: {
17
+ type: { control: 'select', options: ['image', 'pdf', 'document'], description: propDescription('bs-attachment', 'type') },
18
+ fileName: { control: 'text', description: propDescription('bs-attachment', 'fileName') },
19
+ imageSrc: { control: 'text', description: propDescription('bs-attachment', 'imageSrc') },
20
+ loading: { control: 'boolean', description: propDescription('bs-attachment', 'loading') },
21
+ removable: { control: 'boolean', description: propDescription('bs-attachment', 'removable') },
22
+ },
23
+ args: {
24
+ type: 'image',
25
+ fileName: 'Dummy-pdf-in-here',
26
+ imageSrc: SAMPLE_IMAGE,
27
+ loading: false,
28
+ removable: true,
29
+ },
30
+ };
31
+ export default meta;
32
+ export const Default = {};
33
+ export const Pdf = {
34
+ args: { type: 'pdf' },
35
+ };
36
+ export const Document = {
37
+ args: { type: 'document' },
38
+ };
39
+ export const ImageLoading = {
40
+ name: 'Image (loading)',
41
+ args: { loading: true },
42
+ };
43
+ export const PdfLoading = {
44
+ name: 'PDF (loading)',
45
+ args: { type: 'pdf', loading: true },
46
+ };
47
+ export const Gallery = {
48
+ render: () => html `
49
+ <div style="display: flex; gap: 8px; flex-wrap: wrap;">
50
+ <bs-attachment type="image" image-src=${SAMPLE_IMAGE}></bs-attachment>
51
+ <bs-attachment type="pdf" file-name="Dummy-pdf-in-here"></bs-attachment>
52
+ <bs-attachment type="document" file-name="Dummy-pdf-in-here"></bs-attachment>
53
+ <bs-attachment type="image" image-src=${SAMPLE_IMAGE} loading></bs-attachment>
54
+ <bs-attachment type="pdf" file-name="Dummy-pdf-in-here" loading></bs-attachment>
55
+ <bs-attachment type="document" file-name="Dummy-pdf-in-here" loading></bs-attachment>
56
+ </div>
57
+ `,
58
+ };
@@ -0,0 +1,28 @@
1
+ import { render, h, describe, it, expect, vi } from "@stencil/vitest";
2
+ describe('bs-attachment-list', () => {
3
+ it('renders slotted attachments inside the scrollable row', async () => {
4
+ const { root } = await render(h("bs-attachment-list", null, h("bs-attachment", { type: "pdf", "file-name": "report.pdf" })));
5
+ const row = root.shadowRoot.querySelector('[part="row"]');
6
+ expect(row).not.toBeNull();
7
+ expect(root.querySelector('bs-attachment')).not.toBeNull();
8
+ });
9
+ it('has an accessible group label on the row by default', async () => {
10
+ const { root } = await render(h("bs-attachment-list", null));
11
+ expect(root.shadowRoot.querySelector('[part="row"]').getAttribute('aria-label')).toBe('Attachments');
12
+ });
13
+ it('does not render the fade overlay when content fits without scrolling', async () => {
14
+ const { root } = await render(h("bs-attachment-list", null));
15
+ expect(root.shadowRoot.querySelector('[part="fade"]')).toBeNull();
16
+ });
17
+ it('shows the fade overlay once the row has more content than fits', async () => {
18
+ const { root, waitForChanges } = await render(h("bs-attachment-list", null));
19
+ const row = root.shadowRoot.querySelector('[part="row"]');
20
+ // jsdom never actually lays out content, so scrollWidth/clientWidth are always 0 -- fake the
21
+ // "more content than fits" condition directly rather than relying on real layout.
22
+ vi.spyOn(row, 'scrollWidth', 'get').mockReturnValue(500);
23
+ vi.spyOn(row, 'clientWidth', 'get').mockReturnValue(300);
24
+ row.dispatchEvent(new Event('scroll'));
25
+ await waitForChanges();
26
+ expect(root.shadowRoot.querySelector('[part="fade"]')).not.toBeNull();
27
+ });
28
+ });
@@ -0,0 +1,56 @@
1
+ :host {
2
+ display: block;
3
+ --bs-attachment-list-gap: 10px;
4
+ --bs-attachment-list-padding: var(--bs-spacing-150);
5
+ --bs-attachment-list-fade-color: var(--bs-static-white);
6
+ --bs-attachment-list-fade-width: var(--bs-spacing-800);
7
+ --bs-attachment-list-scrollbar-thumb: var(--bs-neutral-300);
8
+ }
9
+
10
+ .bs-attachment-list {
11
+ box-sizing: border-box;
12
+ position: relative;
13
+ }
14
+
15
+ .bs-attachment-list__row {
16
+ box-sizing: border-box;
17
+ display: flex;
18
+ align-items: flex-start;
19
+ gap: var(--bs-attachment-list-gap);
20
+ padding: var(--bs-attachment-list-padding);
21
+ overflow-x: auto;
22
+ /* Hidden by default (Firefox); WebKit/Blink hide it via the ::-webkit-scrollbar rules below
23
+ * instead, then reveal a styled thumb on hover/focus -- see the comment there for why this
24
+ * can't be a single cross-browser rule. */
25
+ scrollbar-width: none;
26
+ }
27
+
28
+ .bs-attachment-list__row::-webkit-scrollbar {
29
+ height: 4px;
30
+ }
31
+
32
+ .bs-attachment-list__row::-webkit-scrollbar-track {
33
+ background: transparent;
34
+ }
35
+
36
+ .bs-attachment-list__row::-webkit-scrollbar-thumb {
37
+ /* Transparent (not display:none) so the thumb still reserves its track space and the reveal on
38
+ * hover/focus below is just a color change, not a layout shift. */
39
+ background: transparent;
40
+ border-radius: var(--bs-border-radius-full);
41
+ }
42
+
43
+ .bs-attachment-list__row:hover::-webkit-scrollbar-thumb,
44
+ .bs-attachment-list__row:focus-within::-webkit-scrollbar-thumb {
45
+ background: var(--bs-attachment-list-scrollbar-thumb);
46
+ }
47
+
48
+ .bs-attachment-list__fade {
49
+ position: absolute;
50
+ top: 0;
51
+ right: 0;
52
+ bottom: 0;
53
+ width: var(--bs-attachment-list-fade-width);
54
+ pointer-events: none;
55
+ background: linear-gradient(to right, transparent, var(--bs-attachment-list-fade-color));
56
+ }
@@ -0,0 +1,105 @@
1
+ import { h } from "@stencil/core";
2
+ /**
3
+ * A horizontally-scrolling row wrapper for one or more `bs-attachment` previews, for slotting into
4
+ * `bs-composer`'s `attachments` slot when a Genie AI chat message has file attachments.
5
+ *
6
+ * ## When to use
7
+ * - Wrapping any number of `bs-attachment` elements the user has attached to a message, so they
8
+ * lay out in a single row and scroll horizontally instead of wrapping/overflowing once there
9
+ * are more than fit the available width.
10
+ *
11
+ * ## When not to use
12
+ * - A single attachment on its own — just render `bs-attachment` directly, this wrapper's
13
+ * scroll/fade affordance only matters once there's more content than fits.
14
+ *
15
+ * @slot - One or more `bs-attachment` elements.
16
+ * @part row - The scrollable flex row containing the slotted attachments.
17
+ * @part fade - The right-edge fade-out overlay shown only while the row has more content to
18
+ * scroll to.
19
+ * @prop --bs-attachment-list-gap - Gap between attachments. Matches the 10px Figma spec (not tied
20
+ * to the `--bs-spacing-*` scale, which only has 8px/12px neighbors).
21
+ * @prop --bs-attachment-list-padding - Padding around the row. Aliased to `--bs-spacing-150`.
22
+ * @prop --bs-attachment-list-fade-color - Color the right-edge fade blends into. Aliased to
23
+ * `--bs-static-white`.
24
+ * @prop --bs-attachment-list-fade-width - Width of the right-edge fade overlay. Aliased to
25
+ * `--bs-spacing-800`.
26
+ * @prop --bs-attachment-list-scrollbar-thumb - Color of the scrollbar thumb that appears on
27
+ * hover/focus once the row is scrollable. Aliased to `--bs-neutral-300`.
28
+ */
29
+ export class BsAttachmentList {
30
+ el;
31
+ /** Accessible name for the scrollable region. */
32
+ ariaLabel = 'Attachments';
33
+ /** Whether the row currently has more content than fits (drives the fade + scrollbar-on-hover). */
34
+ canScrollRight = false;
35
+ row;
36
+ resizeObserver;
37
+ componentDidLoad() {
38
+ this.updateScrollState();
39
+ this.resizeObserver = new ResizeObserver(() => this.updateScrollState());
40
+ this.resizeObserver.observe(this.el);
41
+ }
42
+ disconnectedCallback() {
43
+ this.resizeObserver?.disconnect();
44
+ }
45
+ onSlotchange = () => {
46
+ this.updateScrollState();
47
+ };
48
+ onScroll = () => {
49
+ this.updateScrollState();
50
+ };
51
+ updateScrollState = () => {
52
+ const row = this.row;
53
+ if (!row)
54
+ return;
55
+ // +1 tolerance: some browsers report fractional scrollWidth/clientWidth that differ by less
56
+ // than a pixel even when there's nothing left to scroll, which would otherwise leave the fade
57
+ // stuck on permanently.
58
+ this.canScrollRight = row.scrollWidth - row.clientWidth - row.scrollLeft > 1;
59
+ };
60
+ render() {
61
+ return (h("div", { key: 'adf8ddac319b3d891d0895cb7e488b875f4bce5e', class: "bs-attachment-list" }, h("div", { key: 'd4247a77596a1a33d03f8657ec015f2d00b4138d', part: "row", class: "bs-attachment-list__row", ref: el => (this.row = el), onScroll: this.onScroll, role: "group", "aria-label": this.ariaLabel, tabIndex: 0 }, h("slot", { key: 'b4745ab38ca82a43bc48a7bc02669942b2eb0e0f', onSlotchange: this.onSlotchange })), this.canScrollRight && h("div", { key: '58bb4815a8fb296f0788c8a4adfb9780049d641d', part: "fade", class: "bs-attachment-list__fade", "aria-hidden": "true" })));
62
+ }
63
+ static get is() { return "bs-attachment-list"; }
64
+ static get encapsulation() { return "shadow"; }
65
+ static get originalStyleUrls() {
66
+ return {
67
+ "$": ["bs-attachment-list.css"]
68
+ };
69
+ }
70
+ static get styleUrls() {
71
+ return {
72
+ "$": ["bs-attachment-list.css"]
73
+ };
74
+ }
75
+ static get properties() {
76
+ return {
77
+ "ariaLabel": {
78
+ "type": "string",
79
+ "mutable": false,
80
+ "complexType": {
81
+ "original": "string | null",
82
+ "resolved": "string",
83
+ "references": {}
84
+ },
85
+ "required": false,
86
+ "optional": false,
87
+ "docs": {
88
+ "tags": [],
89
+ "text": "Accessible name for the scrollable region."
90
+ },
91
+ "getter": false,
92
+ "setter": false,
93
+ "reflect": false,
94
+ "attribute": "aria-label",
95
+ "defaultValue": "'Attachments'"
96
+ }
97
+ };
98
+ }
99
+ static get states() {
100
+ return {
101
+ "canScrollRight": {}
102
+ };
103
+ }
104
+ static get elementRef() { return "el"; }
105
+ }