bareframe 0.1.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 (228) hide show
  1. package/README.md +197 -0
  2. package/dist/components/accordion.css +107 -0
  3. package/dist/components/accordion.js +92 -0
  4. package/dist/components/action-list.css +30 -0
  5. package/dist/components/action-list.js +31 -0
  6. package/dist/components/alert.css +30 -0
  7. package/dist/components/alert.js +31 -0
  8. package/dist/components/anchor.css +30 -0
  9. package/dist/components/anchor.js +31 -0
  10. package/dist/components/autocomplete.css +30 -0
  11. package/dist/components/autocomplete.js +31 -0
  12. package/dist/components/avatar.css +30 -0
  13. package/dist/components/avatar.js +31 -0
  14. package/dist/components/badge.css +30 -0
  15. package/dist/components/badge.js +31 -0
  16. package/dist/components/banner.css +30 -0
  17. package/dist/components/banner.js +31 -0
  18. package/dist/components/bar-chart.css +30 -0
  19. package/dist/components/bar-chart.js +31 -0
  20. package/dist/components/bottom-navigation.css +30 -0
  21. package/dist/components/bottom-navigation.js +31 -0
  22. package/dist/components/bottom-sheet.css +30 -0
  23. package/dist/components/bottom-sheet.js +31 -0
  24. package/dist/components/breadcrumb.css +30 -0
  25. package/dist/components/breadcrumb.js +31 -0
  26. package/dist/components/button-group.css +30 -0
  27. package/dist/components/button-group.js +31 -0
  28. package/dist/components/button.css +136 -0
  29. package/dist/components/button.js +42 -0
  30. package/dist/components/calendar.css +30 -0
  31. package/dist/components/calendar.js +31 -0
  32. package/dist/components/canvas.css +30 -0
  33. package/dist/components/canvas.js +31 -0
  34. package/dist/components/card.css +30 -0
  35. package/dist/components/card.js +31 -0
  36. package/dist/components/carousel.css +30 -0
  37. package/dist/components/carousel.js +31 -0
  38. package/dist/components/chart.css +30 -0
  39. package/dist/components/chart.js +31 -0
  40. package/dist/components/checkbox.css +30 -0
  41. package/dist/components/checkbox.js +31 -0
  42. package/dist/components/chip.css +30 -0
  43. package/dist/components/chip.js +31 -0
  44. package/dist/components/code-block.css +30 -0
  45. package/dist/components/code-block.js +31 -0
  46. package/dist/components/color-picker.css +30 -0
  47. package/dist/components/color-picker.js +31 -0
  48. package/dist/components/combobox.css +30 -0
  49. package/dist/components/combobox.js +31 -0
  50. package/dist/components/command-palette.css +30 -0
  51. package/dist/components/command-palette.js +31 -0
  52. package/dist/components/context-menu.css +30 -0
  53. package/dist/components/context-menu.js +31 -0
  54. package/dist/components/countdown.css +30 -0
  55. package/dist/components/countdown.js +31 -0
  56. package/dist/components/data-grid.css +30 -0
  57. package/dist/components/data-grid.js +31 -0
  58. package/dist/components/date-picker.css +30 -0
  59. package/dist/components/date-picker.js +31 -0
  60. package/dist/components/date-range-picker.css +30 -0
  61. package/dist/components/date-range-picker.js +31 -0
  62. package/dist/components/dialog.css +30 -0
  63. package/dist/components/dialog.js +31 -0
  64. package/dist/components/divider.css +30 -0
  65. package/dist/components/divider.js +31 -0
  66. package/dist/components/donut-chart.css +30 -0
  67. package/dist/components/donut-chart.js +31 -0
  68. package/dist/components/drawer.css +30 -0
  69. package/dist/components/drawer.js +31 -0
  70. package/dist/components/dropdown.css +30 -0
  71. package/dist/components/dropdown.js +31 -0
  72. package/dist/components/empty-state.css +30 -0
  73. package/dist/components/empty-state.js +31 -0
  74. package/dist/components/error-summary.css +30 -0
  75. package/dist/components/error-summary.js +31 -0
  76. package/dist/components/expanded-panel.css +30 -0
  77. package/dist/components/expanded-panel.js +31 -0
  78. package/dist/components/fab.css +30 -0
  79. package/dist/components/fab.js +31 -0
  80. package/dist/components/file-upload.css +30 -0
  81. package/dist/components/file-upload.js +31 -0
  82. package/dist/components/filter-bar.css +30 -0
  83. package/dist/components/filter-bar.js +31 -0
  84. package/dist/components/footer.css +30 -0
  85. package/dist/components/footer.js +31 -0
  86. package/dist/components/form-field.css +30 -0
  87. package/dist/components/form-field.js +31 -0
  88. package/dist/components/gantt-chart.css +30 -0
  89. package/dist/components/gantt-chart.js +31 -0
  90. package/dist/components/gauge.css +30 -0
  91. package/dist/components/gauge.js +31 -0
  92. package/dist/components/graph.css +30 -0
  93. package/dist/components/graph.js +31 -0
  94. package/dist/components/grid.css +30 -0
  95. package/dist/components/grid.js +31 -0
  96. package/dist/components/header.css +30 -0
  97. package/dist/components/header.js +31 -0
  98. package/dist/components/heatmap.css +30 -0
  99. package/dist/components/heatmap.js +31 -0
  100. package/dist/components/hero.css +30 -0
  101. package/dist/components/hero.js +31 -0
  102. package/dist/components/icon.css +30 -0
  103. package/dist/components/icon.js +31 -0
  104. package/dist/components/image.css +30 -0
  105. package/dist/components/image.js +31 -0
  106. package/dist/components/input.css +30 -0
  107. package/dist/components/input.js +31 -0
  108. package/dist/components/key-value-list.css +30 -0
  109. package/dist/components/key-value-list.js +31 -0
  110. package/dist/components/line-chart.css +30 -0
  111. package/dist/components/line-chart.js +31 -0
  112. package/dist/components/link.css +30 -0
  113. package/dist/components/link.js +31 -0
  114. package/dist/components/list-item.css +30 -0
  115. package/dist/components/list-item.js +31 -0
  116. package/dist/components/list.css +30 -0
  117. package/dist/components/list.js +31 -0
  118. package/dist/components/loading-indicator.css +30 -0
  119. package/dist/components/loading-indicator.js +31 -0
  120. package/dist/components/map.css +30 -0
  121. package/dist/components/map.js +31 -0
  122. package/dist/components/menu-item.css +30 -0
  123. package/dist/components/menu-item.js +31 -0
  124. package/dist/components/menu.css +30 -0
  125. package/dist/components/menu.js +31 -0
  126. package/dist/components/message.css +30 -0
  127. package/dist/components/message.js +31 -0
  128. package/dist/components/metric-card.css +30 -0
  129. package/dist/components/metric-card.js +31 -0
  130. package/dist/components/modal.css +30 -0
  131. package/dist/components/modal.js +31 -0
  132. package/dist/components/multi-select.css +30 -0
  133. package/dist/components/multi-select.js +31 -0
  134. package/dist/components/nav.css +30 -0
  135. package/dist/components/nav.js +31 -0
  136. package/dist/components/notification.css +30 -0
  137. package/dist/components/notification.js +31 -0
  138. package/dist/components/number-field.css +30 -0
  139. package/dist/components/number-field.js +31 -0
  140. package/dist/components/otp-input.css +30 -0
  141. package/dist/components/otp-input.js +31 -0
  142. package/dist/components/pagination.css +30 -0
  143. package/dist/components/pagination.js +31 -0
  144. package/dist/components/pie-chart.css +30 -0
  145. package/dist/components/pie-chart.js +31 -0
  146. package/dist/components/popover.css +30 -0
  147. package/dist/components/popover.js +31 -0
  148. package/dist/components/progress-bar.css +30 -0
  149. package/dist/components/progress-bar.js +31 -0
  150. package/dist/components/progress-circle.css +30 -0
  151. package/dist/components/progress-circle.js +31 -0
  152. package/dist/components/quick-actions.css +30 -0
  153. package/dist/components/quick-actions.js +31 -0
  154. package/dist/components/radio-group.css +30 -0
  155. package/dist/components/radio-group.js +31 -0
  156. package/dist/components/radio.css +30 -0
  157. package/dist/components/radio.js +31 -0
  158. package/dist/components/range-slider.css +30 -0
  159. package/dist/components/range-slider.js +31 -0
  160. package/dist/components/rating.css +30 -0
  161. package/dist/components/rating.js +31 -0
  162. package/dist/components/search.css +30 -0
  163. package/dist/components/search.js +31 -0
  164. package/dist/components/segmented-control.css +30 -0
  165. package/dist/components/segmented-control.js +31 -0
  166. package/dist/components/select.css +30 -0
  167. package/dist/components/select.js +31 -0
  168. package/dist/components/sheet.css +30 -0
  169. package/dist/components/sheet.js +31 -0
  170. package/dist/components/skeleton.css +30 -0
  171. package/dist/components/skeleton.js +31 -0
  172. package/dist/components/slider.css +30 -0
  173. package/dist/components/slider.js +31 -0
  174. package/dist/components/snackbar.css +30 -0
  175. package/dist/components/snackbar.js +31 -0
  176. package/dist/components/sparkline.css +30 -0
  177. package/dist/components/sparkline.js +31 -0
  178. package/dist/components/split-button.css +30 -0
  179. package/dist/components/split-button.js +31 -0
  180. package/dist/components/splitter.css +30 -0
  181. package/dist/components/splitter.js +31 -0
  182. package/dist/components/stack.css +30 -0
  183. package/dist/components/stack.js +31 -0
  184. package/dist/components/stepper.css +30 -0
  185. package/dist/components/stepper.js +31 -0
  186. package/dist/components/switch.css +30 -0
  187. package/dist/components/switch.js +31 -0
  188. package/dist/components/tab-group.css +30 -0
  189. package/dist/components/tab-group.js +31 -0
  190. package/dist/components/tab.css +30 -0
  191. package/dist/components/tab.js +31 -0
  192. package/dist/components/table.css +30 -0
  193. package/dist/components/table.js +31 -0
  194. package/dist/components/tag.css +30 -0
  195. package/dist/components/tag.js +31 -0
  196. package/dist/components/textarea.css +30 -0
  197. package/dist/components/textarea.js +31 -0
  198. package/dist/components/textfield.css +30 -0
  199. package/dist/components/textfield.js +31 -0
  200. package/dist/components/timeline.css +30 -0
  201. package/dist/components/timeline.js +31 -0
  202. package/dist/components/toast.css +30 -0
  203. package/dist/components/toast.js +31 -0
  204. package/dist/components/toggle.css +30 -0
  205. package/dist/components/toggle.js +31 -0
  206. package/dist/components/toolbar.css +30 -0
  207. package/dist/components/toolbar.js +31 -0
  208. package/dist/components/tooltip.css +30 -0
  209. package/dist/components/tooltip.js +31 -0
  210. package/dist/components/tree-view.css +30 -0
  211. package/dist/components/tree-view.js +31 -0
  212. package/dist/components/treemap.css +30 -0
  213. package/dist/components/treemap.js +31 -0
  214. package/dist/components/upload-dropzone.css +30 -0
  215. package/dist/components/upload-dropzone.js +31 -0
  216. package/dist/components/video-player.css +30 -0
  217. package/dist/components/video-player.js +31 -0
  218. package/dist/components/virtual-list.css +30 -0
  219. package/dist/components/virtual-list.js +31 -0
  220. package/dist/components/wizard.css +30 -0
  221. package/dist/components/wizard.js +31 -0
  222. package/dist/index.js +110 -0
  223. package/dist/manifest.json +116 -0
  224. package/dist/themes/dark.css +368 -0
  225. package/dist/themes/light.css +368 -0
  226. package/dist/themes/sprint.css +368 -0
  227. package/dist/themes/system.css +398 -0
  228. package/package.json +32 -0
package/README.md ADDED
@@ -0,0 +1,197 @@
1
+ # bareframe
2
+
3
+ Lightweight, dependency-free Web Components for building reusable UI across applications.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install bareframe
9
+ ```
10
+
11
+ ## Package Usage
12
+
13
+ Register everything:
14
+
15
+ ```js
16
+ import 'bareframe';
17
+ ```
18
+
19
+ Or import one component:
20
+
21
+ ```js
22
+ import 'bareframe/components/button.js';
23
+ ```
24
+
25
+ Load a theme:
26
+
27
+ ```js
28
+ import 'bareframe/themes/system.css';
29
+ ```
30
+
31
+ `system` is the default/recommended theme for bareframe.
32
+
33
+ ## Why bareframe
34
+
35
+ `bareframe` is built for one purpose: create components once and reuse them everywhere.
36
+
37
+ - Lightweight by design
38
+ - Zero runtime dependencies
39
+ - Native Web Components approach
40
+ - Reusable across multiple internal and external apps
41
+ - Easy to extend without framework lock-in
42
+
43
+ ## Philosophy
44
+
45
+ - Keep components small and focused
46
+ - Favor native browser APIs
47
+ - Prioritize portability and long-term maintainability
48
+ - Build reusable primitives first, then compose upward
49
+
50
+ ## Package Goals
51
+
52
+ - Provide a clean foundation for shared UI components
53
+ - Reduce duplication between projects
54
+ - Keep implementation straightforward and easy to reason about
55
+
56
+ ## Example
57
+
58
+ ```js
59
+ import './src/button/button.js';
60
+ import './src/accordion/accordion.js';
61
+ ```
62
+
63
+ ```html
64
+ <bf-button label="Save" variant="primary"></bf-button>
65
+ <bf-button label="Cancel" variant="secondary"></bf-button>
66
+
67
+ <bf-accordion>
68
+ <section title="Section One" open>
69
+ <p>Accordion content one.</p>
70
+ </section>
71
+ <section title="Section Two">
72
+ <p>Accordion content two.</p>
73
+ </section>
74
+ </bf-accordion>
75
+ ```
76
+
77
+ ## Theming (CSS Variables)
78
+
79
+ `bf-button` is themeable through CSS custom properties on the host element.
80
+
81
+ ```css
82
+ bf-button {
83
+ --bf-button-border-radius: 999px;
84
+ --bf-button-padding-y: 0.6rem;
85
+ --bf-button-padding-x: 1.1rem;
86
+ --bf-button-primary-bg: #0f766e;
87
+ --bf-button-primary-color: #f0fdfa;
88
+ --bf-button-focus-outline-color: #5eead4;
89
+ }
90
+
91
+ bf-button[variant='secondary'] {
92
+ --bf-button-secondary-bg: #ecfeff;
93
+ --bf-button-secondary-color: #115e59;
94
+ --bf-button-secondary-border-color: #14b8a6;
95
+ }
96
+ ```
97
+
98
+ ## Built-in Themes
99
+
100
+ Theme files live in `themes/`:
101
+
102
+ - `themes/light.css`
103
+ - `themes/dark.css`
104
+ - `themes/sprint.css`
105
+ - `themes/system.css` (follows OS preference with `prefers-color-scheme`)
106
+
107
+ Use `system` as the default theme for apps:
108
+
109
+ ```html
110
+ <link rel="stylesheet" href="./themes/system.css" />
111
+ ```
112
+
113
+ Load one theme globally:
114
+
115
+ ```html
116
+ <link rel="stylesheet" href="./themes/dark.css" />
117
+ ```
118
+
119
+ Or use system theme:
120
+
121
+ ```html
122
+ <link rel="stylesheet" href="./themes/system.css" />
123
+ ```
124
+
125
+ Optional runtime switch:
126
+
127
+ ```js
128
+ document.documentElement.setAttribute('data-bf-theme', 'sprint');
129
+ ```
130
+
131
+ ## Theme Standard For All Components
132
+
133
+ All components should be fully replaceable through CSS variables:
134
+
135
+ - Component tokens: `--bf-<component>-*`
136
+ - Global theme tokens: `--bf-theme-*`
137
+ - Component defaults should map to global tokens, then fall back
138
+
139
+ Reference:
140
+
141
+ - `docs/theming-contract.md`
142
+ - `src/_template/component.css`
143
+ - `src/_template/component.js`
144
+
145
+ ## Button Test Example
146
+
147
+ An example test harness is included at `examples/button-test.html`.
148
+
149
+ From the project root, run:
150
+
151
+ ```bash
152
+ python3 -m http.server 8080
153
+ ```
154
+
155
+ Then open:
156
+
157
+ `http://localhost:8080/examples/button-test.html`
158
+
159
+ This page lets you:
160
+
161
+ - Click `bf-button` components and inspect emitted `bf-click` event payloads
162
+ - Run quick checks for element registration, label rendering, and variant classes
163
+
164
+ ## Accordion Test Example
165
+
166
+ An example test harness is included at `examples/accordion-test.html`.
167
+
168
+ Open:
169
+
170
+ `http://localhost:8080/examples/accordion-test.html`
171
+
172
+ This page lets you:
173
+
174
+ - Test accordion open/close behavior
175
+ - Inspect `bf-accordion-toggle` event payloads
176
+ - Switch `light`, `dark`, `sprint`, and `system` themes
177
+
178
+ ## Full Component Examples
179
+
180
+ All generated component demos are listed at:
181
+
182
+ `http://localhost:8080/examples/index.html`
183
+
184
+ ## Build Package
185
+
186
+ ```bash
187
+ npm run build
188
+ npm run pack:preview
189
+ ```
190
+
191
+ ## Status
192
+
193
+ Early development. API and component patterns may evolve as the system grows.
194
+
195
+ ## License
196
+
197
+ MIT
@@ -0,0 +1,107 @@
1
+ :host {
2
+ --bf-accordion-font: var(--bf-theme-font-family, inherit);
3
+ --bf-accordion-gap: var(--bf-theme-space-2, 0.5rem);
4
+ --bf-accordion-radius: var(--bf-theme-radius-md, 8px);
5
+ --bf-accordion-border-width: var(--bf-theme-border-width, 1px);
6
+ --bf-accordion-border-style: var(--bf-theme-border-style, solid);
7
+ --bf-accordion-border-color: var(--bf-theme-accordion-border-color, #cbd5e1);
8
+ --bf-accordion-bg: var(--bf-theme-accordion-bg, #ffffff);
9
+ --bf-accordion-color: var(--bf-theme-accordion-color, #0f172a);
10
+ --bf-accordion-trigger-padding-y: var(--bf-theme-space-2, 0.6rem);
11
+ --bf-accordion-trigger-padding-x: var(--bf-theme-space-3, 0.9rem);
12
+ --bf-accordion-panel-padding-y: var(--bf-theme-space-2, 0.6rem);
13
+ --bf-accordion-panel-padding-x: var(--bf-theme-space-3, 0.9rem);
14
+ --bf-accordion-trigger-bg: var(--bf-theme-accordion-trigger-bg, #f8fafc);
15
+ --bf-accordion-trigger-hover-bg: var(
16
+ --bf-theme-accordion-trigger-hover-bg,
17
+ #f1f5f9
18
+ );
19
+ --bf-accordion-trigger-open-bg: var(
20
+ --bf-theme-accordion-trigger-open-bg,
21
+ #eff6ff
22
+ );
23
+ --bf-accordion-trigger-color: var(--bf-theme-accordion-trigger-color, #0f172a);
24
+ --bf-accordion-panel-bg: var(--bf-theme-accordion-panel-bg, #ffffff);
25
+ --bf-accordion-focus-ring-width: var(--bf-theme-focus-ring-width, 2px);
26
+ --bf-accordion-focus-ring-style: var(--bf-theme-focus-ring-style, solid);
27
+ --bf-accordion-focus-ring-color: var(--bf-theme-focus-ring-color, #93c5fd);
28
+ --bf-accordion-focus-ring-offset: var(--bf-theme-focus-ring-offset, 2px);
29
+ --bf-accordion-chevron-color: var(--bf-theme-accordion-chevron-color, #475569);
30
+ --bf-accordion-transition:
31
+ var(--bf-theme-transition-bg, background-color 120ms ease),
32
+ var(--bf-theme-transition-color, color 120ms ease),
33
+ var(--bf-theme-transition-border, border-color 120ms ease);
34
+
35
+ display: block;
36
+ font: var(--bf-accordion-font);
37
+ color: var(--bf-accordion-color);
38
+ }
39
+
40
+ .accordion {
41
+ display: grid;
42
+ gap: var(--bf-accordion-gap);
43
+ }
44
+
45
+ .accordion-item {
46
+ border-width: var(--bf-accordion-border-width);
47
+ border-style: var(--bf-accordion-border-style);
48
+ border-color: var(--bf-accordion-border-color);
49
+ border-radius: var(--bf-accordion-radius);
50
+ background: var(--bf-accordion-bg);
51
+ overflow: clip;
52
+ }
53
+
54
+ .accordion-trigger {
55
+ list-style: none;
56
+ cursor: pointer;
57
+ padding: var(--bf-accordion-trigger-padding-y)
58
+ var(--bf-accordion-trigger-padding-x);
59
+ background: var(--bf-accordion-trigger-bg);
60
+ color: var(--bf-accordion-trigger-color);
61
+ transition: var(--bf-accordion-transition);
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: space-between;
65
+ }
66
+
67
+ .accordion-trigger::-webkit-details-marker {
68
+ display: none;
69
+ }
70
+
71
+ .accordion-trigger::after {
72
+ content: '+';
73
+ color: var(--bf-accordion-chevron-color);
74
+ font-weight: 700;
75
+ line-height: 1;
76
+ }
77
+
78
+ .accordion-item[open] > .accordion-trigger::after {
79
+ content: '-';
80
+ }
81
+
82
+ .accordion-trigger:hover {
83
+ background: var(--bf-accordion-trigger-hover-bg);
84
+ }
85
+
86
+ .accordion-trigger:focus-visible {
87
+ outline-width: var(--bf-accordion-focus-ring-width);
88
+ outline-style: var(--bf-accordion-focus-ring-style);
89
+ outline-color: var(--bf-accordion-focus-ring-color);
90
+ outline-offset: calc(var(--bf-accordion-focus-ring-offset) * -1);
91
+ }
92
+
93
+ .accordion-item[open] > .accordion-trigger {
94
+ background: var(--bf-accordion-trigger-open-bg);
95
+ }
96
+
97
+ .accordion-panel {
98
+ padding: var(--bf-accordion-panel-padding-y) var(--bf-accordion-panel-padding-x);
99
+ background: var(--bf-accordion-panel-bg);
100
+ border-top-width: var(--bf-accordion-border-width);
101
+ border-top-style: var(--bf-accordion-border-style);
102
+ border-top-color: var(--bf-accordion-border-color);
103
+ }
104
+
105
+ .accordion-panel ::slotted(*) {
106
+ margin: 0;
107
+ }
@@ -0,0 +1,92 @@
1
+ class BfAccordion extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ this._details = [];
6
+ }
7
+
8
+ connectedCallback() {
9
+ if (this._initialized) {
10
+ return;
11
+ }
12
+ this._initialized = true;
13
+
14
+ const cssUrl = new URL('./accordion.css', import.meta.url);
15
+ const link = document.createElement('link');
16
+ link.rel = 'stylesheet';
17
+ link.href = cssUrl.href;
18
+
19
+ const container = document.createElement('div');
20
+ container.className = 'accordion';
21
+ container.setAttribute('part', 'accordion');
22
+
23
+ const items = [...this.children].filter(
24
+ (node) => node.nodeType === Node.ELEMENT_NODE,
25
+ );
26
+
27
+ items.forEach((item, index) => {
28
+ const title =
29
+ item.getAttribute('title') ||
30
+ item.getAttribute('data-title') ||
31
+ `Section ${index + 1}`;
32
+ const slotName = `item-${index + 1}`;
33
+ const openByDefault = item.hasAttribute('open');
34
+
35
+ item.setAttribute('slot', slotName);
36
+
37
+ const details = document.createElement('details');
38
+ details.className = 'accordion-item';
39
+ details.setAttribute('part', 'item');
40
+ if (openByDefault) {
41
+ details.open = true;
42
+ }
43
+
44
+ const summary = document.createElement('summary');
45
+ summary.className = 'accordion-trigger';
46
+ summary.setAttribute('part', 'trigger');
47
+ summary.textContent = title;
48
+
49
+ const panel = document.createElement('div');
50
+ panel.className = 'accordion-panel';
51
+ panel.setAttribute('part', 'panel');
52
+
53
+ const slot = document.createElement('slot');
54
+ slot.name = slotName;
55
+ panel.append(slot);
56
+
57
+ details.append(summary, panel);
58
+ container.append(details);
59
+ this._details.push(details);
60
+
61
+ details.addEventListener('toggle', () => {
62
+ if (!this.multiple && details.open) {
63
+ this._details.forEach((other) => {
64
+ if (other !== details) {
65
+ other.open = false;
66
+ }
67
+ });
68
+ }
69
+
70
+ this.dispatchEvent(
71
+ new CustomEvent('bf-accordion-toggle', {
72
+ bubbles: true,
73
+ composed: true,
74
+ detail: {
75
+ index,
76
+ title,
77
+ open: details.open,
78
+ },
79
+ }),
80
+ );
81
+ });
82
+ });
83
+
84
+ this.shadowRoot.replaceChildren(link, container);
85
+ }
86
+
87
+ get multiple() {
88
+ return this.hasAttribute('multiple');
89
+ }
90
+ }
91
+
92
+ customElements.define('bf-accordion', BfAccordion);
@@ -0,0 +1,30 @@
1
+ :host {
2
+ --bf-action-list-font: var(--bf-theme-font-family, inherit);
3
+ --bf-action-list-radius: var(--bf-theme-radius-md, 8px);
4
+ --bf-action-list-border-width: var(--bf-theme-border-width, 1px);
5
+ --bf-action-list-border-style: var(--bf-theme-border-style, solid);
6
+ --bf-action-list-border-color: var(--bf-theme-action-list-border-color, var(--bf-theme-border-1, #cbd5e1));
7
+ --bf-action-list-bg: var(--bf-theme-action-list-bg, var(--bf-theme-surface-1, #ffffff));
8
+ --bf-action-list-color: var(--bf-theme-action-list-color, var(--bf-theme-text-1, #0f172a));
9
+ --bf-action-list-padding-y: var(--bf-theme-space-2, 0.6rem);
10
+ --bf-action-list-padding-x: var(--bf-theme-space-3, 0.9rem);
11
+ --bf-action-list-transition:
12
+ var(--bf-theme-transition-bg, background-color 120ms ease),
13
+ var(--bf-theme-transition-color, color 120ms ease),
14
+ var(--bf-theme-transition-border, border-color 120ms ease);
15
+
16
+ display: block;
17
+ font: var(--bf-action-list-font);
18
+ color: var(--bf-action-list-color);
19
+ }
20
+
21
+ .root {
22
+ background: var(--bf-action-list-bg);
23
+ color: var(--bf-action-list-color);
24
+ border-width: var(--bf-action-list-border-width);
25
+ border-style: var(--bf-action-list-border-style);
26
+ border-color: var(--bf-action-list-border-color);
27
+ border-radius: var(--bf-action-list-radius);
28
+ padding: var(--bf-action-list-padding-y) var(--bf-action-list-padding-x);
29
+ transition: var(--bf-action-list-transition);
30
+ }
@@ -0,0 +1,31 @@
1
+ class BfActionList extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ }
6
+
7
+ connectedCallback() {
8
+ if (this._initialized) {
9
+ return;
10
+ }
11
+ this._initialized = true;
12
+
13
+ const cssUrl = new URL('./action-list.css', import.meta.url);
14
+ const link = document.createElement('link');
15
+ link.rel = 'stylesheet';
16
+ link.href = cssUrl.href;
17
+
18
+ const root = document.createElement('div');
19
+ root.className = 'root';
20
+ root.setAttribute('part', 'root');
21
+ root.innerHTML = '<slot></slot>';
22
+
23
+ if (!this.innerHTML.trim()) {
24
+ root.textContent = 'action list';
25
+ }
26
+
27
+ this.shadowRoot.replaceChildren(link, root);
28
+ }
29
+ }
30
+
31
+ customElements.define('bf-action-list', BfActionList);
@@ -0,0 +1,30 @@
1
+ :host {
2
+ --bf-alert-font: var(--bf-theme-font-family, inherit);
3
+ --bf-alert-radius: var(--bf-theme-radius-md, 8px);
4
+ --bf-alert-border-width: var(--bf-theme-border-width, 1px);
5
+ --bf-alert-border-style: var(--bf-theme-border-style, solid);
6
+ --bf-alert-border-color: var(--bf-theme-alert-border-color, var(--bf-theme-border-1, #cbd5e1));
7
+ --bf-alert-bg: var(--bf-theme-alert-bg, var(--bf-theme-surface-1, #ffffff));
8
+ --bf-alert-color: var(--bf-theme-alert-color, var(--bf-theme-text-1, #0f172a));
9
+ --bf-alert-padding-y: var(--bf-theme-space-2, 0.6rem);
10
+ --bf-alert-padding-x: var(--bf-theme-space-3, 0.9rem);
11
+ --bf-alert-transition:
12
+ var(--bf-theme-transition-bg, background-color 120ms ease),
13
+ var(--bf-theme-transition-color, color 120ms ease),
14
+ var(--bf-theme-transition-border, border-color 120ms ease);
15
+
16
+ display: block;
17
+ font: var(--bf-alert-font);
18
+ color: var(--bf-alert-color);
19
+ }
20
+
21
+ .root {
22
+ background: var(--bf-alert-bg);
23
+ color: var(--bf-alert-color);
24
+ border-width: var(--bf-alert-border-width);
25
+ border-style: var(--bf-alert-border-style);
26
+ border-color: var(--bf-alert-border-color);
27
+ border-radius: var(--bf-alert-radius);
28
+ padding: var(--bf-alert-padding-y) var(--bf-alert-padding-x);
29
+ transition: var(--bf-alert-transition);
30
+ }
@@ -0,0 +1,31 @@
1
+ class BfAlert extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ }
6
+
7
+ connectedCallback() {
8
+ if (this._initialized) {
9
+ return;
10
+ }
11
+ this._initialized = true;
12
+
13
+ const cssUrl = new URL('./alert.css', import.meta.url);
14
+ const link = document.createElement('link');
15
+ link.rel = 'stylesheet';
16
+ link.href = cssUrl.href;
17
+
18
+ const root = document.createElement('div');
19
+ root.className = 'root';
20
+ root.setAttribute('part', 'root');
21
+ root.innerHTML = '<slot></slot>';
22
+
23
+ if (!this.innerHTML.trim()) {
24
+ root.textContent = 'alert';
25
+ }
26
+
27
+ this.shadowRoot.replaceChildren(link, root);
28
+ }
29
+ }
30
+
31
+ customElements.define('bf-alert', BfAlert);
@@ -0,0 +1,30 @@
1
+ :host {
2
+ --bf-anchor-font: var(--bf-theme-font-family, inherit);
3
+ --bf-anchor-radius: var(--bf-theme-radius-md, 8px);
4
+ --bf-anchor-border-width: var(--bf-theme-border-width, 1px);
5
+ --bf-anchor-border-style: var(--bf-theme-border-style, solid);
6
+ --bf-anchor-border-color: var(--bf-theme-anchor-border-color, var(--bf-theme-border-1, #cbd5e1));
7
+ --bf-anchor-bg: var(--bf-theme-anchor-bg, var(--bf-theme-surface-1, #ffffff));
8
+ --bf-anchor-color: var(--bf-theme-anchor-color, var(--bf-theme-text-1, #0f172a));
9
+ --bf-anchor-padding-y: var(--bf-theme-space-2, 0.6rem);
10
+ --bf-anchor-padding-x: var(--bf-theme-space-3, 0.9rem);
11
+ --bf-anchor-transition:
12
+ var(--bf-theme-transition-bg, background-color 120ms ease),
13
+ var(--bf-theme-transition-color, color 120ms ease),
14
+ var(--bf-theme-transition-border, border-color 120ms ease);
15
+
16
+ display: block;
17
+ font: var(--bf-anchor-font);
18
+ color: var(--bf-anchor-color);
19
+ }
20
+
21
+ .root {
22
+ background: var(--bf-anchor-bg);
23
+ color: var(--bf-anchor-color);
24
+ border-width: var(--bf-anchor-border-width);
25
+ border-style: var(--bf-anchor-border-style);
26
+ border-color: var(--bf-anchor-border-color);
27
+ border-radius: var(--bf-anchor-radius);
28
+ padding: var(--bf-anchor-padding-y) var(--bf-anchor-padding-x);
29
+ transition: var(--bf-anchor-transition);
30
+ }
@@ -0,0 +1,31 @@
1
+ class BfAnchor extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ }
6
+
7
+ connectedCallback() {
8
+ if (this._initialized) {
9
+ return;
10
+ }
11
+ this._initialized = true;
12
+
13
+ const cssUrl = new URL('./anchor.css', import.meta.url);
14
+ const link = document.createElement('link');
15
+ link.rel = 'stylesheet';
16
+ link.href = cssUrl.href;
17
+
18
+ const root = document.createElement('div');
19
+ root.className = 'root';
20
+ root.setAttribute('part', 'root');
21
+ root.innerHTML = '<slot></slot>';
22
+
23
+ if (!this.innerHTML.trim()) {
24
+ root.textContent = 'anchor';
25
+ }
26
+
27
+ this.shadowRoot.replaceChildren(link, root);
28
+ }
29
+ }
30
+
31
+ customElements.define('bf-anchor', BfAnchor);
@@ -0,0 +1,30 @@
1
+ :host {
2
+ --bf-autocomplete-font: var(--bf-theme-font-family, inherit);
3
+ --bf-autocomplete-radius: var(--bf-theme-radius-md, 8px);
4
+ --bf-autocomplete-border-width: var(--bf-theme-border-width, 1px);
5
+ --bf-autocomplete-border-style: var(--bf-theme-border-style, solid);
6
+ --bf-autocomplete-border-color: var(--bf-theme-autocomplete-border-color, var(--bf-theme-border-1, #cbd5e1));
7
+ --bf-autocomplete-bg: var(--bf-theme-autocomplete-bg, var(--bf-theme-surface-1, #ffffff));
8
+ --bf-autocomplete-color: var(--bf-theme-autocomplete-color, var(--bf-theme-text-1, #0f172a));
9
+ --bf-autocomplete-padding-y: var(--bf-theme-space-2, 0.6rem);
10
+ --bf-autocomplete-padding-x: var(--bf-theme-space-3, 0.9rem);
11
+ --bf-autocomplete-transition:
12
+ var(--bf-theme-transition-bg, background-color 120ms ease),
13
+ var(--bf-theme-transition-color, color 120ms ease),
14
+ var(--bf-theme-transition-border, border-color 120ms ease);
15
+
16
+ display: block;
17
+ font: var(--bf-autocomplete-font);
18
+ color: var(--bf-autocomplete-color);
19
+ }
20
+
21
+ .root {
22
+ background: var(--bf-autocomplete-bg);
23
+ color: var(--bf-autocomplete-color);
24
+ border-width: var(--bf-autocomplete-border-width);
25
+ border-style: var(--bf-autocomplete-border-style);
26
+ border-color: var(--bf-autocomplete-border-color);
27
+ border-radius: var(--bf-autocomplete-radius);
28
+ padding: var(--bf-autocomplete-padding-y) var(--bf-autocomplete-padding-x);
29
+ transition: var(--bf-autocomplete-transition);
30
+ }
@@ -0,0 +1,31 @@
1
+ class BfAutocomplete extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ }
6
+
7
+ connectedCallback() {
8
+ if (this._initialized) {
9
+ return;
10
+ }
11
+ this._initialized = true;
12
+
13
+ const cssUrl = new URL('./autocomplete.css', import.meta.url);
14
+ const link = document.createElement('link');
15
+ link.rel = 'stylesheet';
16
+ link.href = cssUrl.href;
17
+
18
+ const root = document.createElement('div');
19
+ root.className = 'root';
20
+ root.setAttribute('part', 'root');
21
+ root.innerHTML = '<slot></slot>';
22
+
23
+ if (!this.innerHTML.trim()) {
24
+ root.textContent = 'autocomplete';
25
+ }
26
+
27
+ this.shadowRoot.replaceChildren(link, root);
28
+ }
29
+ }
30
+
31
+ customElements.define('bf-autocomplete', BfAutocomplete);
@@ -0,0 +1,30 @@
1
+ :host {
2
+ --bf-avatar-font: var(--bf-theme-font-family, inherit);
3
+ --bf-avatar-radius: var(--bf-theme-radius-md, 8px);
4
+ --bf-avatar-border-width: var(--bf-theme-border-width, 1px);
5
+ --bf-avatar-border-style: var(--bf-theme-border-style, solid);
6
+ --bf-avatar-border-color: var(--bf-theme-avatar-border-color, var(--bf-theme-border-1, #cbd5e1));
7
+ --bf-avatar-bg: var(--bf-theme-avatar-bg, var(--bf-theme-surface-1, #ffffff));
8
+ --bf-avatar-color: var(--bf-theme-avatar-color, var(--bf-theme-text-1, #0f172a));
9
+ --bf-avatar-padding-y: var(--bf-theme-space-2, 0.6rem);
10
+ --bf-avatar-padding-x: var(--bf-theme-space-3, 0.9rem);
11
+ --bf-avatar-transition:
12
+ var(--bf-theme-transition-bg, background-color 120ms ease),
13
+ var(--bf-theme-transition-color, color 120ms ease),
14
+ var(--bf-theme-transition-border, border-color 120ms ease);
15
+
16
+ display: block;
17
+ font: var(--bf-avatar-font);
18
+ color: var(--bf-avatar-color);
19
+ }
20
+
21
+ .root {
22
+ background: var(--bf-avatar-bg);
23
+ color: var(--bf-avatar-color);
24
+ border-width: var(--bf-avatar-border-width);
25
+ border-style: var(--bf-avatar-border-style);
26
+ border-color: var(--bf-avatar-border-color);
27
+ border-radius: var(--bf-avatar-radius);
28
+ padding: var(--bf-avatar-padding-y) var(--bf-avatar-padding-x);
29
+ transition: var(--bf-avatar-transition);
30
+ }