@brandsync/wc 1.9.0 → 1.10.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 (229) hide show
  1. package/custom-elements.json +4520 -3613
  2. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -1
  3. package/dist/brandsync-wc/{p-c4de155c.entry.js → p-0132a2d1.entry.js} +1 -1
  4. package/dist/brandsync-wc/{p-051d3064.entry.js → p-041776c0.entry.js} +1 -1
  5. package/dist/brandsync-wc/{p-a09e157f.entry.js → p-08c99a60.entry.js} +1 -1
  6. package/dist/brandsync-wc/{p-70f64b25.entry.js → p-18c3c22c.entry.js} +1 -1
  7. package/dist/brandsync-wc/p-1c3a43c7.entry.js +1 -0
  8. package/dist/brandsync-wc/{p-fddc7bd1.entry.js → p-1c427ffb.entry.js} +1 -1
  9. package/dist/brandsync-wc/{p-29027559.entry.js → p-2e958566.entry.js} +1 -1
  10. package/dist/brandsync-wc/{p-235ae012.entry.js → p-301b2455.entry.js} +1 -1
  11. package/dist/brandsync-wc/{p-8ee0153b.entry.js → p-32cd69f1.entry.js} +1 -1
  12. package/dist/brandsync-wc/p-4f2c4929.entry.js +1 -0
  13. package/dist/brandsync-wc/{p-a0d5a620.entry.js → p-50a251a4.entry.js} +1 -1
  14. package/dist/brandsync-wc/{p-0e39b9cc.entry.js → p-5f3cd501.entry.js} +1 -1
  15. package/dist/brandsync-wc/{p-fc240aa0.entry.js → p-701ebf4a.entry.js} +1 -1
  16. package/dist/brandsync-wc/{p-0eed6813.entry.js → p-763876f5.entry.js} +1 -1
  17. package/dist/brandsync-wc/{p-f7d47c17.entry.js → p-76e1c295.entry.js} +1 -1
  18. package/dist/brandsync-wc/p-790db8b3.entry.js +1 -0
  19. package/dist/brandsync-wc/{p-4e5dcaff.entry.js → p-796a1860.entry.js} +1 -1
  20. package/dist/brandsync-wc/{p-36bf37d9.entry.js → p-806a5347.entry.js} +1 -1
  21. package/dist/brandsync-wc/{p-6331de9c.entry.js → p-8eba7f90.entry.js} +1 -1
  22. package/dist/brandsync-wc/{p-6fd7dd6a.entry.js → p-96ed9386.entry.js} +1 -1
  23. package/dist/brandsync-wc/{p-cfcf3f0a.entry.js → p-9e88f19c.entry.js} +1 -1
  24. package/dist/brandsync-wc/{p-de7c946d.entry.js → p-a71d2811.entry.js} +1 -1
  25. package/dist/brandsync-wc/{p-33e44094.entry.js → p-a8e2a829.entry.js} +1 -1
  26. package/dist/brandsync-wc/{p-3b64e3cd.entry.js → p-addfa0a0.entry.js} +1 -1
  27. package/dist/brandsync-wc/{p-4574a707.entry.js → p-af2bf957.entry.js} +1 -1
  28. package/dist/brandsync-wc/{p-6bf2f116.entry.js → p-b2074a32.entry.js} +1 -1
  29. package/dist/brandsync-wc/{p-7c94e6ae.entry.js → p-c99b6a66.entry.js} +1 -1
  30. package/dist/brandsync-wc/{p-2891d40b.entry.js → p-c9a72416.entry.js} +1 -1
  31. package/dist/brandsync-wc/{p-9f65f998.entry.js → p-d3f44cb7.entry.js} +1 -1
  32. package/dist/brandsync-wc/p-d42b1c2b.entry.js +1 -0
  33. package/dist/brandsync-wc/{p-3ec74d35.entry.js → p-daab6b22.entry.js} +1 -1
  34. package/dist/brandsync-wc/{p-107b1c5d.entry.js → p-dbcbe682.entry.js} +1 -1
  35. package/dist/brandsync-wc/{p-3176d1d3.entry.js → p-e8a5b8eb.entry.js} +1 -1
  36. package/dist/brandsync-wc/{p-062cfa34.entry.js → p-ea4e20ef.entry.js} +1 -1
  37. package/dist/brandsync-wc/{p-27bbed83.entry.js → p-f370b8fa.entry.js} +1 -1
  38. package/dist/brandsync-wc/{p-05c7de28.entry.js → p-f89de457.entry.js} +1 -1
  39. package/dist/brandsync-wc/{p-114d2fd8.entry.js → p-fd254972.entry.js} +1 -1
  40. package/dist/cjs/brandsync-wc.cjs.js +1 -1
  41. package/dist/cjs/bs-ai-disclaimer.cjs.entry.js +1 -1
  42. package/dist/cjs/bs-ai-greeting.cjs.entry.js +1 -1
  43. package/dist/cjs/bs-ai-thinking.cjs.entry.js +1 -1
  44. package/dist/cjs/bs-attachment-list.cjs.entry.js +1 -1
  45. package/dist/cjs/bs-breadcrumbs.cjs.entry.js +1 -1
  46. package/dist/cjs/bs-button-skeleton.cjs.entry.js +1 -1
  47. package/dist/cjs/bs-chatbot-feedback.cjs.entry.js +1 -1
  48. package/dist/cjs/bs-chatbot-header.cjs.entry.js +1 -1
  49. package/dist/cjs/bs-chatbot-response-action.cjs.entry.js +1 -1
  50. package/dist/cjs/bs-chatbot-sources-drawer.cjs.entry.js +1 -1
  51. package/dist/cjs/bs-chatbot-suggestion-button.cjs.entry.js +1 -1
  52. package/dist/cjs/bs-checkbox-skeleton.cjs.entry.js +1 -1
  53. package/dist/cjs/bs-datepicker.cjs.entry.js +410 -0
  54. package/dist/cjs/bs-file-upload-item.cjs.entry.js +1 -1
  55. package/dist/cjs/bs-file-upload.cjs.entry.js +1 -1
  56. package/dist/cjs/bs-icon-button.cjs.entry.js +1 -1
  57. package/dist/cjs/bs-inline-tab.cjs.entry.js +1 -1
  58. package/dist/cjs/{bs-input.cjs.entry.js → bs-input_2.cjs.entry.js} +37 -4
  59. package/dist/cjs/bs-menu.cjs.entry.js +1 -1
  60. package/dist/cjs/bs-navigation-drawer-item.cjs.entry.js +1 -1
  61. package/dist/cjs/bs-navigation-drawer.cjs.entry.js +2 -2
  62. package/dist/cjs/bs-navigation-header.cjs.entry.js +1 -1
  63. package/dist/cjs/bs-pagination.cjs.entry.js +1 -1
  64. package/dist/cjs/bs-progress-linear.cjs.entry.js +2 -2
  65. package/dist/cjs/bs-progress.cjs.entry.js +2 -2
  66. package/dist/cjs/bs-radio.cjs.entry.js +1 -1
  67. package/dist/cjs/bs-slider.cjs.entry.js +1 -1
  68. package/dist/cjs/bs-snackbar.cjs.entry.js +1 -1
  69. package/dist/cjs/bs-source-link.cjs.entry.js +2 -2
  70. package/dist/cjs/bs-stepper-step.cjs.entry.js +1 -1
  71. package/dist/cjs/bs-stepper.cjs.entry.js +1 -1
  72. package/dist/cjs/bs-switch.cjs.entry.js +1 -1
  73. package/dist/cjs/bs-tab.cjs.entry.js +1 -1
  74. package/dist/cjs/bs-tabs.cjs.entry.js +1 -1
  75. package/dist/cjs/bs-timepicker.cjs.entry.js +209 -0
  76. package/dist/cjs/bs-toast.cjs.entry.js +1 -1
  77. package/dist/cjs/bs-tooltip.cjs.entry.js +1 -1
  78. package/dist/cjs/loader.cjs.js +1 -1
  79. package/dist/collection/collection-manifest.json +2 -0
  80. package/dist/collection/components/bs-a11y.cmp.test.js +4 -0
  81. package/dist/collection/components/bs-ai-disclaimer/bs-ai-disclaimer.js +1 -1
  82. package/dist/collection/components/bs-ai-greeting/bs-ai-greeting.js +1 -1
  83. package/dist/collection/components/bs-ai-thinking/bs-ai-thinking.js +1 -1
  84. package/dist/collection/components/bs-attachment-list/bs-attachment-list.js +1 -1
  85. package/dist/collection/components/bs-breadcrumb/bs-breadcrumbs/bs-breadcrumbs.js +1 -1
  86. package/dist/collection/components/bs-button/bs-icon-button/bs-icon-button.js +1 -1
  87. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +1 -1
  88. package/dist/collection/components/bs-chatbot-feedback/bs-chatbot-feedback.js +1 -1
  89. package/dist/collection/components/bs-chatbot-header/bs-chatbot-header.js +1 -1
  90. package/dist/collection/components/bs-chatbot-response-action/bs-chatbot-response-action.js +1 -1
  91. package/dist/collection/components/bs-chatbot-sources-drawer/bs-chatbot-sources-drawer.js +1 -1
  92. package/dist/collection/components/bs-chatbot-suggestion-button/bs-chatbot-suggestion-button.js +1 -1
  93. package/dist/collection/components/bs-checkbox/bs-checkbox-skeleton/bs-checkbox-skeleton.js +1 -1
  94. package/dist/collection/components/bs-datepicker/bs-datepicker.cmp.test.js +182 -0
  95. package/dist/collection/components/bs-datepicker/bs-datepicker.css +315 -0
  96. package/dist/collection/components/bs-datepicker/bs-datepicker.js +782 -0
  97. package/dist/collection/components/bs-datepicker/bs-datepicker.stories.js +63 -0
  98. package/dist/collection/components/bs-file-upload/bs-file-upload.js +1 -1
  99. package/dist/collection/components/bs-file-upload-item/bs-file-upload-item.js +1 -1
  100. package/dist/collection/components/bs-input/bs-input.js +7 -4
  101. package/dist/collection/components/bs-menu/bs-menu.js +1 -1
  102. package/dist/collection/components/bs-menu-item/bs-menu-item.js +1 -1
  103. package/dist/collection/components/bs-pagination/bs-pagination.js +1 -1
  104. package/dist/collection/components/bs-progress/bs-progress.js +2 -2
  105. package/dist/collection/components/bs-progress-linear/bs-progress-linear.js +2 -2
  106. package/dist/collection/components/bs-radio/bs-radio.js +1 -1
  107. package/dist/collection/components/bs-slider/bs-slider.js +1 -1
  108. package/dist/collection/components/bs-snackbar/bs-snackbar.js +1 -1
  109. package/dist/collection/components/bs-source-link/bs-source-link.js +2 -2
  110. package/dist/collection/components/bs-stepper/bs-stepper/bs-stepper.js +1 -1
  111. package/dist/collection/components/bs-stepper/bs-stepper-step/bs-stepper-step.js +1 -1
  112. package/dist/collection/components/bs-switch/bs-switch.js +1 -1
  113. package/dist/collection/components/bs-tab/bs-inline-tab/bs-inline-tab.js +1 -1
  114. package/dist/collection/components/bs-tab/bs-tab/bs-tab.js +1 -1
  115. package/dist/collection/components/bs-tab/bs-tabs/bs-tabs.js +1 -1
  116. package/dist/collection/components/bs-timepicker/bs-timepicker.cmp.test.js +141 -0
  117. package/dist/collection/components/bs-timepicker/bs-timepicker.css +200 -0
  118. package/dist/collection/components/bs-timepicker/bs-timepicker.js +509 -0
  119. package/dist/collection/components/bs-timepicker/bs-timepicker.stories.js +44 -0
  120. package/dist/collection/components/bs-toast/bs-toast.js +1 -1
  121. package/dist/collection/components/bs-tooltip/bs-tooltip.js +1 -1
  122. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer/bs-navigation-drawer.js +2 -2
  123. package/dist/collection/components/ui-shell/bs-navigation-drawer/bs-navigation-drawer-item/bs-navigation-drawer-item.js +1 -1
  124. package/dist/collection/components/ui-shell/bs-navigation-header/bs-navigation-header/bs-navigation-header.js +1 -1
  125. package/dist/components/bs-ai-disclaimer.js +1 -1
  126. package/dist/components/bs-ai-greeting.js +1 -1
  127. package/dist/components/bs-ai-thinking.js +1 -1
  128. package/dist/components/bs-attachment-list.js +1 -1
  129. package/dist/components/bs-attachment.js +1 -1
  130. package/dist/components/bs-breadcrumb-overflow.js +1 -1
  131. package/dist/components/bs-breadcrumbs.js +1 -1
  132. package/dist/components/bs-button-skeleton.js +1 -1
  133. package/dist/components/bs-carousel.js +1 -1
  134. package/dist/components/bs-chatbot-feedback.js +1 -1
  135. package/dist/components/bs-chatbot-header.js +1 -1
  136. package/dist/components/bs-chatbot-response-action.js +1 -1
  137. package/dist/components/bs-chatbot-sources-drawer.js +1 -1
  138. package/dist/components/bs-chatbot-suggestion-button.js +1 -1
  139. package/dist/components/bs-checkbox-skeleton.js +1 -1
  140. package/dist/components/bs-datepicker.d.ts +11 -0
  141. package/dist/components/bs-datepicker.js +1 -0
  142. package/dist/components/bs-dialog.js +1 -1
  143. package/dist/components/bs-file-upload-item.js +1 -1
  144. package/dist/components/bs-file-upload.js +1 -1
  145. package/dist/components/bs-icon-button.js +1 -1
  146. package/dist/components/bs-inline-tab.js +1 -1
  147. package/dist/components/bs-input.js +1 -1
  148. package/dist/components/bs-menu-item.js +1 -1
  149. package/dist/components/bs-menu.js +1 -1
  150. package/dist/components/bs-navigation-drawer-item.js +1 -1
  151. package/dist/components/bs-navigation-drawer.js +1 -1
  152. package/dist/components/bs-navigation-header.js +1 -1
  153. package/dist/components/bs-pagination.js +1 -1
  154. package/dist/components/bs-progress-linear.js +1 -1
  155. package/dist/components/bs-progress.js +1 -1
  156. package/dist/components/bs-radio.js +1 -1
  157. package/dist/components/bs-slider.js +1 -1
  158. package/dist/components/bs-snackbar.js +1 -1
  159. package/dist/components/bs-source-link.js +1 -1
  160. package/dist/components/bs-stepper-step.js +1 -1
  161. package/dist/components/bs-stepper.js +1 -1
  162. package/dist/components/bs-switch.js +1 -1
  163. package/dist/components/bs-tab.js +1 -1
  164. package/dist/components/bs-tabs.js +1 -1
  165. package/dist/components/bs-timepicker.d.ts +11 -0
  166. package/dist/components/bs-timepicker.js +1 -0
  167. package/dist/components/bs-toast.js +1 -1
  168. package/dist/components/bs-tooltip.js +1 -1
  169. package/dist/components/{p-BA3c9Rom.js → p-B7Icv1ho.js} +1 -1
  170. package/dist/components/{p-wei0Ija2.js → p-BTvme8CE.js} +1 -1
  171. package/dist/components/{p-BoeorHNv.js → p-BYR_ZC8v.js} +1 -1
  172. package/dist/components/p-Ba860ej1.js +1 -0
  173. package/dist/components/p-CPvqZNO8.js +1 -0
  174. package/dist/components/{p-EtXc94lJ.js → p-DkIVyFOP.js} +1 -1
  175. package/dist/components/{p-BfEyD6Ku.js → p-ZK8p5zax.js} +1 -1
  176. package/dist/components/p-jDO25SfF.js +1 -0
  177. package/dist/esm/brandsync-wc.js +1 -1
  178. package/dist/esm/bs-ai-disclaimer.entry.js +1 -1
  179. package/dist/esm/bs-ai-greeting.entry.js +1 -1
  180. package/dist/esm/bs-ai-thinking.entry.js +1 -1
  181. package/dist/esm/bs-attachment-list.entry.js +1 -1
  182. package/dist/esm/bs-breadcrumbs.entry.js +1 -1
  183. package/dist/esm/bs-button-skeleton.entry.js +1 -1
  184. package/dist/esm/bs-chatbot-feedback.entry.js +1 -1
  185. package/dist/esm/bs-chatbot-header.entry.js +1 -1
  186. package/dist/esm/bs-chatbot-response-action.entry.js +1 -1
  187. package/dist/esm/bs-chatbot-sources-drawer.entry.js +1 -1
  188. package/dist/esm/bs-chatbot-suggestion-button.entry.js +1 -1
  189. package/dist/esm/bs-checkbox-skeleton.entry.js +1 -1
  190. package/dist/esm/bs-datepicker.entry.js +408 -0
  191. package/dist/esm/bs-file-upload-item.entry.js +1 -1
  192. package/dist/esm/bs-file-upload.entry.js +1 -1
  193. package/dist/esm/bs-icon-button.entry.js +1 -1
  194. package/dist/esm/bs-inline-tab.entry.js +1 -1
  195. package/dist/esm/{bs-input.entry.js → bs-input_2.entry.js} +37 -5
  196. package/dist/esm/bs-menu.entry.js +1 -1
  197. package/dist/esm/bs-navigation-drawer-item.entry.js +1 -1
  198. package/dist/esm/bs-navigation-drawer.entry.js +2 -2
  199. package/dist/esm/bs-navigation-header.entry.js +1 -1
  200. package/dist/esm/bs-pagination.entry.js +1 -1
  201. package/dist/esm/bs-progress-linear.entry.js +2 -2
  202. package/dist/esm/bs-progress.entry.js +2 -2
  203. package/dist/esm/bs-radio.entry.js +1 -1
  204. package/dist/esm/bs-slider.entry.js +1 -1
  205. package/dist/esm/bs-snackbar.entry.js +1 -1
  206. package/dist/esm/bs-source-link.entry.js +2 -2
  207. package/dist/esm/bs-stepper-step.entry.js +1 -1
  208. package/dist/esm/bs-stepper.entry.js +1 -1
  209. package/dist/esm/bs-switch.entry.js +1 -1
  210. package/dist/esm/bs-tab.entry.js +1 -1
  211. package/dist/esm/bs-tabs.entry.js +1 -1
  212. package/dist/esm/bs-timepicker.entry.js +207 -0
  213. package/dist/esm/bs-toast.entry.js +1 -1
  214. package/dist/esm/bs-tooltip.entry.js +1 -1
  215. package/dist/esm/loader.js +1 -1
  216. package/dist/types/components/bs-datepicker/bs-datepicker.cmp.test.d.ts +1 -0
  217. package/dist/types/components/bs-datepicker/bs-datepicker.d.ts +136 -0
  218. package/dist/types/components/bs-datepicker/bs-datepicker.stories.d.ts +20 -0
  219. package/dist/types/components/bs-timepicker/bs-timepicker.cmp.test.d.ts +1 -0
  220. package/dist/types/components/bs-timepicker/bs-timepicker.d.ts +101 -0
  221. package/dist/types/components/bs-timepicker/bs-timepicker.stories.d.ts +14 -0
  222. package/dist/types/components.d.ts +515 -0
  223. package/package.json +1 -1
  224. package/dist/brandsync-wc/p-7b00dd36.entry.js +0 -1
  225. package/dist/brandsync-wc/p-ae978c9a.entry.js +0 -1
  226. package/dist/brandsync-wc/p-c10d2529.entry.js +0 -1
  227. package/dist/cjs/bs-menu-item.cjs.entry.js +0 -34
  228. package/dist/components/p-Buly0d5G.js +0 -1
  229. package/dist/esm/bs-menu-item.entry.js +0 -32
@@ -0,0 +1,63 @@
1
+ import { html } from "lit";
2
+ import { componentDescription, propDescription } from "../../stories-utils";
3
+ const meta = {
4
+ title: 'Components/bs-datepicker',
5
+ parameters: { docs: { description: { component: componentDescription('bs-datepicker') } } },
6
+ render: args => html `
7
+ <bs-datepicker
8
+ ?range=${args.range}
9
+ value=${args.value}
10
+ start=${args.start}
11
+ end=${args.end}
12
+ min=${args.min || undefined}
13
+ max=${args.max || undefined}
14
+ locale=${args.locale}
15
+ first-day-of-week=${args.firstDayOfWeek}
16
+ @bsChange=${(ev) => console.log('bsChange', ev.detail)}
17
+ ></bs-datepicker>
18
+ `,
19
+ argTypes: {
20
+ range: { control: 'boolean', description: propDescription('bs-datepicker', 'range') },
21
+ value: { control: 'text', description: propDescription('bs-datepicker', 'value') },
22
+ start: { control: 'text', description: propDescription('bs-datepicker', 'start') },
23
+ end: { control: 'text', description: propDescription('bs-datepicker', 'end') },
24
+ min: { control: 'text', description: propDescription('bs-datepicker', 'min') },
25
+ max: { control: 'text', description: propDescription('bs-datepicker', 'max') },
26
+ locale: { control: 'text', description: propDescription('bs-datepicker', 'locale') },
27
+ firstDayOfWeek: { control: { type: 'number', min: 0, max: 6 }, description: propDescription('bs-datepicker', 'firstDayOfWeek') },
28
+ },
29
+ args: {
30
+ range: false,
31
+ value: '2026-09-16',
32
+ start: '',
33
+ end: '',
34
+ min: '',
35
+ max: '',
36
+ locale: 'en-GB',
37
+ firstDayOfWeek: 0,
38
+ },
39
+ };
40
+ export default meta;
41
+ // Figma "Default" type: month/year dropdowns, 16 September 2026 selected.
42
+ export const Default = {};
43
+ // Figma "Range" type: start/end fields, Mon-Sat of one week selected. The Figma's own dates (11-16
44
+ // September) don't line up with the real 2026 calendar, so this uses 14-19 September -- the same
45
+ // Monday-to-Saturday shape, so the band sits in a single row like the design.
46
+ export const Range = {
47
+ args: { range: true, value: '', start: '2026-09-14', end: '2026-09-19' },
48
+ };
49
+ export const RangeAcrossWeeks = {
50
+ name: 'Range across weeks',
51
+ args: { range: true, value: '', start: '2026-09-11', end: '2026-09-24' },
52
+ };
53
+ export const MinMax = {
54
+ name: 'Min and max',
55
+ args: { min: '2026-09-10', max: '2026-09-25' },
56
+ };
57
+ export const MondayFirst = {
58
+ name: 'Week starts on Monday',
59
+ args: { firstDayOfWeek: 1 },
60
+ };
61
+ export const Danish = {
62
+ args: { locale: 'da-DK', firstDayOfWeek: 1 },
63
+ };
@@ -112,7 +112,7 @@ export class BsFileUpload {
112
112
  this.handleFiles(files);
113
113
  };
114
114
  render() {
115
- return (h("div", { key: 'baa70a704a4c3508cd3186f567d0887218a9c04d', part: "dropzone", class: `bs-file-upload bs-file-upload--${this.direction} ${this.dragging ? 'bs-file-upload--dragging' : ''} ${this.disabled ? 'bs-file-upload--disabled' : ''}`, onDragEnter: this.onDragOver, onDragOver: this.onDragOver, onDragLeave: this.onDragLeave, onDrop: this.onDrop }, h("div", { key: 'c5fe3207ba56506a272c42097ec23881bcf863d4', part: "icon", class: "bs-file-upload__icon" }, h("slot", { key: 'd33d8f0f7b17bab679124823c61a1b7c6d031345', name: "icon" }, h(UploadIcon, { key: 'd0356e97a031867f323de21905a2bbca57963962' }))), h("div", { key: 'a5f4fb403556b2b596291bfddad2b73b1765f91f', class: "bs-file-upload__content" }, h("div", { key: 'b99afac250a8d40e54c97f74afde42620da2ff07', class: "bs-file-upload__text" }, this.heading && (h("span", { key: '33a2ce5aac1d8bf15c55dcf8ccfe4fbce6892fd1', part: "heading", class: "bs-file-upload__heading" }, this.heading)), this.description && (h("span", { key: 'eec7f2fcc598412107e7b9c78efae30a3714c674', part: "description", id: "description", class: "bs-file-upload__description" }, this.description))), h("bs-button", { key: 'f44a5747bb0e9452aefa1fe2fc1d51b1af7da9b1', part: "browse", variant: "neutral", size: "sm", disabled: this.disabled, onClick: this.onBrowse }, this.buttonLabel)), h("input", { key: 'c8e19f95978d103f535bf26fb64c34ff69c4c7ee', ref: el => (this.inputEl = el), class: "bs-file-upload__input", type: "file", hidden: true, tabindex: -1, accept: this.accept, multiple: this.multiple, disabled: this.disabled, "aria-describedby": this.description ? 'description' : undefined, onChange: this.onInputChange })));
115
+ return (h("div", { key: 'b33535fd240d2d406118fd64fd9c227dea7ecd6e', part: "dropzone", class: `bs-file-upload bs-file-upload--${this.direction} ${this.dragging ? 'bs-file-upload--dragging' : ''} ${this.disabled ? 'bs-file-upload--disabled' : ''}`, onDragEnter: this.onDragOver, onDragOver: this.onDragOver, onDragLeave: this.onDragLeave, onDrop: this.onDrop }, h("div", { key: '38cc0d7e10cbdfd9daef5749c2b50ec7c9123f71', part: "icon", class: "bs-file-upload__icon" }, h("slot", { key: '0e9cadb8101a73f55410eb30b2ddbf9c5e2cd0ed', name: "icon" }, h(UploadIcon, { key: '3f745666d0967ab5de4a6824a0fc8b3e0f7f900b' }))), h("div", { key: '7e347497915149907ade2e90aa19bd339b013be9', class: "bs-file-upload__content" }, h("div", { key: 'ea3a760d44b38cd5397d5952dbee998ddb2bea1b', class: "bs-file-upload__text" }, this.heading && (h("span", { key: '9e00cc05d2b479964502243e1dda32eb7fa81e42', part: "heading", class: "bs-file-upload__heading" }, this.heading)), this.description && (h("span", { key: 'abb9857cdd2c85a7730101d05a5704d947c669bd', part: "description", id: "description", class: "bs-file-upload__description" }, this.description))), h("bs-button", { key: '98dea0715d7c0c641c552025403febd13fe4c32f', part: "browse", variant: "neutral", size: "sm", disabled: this.disabled, onClick: this.onBrowse }, this.buttonLabel)), h("input", { key: '0c83fdaba93b46128e4990f9d15a746fd95479f5', ref: el => (this.inputEl = el), class: "bs-file-upload__input", type: "file", hidden: true, tabindex: -1, accept: this.accept, multiple: this.multiple, disabled: this.disabled, "aria-describedby": this.description ? 'description' : undefined, onChange: this.onInputChange })));
116
116
  }
117
117
  static get is() { return "bs-file-upload"; }
118
118
  static get encapsulation() { return "shadow"; }
@@ -86,7 +86,7 @@ export class BsFileUploadItem {
86
86
  }
87
87
  render() {
88
88
  const removing = this.state === 'success';
89
- return (h("div", { key: 'd26aebbbdb7858444d2ff3084c421ce1e70acd9e', part: "item", class: `bs-file-upload-item bs-file-upload-item--${this.state}` }, h("div", { key: '2bf21442cc31bc9f85178e97bdae140de59fd7ce', part: "thumbnail", class: "bs-file-upload-item__thumbnail" }, h("slot", { key: 'fb9a9d723855e6d2556e61fb5cc7414e296ddf89', name: "thumbnail" }, this.thumbnailSrc ? (h("img", { class: "bs-file-upload-item__image", src: this.thumbnailSrc, alt: this.thumbnailAlt })) : (h(ImageIcon, null)))), h("div", { key: 'ca1cab03c21d93b4fe754e8e4575bbee5c6c11bd', class: "bs-file-upload-item__content" }, h("div", { key: '072532a7cfb4a699ab9920594ed4299bd094eea3', class: "bs-file-upload-item__meta" }, h("span", { key: 'f30ec89b3af9d5a4fc3ea2cf9252713f47a68ba2', part: "name", class: "bs-file-upload-item__name" }, this.fileName), this.fileSize && (h("span", { key: '63aeb6db94d78011a649fa1a0771d488890c330b', part: "size", class: "bs-file-upload-item__size" }, this.fileSize))), this.renderStatus()), h("bs-icon-button", { key: '5434d917777db308f8b16f84e2ccd5efcfb46dc8', part: "action", variant: "subtle", size: "lg", ariaLabel: removing ? this.removeLabel : this.cancelLabel, onClick: this.onAction }, removing ? h(TrashIcon, null) : h(CloseIcon, null))));
89
+ return (h("div", { key: '6b7fc89949cfa70838cc60d94ccb91afe09f75cd', part: "item", class: `bs-file-upload-item bs-file-upload-item--${this.state}` }, h("div", { key: '55923d2fc56d8b1794a3a0d835440cd428e1e168', part: "thumbnail", class: "bs-file-upload-item__thumbnail" }, h("slot", { key: '25f93a00ba465db98c73f1bf38abc46110ae5c82', name: "thumbnail" }, this.thumbnailSrc ? (h("img", { class: "bs-file-upload-item__image", src: this.thumbnailSrc, alt: this.thumbnailAlt })) : (h(ImageIcon, null)))), h("div", { key: 'ab975fe4e7e888755f9ceae00b6633f86b856c47', class: "bs-file-upload-item__content" }, h("div", { key: '6b1c9161edd76c799f0c545e2f939907bbb1dcee', class: "bs-file-upload-item__meta" }, h("span", { key: '3b7ca85e645d19b1ef1affff55a8e2a2284aff72', part: "name", class: "bs-file-upload-item__name" }, this.fileName), this.fileSize && (h("span", { key: '70dd2e29628bd536dac520ffe653bc7651f41c33', part: "size", class: "bs-file-upload-item__size" }, this.fileSize))), this.renderStatus()), h("bs-icon-button", { key: '5ac7e596601ebdb35add9e278f17f67db4758e48', part: "action", variant: "subtle", size: "lg", ariaLabel: removing ? this.removeLabel : this.cancelLabel, onClick: this.onAction }, removing ? h(TrashIcon, null) : h(CloseIcon, null))));
90
90
  }
91
91
  static get is() { return "bs-file-upload-item"; }
92
92
  static get encapsulation() { return "shadow"; }
@@ -314,7 +314,10 @@ export class BsInput {
314
314
  }
315
315
  renderStandardControl() {
316
316
  const nativeType = this.type === 'password' ? (this.passwordVisible ? 'text' : 'password') : this.type === 'dropdown' ? 'text' : this.type;
317
- return (h("input", { id: "control", part: "control", class: "bs-input__control", type: nativeType, value: this.value, placeholder: this.placeholder, disabled: this.disabled, readOnly: this.type === 'dropdown', min: this.type === 'number' ? this.min : undefined, max: this.type === 'number' ? this.max : undefined, step: this.type === 'number' ? this.step : undefined, "aria-describedby": this.error || this.description ? 'description-or-error' : undefined, "aria-invalid": this.error ? 'true' : undefined, "aria-required": this.required ? 'true' : undefined, onInput: this.onInput, onChange: this.onChange }));
317
+ return (h("input", { id: "control", part: "control", class: "bs-input__control", type: nativeType, value: this.value, placeholder: this.placeholder, disabled: this.disabled, readOnly: this.type === 'dropdown',
318
+ // The popup state belongs on the focusable control (a roleless wrapper div can't carry
319
+ // aria-haspopup/aria-expanded -- axe's aria-allowed-attr flags it).
320
+ role: this.type === 'dropdown' ? 'combobox' : undefined, "aria-haspopup": this.type === 'dropdown' ? 'listbox' : undefined, "aria-expanded": this.type === 'dropdown' ? String(this.open) : undefined, min: this.type === 'number' ? this.min : undefined, max: this.type === 'number' ? this.max : undefined, step: this.type === 'number' ? this.step : undefined, "aria-describedby": this.error || this.description ? 'description-or-error' : undefined, "aria-invalid": this.error ? 'true' : undefined, "aria-required": this.required ? 'true' : undefined, onInput: this.onInput, onChange: this.onChange }));
318
321
  }
319
322
  renderSelectControl() {
320
323
  return (h("select", { id: "control", part: "control", class: "bs-input__control", disabled: this.disabled, "aria-describedby": this.error || this.description ? 'description-or-error' : undefined, "aria-invalid": this.error ? 'true' : undefined, "aria-required": this.required ? 'true' : undefined, onInput: this.onInput, onChange: this.onChange }, this.options.map(opt => (h("option", { value: opt.value, selected: opt.value === this.value }, opt.label)))));
@@ -374,7 +377,7 @@ export class BsInput {
374
377
  .filter(Boolean)
375
378
  .join(' ');
376
379
  const isDropdown = this.type === 'dropdown';
377
- return (h("div", { class: "bs-input__field-wrapper" }, h("div", { part: "field", class: fieldClasses, onClick: isDropdown ? this.onDropdownToggle : undefined, onKeyDown: isDropdown ? this.onDropdownKeydown : undefined, "aria-haspopup": isDropdown ? 'listbox' : undefined, "aria-expanded": isDropdown ? String(this.open) : undefined }, h("span", { part: "icon", class: `bs-input__icon ${this.showsIconArea ? 'bs-input__icon--visible' : ''}` }, this.renderIconContent()), this.renderControl(), h("span", { part: "end-icon", class: `bs-input__end-icon ${this.showsEndIconArea ? 'bs-input__end-icon--visible' : ''}` }, this.renderEndIconContent())), isDropdown && this.open && this.options.length > 0 && (h("bs-menu", { part: "menu", class: "bs-input__dropdown-menu", role: "listbox" }, this.options.map(option => (h("bs-menu-item", { key: option.value, onBsSelect: this.onDropdownOptionSelect(option) }, option.label)))))));
380
+ return (h("div", { class: "bs-input__field-wrapper" }, h("div", { part: "field", class: fieldClasses, onClick: isDropdown ? this.onDropdownToggle : undefined, onKeyDown: isDropdown ? this.onDropdownKeydown : undefined }, h("span", { part: "icon", class: `bs-input__icon ${this.showsIconArea ? 'bs-input__icon--visible' : ''}` }, this.renderIconContent()), this.renderControl(), h("span", { part: "end-icon", class: `bs-input__end-icon ${this.showsEndIconArea ? 'bs-input__end-icon--visible' : ''}` }, this.renderEndIconContent())), isDropdown && this.open && this.options.length > 0 && (h("bs-menu", { part: "menu", class: "bs-input__dropdown-menu", role: "listbox" }, this.options.map(option => (h("bs-menu-item", { key: option.value, onBsSelect: this.onDropdownOptionSelect(option) }, option.label)))))));
378
381
  }
379
382
  renderPinField() {
380
383
  this.pinInputs = [];
@@ -383,10 +386,10 @@ export class BsInput {
383
386
  return (h("div", { part: "field", class: `bs-input__field bs-input__field--pin ${errorClass} ${disabledClass}` }, Array.from({ length: this.length }).map((_, i) => (h("input", { id: i === 0 ? 'control' : undefined, ref: el => (this.pinInputs[i] = el), part: "control", class: "bs-input__pin-cell", type: "text", inputMode: "numeric", maxLength: 1, value: this.value[i] ?? '', disabled: this.disabled, "aria-required": this.required ? 'true' : undefined, onInput: this.onPinInput(i), onKeyDown: this.onPinKeydown(i) })))));
384
387
  }
385
388
  render() {
386
- return (h("div", { key: '1149cfe8eaa6085007a8d9a963b6c909bb6cda13', class: `bs-input ${this.error ? 'bs-input--error' : ''}` }, this.label && (
389
+ return (h("div", { key: '70497bf30b0a244e1df36075d0db77cec5345d6c', class: `bs-input ${this.error ? 'bs-input--error' : ''}` }, this.label && (
387
390
  // "control" is a fixed id, not a generated one -- safe because Shadow DOM scopes ids
388
391
  // to this instance's own shadow root, so it can never collide with another bs-input.
389
- h("label", { key: 'd737018c1e1ebcde529710d8ea58c6bed76f2abf', part: "label", class: "bs-input__label", htmlFor: "control" }, this.label, this.required && (h("span", { key: '5993b19cbfcb8725550c1292c00795c8463e554c', part: "required", class: "bs-input__required", "aria-hidden": "true" }, "*")))), this.type === 'pin' ? this.renderPinField() : this.type === 'initials' ? this.renderInitialsField() : this.renderField(), this.error ? (h("span", { id: "description-or-error", part: "error", class: "bs-input__error" }, h("svg", { part: "error-icon", class: "bs-input__error-icon", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true" }, h("circle", { cx: "8", cy: "8", r: "6.5", stroke: "currentColor", "stroke-width": "1.2" }), h("path", { d: "M8 5V8.5", stroke: "currentColor", "stroke-width": "1.2", "stroke-linecap": "round" }), h("circle", { cx: "8", cy: "11", r: "0.75", fill: "currentColor" })), this.error)) : this.description ? (h("span", { id: "description-or-error", part: "description", class: "bs-input__description" }, this.description)) : null));
392
+ h("label", { key: '527e0d146170d9d11a004d452fa2cb363c5cc7d2', part: "label", class: "bs-input__label", htmlFor: "control" }, this.label, this.required && (h("span", { key: '9dd54a626ec80c774d6deacc3c9dcf02d1fef8a9', part: "required", class: "bs-input__required", "aria-hidden": "true" }, "*")))), this.type === 'pin' ? this.renderPinField() : this.type === 'initials' ? this.renderInitialsField() : this.renderField(), this.error ? (h("span", { id: "description-or-error", part: "error", class: "bs-input__error" }, h("svg", { part: "error-icon", class: "bs-input__error-icon", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true" }, h("circle", { cx: "8", cy: "8", r: "6.5", stroke: "currentColor", "stroke-width": "1.2" }), h("path", { d: "M8 5V8.5", stroke: "currentColor", "stroke-width": "1.2", "stroke-linecap": "round" }), h("circle", { cx: "8", cy: "11", r: "0.75", fill: "currentColor" })), this.error)) : this.description ? (h("span", { id: "description-or-error", part: "description", class: "bs-input__description" }, this.description)) : null));
390
393
  }
391
394
  static get is() { return "bs-input"; }
392
395
  static get encapsulation() { return "shadow"; }
@@ -44,7 +44,7 @@ export class BsMenu {
44
44
  items[next].shadowRoot?.querySelector('button')?.focus();
45
45
  }
46
46
  render() {
47
- return (h("div", { key: '4f2995d0f53f85656de8595fb6a9909833c6369d', part: "list", class: "bs-menu", role: "menu" }, h("slot", { key: '0824f2a784eb4cfa28a2868f19c056570b56ba63' })));
47
+ return (h("div", { key: '24e54ac14b17bc1e45bcd5d7d0fda3250350672a', part: "list", class: "bs-menu", role: "menu" }, h("slot", { key: '57e28eafbb83da6bb14dfe588793edd33b2b5316' })));
48
48
  }
49
49
  static get is() { return "bs-menu"; }
50
50
  static get encapsulation() { return "shadow"; }
@@ -47,7 +47,7 @@ export class BsMenuItem {
47
47
  this.bsSelect.emit();
48
48
  };
49
49
  render() {
50
- return (h("button", { key: '02e1255e64ab0bd0b283927f1321fb5e660c78b6', type: "button", part: "item", role: "menuitem", class: `bs-menu-item ${this.disabled ? 'bs-menu-item--disabled' : ''}`, disabled: this.disabled, "aria-disabled": this.disabled ? 'true' : undefined, onClick: this.onClick }, h("span", { key: 'fb36594dd48bd601a26d9debda9fb1c9bde37f88', part: "icon", class: `bs-menu-item__icon ${this.hasIcon ? 'bs-menu-item__icon--has-content' : ''}` }, h("slot", { key: '19049f5f1f79e6136cd9cc8bcb3669ff97d79c18', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '6ac351a3d3a07bea5bbb5f69bd58c1a7189283fe', part: "label", class: "bs-menu-item__label" }, h("slot", { key: '04215578eb545d824c090cb72f1e493474dca409' }))));
50
+ return (h("button", { key: '5aabea2ec3ad0181e3ff53b3f22873563da69ccd', type: "button", part: "item", role: "menuitem", class: `bs-menu-item ${this.disabled ? 'bs-menu-item--disabled' : ''}`, disabled: this.disabled, "aria-disabled": this.disabled ? 'true' : undefined, onClick: this.onClick }, h("span", { key: '7e180921d99d4f430d72d8dbfeda0ca00881b74a', part: "icon", class: `bs-menu-item__icon ${this.hasIcon ? 'bs-menu-item__icon--has-content' : ''}` }, h("slot", { key: '9d6d15f2d51c271de699b0101f781d8c0f3ab7e9', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '88645fe2991eb91a145e33a4f5e5e59a9ade3248', part: "label", class: "bs-menu-item__label" }, h("slot", { key: 'd3cc0ffcf0f354ffa9c48cbc88a99ec99d4f2db4' }))));
51
51
  }
52
52
  static get is() { return "bs-menu-item"; }
53
53
  static get encapsulation() { return "shadow"; }
@@ -87,7 +87,7 @@ export class BsPagination {
87
87
  }
88
88
  render() {
89
89
  const pageList = this.getPageList();
90
- return (h("nav", { key: 'f5f1e20a72ffc81ca14b05ad735e3ca714069ed3', "aria-label": "Pagination" }, h("ul", { key: '416ef86fe6aca589869e529d1248cbca7ad254ac', part: "list", class: "bs-pagination__list" }, h("li", { key: 'c550eada1eb765db7734e0971f4a2222ad1488e8', part: "item", class: "bs-pagination__item" }, h("button", { key: '8a88280dc813abe71ba3315048ca8931ef2b20cf', part: "prev", type: "button", class: "bs-pagination__control", "aria-label": this.previousLabel, disabled: this.currentPage <= 1, onClick: () => this.goToPage(this.currentPage - 1) }, h(ChevronLeftIcon, { key: 'ea30181c70ff4c7c39852cb978b4cc9307bfa736' }))), pageList.map((item, index) => item === 'ellipsis' ? (h("li", { part: "item", class: "bs-pagination__item", key: `ellipsis-${index}` }, h("span", { part: "ellipsis", class: "bs-pagination__ellipsis", "aria-hidden": "true" }, h(EllipsisIcon, null)))) : (h("li", { part: "item", class: "bs-pagination__item", key: item }, h("button", { part: item === this.currentPage ? 'page current' : 'page', type: "button", class: `bs-pagination__control bs-pagination__page ${item === this.currentPage ? 'bs-pagination__page--current' : ''}`, "aria-label": `Go to page ${item}`, "aria-current": item === this.currentPage ? 'page' : undefined, onClick: () => this.goToPage(item) }, item)))), h("li", { key: '1c587333c1795e4b189c793b442c03e75937ab11', part: "item", class: "bs-pagination__item" }, h("button", { key: '707144112eb882431b9d6ad43f7557be32d08e78', part: "next", type: "button", class: "bs-pagination__control", "aria-label": this.nextLabel, disabled: this.currentPage >= this.safeTotalPages, onClick: () => this.goToPage(this.currentPage + 1) }, h(ChevronRightIcon, { key: '5c94c76cbda7938da625f326ea2ef7ddadce3929' }))))));
90
+ return (h("nav", { key: '9c08eac677410bc05682ff8e4219b63226eb81bd', "aria-label": "Pagination" }, h("ul", { key: '2d62248f42a4a19470ac6a259ab759ccdfd9a245', part: "list", class: "bs-pagination__list" }, h("li", { key: 'db5f800712d37adb8d3d28cd24016a2e3c2cdda1', part: "item", class: "bs-pagination__item" }, h("button", { key: 'cdee1107fa0f38d3e92adb58d2147f97b7b0605f', part: "prev", type: "button", class: "bs-pagination__control", "aria-label": this.previousLabel, disabled: this.currentPage <= 1, onClick: () => this.goToPage(this.currentPage - 1) }, h(ChevronLeftIcon, { key: 'f1293927db7446d8ceb6b8391e9a5796b0fad61c' }))), pageList.map((item, index) => item === 'ellipsis' ? (h("li", { part: "item", class: "bs-pagination__item", key: `ellipsis-${index}` }, h("span", { part: "ellipsis", class: "bs-pagination__ellipsis", "aria-hidden": "true" }, h(EllipsisIcon, null)))) : (h("li", { part: "item", class: "bs-pagination__item", key: item }, h("button", { part: item === this.currentPage ? 'page current' : 'page', type: "button", class: `bs-pagination__control bs-pagination__page ${item === this.currentPage ? 'bs-pagination__page--current' : ''}`, "aria-label": `Go to page ${item}`, "aria-current": item === this.currentPage ? 'page' : undefined, onClick: () => this.goToPage(item) }, item)))), h("li", { key: '530829cfaccd79476c8788f1079991cd7ccc3a4b', part: "item", class: "bs-pagination__item" }, h("button", { key: '9a38949a2dd2de77cf57e3fe7e281c1fe49fcc50', part: "next", type: "button", class: "bs-pagination__control", "aria-label": this.nextLabel, disabled: this.currentPage >= this.safeTotalPages, onClick: () => this.goToPage(this.currentPage + 1) }, h(ChevronRightIcon, { key: '10f3d9f6a79b431ece2c1b8f12e579b210e95e2f' }))))));
91
91
  }
92
92
  static get is() { return "bs-pagination"; }
93
93
  static get encapsulation() { return "shadow"; }
@@ -69,7 +69,7 @@ export class BsProgress {
69
69
  const isDeterminate = this.type === 'determinate';
70
70
  const value = this.clampedValue;
71
71
  const dashOffset = circumference * (1 - value / 100);
72
- return (h("div", { key: 'add8dfafdbee4eaa9712c6e2ba6ddff6f8f6c47f', part: "container", class: "bs-progress" }, h("div", { key: 'fd89c73aa247fc3770187a45dc4681857e257d4e', class: "bs-progress__box", style: { width: `${diameter}px`, height: `${diameter}px` }, role: "progressbar", "aria-label": this.ariaLabel, "aria-valuemin": isDeterminate ? '0' : undefined, "aria-valuemax": isDeterminate ? '100' : undefined, "aria-valuenow": isDeterminate ? String(value) : undefined, "aria-busy": isDeterminate ? undefined : 'true' }, isDeterminate ? (h("svg", { class: "bs-progress__ring", width: diameter, height: diameter, viewBox: `0 0 ${diameter} ${diameter}` }, h("circle", { part: "track", class: "bs-progress__track", cx: diameter / 2, cy: diameter / 2, r: radius, "stroke-width": this.strokeWidth, fill: "none" }), h("circle", { part: "arc", class: "bs-progress__arc", cx: diameter / 2, cy: diameter / 2, r: radius, "stroke-width": this.strokeWidth, fill: "none", "stroke-linecap": "round", "stroke-dasharray": circumference, "stroke-dashoffset": dashOffset }))) : (
72
+ return (h("div", { key: 'b1516c02f0f6ec3865930a5ef1be7bab30c9cdfe', part: "container", class: "bs-progress" }, h("div", { key: '0689f281619a940d73d24bb79d25d54a0863c1af', class: "bs-progress__box", style: { width: `${diameter}px`, height: `${diameter}px` }, role: "progressbar", "aria-label": this.ariaLabel, "aria-valuemin": isDeterminate ? '0' : undefined, "aria-valuemax": isDeterminate ? '100' : undefined, "aria-valuenow": isDeterminate ? String(value) : undefined, "aria-busy": isDeterminate ? undefined : 'true' }, isDeterminate ? (h("svg", { class: "bs-progress__ring", width: diameter, height: diameter, viewBox: `0 0 ${diameter} ${diameter}` }, h("circle", { part: "track", class: "bs-progress__track", cx: diameter / 2, cy: diameter / 2, r: radius, "stroke-width": this.strokeWidth, fill: "none" }), h("circle", { part: "arc", class: "bs-progress__arc", cx: diameter / 2, cy: diameter / 2, r: radius, "stroke-width": this.strokeWidth, fill: "none", "stroke-linecap": "round", "stroke-dasharray": circumference, "stroke-dashoffset": dashOffset }))) : (
73
73
  // Figma's indeterminate ring is a fading "comet tail" (transparent -> solid color),
74
74
  // not a flat-colored partial arc -- SVG has no angular/conic gradient primitive, so a
75
75
  // CSS conic-gradient (color varying by angle) + a radial-gradient mask (carving the
@@ -78,7 +78,7 @@ export class BsProgress {
78
78
  h("div", { part: "arc", class: "bs-progress__spinner", style: {
79
79
  '--bs-progress-spinner-stroke-width': `${this.strokeWidth}px`,
80
80
  '--bs-progress-spinner-sweep': `${INDETERMINATE_SWEEP_DEGREES}deg`,
81
- } }))), isDeterminate && this.showLabel && (h("span", { key: '9c86dc195204f28c06e05bf09f823241bf9f3a86', part: "label", class: `bs-progress__label bs-progress__label--${this.size}` }, value, "%"))));
81
+ } }))), isDeterminate && this.showLabel && (h("span", { key: '2482112c5f6cac5dceffe49bd878e05a526ea64e', part: "label", class: `bs-progress__label bs-progress__label--${this.size}` }, value, "%"))));
82
82
  }
83
83
  static get is() { return "bs-progress"; }
84
84
  static get encapsulation() { return "shadow"; }
@@ -51,13 +51,13 @@ export class BsProgressLinear {
51
51
  render() {
52
52
  const isDeterminate = this.type === 'determinate';
53
53
  const value = this.clampedValue;
54
- return (h("div", { key: '279dbb0cd17b9584b500570d58cc09bd91e8a0d7', part: "container", class: "bs-progress-linear" }, h("div", { key: '9299c229184d172f743fb7fb0dce2a9c55a4496f', part: "track", class: `bs-progress-linear__track bs-progress-linear__track--${this.size}`, role: "progressbar", "aria-label": this.ariaLabel, "aria-valuemin": isDeterminate ? '0' : undefined, "aria-valuemax": isDeterminate ? '100' : undefined, "aria-valuenow": isDeterminate ? String(value) : undefined, "aria-busy": isDeterminate ? undefined : 'true' }, isDeterminate ? (h("div", { part: "fill", class: "bs-progress-linear__fill", style: { width: `${value}%` } })) : (
54
+ return (h("div", { key: '84a59a0536a42cbf196fe981b8574a2e530e99a0', part: "container", class: "bs-progress-linear" }, h("div", { key: '6ef60ecc713e514ee0d11c4f26fe12fd395c685d', part: "track", class: `bs-progress-linear__track bs-progress-linear__track--${this.size}`, role: "progressbar", "aria-label": this.ariaLabel, "aria-valuemin": isDeterminate ? '0' : undefined, "aria-valuemax": isDeterminate ? '100' : undefined, "aria-valuenow": isDeterminate ? String(value) : undefined, "aria-busy": isDeterminate ? undefined : 'true' }, isDeterminate ? (h("div", { part: "fill", class: "bs-progress-linear__fill", style: { width: `${value}%` } })) : (
55
55
  // Figma's indeterminate bar is a soft "comet" gradient segment (transparent -> blue ->
56
56
  // transparent) sliding left-to-right across the track's full width in a loop -- the
57
57
  // same fade concept as bs-progress's indeterminate ring's conic-gradient comet tail,
58
58
  // but along a straight line via a linear-gradient + `transform: translateX(...)`
59
59
  // keyframe animation instead of a rotating conic-gradient.
60
- h("div", { part: "fill", class: "bs-progress-linear__fill bs-progress-linear__fill--indeterminate" }))), this.showLabel && this.hasLabelContent && (h("span", { key: '51a75cae90630fec1d8757d483c239a534385aa7', part: "label", class: "bs-progress-linear__label" }, h("slot", { key: '7e6639ff4f7219cbb3fa09d7c7570268534530b4' })))));
60
+ h("div", { part: "fill", class: "bs-progress-linear__fill bs-progress-linear__fill--indeterminate" }))), this.showLabel && this.hasLabelContent && (h("span", { key: 'd637632ca0bebe53088d4ee0ba984bbb2cf0b212', part: "label", class: "bs-progress-linear__label" }, h("slot", { key: '01830596779d6f41387cff50bbcbc9892ab71162' })))));
61
61
  }
62
62
  // The default slot's assigned content lives in the host's light DOM regardless of whether a
63
63
  // <slot> is currently rendered in the shadow tree, so this can be computed directly from the
@@ -104,7 +104,7 @@ export class BsRadio {
104
104
  }
105
105
  };
106
106
  render() {
107
- return (h("label", { key: '84bfc39d5714d15c45936c8150b9bd7473b79574', class: `bs-radio ${this.disabled ? 'bs-radio--disabled' : ''}` }, h("input", { key: '0a118d5e59f4d33b0411f7be0fba08a706cda298', class: "bs-radio__input", type: "radio", name: this.name, value: this.value, checked: this.checked, disabled: this.disabled, tabIndex: this.checked || !this.groupHasChecked ? 0 : -1, onKeyDown: this.onKeyDown, onChange: this.onChange }), h("span", { key: '889dadd67126819c3d39a5823d48be58a9c71f9f', class: "bs-radio__hit-area" }, h("span", { key: '5bbed4d44bcf4d810693b5912a90855d680540d0', class: "bs-radio__state-layer" }, h("span", { key: '509389527b876127ca456900e3bb4aa21c735f72', part: "circle", class: `bs-radio__circle ${this.checked ? 'bs-radio__circle--selected' : ''}` }, this.checked && h("span", { key: '9a7e335f9646eb72fb06fb0ca9436e763c3ad278', part: "dot", class: "bs-radio__dot" })))), h("span", { key: '2017790d3d99355b4eb93e3659c809df58c61065', part: "label", class: "bs-radio__label" }, h("slot", { key: '199450bb26f7966cdd64b04c78e3015300d793c9' }))));
107
+ return (h("label", { key: 'd261741b6d1823387c7df668759910761da6afec', class: `bs-radio ${this.disabled ? 'bs-radio--disabled' : ''}` }, h("input", { key: '649a22151782938d8aff9229446060a54ce84e98', class: "bs-radio__input", type: "radio", name: this.name, value: this.value, checked: this.checked, disabled: this.disabled, tabIndex: this.checked || !this.groupHasChecked ? 0 : -1, onKeyDown: this.onKeyDown, onChange: this.onChange }), h("span", { key: '3399b1629f64b148957031eac2787dd4a673e0fe', class: "bs-radio__hit-area" }, h("span", { key: 'ed5e9f03d38d76b6e69e3800489ae50c48dfcd19', class: "bs-radio__state-layer" }, h("span", { key: 'e8384a66bf5785aef4c608dde2ff96d0208cd798', part: "circle", class: `bs-radio__circle ${this.checked ? 'bs-radio__circle--selected' : ''}` }, this.checked && h("span", { key: 'abbe35f86db25e6c4732cf056d2f359f73938024', part: "dot", class: "bs-radio__dot" })))), h("span", { key: '6d29a3fd68fdaa511c66535893bedf5e49205d8c', part: "label", class: "bs-radio__label" }, h("slot", { key: '20d9bc9f8008cf775a520f25cef88cec5a36021a' }))));
108
108
  }
109
109
  static get is() { return "bs-radio"; }
110
110
  static get encapsulation() { return "shadow"; }
@@ -229,7 +229,7 @@ export class BsSlider {
229
229
  render() {
230
230
  const isRange = this.type === 'range';
231
231
  const rootClasses = ['bs-slider', this.disabled ? 'bs-slider--disabled' : ''].filter(Boolean).join(' ');
232
- return (h("div", { key: 'f2db9b3d88d97f4183227dca165e4943586100b7', class: rootClasses }, this.showLabel && (h("div", { key: 'b5898da538670e481c1e0c0120f8ac67fec49ffe', class: "bs-slider__header" }, h("span", { key: '3f0257ee85b18fdce7a51825f9e3005b7c8c8985', id: "bs-slider-label", part: "label", class: "bs-slider__label" }, this.label), isRange ? (h("span", { class: "bs-slider__value-fields" }, this.renderPercentField(this.percent(this.effectiveValueStart), this.onStartPercentFieldChange, this.ariaLabel ?? 'Start value'), h("span", { class: "bs-slider__separator" }, "\u2013"), this.renderPercentField(this.percent(this.effectiveValueEnd), this.onEndPercentFieldChange, this.ariaLabel ? `${this.ariaLabel} end` : 'End value'))) : (this.renderPercentField(this.percent(this.value), this.onPercentFieldChange, this.ariaLabel ? `${this.ariaLabel} value` : 'Value')))), h("div", { key: '74adbfd1c596cb0de4bf484cd2ffbc2f283d9074', class: "bs-slider__row" }, this.showLabel && (h("span", { key: '334f03095f5246d4156e7853a1b9d3ddcb594f0a', part: "bound", class: "bs-slider__bound" }, this.min)), isRange ? this.renderRangeThumbs() : this.renderSingleThumb(), this.showLabel && (h("span", { key: '5173a19292bd029121cf9412a2087383700ec61b', part: "bound", class: "bs-slider__bound" }, this.max)))));
232
+ return (h("div", { key: 'c6648b04d434b95f21b9020ee7eb773c30bad01d', class: rootClasses }, this.showLabel && (h("div", { key: '441e317ad19da525a721da0529aadd959a73c3ad', class: "bs-slider__header" }, h("span", { key: '5ed50642ee23d285a472a701bca67f68a05848fc', id: "bs-slider-label", part: "label", class: "bs-slider__label" }, this.label), isRange ? (h("span", { class: "bs-slider__value-fields" }, this.renderPercentField(this.percent(this.effectiveValueStart), this.onStartPercentFieldChange, this.ariaLabel ?? 'Start value'), h("span", { class: "bs-slider__separator" }, "\u2013"), this.renderPercentField(this.percent(this.effectiveValueEnd), this.onEndPercentFieldChange, this.ariaLabel ? `${this.ariaLabel} end` : 'End value'))) : (this.renderPercentField(this.percent(this.value), this.onPercentFieldChange, this.ariaLabel ? `${this.ariaLabel} value` : 'Value')))), h("div", { key: '2883165b7d7c649f317442a5925300c34b183e63', class: "bs-slider__row" }, this.showLabel && (h("span", { key: '7b9d60275fb8e71371277012b4fb460b357da8c8', part: "bound", class: "bs-slider__bound" }, this.min)), isRange ? this.renderRangeThumbs() : this.renderSingleThumb(), this.showLabel && (h("span", { key: '1b450b15db44433662a916dd52aaf961217e71dd', part: "bound", class: "bs-slider__bound" }, this.max)))));
233
233
  }
234
234
  static get is() { return "bs-slider"; }
235
235
  static get encapsulation() { return "shadow"; }
@@ -61,7 +61,7 @@ export class BsSnackbar {
61
61
  this.bsDismiss.emit();
62
62
  };
63
63
  render() {
64
- return (h("div", { key: 'c84de130f993938339fd16d9f534f1da18fe6c0a', part: "container", class: `bs-snackbar bs-snackbar--${this.variant}`, role: "status", "aria-live": this.variant === 'error' ? 'assertive' : 'polite' }, h("div", { key: '0941f900229f6b3208f8268d34b0cde49e4dba22', class: "bs-snackbar__content" }, h("span", { key: 'cf89eff5ea640950573f9b610d6eff46e5d0154e', part: "icon", class: "bs-snackbar__icon", "aria-hidden": "true" }, this.loading ? h("span", { class: "bs-snackbar__spinner" }) : h(CheckCircleIcon, null)), h("span", { key: 'd4ae7e62ecaea7b53962b08d69bae435ecf0a810', part: "message", class: "bs-snackbar__message" }, h("slot", { key: 'a99ec601f27f79f42fc61cd14c0fed742d2fa334' }))), h("div", { key: 'a139c0287e2eacb26ccbd604ff0343bca23eeb5d', class: "bs-snackbar__actions" }, this.actionLabel && (h("bs-button", { key: 'f22c4a63903fdb50da087ab2c38dd076298a12ed', part: "action", variant: ACTION_VARIANT[this.variant], size: "sm", onClick: this.onAction }, this.actionLabel)), h("bs-icon-button", { key: '4cd5c8f367ee71f11dad1f6f47ff1cdf6436a764', part: "close", variant: "subtle", size: "md", ariaLabel: "Dismiss", onClick: this.onDismiss }, h(CloseIcon, { key: 'a52e6af7acf7c95a54aa6cb5237f2b53e30ea601' })))));
64
+ return (h("div", { key: '26d056b4b494847c48b1c60ac0c392334d27d54e', part: "container", class: `bs-snackbar bs-snackbar--${this.variant}`, role: "status", "aria-live": this.variant === 'error' ? 'assertive' : 'polite' }, h("div", { key: '583ad744a0b8c274992bf2e98f5bc06f8937ed4c', class: "bs-snackbar__content" }, h("span", { key: '518b02e526a261be557587bb4d39a93964bcdf24', part: "icon", class: "bs-snackbar__icon", "aria-hidden": "true" }, this.loading ? h("span", { class: "bs-snackbar__spinner" }) : h(CheckCircleIcon, null)), h("span", { key: 'ad8436b86fc5232e74a5e92604adfca129b9c698', part: "message", class: "bs-snackbar__message" }, h("slot", { key: 'b6fa1efe3c4da2e03f3c45fb18f5b899411af791' }))), h("div", { key: '674f7dc064863843406f87cc5c2534e90c7d4b30', class: "bs-snackbar__actions" }, this.actionLabel && (h("bs-button", { key: '56a7051b28197f34a5a11eb3f92087defd3a495a', part: "action", variant: ACTION_VARIANT[this.variant], size: "sm", onClick: this.onAction }, this.actionLabel)), h("bs-icon-button", { key: 'cfb7f10a70ed48f0c0ecfde5212e2ce41aca17f1', part: "close", variant: "subtle", size: "md", ariaLabel: "Dismiss", onClick: this.onDismiss }, h(CloseIcon, { key: '75fd2a71af3f309a19322304e7937a39729638b9' })))));
65
65
  }
66
66
  static get is() { return "bs-snackbar"; }
67
67
  static get encapsulation() { return "shadow"; }
@@ -51,8 +51,8 @@ export class BsSourceLink {
51
51
  };
52
52
  render() {
53
53
  const inner = [
54
- h("span", { key: '5c6382ad80cc971f302da1d80af089306a612e73', class: "bs-source-link__left" }, h("span", { key: '07c8591469e23fe4304846e9282cea0a9eae3ba2', class: "bs-source-link__filename-row" }, h("span", { key: 'ffdb99816134be212cc4d30ebdbf8dd8bcdc085f', part: "icon", class: "bs-source-link__icon" }, h("slot", { key: '475cd85bcb5caa1d3a82d08318731ef4bdf6cb60', name: "icon" }, h(FileTextIcon, { key: '6915810a89f15b823b2b744d30db5b2cefff8162' }))), h("p", { key: '14facc92c71f91701654ea2ce2f9f2ef4b980c5e', part: "filename", class: "bs-source-link__filename" }, this.fileName)), h("span", { key: 'ecd7080f8bc8ce5d7e169f917aaae275ac7a474e', class: "bs-source-link__meta" }, this.sourceName && (h("span", { key: 'f1697d3e278225b26909ec1c40ce2c4cb51c884b', part: "source", class: "bs-source-link__source" }, this.sourceName)), this.sourceName && this.version && h("span", { key: '8efe25341dc7c68ec9c66b91f5f399c9b8ed659f', class: "bs-source-link__dot", "aria-hidden": "true" }), this.version && (h("span", { key: 'cddd46792f911af65434554e56d1cb72d2b88cae', part: "version", class: "bs-source-link__version" }, this.version)))),
55
- h("span", { key: '166b5070329771cd7e8f20689e5b257d3f6f1fd0', part: "arrow", class: "bs-source-link__arrow", "aria-hidden": "true" }, h(ArrowUpRightIcon, { key: 'c2a820c6b36ead5f1bbfd74d84c70cb9894c8f1f' })),
54
+ h("span", { key: '0b24af45da9ac7753eabcfde75547e08e19c2fa5', class: "bs-source-link__left" }, h("span", { key: '305dd947e35832c5dc2cb04585b3289e0c36072e', class: "bs-source-link__filename-row" }, h("span", { key: '09658f61e3806bbd2c4c03c0367ab79ad9a3faa6', part: "icon", class: "bs-source-link__icon" }, h("slot", { key: 'dcbe10c8789f9dbcd95c3d796a555a387a5626ee', name: "icon" }, h(FileTextIcon, { key: 'c56ece8394e6fce4d7a327203c109e72b883ab91' }))), h("p", { key: '293a17d2135821a549b7874338b02c8cec345632', part: "filename", class: "bs-source-link__filename" }, this.fileName)), h("span", { key: 'ac200e11ee885d366f146d7413526661b9d76cfa', class: "bs-source-link__meta" }, this.sourceName && (h("span", { key: 'd076f98b5a70593e575ff764da84cfbecf5ffdef', part: "source", class: "bs-source-link__source" }, this.sourceName)), this.sourceName && this.version && h("span", { key: '50fca70a24f3c4f6c8d8b4a5f1cdb46dba4d7de3', class: "bs-source-link__dot", "aria-hidden": "true" }), this.version && (h("span", { key: 'ccdf4864ed01b0a517118219b55bf8cc7c442548', part: "version", class: "bs-source-link__version" }, this.version)))),
55
+ h("span", { key: '48ef2cf4c2441fb94d48112860a0ee5982176152', part: "arrow", class: "bs-source-link__arrow", "aria-hidden": "true" }, h(ArrowUpRightIcon, { key: '6942e3329d26b9244d57377498ac2b46966c0c64' })),
56
56
  ];
57
57
  return this.href ? (h("a", { class: "bs-source-link", href: this.href, target: this.target, rel: "noopener noreferrer", onClick: this.onClick }, inner)) : (h("button", { type: "button", class: "bs-source-link", onClick: this.onClick }, inner));
58
58
  }
@@ -62,7 +62,7 @@ export class BsStepper {
62
62
  }
63
63
  render() {
64
64
  // role="list" so each bs-stepper-step's role="listitem" has the required parent.
65
- return (h(Host, { key: 'a9c1838c549b0c3ea9cc145624bc38e9edb32a51', role: "list" }, h("slot", { key: '549a18512ad246b5988008b8d2b6a9142e5380a5', onSlotchange: this.onSlotChange })));
65
+ return (h(Host, { key: 'db168a586dfd3142f6dc75627f6f13fd6bde56dd', role: "list" }, h("slot", { key: 'fe06e525cb9e790d97be4d153cc07757c3624732', onSlotchange: this.onSlotChange })));
66
66
  }
67
67
  static get is() { return "bs-stepper"; }
68
68
  static get encapsulation() { return "shadow"; }
@@ -57,7 +57,7 @@ export class BsStepperStep {
57
57
  }
58
58
  render() {
59
59
  const state = this.state;
60
- return (h(Host, { key: 'fe270c356f44c25a3a12450eec8e1a7657d4d88f', role: "listitem", class: `bs-stepper-step--${this.direction}` }, h("div", { key: '1bc833a5ca917d141078e3b69e9e455ec8d877ad', class: "bs-stepper-step__top" }, h("span", { key: 'aa91b7e91d600b08c389be456b28f4a65450d72e', part: "icon", class: `bs-stepper-step__icon bs-stepper-step__icon--${state}` }, state === 'current' && h("span", { key: 'e3fee594c97bf9f5d47e1b922bf9adffa1c0d438', class: "bs-stepper-step__icon-dot" }), state === 'done' && h(CheckIcon, { key: '4930e7653d7c81c8fcf18920fdd0a9a0e975eee4' }), state === 'error' && h(ExclamationIcon, { key: 'ca757e769dd4411c987bf5f22b7cda904d9fd067' })), h("span", { key: '2b0621849727e355d4d0944087ff1d9eacb5b5f7', part: "connector", class: "bs-stepper-step__connector", "aria-hidden": "true" }, h("span", { key: '0d08b9591ea2c9a967ebf85dce105f667cb86370', class: "bs-stepper-step__connector-line" }))), h("span", { key: '3bd0490ef190a4e4f33f822383be230e4e20e7dc', part: "label", class: `bs-stepper-step__label bs-stepper-step__label--${state}` }, h("span", { key: 'cf6cb4f72fcf546a954085d125a72548cfe521fe', part: "name", class: "bs-stepper-step__name" }, this.name), this.showDescription && this.description && (h("span", { key: 'b0ef234071983ae8c87d68440e7bfa4a491a35f5', part: "description", class: "bs-stepper-step__description" }, this.description)))));
60
+ return (h(Host, { key: '809ebc9656bc8c309b603c1940ea982d02560630', role: "listitem", class: `bs-stepper-step--${this.direction}` }, h("div", { key: '05484ab3c56d0c42dac1b8af99d715109679389b', class: "bs-stepper-step__top" }, h("span", { key: '2076c16d90d907a4b40de84304bd77a7b9ae1bf9', part: "icon", class: `bs-stepper-step__icon bs-stepper-step__icon--${state}` }, state === 'current' && h("span", { key: '6fcbca00f7010e49583522a83f54f2db5ea01441', class: "bs-stepper-step__icon-dot" }), state === 'done' && h(CheckIcon, { key: '17589e79f8806e30aa6f6683fc6f7acd857dc8c9' }), state === 'error' && h(ExclamationIcon, { key: '29fd2fdd31b9d899153396e758bcc8c69cbddaea' })), h("span", { key: 'cbd47c375dc0f287449e2b1ea9f49bc15302389a', part: "connector", class: "bs-stepper-step__connector", "aria-hidden": "true" }, h("span", { key: '6d29361f15e62a945f7f9c8a37b05025b3173214', class: "bs-stepper-step__connector-line" }))), h("span", { key: 'edb0ca51856917b8703ec88655bd4c8c1a1ff5df', part: "label", class: `bs-stepper-step__label bs-stepper-step__label--${state}` }, h("span", { key: 'abe23448bb9bc8a818551dc219aa89f05b9a6721', part: "name", class: "bs-stepper-step__name" }, this.name), this.showDescription && this.description && (h("span", { key: 'e469eb84389527f380c37f7e7724809528d624ae', part: "description", class: "bs-stepper-step__description" }, this.description)))));
61
61
  }
62
62
  static get is() { return "bs-stepper-step"; }
63
63
  static get encapsulation() { return "shadow"; }
@@ -75,7 +75,7 @@ export class BsSwitch {
75
75
  const knobClasses = ['bs-switch__knob', `bs-switch__knob--${this.size}`, this.disabled ? 'bs-switch__knob--disabled' : '']
76
76
  .filter(Boolean)
77
77
  .join(' ');
78
- return (h("label", { key: '37466aa7ca1b18c07b92bd7855fd974d62ad5845', class: `bs-switch ${this.disabled ? 'bs-switch--disabled' : ''}` }, h("input", { key: 'f4e0073dd9a322692003593385da04a9289ea848', class: "bs-switch__input", type: "checkbox", role: "switch", checked: this.checked, disabled: this.disabled, "aria-checked": String(this.checked), "aria-label": this.ariaLabel, onChange: this.onChange }), h("span", { key: 'f8cbdb6bb25964ba79e9cb09d82beab0c3946a14', part: "track", class: trackClasses }, h("span", { key: '7e8598698e08a95d1ada9829264df99abd507d81', part: "knob", class: knobClasses })), h("span", { key: '11d464eaf95f555f3874524adc5fb2373b1fd056', part: "label", class: "bs-switch__label" }, h("slot", { key: '2409cb732d23f613c2595fa62e9fd7539bb2041e' }))));
78
+ return (h("label", { key: '29aaef97a7a237cddfdfffb7cdb693c8934a9d4f', class: `bs-switch ${this.disabled ? 'bs-switch--disabled' : ''}` }, h("input", { key: '03a1e41e0b66f823a95b76c85a19c8ca6c418763', class: "bs-switch__input", type: "checkbox", role: "switch", checked: this.checked, disabled: this.disabled, "aria-checked": String(this.checked), "aria-label": this.ariaLabel, onChange: this.onChange }), h("span", { key: '4dc7254d5855d91221048aa2fbddcb0532c4f572', part: "track", class: trackClasses }, h("span", { key: '11dbb2724c94e6a58413d36b8d673015ad44a5e3', part: "knob", class: knobClasses })), h("span", { key: '9954a8d69131ca00bcd177d1d7cfe7ca83bc32a1', part: "label", class: "bs-switch__label" }, h("slot", { key: '98058212aed27b2d6b589eb769fddd5fe3156510' }))));
79
79
  }
80
80
  static get is() { return "bs-switch"; }
81
81
  static get encapsulation() { return "shadow"; }
@@ -94,7 +94,7 @@ export class BsInlineTab {
94
94
  };
95
95
  render() {
96
96
  const iconOnly = this.hasIcon && !this.hasLabel;
97
- return (h("button", { key: '0d6927b0b39a7d84add287e6473681e5052b5f2d', type: "button", part: "tab", role: "tab", class: `bs-inline-tab ${this.selected ? 'bs-inline-tab--selected' : ''} ${this.disabled ? 'bs-inline-tab--disabled' : ''} ${iconOnly ? 'bs-inline-tab--icon-only' : ''} ${this.hasIcon ? 'bs-inline-tab--has-icon' : ''}`, disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel, tabIndex: this.tabbable === undefined ? undefined : this.tabbable ? 0 : -1, onClick: this.onClick }, h("span", { key: '866660f0f79927cd018df42286719f2f48262cbb', part: "icon", class: `bs-inline-tab__icon ${this.hasIcon ? 'bs-inline-tab__icon--has-content' : ''}` }, h("slot", { key: '58e11c8a0a57646644cb0b7c950d73f5cee52310', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '38d2e1df2b4e494f68d3c4b9ea34d7a317401953', part: "label", class: `bs-inline-tab__label ${this.hasLabel ? 'bs-inline-tab__label--has-content' : ''}` }, h("slot", { key: '51fb6ec04479b18af787bca4e64f8105a0b19311', onSlotchange: this.onLabelSlotchange }))));
97
+ return (h("button", { key: '2b53f8013cdcd94dd7297ece3cff679d158a86a8', type: "button", part: "tab", role: "tab", class: `bs-inline-tab ${this.selected ? 'bs-inline-tab--selected' : ''} ${this.disabled ? 'bs-inline-tab--disabled' : ''} ${iconOnly ? 'bs-inline-tab--icon-only' : ''} ${this.hasIcon ? 'bs-inline-tab--has-icon' : ''}`, disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel, tabIndex: this.tabbable === undefined ? undefined : this.tabbable ? 0 : -1, onClick: this.onClick }, h("span", { key: '4e4832cffe54b28cdd68f7c35c9741dfe001b4d5', part: "icon", class: `bs-inline-tab__icon ${this.hasIcon ? 'bs-inline-tab__icon--has-content' : ''}` }, h("slot", { key: 'ccc3225b1a9047a0a346b8fb8bf6f02a63ecc988', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '95c8ac8ba725cf9ed20887dfee0c88d0dd0ce180', part: "label", class: `bs-inline-tab__label ${this.hasLabel ? 'bs-inline-tab__label--has-content' : ''}` }, h("slot", { key: 'f9551ac1fe994a7e66fe48d23b39f2936c6b5a37', onSlotchange: this.onLabelSlotchange }))));
98
98
  }
99
99
  static get is() { return "bs-inline-tab"; }
100
100
  static get encapsulation() { return "shadow"; }
@@ -107,7 +107,7 @@ export class BsTab {
107
107
  const iconOnly = this.hasIcon && !this.hasLabel;
108
108
  const vertical = this.hasIcon && this.hasLabel && this.iconPosition === 'top';
109
109
  const showBadge = this.hasBadge && !iconOnly && !vertical;
110
- return (h("button", { key: '383cf44dfcf1feb5404e6a392318c8ce5a8a1178', type: "button", part: "tab", role: "tab", class: `bs-tab ${this.selected ? 'bs-tab--selected' : ''} ${this.disabled ? 'bs-tab--disabled' : ''} ${iconOnly ? 'bs-tab--icon-only' : ''} ${vertical ? 'bs-tab--vertical' : ''}`, disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel, tabIndex: this.tabbable === undefined ? undefined : this.tabbable ? 0 : -1, onClick: this.onClick }, h("span", { key: '8b3a6b9ee663c2957c206024478ee76abf4fb905', part: "icon", class: `bs-tab__icon ${this.hasIcon ? 'bs-tab__icon--has-content' : ''}` }, h("slot", { key: 'b46fd73bac532345e747bb214f8c91f32b04810c', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: '9d3e69f4dc96e20a327ebccdbdf934f07a4892c0', part: "label", class: `bs-tab__label ${this.hasLabel ? 'bs-tab__label--has-content' : ''}` }, h("slot", { key: 'e724d44bec76845b64e8e0ebb5c883dc47ff11a3', onSlotchange: this.onLabelSlotchange })), h("span", { key: '1cb4e5a8056ebac8b1b098c350c4a5d89bd2968a', part: "badge", class: `bs-tab__badge ${showBadge ? 'bs-tab__badge--has-content' : ''}` }, h("slot", { key: '46a6bbf2c8702645b85062012294eedf3facceac', name: "badge", onSlotchange: this.onBadgeSlotchange })), h("span", { key: '38845ccafeddfe79af64c3e291197e88bbced150', part: "indicator", class: "bs-tab__indicator" })));
110
+ return (h("button", { key: '87234360dfed766afe447c3e8f037d8b59868a15', type: "button", part: "tab", role: "tab", class: `bs-tab ${this.selected ? 'bs-tab--selected' : ''} ${this.disabled ? 'bs-tab--disabled' : ''} ${iconOnly ? 'bs-tab--icon-only' : ''} ${vertical ? 'bs-tab--vertical' : ''}`, disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel, tabIndex: this.tabbable === undefined ? undefined : this.tabbable ? 0 : -1, onClick: this.onClick }, h("span", { key: 'cecdf03d52896828f098956a25342209c0244f39', part: "icon", class: `bs-tab__icon ${this.hasIcon ? 'bs-tab__icon--has-content' : ''}` }, h("slot", { key: 'f4bbc1ac9ee7df0db6cb393c69b43227add0db3e', name: "icon", onSlotchange: this.onIconSlotchange })), h("span", { key: 'c14726bc5b6f47d0a96fdf5807a2dd7b2466a27f', part: "label", class: `bs-tab__label ${this.hasLabel ? 'bs-tab__label--has-content' : ''}` }, h("slot", { key: '88936beb454b7fa0b9d1c67d39e812f86e89ae56', onSlotchange: this.onLabelSlotchange })), h("span", { key: 'a32984bfa7879e702748171fc51a4679b58d0b8b', part: "badge", class: `bs-tab__badge ${showBadge ? 'bs-tab__badge--has-content' : ''}` }, h("slot", { key: 'ad516087badafb57ff4df818d0b9a100373f205e', name: "badge", onSlotchange: this.onBadgeSlotchange })), h("span", { key: '30e25441bd650875ce8b6dd97befc1053c40ca47', part: "indicator", class: "bs-tab__indicator" })));
111
111
  }
112
112
  static get is() { return "bs-tab"; }
113
113
  static get encapsulation() { return "shadow"; }
@@ -135,7 +135,7 @@ export class BsTabs {
135
135
  }
136
136
  render() {
137
137
  const vertical = this.orientation === 'vertical';
138
- return (h("div", { key: '251521d36dcf4d6960df344285bc9a060ff87abb', part: "tablist", role: "tablist", "aria-orientation": this.orientation, class: `bs-tabs bs-tabs--${this.type} ${vertical ? 'bs-tabs--vertical' : ''}` }, h("slot", { key: '02216f048eaedb13f00891c30e1c49d15a509c1d', onSlotchange: () => this.syncRovingTabindex() })));
138
+ return (h("div", { key: 'b47d3502305490c9098b825f1eb8c60f45dad5d8', part: "tablist", role: "tablist", "aria-orientation": this.orientation, class: `bs-tabs bs-tabs--${this.type} ${vertical ? 'bs-tabs--vertical' : ''}` }, h("slot", { key: '133cf0b2ea93354a664bb304579fa59d85e53edf', onSlotchange: () => this.syncRovingTabindex() })));
139
139
  }
140
140
  static get is() { return "bs-tabs"; }
141
141
  static get encapsulation() { return "shadow"; }
@@ -0,0 +1,141 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ const sr = (root) => root.shadowRoot;
3
+ const spin = (root, label) => sr(root).querySelector(`[role="spinbutton"][aria-label="${label}"]`);
4
+ const text = (root, label) => spin(root, label).textContent;
5
+ const key = (el, k) => el.dispatchEvent(new KeyboardEvent('keydown', { key: k, bubbles: true }));
6
+ const steps = (root) => Array.from(sr(root).querySelectorAll('[part="step"]'));
7
+ // order: hour up, hour down, minute up, minute down
8
+ const period = (root) => sr(root).querySelector('[part="period"]');
9
+ describe('bs-timepicker', () => {
10
+ it('defaults to 12h, 12:00 AM with no value', async () => {
11
+ const { root } = await render(h("bs-timepicker", null));
12
+ expect(text(root, 'Hour')).toBe('12');
13
+ expect(text(root, 'Minute')).toBe('00');
14
+ expect(period(root).value).toBe('AM');
15
+ });
16
+ it('shows a 24-hour value as 12h with PM', async () => {
17
+ const { root } = await render(h("bs-timepicker", { value: "14:05" }));
18
+ expect(text(root, 'Hour')).toBe('02');
19
+ expect(text(root, 'Minute')).toBe('05');
20
+ expect(period(root).value).toBe('PM');
21
+ });
22
+ it('shows 00-23 and no AM/PM in 24h format', async () => {
23
+ const { root } = await render(h("bs-timepicker", { format: "24h", value: "14:05" }));
24
+ expect(text(root, 'Hour')).toBe('14');
25
+ expect(period(root)).toBeNull();
26
+ });
27
+ it('has hour/minute spinbuttons with ARIA values', async () => {
28
+ const { root } = await render(h("bs-timepicker", { format: "24h", value: "14:05" }));
29
+ const hourEl = spin(root, 'Hour');
30
+ expect(hourEl.getAttribute('aria-valuenow')).toBe('14');
31
+ expect(hourEl.getAttribute('aria-valuemin')).toBe('0');
32
+ expect(hourEl.getAttribute('aria-valuemax')).toBe('23');
33
+ expect(spin(root, 'Minute').getAttribute('aria-valuemax')).toBe('59');
34
+ });
35
+ it('caret buttons step and wrap the hour (12h: 12 -> 1, keeps PM)', async () => {
36
+ const { root, waitForChanges } = await render(h("bs-timepicker", { value: "12:00" }));
37
+ expect(period(root).value).toBe('PM');
38
+ steps(root)[0].click();
39
+ await waitForChanges();
40
+ expect(text(root, 'Hour')).toBe('01');
41
+ expect(period(root).value).toBe('PM');
42
+ steps(root)[1].click();
43
+ await waitForChanges();
44
+ expect(text(root, 'Hour')).toBe('12');
45
+ });
46
+ it('minutes wrap without touching the hour', async () => {
47
+ const { root, waitForChanges } = await render(h("bs-timepicker", { format: "24h", value: "09:59" }));
48
+ steps(root)[2].click();
49
+ await waitForChanges();
50
+ expect(text(root, 'Minute')).toBe('00');
51
+ expect(text(root, 'Hour')).toBe('09');
52
+ });
53
+ it('honours minuteStep', async () => {
54
+ const { root, waitForChanges } = await render(h("bs-timepicker", { format: "24h", value: "09:00", minuteStep: 15 }));
55
+ steps(root)[2].click();
56
+ await waitForChanges();
57
+ expect(text(root, 'Minute')).toBe('15');
58
+ steps(root)[3].click();
59
+ steps(root)[3].click();
60
+ await waitForChanges();
61
+ expect(text(root, 'Minute')).toBe('45');
62
+ });
63
+ it('ArrowUp/ArrowDown/Home/End work on a focused value', async () => {
64
+ const { root, waitForChanges } = await render(h("bs-timepicker", { format: "24h", value: "09:30" }));
65
+ key(spin(root, 'Hour'), 'ArrowUp');
66
+ await waitForChanges();
67
+ expect(text(root, 'Hour')).toBe('10');
68
+ key(spin(root, 'Hour'), 'End');
69
+ await waitForChanges();
70
+ expect(text(root, 'Hour')).toBe('23');
71
+ key(spin(root, 'Hour'), 'ArrowUp');
72
+ await waitForChanges();
73
+ expect(text(root, 'Hour')).toBe('00');
74
+ });
75
+ it('typing digits sets the value', async () => {
76
+ const { root, waitForChanges } = await render(h("bs-timepicker", { format: "24h", value: "00:00" }));
77
+ key(spin(root, 'Hour'), '1');
78
+ key(spin(root, 'Hour'), '7');
79
+ await waitForChanges();
80
+ expect(text(root, 'Hour')).toBe('17');
81
+ // 9 can't start a valid 24h hour pair beyond 9x, but 9 itself is valid.
82
+ key(spin(root, 'Minute'), '4');
83
+ key(spin(root, 'Minute'), '2');
84
+ await waitForChanges();
85
+ expect(text(root, 'Minute')).toBe('42');
86
+ });
87
+ it('the AM/PM dropdown flips the period without changing the displayed hour', async () => {
88
+ const { root, waitForChanges } = await render(h("bs-timepicker", { value: "09:15" }));
89
+ period(root).dispatchEvent(new CustomEvent('bsChange', { detail: 'PM' }));
90
+ await waitForChanges();
91
+ expect(period(root).value).toBe('PM');
92
+ expect(text(root, 'Hour')).toBe('09');
93
+ });
94
+ it('the 24h switch converts the display without changing the time', async () => {
95
+ const { root, waitForChanges } = await render(h("bs-timepicker", { value: "14:30" }));
96
+ sr(root).querySelector('bs-switch').dispatchEvent(new CustomEvent('bsChange', { detail: true }));
97
+ await waitForChanges();
98
+ expect(root).toEqualAttribute('format', '24h');
99
+ expect(text(root, 'Hour')).toBe('14');
100
+ });
101
+ it('nothing is committed until Confirm, which emits 24-hour HH:mm', async () => {
102
+ const { root, waitForChanges } = await render(h("bs-timepicker", { value: "09:15" }));
103
+ const events = [];
104
+ root.addEventListener('bsChange', (e) => events.push(e.detail));
105
+ period(root).dispatchEvent(new CustomEvent('bsChange', { detail: 'PM' }));
106
+ steps(root)[0].click();
107
+ await waitForChanges();
108
+ expect(root.value).toBe('09:15');
109
+ expect(events).toEqual([]);
110
+ sr(root).querySelector('[part="confirm"]').click();
111
+ await waitForChanges();
112
+ expect(events).toEqual([{ value: '22:15' }]);
113
+ expect(root.value).toBe('22:15');
114
+ });
115
+ it('Cancel discards the draft and emits bsCancel', async () => {
116
+ const { root, waitForChanges } = await render(h("bs-timepicker", { format: "24h", value: "09:15" }));
117
+ let cancelled = 0;
118
+ root.addEventListener('bsCancel', () => cancelled++);
119
+ steps(root)[0].click();
120
+ await waitForChanges();
121
+ expect(text(root, 'Hour')).toBe('10');
122
+ sr(root).querySelector('[part="cancel"]').click();
123
+ await waitForChanges();
124
+ expect(cancelled).toBe(1);
125
+ expect(text(root, 'Hour')).toBe('09');
126
+ expect(root.value).toBe('09:15');
127
+ });
128
+ it('setting value programmatically updates the display without emitting', async () => {
129
+ const { root, waitForChanges } = await render(h("bs-timepicker", { format: "24h", value: "09:15" }));
130
+ let fired = 0;
131
+ root.addEventListener('bsChange', () => fired++);
132
+ root.value = '18:45';
133
+ await waitForChanges();
134
+ expect(text(root, 'Hour')).toBe('18');
135
+ expect(fired).toBe(0);
136
+ });
137
+ it('ignores an invalid value', async () => {
138
+ const { root } = await render(h("bs-timepicker", { format: "24h", value: "25:99" }));
139
+ expect(text(root, 'Hour')).toBe('00');
140
+ });
141
+ });