@brytdesigns/web-component-accordion 1.1.8 → 3.0.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.
- package/dist/main/components/accordion-content.js +55 -111
- package/dist/main/components/accordion-content.js.map +1 -1
- package/dist/main/components/accordion-context.js +27 -19
- package/dist/main/components/accordion-context.js.map +1 -1
- package/dist/main/components/accordion-item.js +9 -13
- package/dist/main/components/accordion-item.js.map +1 -1
- package/dist/main/components/accordion-trigger.js +32 -25
- package/dist/main/components/accordion-trigger.js.map +1 -1
- package/dist/main/components/index.js +4 -10
- package/dist/main/hooks/index.js +3 -4
- package/dist/main/hooks/useAccordion.js +90 -77
- package/dist/main/hooks/useAccordion.js.map +1 -1
- package/dist/main/hooks/useAccordionItem.js +77 -99
- package/dist/main/hooks/useAccordionItem.js.map +1 -1
- package/dist/main/index.d.ts +52 -17
- package/dist/main/index.js +23 -24
- package/dist/main/index.js.map +1 -1
- package/dist/styles.css +35 -0
- package/package.json +10 -10
- package/dist/esm/index.js +0 -391
- package/dist/esm/index.js.map +0 -1
- package/dist/main/components/index.js.map +0 -1
- package/dist/main/hooks/index.js.map +0 -1
package/dist/esm/index.js
DELETED
|
@@ -1,391 +0,0 @@
|
|
|
1
|
-
import { createWithElementContext, customShadowlessElement, correctElementType, toHyphenated, getContextFromProvider } from '@brytdesigns/web-component-core/utils';
|
|
2
|
-
import { animate } from 'motion';
|
|
3
|
-
import { splitProps, createEffect, on, batch, untrack, mergeProps, createSelector, onCleanup } from 'solid-js';
|
|
4
|
-
import { controlsToPromise } from '@brytdesigns/web-component-core/animation';
|
|
5
|
-
import { createContext, consume, provide } from 'component-register';
|
|
6
|
-
import { createStore } from 'solid-js/store';
|
|
7
|
-
|
|
8
|
-
var __defProp = Object.defineProperty;
|
|
9
|
-
var __export = (target, all) => {
|
|
10
|
-
for (var name in all)
|
|
11
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
// src/components/accordion-content.ts
|
|
15
|
-
var accordion_content_exports = {};
|
|
16
|
-
__export(accordion_content_exports, {
|
|
17
|
-
Component: () => Component,
|
|
18
|
-
Name: () => Name
|
|
19
|
-
});
|
|
20
|
-
function initializeAccordionContext(props) {
|
|
21
|
-
const [element, stateProps] = splitProps(props, ["root"]);
|
|
22
|
-
const [store, setStore] = createStore({ animationQueue: [] });
|
|
23
|
-
createEffect(
|
|
24
|
-
on(
|
|
25
|
-
() => store.animationQueue,
|
|
26
|
-
(animationQueue) => {
|
|
27
|
-
if (!animationQueue.length) return;
|
|
28
|
-
const animations = Promise.allSettled(store.animationQueue);
|
|
29
|
-
setElementState("isAnimating", true);
|
|
30
|
-
animations.finally(() => {
|
|
31
|
-
batch(() => {
|
|
32
|
-
setElementState("isAnimating", false);
|
|
33
|
-
setStore("animationQueue", []);
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
)
|
|
38
|
-
);
|
|
39
|
-
function setElementState(key, value) {
|
|
40
|
-
const currentValue = untrack(() => props[key]);
|
|
41
|
-
if (typeof value === "function") {
|
|
42
|
-
let result = false;
|
|
43
|
-
if (typeof currentValue === "number") {
|
|
44
|
-
result = value(currentValue || 0);
|
|
45
|
-
} else if (typeof currentValue === "boolean") {
|
|
46
|
-
result = value(currentValue || false);
|
|
47
|
-
}
|
|
48
|
-
if (`${currentValue}` === `${value}`) return;
|
|
49
|
-
element.root.setAttribute(toHyphenated(key), `${result}`);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
if (`${currentValue}` === `${value}`) return;
|
|
53
|
-
return element.root.setAttribute(toHyphenated(key), `${value}`);
|
|
54
|
-
}
|
|
55
|
-
return [
|
|
56
|
-
mergeProps(store, stateProps),
|
|
57
|
-
{ setElementState, setStore }
|
|
58
|
-
];
|
|
59
|
-
}
|
|
60
|
-
var AccordionContextState = createContext(initializeAccordionContext);
|
|
61
|
-
var provideAccordionContext = (initialState, element) => {
|
|
62
|
-
const props = mergeProps(initialState, { root: element });
|
|
63
|
-
return provide(AccordionContextState, props, element);
|
|
64
|
-
};
|
|
65
|
-
var useAccordionContext = (context) => {
|
|
66
|
-
const [state, { setElementState, setStore: setState }] = context;
|
|
67
|
-
function updateAnimationQueue(animation) {
|
|
68
|
-
setState("animationQueue", (state2) => [...state2, animation]);
|
|
69
|
-
}
|
|
70
|
-
function updateActiveIndex(index) {
|
|
71
|
-
setElementState("activeIndex", index);
|
|
72
|
-
}
|
|
73
|
-
const isActive = createSelector(() => state.activeIndex);
|
|
74
|
-
return [
|
|
75
|
-
state,
|
|
76
|
-
{ updateAnimationQueue, item: { update: updateActiveIndex, isActive } }
|
|
77
|
-
];
|
|
78
|
-
};
|
|
79
|
-
var useAccordion = (element) => {
|
|
80
|
-
const context = consume(AccordionContextState, element);
|
|
81
|
-
if (!context) {
|
|
82
|
-
throw console.error(
|
|
83
|
-
"AccordionContext not found! Please ensure to wrap your custom element with accordion-context element."
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
return useAccordionContext(context);
|
|
87
|
-
};
|
|
88
|
-
var withAccordionElementContext = createWithElementContext(AccordionContextState);
|
|
89
|
-
var getAccordionContext = (element) => {
|
|
90
|
-
const context = getContextFromProvider(
|
|
91
|
-
AccordionContextState,
|
|
92
|
-
element
|
|
93
|
-
);
|
|
94
|
-
return useAccordionContext(context);
|
|
95
|
-
};
|
|
96
|
-
function initializeAccordionItemContext(props) {
|
|
97
|
-
const [element, _, stateProps] = splitProps(
|
|
98
|
-
props,
|
|
99
|
-
["root"],
|
|
100
|
-
["ariaExpanded"]
|
|
101
|
-
);
|
|
102
|
-
const [context, methods] = useAccordion(element.root);
|
|
103
|
-
function setElementState(key, value) {
|
|
104
|
-
const currentValue = untrack(() => props[key]);
|
|
105
|
-
if (typeof value === "function") {
|
|
106
|
-
let result = false;
|
|
107
|
-
if (typeof currentValue === "number") {
|
|
108
|
-
result = value(currentValue || 0);
|
|
109
|
-
} else if (typeof currentValue === "boolean") {
|
|
110
|
-
result = value(currentValue || false);
|
|
111
|
-
}
|
|
112
|
-
if (`${currentValue}` === `${value}`) return;
|
|
113
|
-
element.root.setAttribute(toHyphenated(key), `${result}`);
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (`${currentValue}` === `${value}`) return;
|
|
117
|
-
return element.root.setAttribute(toHyphenated(key), `${value}`);
|
|
118
|
-
}
|
|
119
|
-
createEffect(() => {
|
|
120
|
-
const isActive = methods.item.isActive(props.index);
|
|
121
|
-
batch(() => {
|
|
122
|
-
setElementState("isExpanded", isActive);
|
|
123
|
-
setElementState("ariaExpanded", isActive);
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
createEffect(() => {
|
|
127
|
-
const index = untrack(() => stateProps.index);
|
|
128
|
-
const isExpanded = stateProps.isExpanded;
|
|
129
|
-
if (isExpanded) methods.item.update(index);
|
|
130
|
-
});
|
|
131
|
-
function setActive(index) {
|
|
132
|
-
methods.item.update(index);
|
|
133
|
-
}
|
|
134
|
-
return [
|
|
135
|
-
mergeProps(stateProps, {
|
|
136
|
-
get isAnimating() {
|
|
137
|
-
return context.isAnimating;
|
|
138
|
-
}
|
|
139
|
-
}),
|
|
140
|
-
{ setElementState, setActive }
|
|
141
|
-
];
|
|
142
|
-
}
|
|
143
|
-
var AccordionItemContextState = createContext(initializeAccordionItemContext);
|
|
144
|
-
var provideAccordionItemContext = (initialState, element) => {
|
|
145
|
-
const props = mergeProps(initialState, { root: element });
|
|
146
|
-
return provide(AccordionItemContextState, props, element);
|
|
147
|
-
};
|
|
148
|
-
var useAccordionItemContext = (context) => {
|
|
149
|
-
const [state, { setElementState, setActive }] = context;
|
|
150
|
-
function expand() {
|
|
151
|
-
const index = untrack(() => state.index);
|
|
152
|
-
batch(() => {
|
|
153
|
-
setActive(index);
|
|
154
|
-
setElementState("isExpanded", true);
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
function collapse() {
|
|
158
|
-
batch(() => {
|
|
159
|
-
setActive(-1);
|
|
160
|
-
setElementState("isExpanded", false);
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
function toggle() {
|
|
164
|
-
setElementState("isExpanded", (v) => {
|
|
165
|
-
const index = untrack(() => state.index);
|
|
166
|
-
const newValue = !v;
|
|
167
|
-
if (newValue) setActive(index);
|
|
168
|
-
else setActive(-1);
|
|
169
|
-
return newValue;
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
return [state, { expand, collapse, toggle }];
|
|
173
|
-
};
|
|
174
|
-
var useAccordionItem = (element) => {
|
|
175
|
-
const context = consume(
|
|
176
|
-
AccordionItemContextState,
|
|
177
|
-
element
|
|
178
|
-
);
|
|
179
|
-
if (!context) {
|
|
180
|
-
throw console.error(
|
|
181
|
-
"AccordionItemContext not found! Please ensure to wrap your custom element with accordion-item element."
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
return useAccordionItemContext(context);
|
|
185
|
-
};
|
|
186
|
-
var withAccordionItemElementContext = createWithElementContext(AccordionItemContextState);
|
|
187
|
-
var getAccordionItemContext = (element) => {
|
|
188
|
-
const context = getContextFromProvider(
|
|
189
|
-
AccordionItemContextState,
|
|
190
|
-
element
|
|
191
|
-
);
|
|
192
|
-
return useAccordionItemContext(context);
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
// src/components/accordion-content.ts
|
|
196
|
-
var hideElement = (element) => {
|
|
197
|
-
element.style.cssText = `
|
|
198
|
-
display: none;
|
|
199
|
-
opacity: 0;
|
|
200
|
-
visibility: hidden;
|
|
201
|
-
max-height: 0px;
|
|
202
|
-
`;
|
|
203
|
-
element.style.overflow = null;
|
|
204
|
-
};
|
|
205
|
-
var showElement = (element) => {
|
|
206
|
-
element.style.cssText = `
|
|
207
|
-
display: block;
|
|
208
|
-
opacity: 1;
|
|
209
|
-
visibility: visible;
|
|
210
|
-
`;
|
|
211
|
-
};
|
|
212
|
-
var getHeight = (el) => {
|
|
213
|
-
el.style.maxHeight = "max-content";
|
|
214
|
-
const height = el.getBoundingClientRect().height;
|
|
215
|
-
el.style.maxHeight = `${0}`;
|
|
216
|
-
return height;
|
|
217
|
-
};
|
|
218
|
-
var getPaddingTop = (element) => {
|
|
219
|
-
const paddingY = parseInt(getComputedStyle(element).paddingTop);
|
|
220
|
-
return paddingY;
|
|
221
|
-
};
|
|
222
|
-
var getPaddingBottom = (element) => {
|
|
223
|
-
const paddingY = parseInt(getComputedStyle(element).paddingBottom);
|
|
224
|
-
return paddingY;
|
|
225
|
-
};
|
|
226
|
-
var Name = `accordion-content`;
|
|
227
|
-
var Component = (props, { element }) => {
|
|
228
|
-
const [state] = useAccordionItem(element);
|
|
229
|
-
const [_, accordionMethods] = useAccordion(element);
|
|
230
|
-
let isFirstRender = true;
|
|
231
|
-
const expand = (element2) => {
|
|
232
|
-
showElement(element2);
|
|
233
|
-
const height = getHeight(element2), pt = getPaddingTop(element2), pb = getPaddingBottom(element2);
|
|
234
|
-
Array.from(element2.children).forEach(
|
|
235
|
-
(child) => child.style.opacity = "1"
|
|
236
|
-
);
|
|
237
|
-
const animation = animate(
|
|
238
|
-
element2,
|
|
239
|
-
{
|
|
240
|
-
maxHeight: ["0px", `${height}px`],
|
|
241
|
-
paddingTop: ["0px", `${pt}px`],
|
|
242
|
-
paddingBottom: ["0px", `${pb}px`]
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
duration: 0.35
|
|
246
|
-
}
|
|
247
|
-
);
|
|
248
|
-
animation.then(() => {
|
|
249
|
-
element2.style.maxHeight = "max-content";
|
|
250
|
-
element2.style.overflow = null;
|
|
251
|
-
if (props.shouldScrollIntoView)
|
|
252
|
-
element2.scrollIntoView({
|
|
253
|
-
behavior: "smooth",
|
|
254
|
-
block: "start",
|
|
255
|
-
inline: "nearest"
|
|
256
|
-
});
|
|
257
|
-
return;
|
|
258
|
-
});
|
|
259
|
-
return animation;
|
|
260
|
-
};
|
|
261
|
-
const collapse = (element2) => {
|
|
262
|
-
const height = getHeight(element2), pt = getPaddingTop(element2), pb = getPaddingBottom(element2);
|
|
263
|
-
element2.style.overflow = "hidden";
|
|
264
|
-
Array.from(element2.children).forEach(
|
|
265
|
-
(child) => child.style.opacity = "0"
|
|
266
|
-
);
|
|
267
|
-
const animation = animate(
|
|
268
|
-
element2,
|
|
269
|
-
{
|
|
270
|
-
maxHeight: [`${height}px`, "0px"],
|
|
271
|
-
paddingTop: [`${pt}px`, "0px"],
|
|
272
|
-
paddingBottom: [`${pb}px`, "0px"]
|
|
273
|
-
},
|
|
274
|
-
{
|
|
275
|
-
duration: 0.35
|
|
276
|
-
}
|
|
277
|
-
);
|
|
278
|
-
animation.then(() => hideElement(element2));
|
|
279
|
-
return animation;
|
|
280
|
-
};
|
|
281
|
-
createEffect(
|
|
282
|
-
on(
|
|
283
|
-
() => state.isExpanded,
|
|
284
|
-
(isExpanded) => {
|
|
285
|
-
if (!isExpanded) {
|
|
286
|
-
const animation2 = collapse(element);
|
|
287
|
-
accordionMethods.updateAnimationQueue(controlsToPromise(animation2));
|
|
288
|
-
return onCleanup(() => animation2.complete());
|
|
289
|
-
}
|
|
290
|
-
if (isFirstRender) {
|
|
291
|
-
isFirstRender = false;
|
|
292
|
-
showElement(element);
|
|
293
|
-
}
|
|
294
|
-
const animation = expand(element);
|
|
295
|
-
accordionMethods.updateAnimationQueue(controlsToPromise(animation));
|
|
296
|
-
return onCleanup(() => animation.complete());
|
|
297
|
-
}
|
|
298
|
-
)
|
|
299
|
-
);
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
// src/components/accordion-item.ts
|
|
303
|
-
var accordion_item_exports = {};
|
|
304
|
-
__export(accordion_item_exports, {
|
|
305
|
-
Component: () => Component2,
|
|
306
|
-
Name: () => Name2
|
|
307
|
-
});
|
|
308
|
-
var Name2 = `accordion-item`;
|
|
309
|
-
var Component2 = (props, { element }) => {
|
|
310
|
-
if (element.parentElement?.tagName !== "ACCORDION-CONTEXT")
|
|
311
|
-
return console.warn(
|
|
312
|
-
`${Name2}: must be an immediate child of accordion-context`,
|
|
313
|
-
element
|
|
314
|
-
);
|
|
315
|
-
provideAccordionItemContext(props, element);
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
// src/components/accordion-trigger.ts
|
|
319
|
-
var accordion_trigger_exports = {};
|
|
320
|
-
__export(accordion_trigger_exports, {
|
|
321
|
-
Component: () => Component3,
|
|
322
|
-
Name: () => Name3
|
|
323
|
-
});
|
|
324
|
-
var Name3 = `accordion-trigger`;
|
|
325
|
-
var Component3 = (props, { element }) => {
|
|
326
|
-
const [state, methods] = useAccordionItem(element);
|
|
327
|
-
createEffect(() => {
|
|
328
|
-
const isAnimating = state.isAnimating;
|
|
329
|
-
if (isAnimating) return;
|
|
330
|
-
const controller = new AbortController(), preventDefault = props.preventDefault;
|
|
331
|
-
element.addEventListener(
|
|
332
|
-
"click",
|
|
333
|
-
(event) => {
|
|
334
|
-
if (preventDefault) event.preventDefault();
|
|
335
|
-
methods.toggle();
|
|
336
|
-
},
|
|
337
|
-
{ signal: controller.signal }
|
|
338
|
-
);
|
|
339
|
-
return onCleanup(() => {
|
|
340
|
-
controller.abort();
|
|
341
|
-
});
|
|
342
|
-
});
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
// src/components/accordion-context.ts
|
|
346
|
-
var accordion_context_exports = {};
|
|
347
|
-
__export(accordion_context_exports, {
|
|
348
|
-
Component: () => Component4,
|
|
349
|
-
Name: () => Name4
|
|
350
|
-
});
|
|
351
|
-
var Name4 = `accordion-context`;
|
|
352
|
-
var Component4 = (props, { element }) => {
|
|
353
|
-
const context = provideAccordionContext(props, element);
|
|
354
|
-
const [_, methods] = useAccordionContext(context);
|
|
355
|
-
const children = Array.from(element.children);
|
|
356
|
-
const accordionItems = children.filter(
|
|
357
|
-
(child) => child.tagName === "ACCORDION-ITEM"
|
|
358
|
-
);
|
|
359
|
-
accordionItems.forEach((accordionItem, index) => {
|
|
360
|
-
accordionItem.setAttribute("index", `${index + 1}`);
|
|
361
|
-
if (accordionItem.getAttribute(toHyphenated("isExpanded")) !== "true")
|
|
362
|
-
return;
|
|
363
|
-
methods.item.update(index + 1);
|
|
364
|
-
});
|
|
365
|
-
};
|
|
366
|
-
|
|
367
|
-
// src/index.ts
|
|
368
|
-
customShadowlessElement(
|
|
369
|
-
accordion_context_exports.Name,
|
|
370
|
-
{ activeIndex: -1, isAnimating: false },
|
|
371
|
-
correctElementType(accordion_context_exports.Component)
|
|
372
|
-
);
|
|
373
|
-
customShadowlessElement(
|
|
374
|
-
accordion_item_exports.Name,
|
|
375
|
-
{ index: 0, isExpanded: false, ariaExpanded: false },
|
|
376
|
-
correctElementType(accordion_item_exports.Component)
|
|
377
|
-
);
|
|
378
|
-
customShadowlessElement(
|
|
379
|
-
accordion_trigger_exports.Name,
|
|
380
|
-
{ preventDefault: true },
|
|
381
|
-
correctElementType(accordion_trigger_exports.Component)
|
|
382
|
-
);
|
|
383
|
-
customShadowlessElement(
|
|
384
|
-
accordion_content_exports.Name,
|
|
385
|
-
{ shouldScrollIntoView: false },
|
|
386
|
-
correctElementType(accordion_content_exports.Component)
|
|
387
|
-
);
|
|
388
|
-
|
|
389
|
-
export { getAccordionContext, getAccordionItemContext, provideAccordionContext, provideAccordionItemContext, useAccordion, useAccordionContext, useAccordionItem, useAccordionItemContext, withAccordionElementContext, withAccordionItemElementContext };
|
|
390
|
-
//# sourceMappingURL=index.js.map
|
|
391
|
-
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/accordion-content.ts","../../src/hooks/useAccordion.ts","../../src/hooks/useAccordionItem.ts","../../src/components/accordion-item.ts","../../src/components/accordion-trigger.ts","../../src/components/accordion-context.ts","../../src/index.ts"],"names":["state","splitProps","untrack","toHyphenated","createEffect","batch","mergeProps","createContext","provide","consume","createWithElementContext","getContextFromProvider","element","on","animation","Component","Name","onCleanup"],"mappings":"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","file":"index.js","sourcesContent":["import type { CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\nimport type { ICustomElement } from \"component-register\";\nimport { animate } from \"motion\";\nimport { createEffect, on, onCleanup } from \"solid-js\";\n\nimport { controlsToPromise } from \"@brytdesigns/web-component-core/animation\";\n\nimport { useAccordion, useAccordionItem } from \"../hooks/index.js\";\n\nexport type Props = {\n shouldScrollIntoView: boolean;\n};\n\nconst hideElement = (element: ICustomElement) => {\n element.style.cssText = `\n display: none;\n opacity: 0;\n visibility: hidden;\n max-height: 0px;\n `;\n element.style.overflow = null;\n};\n\nconst showElement = (element: ICustomElement) => {\n element.style.cssText = `\n display: block;\n opacity: 1;\n visibility: visible;\n `;\n};\n\nconst getHeight = (el: ICustomElement & HTMLElement) => {\n el.style.maxHeight = \"max-content\";\n const height = el.getBoundingClientRect().height;\n el.style.maxHeight = `${0}`;\n return height;\n};\n\nconst getPaddingTop = (element: ICustomElement & HTMLElement) => {\n const paddingY = parseInt(getComputedStyle(element).paddingTop);\n return paddingY;\n};\n\nconst getPaddingBottom = (element: ICustomElement & HTMLElement) => {\n const paddingY = parseInt(getComputedStyle(element).paddingBottom);\n return paddingY;\n};\n\nexport const Name = `accordion-content`;\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n const [state] = useAccordionItem(element);\n const [_, accordionMethods] = useAccordion(element);\n\n let isFirstRender = true;\n\n const expand = (element: ICustomElement & HTMLElement) => {\n showElement(element);\n\n const height = getHeight(element),\n pt = getPaddingTop(element),\n pb = getPaddingBottom(element);\n\n (Array.from(element.children) as HTMLElement[]).forEach(\n (child) => (child.style.opacity = \"1\"),\n );\n\n const animation = animate(\n element,\n {\n maxHeight: [\"0px\", `${height}px`],\n paddingTop: [\"0px\", `${pt}px`],\n paddingBottom: [\"0px\", `${pb}px`],\n },\n {\n duration: 0.35,\n },\n );\n\n animation.then(() => {\n element.style.maxHeight = \"max-content\";\n //@ts-ignore\n element.style.overflow = null;\n if (props.shouldScrollIntoView)\n element.scrollIntoView({\n behavior: \"smooth\",\n block: \"start\",\n inline: \"nearest\",\n });\n return;\n });\n\n return animation;\n };\n\n const collapse = (element: ICustomElement & HTMLElement) => {\n const height = getHeight(element),\n pt = getPaddingTop(element),\n pb = getPaddingBottom(element);\n\n element.style.overflow = \"hidden\";\n\n (Array.from(element.children) as HTMLElement[]).forEach(\n (child) => (child.style.opacity = \"0\"),\n );\n\n const animation = animate(\n element,\n {\n maxHeight: [`${height}px`, \"0px\"],\n paddingTop: [`${pt}px`, \"0px\"],\n paddingBottom: [`${pb}px`, \"0px\"],\n },\n {\n duration: 0.35,\n },\n );\n\n animation.then(() => hideElement(element));\n\n return animation;\n };\n\n createEffect(\n on(\n () => state.isExpanded,\n (isExpanded) => {\n if (!isExpanded) {\n const animation = collapse(element);\n accordionMethods.updateAnimationQueue(controlsToPromise(animation));\n return onCleanup(() => animation.complete());\n }\n\n if (isFirstRender) {\n isFirstRender = false;\n showElement(element);\n }\n\n const animation = expand(element);\n accordionMethods.updateAnimationQueue(controlsToPromise(animation));\n return onCleanup(() => animation.complete());\n },\n ),\n );\n};\n","import {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport {\n createEffect,\n mergeProps,\n on,\n batch,\n splitProps,\n createSelector,\n untrack,\n} from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport {\n toHyphenated,\n getContextFromProvider,\n createWithElementContext,\n} from \"@brytdesigns/web-component-core/utils\";\n\ntype StoreContext = {\n animationQueue: Promise<unknown>[];\n};\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n isAnimating: boolean;\n activeIndex: number;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype AccordionContext = ReturnType<typeof initializeAccordionContext>;\n\nfunction initializeAccordionContext(props: CreateContextOptions) {\n const [element, stateProps] = splitProps(props, [\"root\"]);\n const [store, setStore] = createStore<StoreContext>({ animationQueue: [] });\n\n createEffect(\n on(\n () => store.animationQueue,\n (animationQueue) => {\n if (!animationQueue.length) return;\n const animations = Promise.allSettled(store.animationQueue);\n setElementState(\"isAnimating\", true);\n animations.finally(() => {\n batch(() => {\n setElementState(\"isAnimating\", false);\n setStore(\"animationQueue\", []);\n });\n });\n },\n ),\n );\n\n function setElementState(\n key: keyof Omit<CreateContextOptions, \"root\">,\n value: boolean | number | ((v: boolean | number) => boolean | number),\n ) {\n const currentValue = untrack(() => props[key]);\n if (typeof value === \"function\") {\n let result: boolean | number = false;\n if (typeof currentValue === \"number\") {\n result = value(currentValue || 0);\n } else if (typeof currentValue === \"boolean\") {\n result = value(currentValue || false);\n }\n if (`${currentValue}` === `${value}`) return;\n element.root.setAttribute(toHyphenated(key), `${result}`);\n return;\n }\n if (`${currentValue}` === `${value}`) return;\n return element.root.setAttribute(toHyphenated(key), `${value}`);\n }\n\n return [\n mergeProps(store, stateProps),\n { setElementState, setStore },\n ] as const;\n}\n\nconst AccordionContextState = createContext(initializeAccordionContext);\n\nexport const provideAccordionContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): AccordionContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(AccordionContextState, props, element);\n};\n\nexport const useAccordionContext = (context: AccordionContext) => {\n const [state, { setElementState, setStore: setState }] = context;\n\n function updateAnimationQueue(animation: Promise<unknown>) {\n setState(\"animationQueue\", (state) => [...state, animation]);\n }\n\n function updateActiveIndex(index: number) {\n setElementState(\"activeIndex\", index);\n }\n\n const isActive = createSelector(() => state.activeIndex);\n\n return [\n state,\n { updateAnimationQueue, item: { update: updateActiveIndex, isActive } },\n ] as const;\n};\n\nexport const useAccordion = (element: HTMLElement & ICustomElement) => {\n const context: AccordionContext = consume(AccordionContextState, element);\n\n if (!context) {\n throw console.error(\n \"AccordionContext not found! Please ensure to wrap your custom element with accordion-context element.\",\n );\n }\n\n return useAccordionContext(context);\n};\n\nexport const withAccordionElementContext = createWithElementContext<\n typeof AccordionContextState,\n AccordionContext\n>(AccordionContextState);\n\nexport const getAccordionContext = (element: Element) => {\n const context = getContextFromProvider<AccordionContext>(\n AccordionContextState,\n element,\n );\n return useAccordionContext(context);\n};\n","import {\n type ICustomElement,\n createContext,\n provide,\n consume,\n} from \"component-register\";\nimport { batch, createEffect, mergeProps, splitProps, untrack } from \"solid-js\";\nimport {\n toHyphenated,\n getContextFromProvider,\n createWithElementContext,\n} from \"@brytdesigns/web-component-core/utils\";\nimport { useAccordion } from \"./useAccordion.js\";\n\ntype CreateContextOptions = {\n root: HTMLElement & ICustomElement;\n isExpanded: boolean;\n index: number;\n ariaExpanded: boolean;\n};\n\ntype WalkableNode = Parameters<typeof provide>[2];\n\ntype AccordionItemContext = ReturnType<typeof initializeAccordionItemContext>;\n\nfunction initializeAccordionItemContext(props: CreateContextOptions) {\n const [element, _, stateProps] = splitProps(\n props,\n [\"root\"],\n [\"ariaExpanded\"],\n );\n const [context, methods] = useAccordion(element.root);\n\n function setElementState(\n key: keyof Omit<CreateContextOptions, \"root\">,\n value: boolean | number | ((v: boolean | number) => boolean | number),\n ) {\n const currentValue = untrack(() => props[key]);\n if (typeof value === \"function\") {\n let result: boolean | number = false;\n if (typeof currentValue === \"number\") {\n result = value(currentValue || 0);\n } else if (typeof currentValue === \"boolean\") {\n result = value(currentValue || false);\n }\n if (`${currentValue}` === `${value}`) return;\n element.root.setAttribute(toHyphenated(key), `${result}`);\n return;\n }\n if (`${currentValue}` === `${value}`) return;\n return element.root.setAttribute(toHyphenated(key), `${value}`);\n }\n\n createEffect(() => {\n const isActive = methods.item.isActive(props.index);\n batch(() => {\n setElementState(\"isExpanded\", isActive);\n setElementState(\"ariaExpanded\", isActive);\n });\n });\n\n createEffect(() => {\n const index = untrack(() => stateProps.index);\n const isExpanded = stateProps.isExpanded;\n if (isExpanded) methods.item.update(index);\n });\n\n function setActive(index: number) {\n methods.item.update(index);\n }\n\n return [\n mergeProps(stateProps, {\n get isAnimating() {\n return context.isAnimating;\n },\n }),\n { setElementState, setActive },\n ] as const;\n}\n\nconst AccordionItemContextState = createContext(initializeAccordionItemContext);\n\nexport const provideAccordionItemContext = (\n initialState: Omit<CreateContextOptions, \"root\">,\n element: WalkableNode,\n): AccordionItemContext => {\n const props = mergeProps(initialState, { root: element });\n return provide(AccordionItemContextState, props, element);\n};\n\nexport const useAccordionItemContext = (context: AccordionItemContext) => {\n const [state, { setElementState, setActive }] = context;\n\n function expand() {\n const index = untrack(() => state.index);\n batch(() => {\n setActive(index);\n setElementState(\"isExpanded\", true);\n });\n }\n\n function collapse() {\n batch(() => {\n setActive(-1);\n setElementState(\"isExpanded\", false);\n });\n }\n\n function toggle() {\n setElementState(\"isExpanded\", (v) => {\n const index = untrack(() => state.index);\n const newValue = !v;\n if (newValue) setActive(index);\n else setActive(-1);\n return newValue;\n });\n }\n\n return [state, { expand, collapse, toggle }] as const;\n};\n\nexport const useAccordionItem = (element: HTMLElement & ICustomElement) => {\n const context: AccordionItemContext = consume(\n AccordionItemContextState,\n element,\n );\n\n if (!context) {\n throw console.error(\n \"AccordionItemContext not found! Please ensure to wrap your custom element with accordion-item element.\",\n );\n }\n\n return useAccordionItemContext(context);\n};\n\nexport const withAccordionItemElementContext = createWithElementContext<\n typeof AccordionItemContextState,\n AccordionItemContext\n>(AccordionItemContextState);\n\nexport const getAccordionItemContext = (element: Element) => {\n const context = getContextFromProvider<AccordionItemContext>(\n AccordionItemContextState,\n element,\n );\n return useAccordionItemContext(context);\n};\n","import { type CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\n\nimport { provideAccordionItemContext } from \"../hooks/index.js\";\n\nexport type Props = {\n index: number;\n isExpanded: boolean;\n ariaExpanded: boolean;\n};\n\nexport const Name = `accordion-item`;\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n if (element.parentElement?.tagName !== \"ACCORDION-CONTEXT\")\n return console.warn(\n `${Name}: must be an immediate child of accordion-context`,\n element,\n );\n\n provideAccordionItemContext(props, element);\n};\n","import { type CorrectComponentType } from \"@brytdesigns/web-component-core/utils\";\n\nimport { createEffect, onCleanup } from \"solid-js\";\n\nimport { useAccordionItem } from \"../hooks/index.js\";\n\nexport type Props = {\n preventDefault: boolean;\n};\n\nexport const Name = `accordion-trigger`;\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n const [state, methods] = useAccordionItem(element);\n\n createEffect(() => {\n const isAnimating = state.isAnimating;\n if (isAnimating) return;\n\n const controller = new AbortController(),\n preventDefault = props.preventDefault;\n\n element.addEventListener(\n \"click\",\n (event) => {\n if (preventDefault) event.preventDefault();\n methods.toggle();\n },\n { signal: controller.signal },\n );\n\n return onCleanup(() => {\n controller.abort();\n });\n });\n};\n","import {\n toHyphenated,\n type CorrectComponentType,\n} from \"@brytdesigns/web-component-core/utils\";\n\nimport {\n provideAccordionContext,\n useAccordionContext,\n} from \"../hooks/index.js\";\n\nexport type Props = {\n activeIndex: number;\n isAnimating: boolean;\n};\n\nexport const Name = `accordion-context`;\n\nexport const Component: CorrectComponentType<Props> = (props, { element }) => {\n const context = provideAccordionContext(props, element);\n const [_, methods] = useAccordionContext(context);\n const children = Array.from(element.children) as HTMLElement[];\n const accordionItems = children.filter(\n (child) => child.tagName === \"ACCORDION-ITEM\",\n );\n accordionItems.forEach((accordionItem, index) => {\n accordionItem.setAttribute(\"index\", `${index + 1}`);\n if (accordionItem.getAttribute(toHyphenated(\"isExpanded\")) !== \"true\")\n return;\n methods.item.update(index + 1);\n });\n};\n","import {\n customShadowlessElement,\n correctElementType,\n} from \"@brytdesigns/web-component-core/utils\";\n\nimport {\n AccordionContext,\n AccordionItem,\n AccordionContent,\n AccordionTrigger,\n} from \"./components/index.js\";\n\nexport type AccordionContextProps = AccordionContent.Props;\nexport type AccordionItemProps = AccordionItem.Props;\nexport type AccordionTriggerProps = AccordionTrigger.Props;\nexport type AccordionContentProps = AccordionContent.Props;\n\ncustomShadowlessElement(\n AccordionContext.Name,\n { activeIndex: -1, isAnimating: false },\n correctElementType(AccordionContext.Component),\n);\n\ncustomShadowlessElement(\n AccordionItem.Name,\n { index: 0, isExpanded: false, ariaExpanded: false },\n correctElementType(AccordionItem.Component),\n);\n\ncustomShadowlessElement(\n AccordionTrigger.Name,\n { preventDefault: true },\n correctElementType(AccordionTrigger.Component),\n);\n\ncustomShadowlessElement(\n AccordionContent.Name,\n { shouldScrollIntoView: false },\n correctElementType(AccordionContent.Component),\n);\n\nexport * from \"./hooks/index.js\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js","sourcesContent":[]}
|