@brandsync/wc 0.0.1

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 (134) hide show
  1. package/LICENSE +21 -0
  2. package/custom-elements.json +1138 -0
  3. package/dist/brandsync-wc/brandsync-wc.css +1730 -0
  4. package/dist/brandsync-wc/brandsync-wc.esm.js +1 -0
  5. package/dist/brandsync-wc/brandsync-wc.esm.js.map +1 -0
  6. package/dist/brandsync-wc/index-Cqxk7LcP.js.map +1 -0
  7. package/dist/brandsync-wc/index.esm.js +1 -0
  8. package/dist/brandsync-wc/index.esm.js.map +1 -0
  9. package/dist/brandsync-wc/p-042ad15a.entry.js +1 -0
  10. package/dist/brandsync-wc/p-2c4df28d.entry.js +1 -0
  11. package/dist/brandsync-wc/p-3134f5f5.entry.js +1 -0
  12. package/dist/brandsync-wc/p-5739acaf.entry.js +1 -0
  13. package/dist/brandsync-wc/p-BOj_41o9.js +3 -0
  14. package/dist/brandsync-wc/p-c2cc0d6f.entry.js +1 -0
  15. package/dist/brandsync-wc/p-da11e421.entry.js +1 -0
  16. package/dist/brandsync-wc/p-db3934d2.entry.js +1 -0
  17. package/dist/brandsync-wc/p-e38a9744.entry.js +1 -0
  18. package/dist/cjs/brandsync-wc.cjs.js +24 -0
  19. package/dist/cjs/bs-badge.cjs.entry.js +19 -0
  20. package/dist/cjs/bs-button-skeleton.cjs.entry.js +19 -0
  21. package/dist/cjs/bs-button.cjs.entry.js +88 -0
  22. package/dist/cjs/bs-card.cjs.entry.js +20 -0
  23. package/dist/cjs/bs-composer.cjs.entry.js +116 -0
  24. package/dist/cjs/bs-data-table.cjs.entry.js +62 -0
  25. package/dist/cjs/bs-input.cjs.entry.js +42 -0
  26. package/dist/cjs/bs-modal.cjs.entry.js +69 -0
  27. package/dist/cjs/index-nyOcuVbF.js +1710 -0
  28. package/dist/cjs/index.cjs.js +7 -0
  29. package/dist/cjs/loader.cjs.js +12 -0
  30. package/dist/collection/collection-manifest.json +20 -0
  31. package/dist/collection/components/bs-badge/bs-badge.cmp.test.js +30 -0
  32. package/dist/collection/components/bs-badge/bs-badge.css +55 -0
  33. package/dist/collection/components/bs-badge/bs-badge.js +64 -0
  34. package/dist/collection/components/bs-badge/bs-badge.stories.js +75 -0
  35. package/dist/collection/components/bs-button/bs-button.cmp.test.js +81 -0
  36. package/dist/collection/components/bs-button/bs-button.css +247 -0
  37. package/dist/collection/components/bs-button/bs-button.js +242 -0
  38. package/dist/collection/components/bs-button/bs-button.stories.js +145 -0
  39. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.cmp.test.js +18 -0
  40. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.css +46 -0
  41. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.js +73 -0
  42. package/dist/collection/components/bs-button-skeleton/bs-button-skeleton.stories.js +25 -0
  43. package/dist/collection/components/bs-card/bs-card.cmp.test.js +42 -0
  44. package/dist/collection/components/bs-card/bs-card.css +31 -0
  45. package/dist/collection/components/bs-card/bs-card.js +70 -0
  46. package/dist/collection/components/bs-card/bs-card.stories.js +27 -0
  47. package/dist/collection/components/bs-composer/bs-composer.cmp.test.js +132 -0
  48. package/dist/collection/components/bs-composer/bs-composer.css +185 -0
  49. package/dist/collection/components/bs-composer/bs-composer.js +353 -0
  50. package/dist/collection/components/bs-composer/bs-composer.stories.js +66 -0
  51. package/dist/collection/components/bs-data-table/bs-data-table.css +56 -0
  52. package/dist/collection/components/bs-data-table/bs-data-table.js +259 -0
  53. package/dist/collection/components/bs-data-table/bs-data-table.stories.js +55 -0
  54. package/dist/collection/components/bs-input/bs-input.cmp.test.js +101 -0
  55. package/dist/collection/components/bs-input/bs-input.css +64 -0
  56. package/dist/collection/components/bs-input/bs-input.js +230 -0
  57. package/dist/collection/components/bs-input/bs-input.stories.js +40 -0
  58. package/dist/collection/components/bs-modal/bs-modal.cmp.test.js +112 -0
  59. package/dist/collection/components/bs-modal/bs-modal.css +66 -0
  60. package/dist/collection/components/bs-modal/bs-modal.js +198 -0
  61. package/dist/collection/components/bs-modal/bs-modal.stories.js +38 -0
  62. package/dist/collection/index.js +10 -0
  63. package/dist/collection/stories-utils.js +25 -0
  64. package/dist/collection/utils/utils.js +3 -0
  65. package/dist/collection/utils/utils.unit.test.js +16 -0
  66. package/dist/components/bs-badge.d.ts +11 -0
  67. package/dist/components/bs-badge.js +1 -0
  68. package/dist/components/bs-button-skeleton.d.ts +11 -0
  69. package/dist/components/bs-button-skeleton.js +1 -0
  70. package/dist/components/bs-button.d.ts +11 -0
  71. package/dist/components/bs-button.js +1 -0
  72. package/dist/components/bs-card.d.ts +11 -0
  73. package/dist/components/bs-card.js +1 -0
  74. package/dist/components/bs-composer.d.ts +11 -0
  75. package/dist/components/bs-composer.js +1 -0
  76. package/dist/components/bs-data-table.d.ts +11 -0
  77. package/dist/components/bs-data-table.js +1 -0
  78. package/dist/components/bs-input.d.ts +11 -0
  79. package/dist/components/bs-input.js +1 -0
  80. package/dist/components/bs-modal.d.ts +11 -0
  81. package/dist/components/bs-modal.js +1 -0
  82. package/dist/components/index.d.ts +35 -0
  83. package/dist/components/index.js +1 -0
  84. package/dist/components/p-Cu4gTknX.js +1 -0
  85. package/dist/esm/brandsync-wc.js +20 -0
  86. package/dist/esm/bs-badge.entry.js +17 -0
  87. package/dist/esm/bs-button-skeleton.entry.js +17 -0
  88. package/dist/esm/bs-button.entry.js +86 -0
  89. package/dist/esm/bs-card.entry.js +18 -0
  90. package/dist/esm/bs-composer.entry.js +114 -0
  91. package/dist/esm/bs-data-table.entry.js +60 -0
  92. package/dist/esm/bs-input.entry.js +40 -0
  93. package/dist/esm/bs-modal.entry.js +67 -0
  94. package/dist/esm/index-BOj_41o9.js +1701 -0
  95. package/dist/esm/index.js +5 -0
  96. package/dist/esm/loader.js +10 -0
  97. package/dist/index.cjs.js +1 -0
  98. package/dist/index.js +1 -0
  99. package/dist/types/components/bs-badge/bs-badge.cmp.test.d.ts +1 -0
  100. package/dist/types/components/bs-badge/bs-badge.d.ts +20 -0
  101. package/dist/types/components/bs-badge/bs-badge.stories.d.ts +19 -0
  102. package/dist/types/components/bs-button/bs-button.cmp.test.d.ts +1 -0
  103. package/dist/types/components/bs-button/bs-button.d.ts +84 -0
  104. package/dist/types/components/bs-button/bs-button.stories.d.ts +29 -0
  105. package/dist/types/components/bs-button-skeleton/bs-button-skeleton.cmp.test.d.ts +1 -0
  106. package/dist/types/components/bs-button-skeleton/bs-button-skeleton.d.ts +28 -0
  107. package/dist/types/components/bs-button-skeleton/bs-button-skeleton.stories.d.ts +10 -0
  108. package/dist/types/components/bs-card/bs-card.cmp.test.d.ts +1 -0
  109. package/dist/types/components/bs-card/bs-card.d.ts +26 -0
  110. package/dist/types/components/bs-card/bs-card.stories.d.ts +10 -0
  111. package/dist/types/components/bs-composer/bs-composer.cmp.test.d.ts +1 -0
  112. package/dist/types/components/bs-composer/bs-composer.d.ts +83 -0
  113. package/dist/types/components/bs-composer/bs-composer.stories.d.ts +17 -0
  114. package/dist/types/components/bs-data-table/bs-data-table.d.ts +55 -0
  115. package/dist/types/components/bs-data-table/bs-data-table.stories.d.ts +7 -0
  116. package/dist/types/components/bs-input/bs-input.cmp.test.d.ts +1 -0
  117. package/dist/types/components/bs-input/bs-input.d.ts +33 -0
  118. package/dist/types/components/bs-input/bs-input.stories.d.ts +15 -0
  119. package/dist/types/components/bs-modal/bs-modal.cmp.test.d.ts +1 -0
  120. package/dist/types/components/bs-modal/bs-modal.d.ts +45 -0
  121. package/dist/types/components/bs-modal/bs-modal.stories.d.ts +9 -0
  122. package/dist/types/components.d.ts +962 -0
  123. package/dist/types/index.d.ts +11 -0
  124. package/dist/types/stencil-public-runtime.d.ts +1872 -0
  125. package/dist/types/stories-utils.d.ts +8 -0
  126. package/dist/types/utils/utils.d.ts +1 -0
  127. package/dist/types/utils/utils.unit.test.d.ts +1 -0
  128. package/loader/cdn.js +1 -0
  129. package/loader/index.cjs.js +1 -0
  130. package/loader/index.d.ts +24 -0
  131. package/loader/index.es2017.js +1 -0
  132. package/loader/index.js +2 -0
  133. package/package.json +67 -0
  134. package/readme.md +48 -0
@@ -0,0 +1,962 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ /**
4
+ * This is an autogenerated file created by the Stencil compiler.
5
+ * It contains typing information for all components that exist in this project.
6
+ */
7
+ import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
+ import { BsBadgeVariant } from "./components/bs-badge/bs-badge";
9
+ import { BsButtonSize, BsButtonVariant } from "./components/bs-button/bs-button";
10
+ import { BsButtonSize as BsButtonSize1 } from "./components/bs-button/bs-button";
11
+ import { BsCardSurface } from "./components/bs-card/bs-card";
12
+ import { BsComposerState, BsComposerVariant } from "./components/bs-composer/bs-composer";
13
+ import { BsDataTableColumn, BsDataTableRow } from "./components/bs-data-table/bs-data-table";
14
+ import { BsModalSize } from "./components/bs-modal/bs-modal";
15
+ export { BsBadgeVariant } from "./components/bs-badge/bs-badge";
16
+ export { BsButtonSize, BsButtonVariant } from "./components/bs-button/bs-button";
17
+ export { BsButtonSize as BsButtonSize1 } from "./components/bs-button/bs-button";
18
+ export { BsCardSurface } from "./components/bs-card/bs-card";
19
+ export { BsComposerState, BsComposerVariant } from "./components/bs-composer/bs-composer";
20
+ export { BsDataTableColumn, BsDataTableRow } from "./components/bs-data-table/bs-data-table";
21
+ export { BsModalSize } from "./components/bs-modal/bs-modal";
22
+ export namespace Components {
23
+ /**
24
+ * A small status or category pill, usually paired with a label or list item.
25
+ * ## When to use
26
+ * - Communicating a short, fixed status (e.g. "Active", "On leave") or category label.
27
+ * ## When not to use
28
+ * - As an interactive/clickable element — a badge is a label, not a control. Use a button
29
+ * or chip component if it needs to be clickable.
30
+ * - For long text — badges are sized for one or two words.
31
+ */
32
+ interface BsBadge {
33
+ /**
34
+ * Maps directly to the brandsync-tokens `--bs-badge-bg-*` / `--bs-badge-text-*` sets.
35
+ * @default 'default'
36
+ */
37
+ "variant": BsBadgeVariant;
38
+ }
39
+ /**
40
+ * A clickable action element for the single most important action in a given context.
41
+ * ## When to use
42
+ * - The primary call to action on a screen or within a card/modal (e.g. "Book room", "Confirm").
43
+ * - Secondary, lower-emphasis actions alongside it (use `variant="neutral"`).
44
+ * - `variant="error"` for destructive/irreversible actions (e.g. "Delete account") — per
45
+ * BrandSync guidance, destructive actions should always use the error variant, never
46
+ * `neutral`, so the visual weight matches the risk of the action.
47
+ * ## When not to use
48
+ * - For navigation between pages — use a link/nav component instead, a button implies an
49
+ * in-page action, not a destination change.
50
+ * - For more than one primary-emphasis action in the same view — pick one, demote the rest to
51
+ * `neutral`.
52
+ * - `error` purely for visual emphasis — it signals a destructive action to the user, so reserve
53
+ * it for actions that actually delete/revoke/undo something.
54
+ * @prop --bs-button-radius - Corner radius. Aliased to `--bs-border-radius-100` by default.
55
+ * @prop --bs-button-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
56
+ * @prop --bs-button-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
57
+ * @prop --bs-button-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
58
+ */
59
+ interface BsButton {
60
+ /**
61
+ * Accessible name for the button. Required for icon-only usage (no visible label text via the default slot) so screen readers still announce what the button does. Stencil reflects this camelCase prop to the `aria-label` HTML attribute automatically.
62
+ * @default null
63
+ */
64
+ "ariaLabel": string | null;
65
+ /**
66
+ * Disables the button and applies the disabled token set.
67
+ * @default false
68
+ */
69
+ "disabled": boolean;
70
+ /**
71
+ * Sizing scale.
72
+ * @default 'md'
73
+ */
74
+ "size": BsButtonSize;
75
+ /**
76
+ * Native `<button>` type.
77
+ * @default 'button'
78
+ */
79
+ "type": 'button' | 'submit' | 'reset';
80
+ /**
81
+ * Visual style. Maps directly to the brandsync-tokens `--bs-button-*` semantic set. `error` is for destructive/irreversible actions per BrandSync guidance, not a stronger emphasis alternative to `primary`.
82
+ * @default 'primary'
83
+ */
84
+ "variant": BsButtonVariant;
85
+ }
86
+ /**
87
+ * A shape-matched loading placeholder for `bs-button`, shown while the real label/action isn't
88
+ * known yet (e.g. still being fetched from an API). Sized to match `bs-button`'s `sm`/`md`/`lg`
89
+ * heights so layout doesn't shift once the real button renders.
90
+ * This is not a submit-in-progress spinner — that's a different concern (a button that's
91
+ * already rendered but waiting on an async action it triggered). Use this component only when
92
+ * the button itself doesn't exist yet.
93
+ * ## When to use
94
+ * - In place of a `bs-button` whose label/visibility depends on data that hasn't loaded yet.
95
+ * ## When not to use
96
+ * - While a button's own click handler is running (e.g. a submit request in flight) — render the
97
+ * real `bs-button` and show its own busy/spinner state instead.
98
+ * @prop --bs-button-skeleton-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
99
+ * @prop --bs-button-skeleton-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
100
+ * @prop --bs-button-skeleton-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
101
+ * @prop --bs-button-skeleton-width - Placeholder width. Defaults to `96px`.
102
+ */
103
+ interface BsButtonSkeleton {
104
+ /**
105
+ * Sizing scale, matching the `bs-button` size it stands in for.
106
+ * @default 'md'
107
+ */
108
+ "size": BsButtonSize1;
109
+ }
110
+ /**
111
+ * A bounded surface for grouping related content — a summary, a form section, a list item.
112
+ * ## When to use
113
+ * - Grouping a self-contained piece of content that needs visual separation from the page
114
+ * background (e.g. a booking summary, a settings section).
115
+ * ## When not to use
116
+ * - As the only structural element on a page — cards group content, they don't replace layout.
117
+ * - For a dismissible/transient message — use a modal or a dedicated notification component.
118
+ */
119
+ interface BsCard {
120
+ /**
121
+ * Maps to the brandsync-tokens `--bs-paper-bg-*` set — Brandsync's tokens don't have a dedicated "card" component yet, so this reuses the existing Paper surface tokens.
122
+ * @default 'raised'
123
+ */
124
+ "surface": BsCardSurface;
125
+ }
126
+ /**
127
+ * A chat composer input for Genie AI-style conversational interfaces: a text field
128
+ * plus an attach button, a mic/voice-recording toggle, and a single primary action button whose
129
+ * icon and behavior change with `state` (send, stop generating, or confirm a voice recording).
130
+ * ## When to use
131
+ * - The message-entry bar for an AI chat/assistant or human support conversation.
132
+ * ## When not to use
133
+ * - A general-purpose text field — use `bs-input` instead; this component's layout and states are
134
+ * purpose-built for a chat composer, not a generic form field.
135
+ * @prop --bs-composer-radius - Corner radius of the container. Aliased to `--bs-border-radius-150`.
136
+ * @prop --bs-composer-button-radius - Corner radius of the attach/mic/action buttons. Aliased to `--bs-border-radius-100`.
137
+ * @prop --bs-composer-button-size - Width/height of the attach/mic/action buttons. Aliased to `--bs-spacing-600`.
138
+ * @prop --bs-composer-bg - Background of the pill container. Aliased to `--bs-input-bg-default`.
139
+ * @prop --bs-composer-border - Border color of the pill container. Aliased to `--bs-input-border-default`.
140
+ * @prop --bs-composer-border-focus - Border color when the text field has focus. Aliased to `--bs-input-border-focus`.
141
+ * @prop --bs-composer-action-bg - Background of the primary action button. Aliased to `--bs-color-primary-default`.
142
+ * @prop --bs-composer-action-bg-hover - Aliased to `--bs-color-primary-hover`.
143
+ * @prop --bs-composer-action-bg-pressed - Aliased to `--bs-color-primary-pressed`.
144
+ * @prop --bs-composer-action-bg-disabled - Aliased to `--bs-surface-action-disabled`.
145
+ * @prop --bs-composer-action-icon - Icon color on the primary action button. Aliased to `--bs-text-on-action`.
146
+ * @prop --bs-composer-action-icon-disabled - Aliased to `--bs-text-on-disabled`.
147
+ * @prop --bs-composer-attach-icon - Icon color of the attach button. Aliased to `--bs-icon-default`.
148
+ * @prop --bs-composer-mic-icon - Icon color of the mic/stop-recording button. Aliased to `--bs-icon-default`.
149
+ * @prop --bs-composer-mic-icon-disabled - Aliased to `--bs-icon-disabled`.
150
+ * @prop --bs-composer-subtle-hover - Background of the attach/mic buttons on hover (subtle-button treatment, same as `bs-button`'s `subtle` variant). Aliased to `--bs-color-neutral-container`.
151
+ * @prop --bs-composer-subtle-pressed - Background of the attach/mic buttons when pressed. Aliased to `--bs-color-neutral-container-pressed`.
152
+ */
153
+ interface BsComposer {
154
+ /**
155
+ * Accessible name for the text field. This component has no visible `<label>` (chat composers don't show one in the design), so `ariaLabel` is the only way a consumer gives the textbox an accessible name -- set it in every real usage.
156
+ * @default null
157
+ */
158
+ "ariaLabel": string | null;
159
+ /**
160
+ * Overrides the variant's default placeholder.
161
+ */
162
+ "placeholder"?: string;
163
+ /**
164
+ * Which of the four mutually-exclusive composer states to render: `idle` (send, enabled), `generating` (stop, while the AI is responding), `disabled` (send, but not interactive), or `recording` (voice input in progress -- shows a waveform and a confirm action).
165
+ * @default 'idle'
166
+ */
167
+ "state": BsComposerState;
168
+ /**
169
+ * Current text value. Native `input` events don't cross the Shadow DOM boundary, so this component re-dispatches them as a `bsInput` custom event instead.
170
+ * @default ''
171
+ */
172
+ "value": string;
173
+ /**
174
+ * Which flavor of composer this is: changes the *default* placeholder text (set `placeholder` directly to override it) and, per the Figma design, renders the container border dashed instead of solid for `'human'` -- a deliberate visual cue distinguishing a human-support composer from the AI one, not a layout/token difference.
175
+ * @default 'ai'
176
+ */
177
+ "variant": BsComposerVariant;
178
+ }
179
+ /**
180
+ * A sortable, optionally row-selectable table for tabular data.
181
+ * `columns`, `rows`, and `cellRenderer` are JS-property-only — HTML attributes can only carry
182
+ * strings, so arrays/objects/functions must be set via `element.rows = [...]` etc., not as
183
+ * attributes. See CONVENTIONS.md.
184
+ * ## When to use
185
+ * - Comparing structured records across the same set of fields (a list of people, bookings, etc.).
186
+ * ## When not to use
187
+ * - A handful of unrelated key/value pairs — a simple list or card is lighter-weight.
188
+ * - Deeply nested/hierarchical data — this component renders one flat row per record.
189
+ */
190
+ interface BsDataTable {
191
+ /**
192
+ * Optional custom cell renderer, e.g. for an actions column. Function props are JS-property-only, same as array props -- there is no attribute equivalent. Falls back to the raw cell value.
193
+ */
194
+ "cellRenderer"?: (row: BsDataTableRow, column: BsDataTableColumn) => string;
195
+ /**
196
+ * Array prop -- must be set as a JS property (`el.columns = [...]`), not an HTML attribute, since attributes can only carry strings. See CONVENTIONS.md.
197
+ * @default []
198
+ */
199
+ "columns": BsDataTableColumn[];
200
+ /**
201
+ * Array prop -- same JS-property-only rule as `columns`.
202
+ * @default []
203
+ */
204
+ "rows": BsDataTableRow[];
205
+ /**
206
+ * @default false
207
+ */
208
+ "selectable": boolean;
209
+ "sortColumn"?: string;
210
+ /**
211
+ * @default 'asc'
212
+ */
213
+ "sortDirection": 'asc' | 'desc';
214
+ }
215
+ /**
216
+ * A single-line text field with an optional label, description, and error state.
217
+ * ## When to use
218
+ * - Collecting a single line of free-text, email, password, or numeric input.
219
+ * - Pair with `error` for inline validation feedback tied to that specific field.
220
+ * ## When not to use
221
+ * - Multi-line text — this component has no `textarea` mode.
222
+ * - A fixed set of choices — use a select/radio/checkbox component instead of free text.
223
+ */
224
+ interface BsInput {
225
+ "description"?: string;
226
+ /**
227
+ * @default false
228
+ */
229
+ "disabled": boolean;
230
+ "error"?: string;
231
+ "label"?: string;
232
+ "placeholder"?: string;
233
+ /**
234
+ * @default 'text'
235
+ */
236
+ "type": 'text' | 'email' | 'password' | 'number';
237
+ /**
238
+ * Current value. Native `input`/`change` events don't cross the Shadow DOM boundary, so this component re-dispatches them as `bsInput`/`bsChange` custom events instead.
239
+ * @default ''
240
+ */
241
+ "value": string;
242
+ }
243
+ /**
244
+ * An overlay dialog that interrupts the current flow for a focused task or confirmation.
245
+ * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
246
+ * ## When to use
247
+ * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
248
+ * - A short, focused task that doesn't warrant navigating to a new page.
249
+ * ## When not to use
250
+ * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
251
+ * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
252
+ * modal that just gets taller and taller.
253
+ */
254
+ interface BsModal {
255
+ "heading"?: string;
256
+ /**
257
+ * Mutable + reflected so the component can close itself (backdrop click, Escape, close button) the same way a native `<dialog>` does, while still emitting `bsClose` for the consumer to react to.
258
+ * @default false
259
+ */
260
+ "open": boolean;
261
+ /**
262
+ * @default 'md'
263
+ */
264
+ "size": BsModalSize;
265
+ }
266
+ }
267
+ export interface BsComposerCustomEvent<T> extends CustomEvent<T> {
268
+ detail: T;
269
+ target: HTMLBsComposerElement;
270
+ }
271
+ export interface BsDataTableCustomEvent<T> extends CustomEvent<T> {
272
+ detail: T;
273
+ target: HTMLBsDataTableElement;
274
+ }
275
+ export interface BsInputCustomEvent<T> extends CustomEvent<T> {
276
+ detail: T;
277
+ target: HTMLBsInputElement;
278
+ }
279
+ export interface BsModalCustomEvent<T> extends CustomEvent<T> {
280
+ detail: T;
281
+ target: HTMLBsModalElement;
282
+ }
283
+ declare global {
284
+ /**
285
+ * A small status or category pill, usually paired with a label or list item.
286
+ * ## When to use
287
+ * - Communicating a short, fixed status (e.g. "Active", "On leave") or category label.
288
+ * ## When not to use
289
+ * - As an interactive/clickable element — a badge is a label, not a control. Use a button
290
+ * or chip component if it needs to be clickable.
291
+ * - For long text — badges are sized for one or two words.
292
+ */
293
+ interface HTMLBsBadgeElement extends Components.BsBadge, HTMLStencilElement {
294
+ }
295
+ var HTMLBsBadgeElement: {
296
+ prototype: HTMLBsBadgeElement;
297
+ new (): HTMLBsBadgeElement;
298
+ };
299
+ /**
300
+ * A clickable action element for the single most important action in a given context.
301
+ * ## When to use
302
+ * - The primary call to action on a screen or within a card/modal (e.g. "Book room", "Confirm").
303
+ * - Secondary, lower-emphasis actions alongside it (use `variant="neutral"`).
304
+ * - `variant="error"` for destructive/irreversible actions (e.g. "Delete account") — per
305
+ * BrandSync guidance, destructive actions should always use the error variant, never
306
+ * `neutral`, so the visual weight matches the risk of the action.
307
+ * ## When not to use
308
+ * - For navigation between pages — use a link/nav component instead, a button implies an
309
+ * in-page action, not a destination change.
310
+ * - For more than one primary-emphasis action in the same view — pick one, demote the rest to
311
+ * `neutral`.
312
+ * - `error` purely for visual emphasis — it signals a destructive action to the user, so reserve
313
+ * it for actions that actually delete/revoke/undo something.
314
+ * @prop --bs-button-radius - Corner radius. Aliased to `--bs-border-radius-100` by default.
315
+ * @prop --bs-button-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
316
+ * @prop --bs-button-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
317
+ * @prop --bs-button-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
318
+ */
319
+ interface HTMLBsButtonElement extends Components.BsButton, HTMLStencilElement {
320
+ }
321
+ var HTMLBsButtonElement: {
322
+ prototype: HTMLBsButtonElement;
323
+ new (): HTMLBsButtonElement;
324
+ };
325
+ /**
326
+ * A shape-matched loading placeholder for `bs-button`, shown while the real label/action isn't
327
+ * known yet (e.g. still being fetched from an API). Sized to match `bs-button`'s `sm`/`md`/`lg`
328
+ * heights so layout doesn't shift once the real button renders.
329
+ * This is not a submit-in-progress spinner — that's a different concern (a button that's
330
+ * already rendered but waiting on an async action it triggered). Use this component only when
331
+ * the button itself doesn't exist yet.
332
+ * ## When to use
333
+ * - In place of a `bs-button` whose label/visibility depends on data that hasn't loaded yet.
334
+ * ## When not to use
335
+ * - While a button's own click handler is running (e.g. a submit request in flight) — render the
336
+ * real `bs-button` and show its own busy/spinner state instead.
337
+ * @prop --bs-button-skeleton-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
338
+ * @prop --bs-button-skeleton-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
339
+ * @prop --bs-button-skeleton-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
340
+ * @prop --bs-button-skeleton-width - Placeholder width. Defaults to `96px`.
341
+ */
342
+ interface HTMLBsButtonSkeletonElement extends Components.BsButtonSkeleton, HTMLStencilElement {
343
+ }
344
+ var HTMLBsButtonSkeletonElement: {
345
+ prototype: HTMLBsButtonSkeletonElement;
346
+ new (): HTMLBsButtonSkeletonElement;
347
+ };
348
+ /**
349
+ * A bounded surface for grouping related content — a summary, a form section, a list item.
350
+ * ## When to use
351
+ * - Grouping a self-contained piece of content that needs visual separation from the page
352
+ * background (e.g. a booking summary, a settings section).
353
+ * ## When not to use
354
+ * - As the only structural element on a page — cards group content, they don't replace layout.
355
+ * - For a dismissible/transient message — use a modal or a dedicated notification component.
356
+ */
357
+ interface HTMLBsCardElement extends Components.BsCard, HTMLStencilElement {
358
+ }
359
+ var HTMLBsCardElement: {
360
+ prototype: HTMLBsCardElement;
361
+ new (): HTMLBsCardElement;
362
+ };
363
+ interface HTMLBsComposerElementEventMap {
364
+ "bsInput": string;
365
+ "bsSubmit": void;
366
+ "bsStop": void;
367
+ "bsVoiceConfirm": void;
368
+ "bsAttach": void;
369
+ "bsMicToggle": void;
370
+ }
371
+ /**
372
+ * A chat composer input for Genie AI-style conversational interfaces: a text field
373
+ * plus an attach button, a mic/voice-recording toggle, and a single primary action button whose
374
+ * icon and behavior change with `state` (send, stop generating, or confirm a voice recording).
375
+ * ## When to use
376
+ * - The message-entry bar for an AI chat/assistant or human support conversation.
377
+ * ## When not to use
378
+ * - A general-purpose text field — use `bs-input` instead; this component's layout and states are
379
+ * purpose-built for a chat composer, not a generic form field.
380
+ * @prop --bs-composer-radius - Corner radius of the container. Aliased to `--bs-border-radius-150`.
381
+ * @prop --bs-composer-button-radius - Corner radius of the attach/mic/action buttons. Aliased to `--bs-border-radius-100`.
382
+ * @prop --bs-composer-button-size - Width/height of the attach/mic/action buttons. Aliased to `--bs-spacing-600`.
383
+ * @prop --bs-composer-bg - Background of the pill container. Aliased to `--bs-input-bg-default`.
384
+ * @prop --bs-composer-border - Border color of the pill container. Aliased to `--bs-input-border-default`.
385
+ * @prop --bs-composer-border-focus - Border color when the text field has focus. Aliased to `--bs-input-border-focus`.
386
+ * @prop --bs-composer-action-bg - Background of the primary action button. Aliased to `--bs-color-primary-default`.
387
+ * @prop --bs-composer-action-bg-hover - Aliased to `--bs-color-primary-hover`.
388
+ * @prop --bs-composer-action-bg-pressed - Aliased to `--bs-color-primary-pressed`.
389
+ * @prop --bs-composer-action-bg-disabled - Aliased to `--bs-surface-action-disabled`.
390
+ * @prop --bs-composer-action-icon - Icon color on the primary action button. Aliased to `--bs-text-on-action`.
391
+ * @prop --bs-composer-action-icon-disabled - Aliased to `--bs-text-on-disabled`.
392
+ * @prop --bs-composer-attach-icon - Icon color of the attach button. Aliased to `--bs-icon-default`.
393
+ * @prop --bs-composer-mic-icon - Icon color of the mic/stop-recording button. Aliased to `--bs-icon-default`.
394
+ * @prop --bs-composer-mic-icon-disabled - Aliased to `--bs-icon-disabled`.
395
+ * @prop --bs-composer-subtle-hover - Background of the attach/mic buttons on hover (subtle-button treatment, same as `bs-button`'s `subtle` variant). Aliased to `--bs-color-neutral-container`.
396
+ * @prop --bs-composer-subtle-pressed - Background of the attach/mic buttons when pressed. Aliased to `--bs-color-neutral-container-pressed`.
397
+ */
398
+ interface HTMLBsComposerElement extends Components.BsComposer, HTMLStencilElement {
399
+ addEventListener<K extends keyof HTMLBsComposerElementEventMap>(type: K, listener: (this: HTMLBsComposerElement, ev: BsComposerCustomEvent<HTMLBsComposerElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
400
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
401
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
402
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
403
+ removeEventListener<K extends keyof HTMLBsComposerElementEventMap>(type: K, listener: (this: HTMLBsComposerElement, ev: BsComposerCustomEvent<HTMLBsComposerElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
404
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
405
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
406
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
407
+ }
408
+ var HTMLBsComposerElement: {
409
+ prototype: HTMLBsComposerElement;
410
+ new (): HTMLBsComposerElement;
411
+ };
412
+ interface HTMLBsDataTableElementEventMap {
413
+ "bsSort": { column: string; direction: 'asc' | 'desc' };
414
+ "bsRowSelect": { id: string | number; selected: boolean };
415
+ }
416
+ /**
417
+ * A sortable, optionally row-selectable table for tabular data.
418
+ * `columns`, `rows`, and `cellRenderer` are JS-property-only — HTML attributes can only carry
419
+ * strings, so arrays/objects/functions must be set via `element.rows = [...]` etc., not as
420
+ * attributes. See CONVENTIONS.md.
421
+ * ## When to use
422
+ * - Comparing structured records across the same set of fields (a list of people, bookings, etc.).
423
+ * ## When not to use
424
+ * - A handful of unrelated key/value pairs — a simple list or card is lighter-weight.
425
+ * - Deeply nested/hierarchical data — this component renders one flat row per record.
426
+ */
427
+ interface HTMLBsDataTableElement extends Components.BsDataTable, HTMLStencilElement {
428
+ addEventListener<K extends keyof HTMLBsDataTableElementEventMap>(type: K, listener: (this: HTMLBsDataTableElement, ev: BsDataTableCustomEvent<HTMLBsDataTableElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
429
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
430
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
431
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
432
+ removeEventListener<K extends keyof HTMLBsDataTableElementEventMap>(type: K, listener: (this: HTMLBsDataTableElement, ev: BsDataTableCustomEvent<HTMLBsDataTableElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
433
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
434
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
435
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
436
+ }
437
+ var HTMLBsDataTableElement: {
438
+ prototype: HTMLBsDataTableElement;
439
+ new (): HTMLBsDataTableElement;
440
+ };
441
+ interface HTMLBsInputElementEventMap {
442
+ "bsInput": string;
443
+ "bsChange": string;
444
+ }
445
+ /**
446
+ * A single-line text field with an optional label, description, and error state.
447
+ * ## When to use
448
+ * - Collecting a single line of free-text, email, password, or numeric input.
449
+ * - Pair with `error` for inline validation feedback tied to that specific field.
450
+ * ## When not to use
451
+ * - Multi-line text — this component has no `textarea` mode.
452
+ * - A fixed set of choices — use a select/radio/checkbox component instead of free text.
453
+ */
454
+ interface HTMLBsInputElement extends Components.BsInput, HTMLStencilElement {
455
+ addEventListener<K extends keyof HTMLBsInputElementEventMap>(type: K, listener: (this: HTMLBsInputElement, ev: BsInputCustomEvent<HTMLBsInputElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
456
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
457
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
458
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
459
+ removeEventListener<K extends keyof HTMLBsInputElementEventMap>(type: K, listener: (this: HTMLBsInputElement, ev: BsInputCustomEvent<HTMLBsInputElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
460
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
461
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
462
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
463
+ }
464
+ var HTMLBsInputElement: {
465
+ prototype: HTMLBsInputElement;
466
+ new (): HTMLBsInputElement;
467
+ };
468
+ interface HTMLBsModalElementEventMap {
469
+ "bsClose": void;
470
+ }
471
+ /**
472
+ * An overlay dialog that interrupts the current flow for a focused task or confirmation.
473
+ * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
474
+ * ## When to use
475
+ * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
476
+ * - A short, focused task that doesn't warrant navigating to a new page.
477
+ * ## When not to use
478
+ * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
479
+ * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
480
+ * modal that just gets taller and taller.
481
+ */
482
+ interface HTMLBsModalElement extends Components.BsModal, HTMLStencilElement {
483
+ addEventListener<K extends keyof HTMLBsModalElementEventMap>(type: K, listener: (this: HTMLBsModalElement, ev: BsModalCustomEvent<HTMLBsModalElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
484
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
485
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
486
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
487
+ removeEventListener<K extends keyof HTMLBsModalElementEventMap>(type: K, listener: (this: HTMLBsModalElement, ev: BsModalCustomEvent<HTMLBsModalElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
488
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
489
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
490
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
491
+ }
492
+ var HTMLBsModalElement: {
493
+ prototype: HTMLBsModalElement;
494
+ new (): HTMLBsModalElement;
495
+ };
496
+ interface HTMLElementTagNameMap {
497
+ "bs-badge": HTMLBsBadgeElement;
498
+ "bs-button": HTMLBsButtonElement;
499
+ "bs-button-skeleton": HTMLBsButtonSkeletonElement;
500
+ "bs-card": HTMLBsCardElement;
501
+ "bs-composer": HTMLBsComposerElement;
502
+ "bs-data-table": HTMLBsDataTableElement;
503
+ "bs-input": HTMLBsInputElement;
504
+ "bs-modal": HTMLBsModalElement;
505
+ }
506
+ }
507
+ declare namespace LocalJSX {
508
+ /**
509
+ * A small status or category pill, usually paired with a label or list item.
510
+ * ## When to use
511
+ * - Communicating a short, fixed status (e.g. "Active", "On leave") or category label.
512
+ * ## When not to use
513
+ * - As an interactive/clickable element — a badge is a label, not a control. Use a button
514
+ * or chip component if it needs to be clickable.
515
+ * - For long text — badges are sized for one or two words.
516
+ */
517
+ interface BsBadge {
518
+ /**
519
+ * Maps directly to the brandsync-tokens `--bs-badge-bg-*` / `--bs-badge-text-*` sets.
520
+ * @default 'default'
521
+ */
522
+ "variant"?: BsBadgeVariant;
523
+ }
524
+ /**
525
+ * A clickable action element for the single most important action in a given context.
526
+ * ## When to use
527
+ * - The primary call to action on a screen or within a card/modal (e.g. "Book room", "Confirm").
528
+ * - Secondary, lower-emphasis actions alongside it (use `variant="neutral"`).
529
+ * - `variant="error"` for destructive/irreversible actions (e.g. "Delete account") — per
530
+ * BrandSync guidance, destructive actions should always use the error variant, never
531
+ * `neutral`, so the visual weight matches the risk of the action.
532
+ * ## When not to use
533
+ * - For navigation between pages — use a link/nav component instead, a button implies an
534
+ * in-page action, not a destination change.
535
+ * - For more than one primary-emphasis action in the same view — pick one, demote the rest to
536
+ * `neutral`.
537
+ * - `error` purely for visual emphasis — it signals a destructive action to the user, so reserve
538
+ * it for actions that actually delete/revoke/undo something.
539
+ * @prop --bs-button-radius - Corner radius. Aliased to `--bs-border-radius-100` by default.
540
+ * @prop --bs-button-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
541
+ * @prop --bs-button-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
542
+ * @prop --bs-button-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
543
+ */
544
+ interface BsButton {
545
+ /**
546
+ * Accessible name for the button. Required for icon-only usage (no visible label text via the default slot) so screen readers still announce what the button does. Stencil reflects this camelCase prop to the `aria-label` HTML attribute automatically.
547
+ * @default null
548
+ */
549
+ "ariaLabel"?: string | null;
550
+ /**
551
+ * Disables the button and applies the disabled token set.
552
+ * @default false
553
+ */
554
+ "disabled"?: boolean;
555
+ /**
556
+ * Sizing scale.
557
+ * @default 'md'
558
+ */
559
+ "size"?: BsButtonSize;
560
+ /**
561
+ * Native `<button>` type.
562
+ * @default 'button'
563
+ */
564
+ "type"?: 'button' | 'submit' | 'reset';
565
+ /**
566
+ * Visual style. Maps directly to the brandsync-tokens `--bs-button-*` semantic set. `error` is for destructive/irreversible actions per BrandSync guidance, not a stronger emphasis alternative to `primary`.
567
+ * @default 'primary'
568
+ */
569
+ "variant"?: BsButtonVariant;
570
+ }
571
+ /**
572
+ * A shape-matched loading placeholder for `bs-button`, shown while the real label/action isn't
573
+ * known yet (e.g. still being fetched from an API). Sized to match `bs-button`'s `sm`/`md`/`lg`
574
+ * heights so layout doesn't shift once the real button renders.
575
+ * This is not a submit-in-progress spinner — that's a different concern (a button that's
576
+ * already rendered but waiting on an async action it triggered). Use this component only when
577
+ * the button itself doesn't exist yet.
578
+ * ## When to use
579
+ * - In place of a `bs-button` whose label/visibility depends on data that hasn't loaded yet.
580
+ * ## When not to use
581
+ * - While a button's own click handler is running (e.g. a submit request in flight) — render the
582
+ * real `bs-button` and show its own busy/spinner state instead.
583
+ * @prop --bs-button-skeleton-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
584
+ * @prop --bs-button-skeleton-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
585
+ * @prop --bs-button-skeleton-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
586
+ * @prop --bs-button-skeleton-width - Placeholder width. Defaults to `96px`.
587
+ */
588
+ interface BsButtonSkeleton {
589
+ /**
590
+ * Sizing scale, matching the `bs-button` size it stands in for.
591
+ * @default 'md'
592
+ */
593
+ "size"?: BsButtonSize1;
594
+ }
595
+ /**
596
+ * A bounded surface for grouping related content — a summary, a form section, a list item.
597
+ * ## When to use
598
+ * - Grouping a self-contained piece of content that needs visual separation from the page
599
+ * background (e.g. a booking summary, a settings section).
600
+ * ## When not to use
601
+ * - As the only structural element on a page — cards group content, they don't replace layout.
602
+ * - For a dismissible/transient message — use a modal or a dedicated notification component.
603
+ */
604
+ interface BsCard {
605
+ /**
606
+ * Maps to the brandsync-tokens `--bs-paper-bg-*` set — Brandsync's tokens don't have a dedicated "card" component yet, so this reuses the existing Paper surface tokens.
607
+ * @default 'raised'
608
+ */
609
+ "surface"?: BsCardSurface;
610
+ }
611
+ /**
612
+ * A chat composer input for Genie AI-style conversational interfaces: a text field
613
+ * plus an attach button, a mic/voice-recording toggle, and a single primary action button whose
614
+ * icon and behavior change with `state` (send, stop generating, or confirm a voice recording).
615
+ * ## When to use
616
+ * - The message-entry bar for an AI chat/assistant or human support conversation.
617
+ * ## When not to use
618
+ * - A general-purpose text field — use `bs-input` instead; this component's layout and states are
619
+ * purpose-built for a chat composer, not a generic form field.
620
+ * @prop --bs-composer-radius - Corner radius of the container. Aliased to `--bs-border-radius-150`.
621
+ * @prop --bs-composer-button-radius - Corner radius of the attach/mic/action buttons. Aliased to `--bs-border-radius-100`.
622
+ * @prop --bs-composer-button-size - Width/height of the attach/mic/action buttons. Aliased to `--bs-spacing-600`.
623
+ * @prop --bs-composer-bg - Background of the pill container. Aliased to `--bs-input-bg-default`.
624
+ * @prop --bs-composer-border - Border color of the pill container. Aliased to `--bs-input-border-default`.
625
+ * @prop --bs-composer-border-focus - Border color when the text field has focus. Aliased to `--bs-input-border-focus`.
626
+ * @prop --bs-composer-action-bg - Background of the primary action button. Aliased to `--bs-color-primary-default`.
627
+ * @prop --bs-composer-action-bg-hover - Aliased to `--bs-color-primary-hover`.
628
+ * @prop --bs-composer-action-bg-pressed - Aliased to `--bs-color-primary-pressed`.
629
+ * @prop --bs-composer-action-bg-disabled - Aliased to `--bs-surface-action-disabled`.
630
+ * @prop --bs-composer-action-icon - Icon color on the primary action button. Aliased to `--bs-text-on-action`.
631
+ * @prop --bs-composer-action-icon-disabled - Aliased to `--bs-text-on-disabled`.
632
+ * @prop --bs-composer-attach-icon - Icon color of the attach button. Aliased to `--bs-icon-default`.
633
+ * @prop --bs-composer-mic-icon - Icon color of the mic/stop-recording button. Aliased to `--bs-icon-default`.
634
+ * @prop --bs-composer-mic-icon-disabled - Aliased to `--bs-icon-disabled`.
635
+ * @prop --bs-composer-subtle-hover - Background of the attach/mic buttons on hover (subtle-button treatment, same as `bs-button`'s `subtle` variant). Aliased to `--bs-color-neutral-container`.
636
+ * @prop --bs-composer-subtle-pressed - Background of the attach/mic buttons when pressed. Aliased to `--bs-color-neutral-container-pressed`.
637
+ */
638
+ interface BsComposer {
639
+ /**
640
+ * Accessible name for the text field. This component has no visible `<label>` (chat composers don't show one in the design), so `ariaLabel` is the only way a consumer gives the textbox an accessible name -- set it in every real usage.
641
+ * @default null
642
+ */
643
+ "ariaLabel"?: string | null;
644
+ /**
645
+ * Fires when the "+" attach button is clicked.
646
+ */
647
+ "onBsAttach"?: (event: BsComposerCustomEvent<void>) => void;
648
+ /**
649
+ * Fires on every keystroke in the text field, with the current value.
650
+ */
651
+ "onBsInput"?: (event: BsComposerCustomEvent<string>) => void;
652
+ /**
653
+ * Fires when the mic/stop-recording button is clicked. The consumer decides what that means (e.g. start recording when idle/generating, or stop recording when `state="recording"`).
654
+ */
655
+ "onBsMicToggle"?: (event: BsComposerCustomEvent<void>) => void;
656
+ /**
657
+ * Fires when the primary action button is clicked while `state="generating"`.
658
+ */
659
+ "onBsStop"?: (event: BsComposerCustomEvent<void>) => void;
660
+ /**
661
+ * Fires when the primary action button is clicked while `state="idle"`.
662
+ */
663
+ "onBsSubmit"?: (event: BsComposerCustomEvent<void>) => void;
664
+ /**
665
+ * Fires when the primary action button is clicked while `state="recording"`.
666
+ */
667
+ "onBsVoiceConfirm"?: (event: BsComposerCustomEvent<void>) => void;
668
+ /**
669
+ * Overrides the variant's default placeholder.
670
+ */
671
+ "placeholder"?: string;
672
+ /**
673
+ * Which of the four mutually-exclusive composer states to render: `idle` (send, enabled), `generating` (stop, while the AI is responding), `disabled` (send, but not interactive), or `recording` (voice input in progress -- shows a waveform and a confirm action).
674
+ * @default 'idle'
675
+ */
676
+ "state"?: BsComposerState;
677
+ /**
678
+ * Current text value. Native `input` events don't cross the Shadow DOM boundary, so this component re-dispatches them as a `bsInput` custom event instead.
679
+ * @default ''
680
+ */
681
+ "value"?: string;
682
+ /**
683
+ * Which flavor of composer this is: changes the *default* placeholder text (set `placeholder` directly to override it) and, per the Figma design, renders the container border dashed instead of solid for `'human'` -- a deliberate visual cue distinguishing a human-support composer from the AI one, not a layout/token difference.
684
+ * @default 'ai'
685
+ */
686
+ "variant"?: BsComposerVariant;
687
+ }
688
+ /**
689
+ * A sortable, optionally row-selectable table for tabular data.
690
+ * `columns`, `rows`, and `cellRenderer` are JS-property-only — HTML attributes can only carry
691
+ * strings, so arrays/objects/functions must be set via `element.rows = [...]` etc., not as
692
+ * attributes. See CONVENTIONS.md.
693
+ * ## When to use
694
+ * - Comparing structured records across the same set of fields (a list of people, bookings, etc.).
695
+ * ## When not to use
696
+ * - A handful of unrelated key/value pairs — a simple list or card is lighter-weight.
697
+ * - Deeply nested/hierarchical data — this component renders one flat row per record.
698
+ */
699
+ interface BsDataTable {
700
+ /**
701
+ * Optional custom cell renderer, e.g. for an actions column. Function props are JS-property-only, same as array props -- there is no attribute equivalent. Falls back to the raw cell value.
702
+ */
703
+ "cellRenderer"?: (row: BsDataTableRow, column: BsDataTableColumn) => string;
704
+ /**
705
+ * Array prop -- must be set as a JS property (`el.columns = [...]`), not an HTML attribute, since attributes can only carry strings. See CONVENTIONS.md.
706
+ * @default []
707
+ */
708
+ "columns"?: BsDataTableColumn[];
709
+ "onBsRowSelect"?: (event: BsDataTableCustomEvent<{ id: string | number; selected: boolean }>) => void;
710
+ "onBsSort"?: (event: BsDataTableCustomEvent<{ column: string; direction: 'asc' | 'desc' }>) => void;
711
+ /**
712
+ * Array prop -- same JS-property-only rule as `columns`.
713
+ * @default []
714
+ */
715
+ "rows"?: BsDataTableRow[];
716
+ /**
717
+ * @default false
718
+ */
719
+ "selectable"?: boolean;
720
+ "sortColumn"?: string;
721
+ /**
722
+ * @default 'asc'
723
+ */
724
+ "sortDirection"?: 'asc' | 'desc';
725
+ }
726
+ /**
727
+ * A single-line text field with an optional label, description, and error state.
728
+ * ## When to use
729
+ * - Collecting a single line of free-text, email, password, or numeric input.
730
+ * - Pair with `error` for inline validation feedback tied to that specific field.
731
+ * ## When not to use
732
+ * - Multi-line text — this component has no `textarea` mode.
733
+ * - A fixed set of choices — use a select/radio/checkbox component instead of free text.
734
+ */
735
+ interface BsInput {
736
+ "description"?: string;
737
+ /**
738
+ * @default false
739
+ */
740
+ "disabled"?: boolean;
741
+ "error"?: string;
742
+ "label"?: string;
743
+ "onBsChange"?: (event: BsInputCustomEvent<string>) => void;
744
+ "onBsInput"?: (event: BsInputCustomEvent<string>) => void;
745
+ "placeholder"?: string;
746
+ /**
747
+ * @default 'text'
748
+ */
749
+ "type"?: 'text' | 'email' | 'password' | 'number';
750
+ /**
751
+ * Current value. Native `input`/`change` events don't cross the Shadow DOM boundary, so this component re-dispatches them as `bsInput`/`bsChange` custom events instead.
752
+ * @default ''
753
+ */
754
+ "value"?: string;
755
+ }
756
+ /**
757
+ * An overlay dialog that interrupts the current flow for a focused task or confirmation.
758
+ * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
759
+ * ## When to use
760
+ * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
761
+ * - A short, focused task that doesn't warrant navigating to a new page.
762
+ * ## When not to use
763
+ * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
764
+ * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
765
+ * modal that just gets taller and taller.
766
+ */
767
+ interface BsModal {
768
+ "heading"?: string;
769
+ "onBsClose"?: (event: BsModalCustomEvent<void>) => void;
770
+ /**
771
+ * Mutable + reflected so the component can close itself (backdrop click, Escape, close button) the same way a native `<dialog>` does, while still emitting `bsClose` for the consumer to react to.
772
+ * @default false
773
+ */
774
+ "open"?: boolean;
775
+ /**
776
+ * @default 'md'
777
+ */
778
+ "size"?: BsModalSize;
779
+ }
780
+
781
+ interface BsBadgeAttributes {
782
+ "variant": BsBadgeVariant;
783
+ }
784
+ interface BsButtonAttributes {
785
+ "variant": BsButtonVariant;
786
+ "size": BsButtonSize;
787
+ "disabled": boolean;
788
+ "type": 'button' | 'submit' | 'reset';
789
+ "ariaLabel": string | null;
790
+ }
791
+ interface BsButtonSkeletonAttributes {
792
+ "size": BsButtonSize;
793
+ }
794
+ interface BsCardAttributes {
795
+ "surface": BsCardSurface;
796
+ }
797
+ interface BsComposerAttributes {
798
+ "variant": BsComposerVariant;
799
+ "placeholder": string;
800
+ "value": string;
801
+ "state": BsComposerState;
802
+ "ariaLabel": string | null;
803
+ }
804
+ interface BsDataTableAttributes {
805
+ "sortColumn": string;
806
+ "sortDirection": 'asc' | 'desc';
807
+ "selectable": boolean;
808
+ }
809
+ interface BsInputAttributes {
810
+ "value": string;
811
+ "type": 'text' | 'email' | 'password' | 'number';
812
+ "label": string;
813
+ "placeholder": string;
814
+ "description": string;
815
+ "error": string;
816
+ "disabled": boolean;
817
+ }
818
+ interface BsModalAttributes {
819
+ "open": boolean;
820
+ "heading": string;
821
+ "size": BsModalSize;
822
+ }
823
+
824
+ interface IntrinsicElements {
825
+ "bs-badge": Omit<BsBadge, keyof BsBadgeAttributes> & { [K in keyof BsBadge & keyof BsBadgeAttributes]?: BsBadge[K] } & { [K in keyof BsBadge & keyof BsBadgeAttributes as `attr:${K}`]?: BsBadgeAttributes[K] } & { [K in keyof BsBadge & keyof BsBadgeAttributes as `prop:${K}`]?: BsBadge[K] };
826
+ "bs-button": Omit<BsButton, keyof BsButtonAttributes> & { [K in keyof BsButton & keyof BsButtonAttributes]?: BsButton[K] } & { [K in keyof BsButton & keyof BsButtonAttributes as `attr:${K}`]?: BsButtonAttributes[K] } & { [K in keyof BsButton & keyof BsButtonAttributes as `prop:${K}`]?: BsButton[K] };
827
+ "bs-button-skeleton": Omit<BsButtonSkeleton, keyof BsButtonSkeletonAttributes> & { [K in keyof BsButtonSkeleton & keyof BsButtonSkeletonAttributes]?: BsButtonSkeleton[K] } & { [K in keyof BsButtonSkeleton & keyof BsButtonSkeletonAttributes as `attr:${K}`]?: BsButtonSkeletonAttributes[K] } & { [K in keyof BsButtonSkeleton & keyof BsButtonSkeletonAttributes as `prop:${K}`]?: BsButtonSkeleton[K] };
828
+ "bs-card": Omit<BsCard, keyof BsCardAttributes> & { [K in keyof BsCard & keyof BsCardAttributes]?: BsCard[K] } & { [K in keyof BsCard & keyof BsCardAttributes as `attr:${K}`]?: BsCardAttributes[K] } & { [K in keyof BsCard & keyof BsCardAttributes as `prop:${K}`]?: BsCard[K] };
829
+ "bs-composer": Omit<BsComposer, keyof BsComposerAttributes> & { [K in keyof BsComposer & keyof BsComposerAttributes]?: BsComposer[K] } & { [K in keyof BsComposer & keyof BsComposerAttributes as `attr:${K}`]?: BsComposerAttributes[K] } & { [K in keyof BsComposer & keyof BsComposerAttributes as `prop:${K}`]?: BsComposer[K] };
830
+ "bs-data-table": Omit<BsDataTable, keyof BsDataTableAttributes> & { [K in keyof BsDataTable & keyof BsDataTableAttributes]?: BsDataTable[K] } & { [K in keyof BsDataTable & keyof BsDataTableAttributes as `attr:${K}`]?: BsDataTableAttributes[K] } & { [K in keyof BsDataTable & keyof BsDataTableAttributes as `prop:${K}`]?: BsDataTable[K] };
831
+ "bs-input": Omit<BsInput, keyof BsInputAttributes> & { [K in keyof BsInput & keyof BsInputAttributes]?: BsInput[K] } & { [K in keyof BsInput & keyof BsInputAttributes as `attr:${K}`]?: BsInputAttributes[K] } & { [K in keyof BsInput & keyof BsInputAttributes as `prop:${K}`]?: BsInput[K] };
832
+ "bs-modal": Omit<BsModal, keyof BsModalAttributes> & { [K in keyof BsModal & keyof BsModalAttributes]?: BsModal[K] } & { [K in keyof BsModal & keyof BsModalAttributes as `attr:${K}`]?: BsModalAttributes[K] } & { [K in keyof BsModal & keyof BsModalAttributes as `prop:${K}`]?: BsModal[K] };
833
+ }
834
+ }
835
+ export { LocalJSX as JSX };
836
+ declare module "@stencil/core" {
837
+ export namespace JSX {
838
+ interface IntrinsicElements {
839
+ /**
840
+ * A small status or category pill, usually paired with a label or list item.
841
+ * ## When to use
842
+ * - Communicating a short, fixed status (e.g. "Active", "On leave") or category label.
843
+ * ## When not to use
844
+ * - As an interactive/clickable element — a badge is a label, not a control. Use a button
845
+ * or chip component if it needs to be clickable.
846
+ * - For long text — badges are sized for one or two words.
847
+ */
848
+ "bs-badge": LocalJSX.IntrinsicElements["bs-badge"] & JSXBase.HTMLAttributes<HTMLBsBadgeElement>;
849
+ /**
850
+ * A clickable action element for the single most important action in a given context.
851
+ * ## When to use
852
+ * - The primary call to action on a screen or within a card/modal (e.g. "Book room", "Confirm").
853
+ * - Secondary, lower-emphasis actions alongside it (use `variant="neutral"`).
854
+ * - `variant="error"` for destructive/irreversible actions (e.g. "Delete account") — per
855
+ * BrandSync guidance, destructive actions should always use the error variant, never
856
+ * `neutral`, so the visual weight matches the risk of the action.
857
+ * ## When not to use
858
+ * - For navigation between pages — use a link/nav component instead, a button implies an
859
+ * in-page action, not a destination change.
860
+ * - For more than one primary-emphasis action in the same view — pick one, demote the rest to
861
+ * `neutral`.
862
+ * - `error` purely for visual emphasis — it signals a destructive action to the user, so reserve
863
+ * it for actions that actually delete/revoke/undo something.
864
+ * @prop --bs-button-radius - Corner radius. Aliased to `--bs-border-radius-100` by default.
865
+ * @prop --bs-button-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
866
+ * @prop --bs-button-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
867
+ * @prop --bs-button-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
868
+ */
869
+ "bs-button": LocalJSX.IntrinsicElements["bs-button"] & JSXBase.HTMLAttributes<HTMLBsButtonElement>;
870
+ /**
871
+ * A shape-matched loading placeholder for `bs-button`, shown while the real label/action isn't
872
+ * known yet (e.g. still being fetched from an API). Sized to match `bs-button`'s `sm`/`md`/`lg`
873
+ * heights so layout doesn't shift once the real button renders.
874
+ * This is not a submit-in-progress spinner — that's a different concern (a button that's
875
+ * already rendered but waiting on an async action it triggered). Use this component only when
876
+ * the button itself doesn't exist yet.
877
+ * ## When to use
878
+ * - In place of a `bs-button` whose label/visibility depends on data that hasn't loaded yet.
879
+ * ## When not to use
880
+ * - While a button's own click handler is running (e.g. a submit request in flight) — render the
881
+ * real `bs-button` and show its own busy/spinner state instead.
882
+ * @prop --bs-button-skeleton-height-sm - Height at `size="sm"`. Aliased to `--bs-spacing-500`.
883
+ * @prop --bs-button-skeleton-height-md - Height at `size="md"`. Aliased to `--bs-spacing-600`.
884
+ * @prop --bs-button-skeleton-height-lg - Height at `size="lg"`. Aliased to `--bs-spacing-700`.
885
+ * @prop --bs-button-skeleton-width - Placeholder width. Defaults to `96px`.
886
+ */
887
+ "bs-button-skeleton": LocalJSX.IntrinsicElements["bs-button-skeleton"] & JSXBase.HTMLAttributes<HTMLBsButtonSkeletonElement>;
888
+ /**
889
+ * A bounded surface for grouping related content — a summary, a form section, a list item.
890
+ * ## When to use
891
+ * - Grouping a self-contained piece of content that needs visual separation from the page
892
+ * background (e.g. a booking summary, a settings section).
893
+ * ## When not to use
894
+ * - As the only structural element on a page — cards group content, they don't replace layout.
895
+ * - For a dismissible/transient message — use a modal or a dedicated notification component.
896
+ */
897
+ "bs-card": LocalJSX.IntrinsicElements["bs-card"] & JSXBase.HTMLAttributes<HTMLBsCardElement>;
898
+ /**
899
+ * A chat composer input for Genie AI-style conversational interfaces: a text field
900
+ * plus an attach button, a mic/voice-recording toggle, and a single primary action button whose
901
+ * icon and behavior change with `state` (send, stop generating, or confirm a voice recording).
902
+ * ## When to use
903
+ * - The message-entry bar for an AI chat/assistant or human support conversation.
904
+ * ## When not to use
905
+ * - A general-purpose text field — use `bs-input` instead; this component's layout and states are
906
+ * purpose-built for a chat composer, not a generic form field.
907
+ * @prop --bs-composer-radius - Corner radius of the container. Aliased to `--bs-border-radius-150`.
908
+ * @prop --bs-composer-button-radius - Corner radius of the attach/mic/action buttons. Aliased to `--bs-border-radius-100`.
909
+ * @prop --bs-composer-button-size - Width/height of the attach/mic/action buttons. Aliased to `--bs-spacing-600`.
910
+ * @prop --bs-composer-bg - Background of the pill container. Aliased to `--bs-input-bg-default`.
911
+ * @prop --bs-composer-border - Border color of the pill container. Aliased to `--bs-input-border-default`.
912
+ * @prop --bs-composer-border-focus - Border color when the text field has focus. Aliased to `--bs-input-border-focus`.
913
+ * @prop --bs-composer-action-bg - Background of the primary action button. Aliased to `--bs-color-primary-default`.
914
+ * @prop --bs-composer-action-bg-hover - Aliased to `--bs-color-primary-hover`.
915
+ * @prop --bs-composer-action-bg-pressed - Aliased to `--bs-color-primary-pressed`.
916
+ * @prop --bs-composer-action-bg-disabled - Aliased to `--bs-surface-action-disabled`.
917
+ * @prop --bs-composer-action-icon - Icon color on the primary action button. Aliased to `--bs-text-on-action`.
918
+ * @prop --bs-composer-action-icon-disabled - Aliased to `--bs-text-on-disabled`.
919
+ * @prop --bs-composer-attach-icon - Icon color of the attach button. Aliased to `--bs-icon-default`.
920
+ * @prop --bs-composer-mic-icon - Icon color of the mic/stop-recording button. Aliased to `--bs-icon-default`.
921
+ * @prop --bs-composer-mic-icon-disabled - Aliased to `--bs-icon-disabled`.
922
+ * @prop --bs-composer-subtle-hover - Background of the attach/mic buttons on hover (subtle-button treatment, same as `bs-button`'s `subtle` variant). Aliased to `--bs-color-neutral-container`.
923
+ * @prop --bs-composer-subtle-pressed - Background of the attach/mic buttons when pressed. Aliased to `--bs-color-neutral-container-pressed`.
924
+ */
925
+ "bs-composer": LocalJSX.IntrinsicElements["bs-composer"] & JSXBase.HTMLAttributes<HTMLBsComposerElement>;
926
+ /**
927
+ * A sortable, optionally row-selectable table for tabular data.
928
+ * `columns`, `rows`, and `cellRenderer` are JS-property-only — HTML attributes can only carry
929
+ * strings, so arrays/objects/functions must be set via `element.rows = [...]` etc., not as
930
+ * attributes. See CONVENTIONS.md.
931
+ * ## When to use
932
+ * - Comparing structured records across the same set of fields (a list of people, bookings, etc.).
933
+ * ## When not to use
934
+ * - A handful of unrelated key/value pairs — a simple list or card is lighter-weight.
935
+ * - Deeply nested/hierarchical data — this component renders one flat row per record.
936
+ */
937
+ "bs-data-table": LocalJSX.IntrinsicElements["bs-data-table"] & JSXBase.HTMLAttributes<HTMLBsDataTableElement>;
938
+ /**
939
+ * A single-line text field with an optional label, description, and error state.
940
+ * ## When to use
941
+ * - Collecting a single line of free-text, email, password, or numeric input.
942
+ * - Pair with `error` for inline validation feedback tied to that specific field.
943
+ * ## When not to use
944
+ * - Multi-line text — this component has no `textarea` mode.
945
+ * - A fixed set of choices — use a select/radio/checkbox component instead of free text.
946
+ */
947
+ "bs-input": LocalJSX.IntrinsicElements["bs-input"] & JSXBase.HTMLAttributes<HTMLBsInputElement>;
948
+ /**
949
+ * An overlay dialog that interrupts the current flow for a focused task or confirmation.
950
+ * Closes itself on backdrop click, Escape, or its own close button, and emits `bsClose`.
951
+ * ## When to use
952
+ * - Confirming a consequential action (e.g. "Confirm booking") before it takes effect.
953
+ * - A short, focused task that doesn't warrant navigating to a new page.
954
+ * ## When not to use
955
+ * - For non-blocking status messages — use a toast/notification instead of interrupting the user.
956
+ * - For a long, multi-step flow — a full page or a dedicated route is usually a better fit than a
957
+ * modal that just gets taller and taller.
958
+ */
959
+ "bs-modal": LocalJSX.IntrinsicElements["bs-modal"] & JSXBase.HTMLAttributes<HTMLBsModalElement>;
960
+ }
961
+ }
962
+ }