@data-slot/core 0.2.3 → 0.2.5

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/index.cjs CHANGED
@@ -1 +1 @@
1
- const e=(e,t)=>e.querySelector(`[data-slot="${t}"]`),t=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],n=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)];let r=0;const i=(e,t)=>e.id||=`${t}-${++r}`,a=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))},o=(e,t,n)=>{t&&e.setAttribute(`aria-labelledby`,i(t,`title`)),n&&e.setAttribute(`aria-describedby`,i(n,`desc`))};function s(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const c=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),l=(...e)=>t=>{for(let n of e){if(t.defaultPrevented)break;n?.(t)}};exports.composeHandlers=l,exports.emit=c,exports.ensureId=i,exports.getPart=e,exports.getParts=t,exports.getRoots=n,exports.linkLabelledBy=o,exports.on=s,exports.setAria=a;
1
+ const e=(e,t)=>e.querySelector(`[data-slot="${t}"]`),t=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],n=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],r=new WeakMap;function i(e,t,n){if(typeof process<`u`&&process.env?.NODE_ENV===`production`)return;let i=r.get(e);i||(i=new Set,r.set(e,i)),!i.has(t)&&(i.add(t),console.warn(`[@data-slot] ${n}`))}function a(e){let t=`data-${e.replace(/([A-Z])/g,`-$1`).toLowerCase()}`,n=`data-${e}`;return t===n?[t]:[t,n]}function o(e,t){for(let n of a(t))if(e.hasAttribute(n))return e.getAttribute(n);return null}function s(e,t){return a(t).some(t=>e.hasAttribute(t))}const c=new Set([``,`true`,`1`,`yes`]),l=new Set([`false`,`0`,`no`]);function u(e,t){if(!s(e,t))return;let n=o(e,t);if(n===null)return;let r=n.toLowerCase();if(c.has(r))return!0;if(l.has(r))return!1;i(e,t,`Invalid boolean value "${n}" for data-${t}. Expected: true/false/1/0/yes/no or empty.`)}function d(e,t){let n=o(e,t);if(n===null||n===``)return;let r=Number(n);if(Number.isNaN(r)||!Number.isFinite(r)){i(e,t,`Invalid number value "${n}" for data-${t}.`);return}return r}function f(e,t){if(s(e,t))return o(e,t)??void 0}function p(e,t,n){let r=o(e,t);if(r!==null){if(n.includes(r))return r;i(e,t,`Invalid value "${r}" for data-${t}. Expected one of: ${n.join(`, `)}.`)}}let m=0;const h=(e,t)=>e.id||=`${t}-${++m}`,g=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))},_=(e,t,n)=>{t&&e.setAttribute(`aria-labelledby`,h(t,`title`)),n&&e.setAttribute(`aria-describedby`,h(n,`desc`))};function v(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const y=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),b=(...e)=>t=>{for(let n of e){if(t.defaultPrevented)break;n?.(t)}};exports.composeHandlers=b,exports.emit=y,exports.ensureId=h,exports.getDataBool=u,exports.getDataEnum=p,exports.getDataNumber=d,exports.getDataString=f,exports.getPart=e,exports.getParts=t,exports.getRoots=n,exports.linkLabelledBy=_,exports.on=v,exports.setAria=g;
package/dist/index.d.cts CHANGED
@@ -11,6 +11,31 @@ declare const getParts: <T extends Element = Element>(root: Element, slot: strin
11
11
  * Find all component roots within a scope by data-slot value
12
12
  */
13
13
  declare const getRoots: <T extends Element = Element>(scope: ParentNode, slot: string) => T[];
14
+ /**
15
+ * Parse a boolean data attribute.
16
+ * - Present with no value, "true", "1", "yes" → true
17
+ * - "false", "0", "no" → false
18
+ * - Absent or invalid → undefined
19
+ */
20
+ declare function getDataBool(el: Element, key: string): boolean | undefined;
21
+ /**
22
+ * Parse a number data attribute.
23
+ * - Valid finite number → number
24
+ * - Absent, invalid, NaN, Infinity, empty → undefined
25
+ */
26
+ declare function getDataNumber(el: Element, key: string): number | undefined;
27
+ /**
28
+ * Parse a string data attribute.
29
+ * - Present (including empty string) → string
30
+ * - Absent → undefined
31
+ */
32
+ declare function getDataString(el: Element, key: string): string | undefined;
33
+ /**
34
+ * Parse an enum data attribute.
35
+ * - Valid value in allowed array → T
36
+ * - Absent or invalid → undefined
37
+ */
38
+ declare function getDataEnum<T extends string>(el: Element, key: string, allowed: readonly T[]): T | undefined;
14
39
  //#endregion
15
40
  //#region src/aria.d.ts
16
41
  /**
@@ -43,4 +68,4 @@ declare const emit: <T = unknown>(el: Element, name: string, detail?: T) => bool
43
68
  */
44
69
  declare const composeHandlers: <E extends Event>(...handlers: Array<((e: E) => void) | undefined>) => ((e: E) => void);
45
70
  //#endregion
46
- export { composeHandlers, emit, ensureId, getPart, getParts, getRoots, linkLabelledBy, on, setAria };
71
+ export { composeHandlers, emit, ensureId, getDataBool, getDataEnum, getDataNumber, getDataString, getPart, getParts, getRoots, linkLabelledBy, on, setAria };
package/dist/index.d.ts CHANGED
@@ -11,6 +11,31 @@ declare const getParts: <T extends Element = Element>(root: Element, slot: strin
11
11
  * Find all component roots within a scope by data-slot value
12
12
  */
13
13
  declare const getRoots: <T extends Element = Element>(scope: ParentNode, slot: string) => T[];
14
+ /**
15
+ * Parse a boolean data attribute.
16
+ * - Present with no value, "true", "1", "yes" → true
17
+ * - "false", "0", "no" → false
18
+ * - Absent or invalid → undefined
19
+ */
20
+ declare function getDataBool(el: Element, key: string): boolean | undefined;
21
+ /**
22
+ * Parse a number data attribute.
23
+ * - Valid finite number → number
24
+ * - Absent, invalid, NaN, Infinity, empty → undefined
25
+ */
26
+ declare function getDataNumber(el: Element, key: string): number | undefined;
27
+ /**
28
+ * Parse a string data attribute.
29
+ * - Present (including empty string) → string
30
+ * - Absent → undefined
31
+ */
32
+ declare function getDataString(el: Element, key: string): string | undefined;
33
+ /**
34
+ * Parse an enum data attribute.
35
+ * - Valid value in allowed array → T
36
+ * - Absent or invalid → undefined
37
+ */
38
+ declare function getDataEnum<T extends string>(el: Element, key: string, allowed: readonly T[]): T | undefined;
14
39
  //#endregion
15
40
  //#region src/aria.d.ts
16
41
  /**
@@ -43,4 +68,4 @@ declare const emit: <T = unknown>(el: Element, name: string, detail?: T) => bool
43
68
  */
44
69
  declare const composeHandlers: <E extends Event>(...handlers: Array<((e: E) => void) | undefined>) => ((e: E) => void);
45
70
  //#endregion
46
- export { composeHandlers, emit, ensureId, getPart, getParts, getRoots, linkLabelledBy, on, setAria };
71
+ export { composeHandlers, emit, ensureId, getDataBool, getDataEnum, getDataNumber, getDataString, getPart, getParts, getRoots, linkLabelledBy, on, setAria };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- const e=(e,t)=>e.querySelector(`[data-slot="${t}"]`),t=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],n=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)];let r=0;const i=(e,t)=>e.id||=`${t}-${++r}`,a=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))},o=(e,t,n)=>{t&&e.setAttribute(`aria-labelledby`,i(t,`title`)),n&&e.setAttribute(`aria-describedby`,i(n,`desc`))};function s(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const c=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),l=(...e)=>t=>{for(let n of e){if(t.defaultPrevented)break;n?.(t)}};export{l as composeHandlers,c as emit,i as ensureId,e as getPart,t as getParts,n as getRoots,o as linkLabelledBy,s as on,a as setAria};
1
+ const e=(e,t)=>e.querySelector(`[data-slot="${t}"]`),t=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],n=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],r=new WeakMap;function i(e,t,n){if(typeof process<`u`&&process.env?.NODE_ENV===`production`)return;let i=r.get(e);i||(i=new Set,r.set(e,i)),!i.has(t)&&(i.add(t),console.warn(`[@data-slot] ${n}`))}function a(e){let t=`data-${e.replace(/([A-Z])/g,`-$1`).toLowerCase()}`,n=`data-${e}`;return t===n?[t]:[t,n]}function o(e,t){for(let n of a(t))if(e.hasAttribute(n))return e.getAttribute(n);return null}function s(e,t){return a(t).some(t=>e.hasAttribute(t))}const c=new Set([``,`true`,`1`,`yes`]),l=new Set([`false`,`0`,`no`]);function u(e,t){if(!s(e,t))return;let n=o(e,t);if(n===null)return;let r=n.toLowerCase();if(c.has(r))return!0;if(l.has(r))return!1;i(e,t,`Invalid boolean value "${n}" for data-${t}. Expected: true/false/1/0/yes/no or empty.`)}function d(e,t){let n=o(e,t);if(n===null||n===``)return;let r=Number(n);if(Number.isNaN(r)||!Number.isFinite(r)){i(e,t,`Invalid number value "${n}" for data-${t}.`);return}return r}function f(e,t){if(s(e,t))return o(e,t)??void 0}function p(e,t,n){let r=o(e,t);if(r!==null){if(n.includes(r))return r;i(e,t,`Invalid value "${r}" for data-${t}. Expected one of: ${n.join(`, `)}.`)}}let m=0;const h=(e,t)=>e.id||=`${t}-${++m}`,g=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))},_=(e,t,n)=>{t&&e.setAttribute(`aria-labelledby`,h(t,`title`)),n&&e.setAttribute(`aria-describedby`,h(n,`desc`))};function v(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const y=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),b=(...e)=>t=>{for(let n of e){if(t.defaultPrevented)break;n?.(t)}};export{b as composeHandlers,y as emit,h as ensureId,u as getDataBool,p as getDataEnum,d as getDataNumber,f as getDataString,e as getPart,t as getParts,n as getRoots,_ as linkLabelledBy,v as on,g as setAria};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-slot/core",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.cjs",