@aihu/primitives 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.
- package/LICENSE +21 -0
- package/README.md +129 -0
- package/dist/button-C-8c-A17.js +126 -0
- package/dist/button-C-8c-A17.js.map +1 -0
- package/dist/button.d.ts +2 -0
- package/dist/button.js +2 -0
- package/dist/collection.d.ts +26 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +72 -0
- package/dist/collection.js.map +1 -0
- package/dist/config-provider.d.ts +39 -0
- package/dist/config-provider.d.ts.map +1 -0
- package/dist/config-provider.js +112 -0
- package/dist/config-provider.js.map +1 -0
- package/dist/dialog-y7MHc6vf.js +253 -0
- package/dist/dialog-y7MHc6vf.js.map +1 -0
- package/dist/dialog.d.ts +2 -0
- package/dist/dialog.js +2 -0
- package/dist/dom-context.d.ts +40 -0
- package/dist/dom-context.d.ts.map +1 -0
- package/dist/dom-context.js +64 -0
- package/dist/dom-context.js.map +1 -0
- package/dist/form-control.d.ts +41 -0
- package/dist/form-control.d.ts.map +1 -0
- package/dist/form-control.js +145 -0
- package/dist/form-control.js.map +1 -0
- package/dist/index-D9kf9rVU.d.ts +86 -0
- package/dist/index-D9kf9rVU.d.ts.map +1 -0
- package/dist/index-DPD4L6Nj.d.ts +31 -0
- package/dist/index-DPD4L6Nj.d.ts.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/presence-gate.d.ts +33 -0
- package/dist/presence-gate.d.ts.map +1 -0
- package/dist/presence-gate.js +109 -0
- package/dist/presence-gate.js.map +1 -0
- package/dist/roving-focus.d.ts +33 -0
- package/dist/roving-focus.d.ts.map +1 -0
- package/dist/roving-focus.js +159 -0
- package/dist/roving-focus.js.map +1 -0
- package/dist/tooltip.d.ts +72 -0
- package/dist/tooltip.d.ts.map +1 -0
- package/dist/tooltip.js +195 -0
- package/dist/tooltip.js.map +1 -0
- package/package.json +79 -0
package/dist/tooltip.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { createDomContext, injectValue, provideContext } from "./dom-context.js";
|
|
2
|
+
import { effect, signal } from "@aihu/signals";
|
|
3
|
+
import { position } from "@aihu/css-engine/runtime/progressive";
|
|
4
|
+
//#region src/tooltip/index.ts
|
|
5
|
+
/**
|
|
6
|
+
* Headless tooltip — `<aihu-tooltip-root>` + `<aihu-tooltip-trigger>` +
|
|
7
|
+
* `<aihu-tooltip-content>`. Implements the WAI-ARIA APG
|
|
8
|
+
* [Tooltip](https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/) pattern: the
|
|
9
|
+
* trigger is `aria-describedby` the tooltip (NOT labelled-by), the content has
|
|
10
|
+
* `role="tooltip"` and is not focusable, and Escape dismisses.
|
|
11
|
+
*
|
|
12
|
+
* Placement REUSES the Plan 3 `position()` shim from
|
|
13
|
+
* `@aihu/css-engine/runtime/progressive` — tooltip contains NO positioning math
|
|
14
|
+
* of its own and adds NO floating-ui dependency.
|
|
15
|
+
*
|
|
16
|
+
* Root attributes (reflected): `open` (boolean), `open-delay`/`close-delay`
|
|
17
|
+
* (ms, default 700/300), `placement` (`"top"|"bottom"|"left"|"right"`).
|
|
18
|
+
* Root signals: `open`, `coords` (computed position written by the shim).
|
|
19
|
+
*/
|
|
20
|
+
const tooltipContext = createDomContext("tooltip");
|
|
21
|
+
let _idSeq = 0;
|
|
22
|
+
const uid = () => `aihu-tooltip-${_idSeq += 1}`;
|
|
23
|
+
var AihuTooltipRoot = class extends HTMLElement {
|
|
24
|
+
static observedAttributes = [
|
|
25
|
+
"open",
|
|
26
|
+
"open-delay",
|
|
27
|
+
"close-delay",
|
|
28
|
+
"placement"
|
|
29
|
+
];
|
|
30
|
+
_open = signal(false);
|
|
31
|
+
_contentId = signal(uid());
|
|
32
|
+
_placement = signal("bottom");
|
|
33
|
+
_openDelay = signal(700);
|
|
34
|
+
_closeDelay = signal(300);
|
|
35
|
+
_trigger = null;
|
|
36
|
+
_openTimer = null;
|
|
37
|
+
_closeTimer = null;
|
|
38
|
+
_disposers = [];
|
|
39
|
+
_ctx;
|
|
40
|
+
constructor() {
|
|
41
|
+
super();
|
|
42
|
+
this._ctx = {
|
|
43
|
+
open: this._open[0],
|
|
44
|
+
contentId: this._contentId[0],
|
|
45
|
+
placement: this._placement[0],
|
|
46
|
+
openDelay: this._openDelay[0],
|
|
47
|
+
closeDelay: this._closeDelay[0],
|
|
48
|
+
setOpen: (n) => this._setOpen(n),
|
|
49
|
+
scheduleOpen: () => this._scheduleOpen(),
|
|
50
|
+
scheduleClose: () => this._scheduleClose(),
|
|
51
|
+
dismiss: () => this._setOpen(false),
|
|
52
|
+
registerTrigger: (el) => {
|
|
53
|
+
this._trigger = el;
|
|
54
|
+
},
|
|
55
|
+
triggerEl: () => this._trigger
|
|
56
|
+
};
|
|
57
|
+
provideContext(this, tooltipContext, this._ctx);
|
|
58
|
+
}
|
|
59
|
+
get open() {
|
|
60
|
+
return this._open[0];
|
|
61
|
+
}
|
|
62
|
+
connectedCallback() {
|
|
63
|
+
this._syncFromAttrs();
|
|
64
|
+
this._disposers.push(effect(() => {
|
|
65
|
+
this.setAttribute("data-state", this._open[0]() ? "open" : "closed");
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
disconnectedCallback() {
|
|
69
|
+
this._clearTimers();
|
|
70
|
+
for (const d of this._disposers) d();
|
|
71
|
+
this._disposers = [];
|
|
72
|
+
}
|
|
73
|
+
attributeChangedCallback(name, _old, value) {
|
|
74
|
+
switch (name) {
|
|
75
|
+
case "open":
|
|
76
|
+
this._setOpen(value !== null);
|
|
77
|
+
break;
|
|
78
|
+
case "open-delay":
|
|
79
|
+
if (value !== null) this._openDelay[1](Number(value));
|
|
80
|
+
break;
|
|
81
|
+
case "close-delay":
|
|
82
|
+
if (value !== null) this._closeDelay[1](Number(value));
|
|
83
|
+
break;
|
|
84
|
+
case "placement":
|
|
85
|
+
if (isPlacement(value)) this._placement[1](value);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
_setOpen(next) {
|
|
90
|
+
this._clearTimers();
|
|
91
|
+
if (next === this._open[0]()) return;
|
|
92
|
+
this._open[1](next);
|
|
93
|
+
if (next) this.setAttribute("open", "");
|
|
94
|
+
else this.removeAttribute("open");
|
|
95
|
+
}
|
|
96
|
+
_scheduleOpen() {
|
|
97
|
+
this._clearTimers();
|
|
98
|
+
this._openTimer = setTimeout(() => this._setOpen(true), this._openDelay[0]());
|
|
99
|
+
}
|
|
100
|
+
_scheduleClose() {
|
|
101
|
+
this._clearTimers();
|
|
102
|
+
this._closeTimer = setTimeout(() => this._setOpen(false), this._closeDelay[0]());
|
|
103
|
+
}
|
|
104
|
+
_clearTimers() {
|
|
105
|
+
if (this._openTimer) clearTimeout(this._openTimer);
|
|
106
|
+
if (this._closeTimer) clearTimeout(this._closeTimer);
|
|
107
|
+
this._openTimer = null;
|
|
108
|
+
this._closeTimer = null;
|
|
109
|
+
}
|
|
110
|
+
_syncFromAttrs() {
|
|
111
|
+
if (this.hasAttribute("open-delay")) this._openDelay[1](Number(this.getAttribute("open-delay")));
|
|
112
|
+
if (this.hasAttribute("close-delay")) this._closeDelay[1](Number(this.getAttribute("close-delay")));
|
|
113
|
+
const p = this.getAttribute("placement");
|
|
114
|
+
if (isPlacement(p)) this._placement[1](p);
|
|
115
|
+
this._open[1](this.hasAttribute("open"));
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
function isPlacement(v) {
|
|
119
|
+
return v === "top" || v === "bottom" || v === "left" || v === "right";
|
|
120
|
+
}
|
|
121
|
+
var AihuTooltipTrigger = class extends HTMLElement {
|
|
122
|
+
ctx;
|
|
123
|
+
disposers = [];
|
|
124
|
+
connectedCallback() {
|
|
125
|
+
this.ctx = injectValue(this, tooltipContext);
|
|
126
|
+
this.ctx.registerTrigger(this);
|
|
127
|
+
this.addEventListener("mouseenter", this._onEnter);
|
|
128
|
+
this.addEventListener("mouseleave", this._onLeave);
|
|
129
|
+
this.addEventListener("focus", this._onEnter);
|
|
130
|
+
this.addEventListener("blur", this._onLeave);
|
|
131
|
+
this.addEventListener("keydown", this._onKeydown);
|
|
132
|
+
this.disposers.push(effect(() => {
|
|
133
|
+
this.setAttribute("aria-describedby", this.ctx.contentId());
|
|
134
|
+
this.setAttribute("data-state", this.ctx.open() ? "open" : "closed");
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
disconnectedCallback() {
|
|
138
|
+
for (const d of this.disposers) d();
|
|
139
|
+
this.disposers = [];
|
|
140
|
+
}
|
|
141
|
+
_onEnter = () => {
|
|
142
|
+
this.ctx.scheduleOpen();
|
|
143
|
+
};
|
|
144
|
+
_onLeave = () => {
|
|
145
|
+
this.ctx.scheduleClose();
|
|
146
|
+
};
|
|
147
|
+
_onKeydown = (ev) => {
|
|
148
|
+
if (ev.key === "Escape") this.ctx.dismiss();
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
var AihuTooltipContent = class extends HTMLElement {
|
|
152
|
+
ctx;
|
|
153
|
+
disposers = [];
|
|
154
|
+
connectedCallback() {
|
|
155
|
+
this.ctx = injectValue(this, tooltipContext);
|
|
156
|
+
this.setAttribute("role", "tooltip");
|
|
157
|
+
this.id = this.ctx.contentId();
|
|
158
|
+
this.addEventListener("keydown", this._onKeydown);
|
|
159
|
+
this.disposers.push(effect(() => {
|
|
160
|
+
const open = this.ctx.open();
|
|
161
|
+
this.setAttribute("data-state", open ? "open" : "closed");
|
|
162
|
+
if (open) this._position();
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
disconnectedCallback() {
|
|
166
|
+
this.removeEventListener("keydown", this._onKeydown);
|
|
167
|
+
for (const d of this.disposers) d();
|
|
168
|
+
this.disposers = [];
|
|
169
|
+
}
|
|
170
|
+
/** Position against the trigger using the REUSED css-engine shim. */
|
|
171
|
+
_position() {
|
|
172
|
+
const anchor = this.ctx.triggerEl();
|
|
173
|
+
if (!anchor) return;
|
|
174
|
+
position(anchor, this, { placement: this.ctx.placement() });
|
|
175
|
+
}
|
|
176
|
+
_onKeydown = (ev) => {
|
|
177
|
+
if (ev.key === "Escape") this.ctx.dismiss();
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
const REGISTRY = [
|
|
181
|
+
["aihu-tooltip-root", AihuTooltipRoot],
|
|
182
|
+
["aihu-tooltip-trigger", AihuTooltipTrigger],
|
|
183
|
+
["aihu-tooltip-content", AihuTooltipContent]
|
|
184
|
+
];
|
|
185
|
+
let _defined = false;
|
|
186
|
+
/** Register all tooltip custom elements (idempotent). */
|
|
187
|
+
function defineTooltip() {
|
|
188
|
+
if (_defined) return;
|
|
189
|
+
for (const [tag, ctor] of REGISTRY) if (!customElements.get(tag)) customElements.define(tag, ctor);
|
|
190
|
+
_defined = true;
|
|
191
|
+
}
|
|
192
|
+
//#endregion
|
|
193
|
+
export { AihuTooltipContent, AihuTooltipRoot, AihuTooltipTrigger, defineTooltip, tooltipContext };
|
|
194
|
+
|
|
195
|
+
//# sourceMappingURL=tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip.js","names":[],"sources":["../src/tooltip/index.ts"],"sourcesContent":["/**\n * Headless tooltip — `<aihu-tooltip-root>` + `<aihu-tooltip-trigger>` +\n * `<aihu-tooltip-content>`. Implements the WAI-ARIA APG\n * [Tooltip](https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/) pattern: the\n * trigger is `aria-describedby` the tooltip (NOT labelled-by), the content has\n * `role=\"tooltip\"` and is not focusable, and Escape dismisses.\n *\n * Placement REUSES the Plan 3 `position()` shim from\n * `@aihu/css-engine/runtime/progressive` — tooltip contains NO positioning math\n * of its own and adds NO floating-ui dependency.\n *\n * Root attributes (reflected): `open` (boolean), `open-delay`/`close-delay`\n * (ms, default 700/300), `placement` (`\"top\"|\"bottom\"|\"left\"|\"right\"`).\n * Root signals: `open`, `coords` (computed position written by the shim).\n */\n\nimport { type Placement, position } from '@aihu/css-engine/runtime/progressive'\nimport { effect, type Read, signal } from '@aihu/signals'\nimport { createDomContext, injectValue, provideContext } from '../dom-context.ts'\n\nexport interface TooltipCoords {\n x: number\n y: number\n placement: Placement\n}\n\nexport interface TooltipContextValue {\n readonly open: Read<boolean>\n readonly contentId: Read<string>\n readonly placement: Read<Placement>\n readonly openDelay: Read<number>\n readonly closeDelay: Read<number>\n setOpen(next: boolean): void\n /** Schedule open/close honoring the configured delays. */\n scheduleOpen(): void\n scheduleClose(): void\n /** Immediate dismiss (Escape). */\n dismiss(): void\n registerTrigger(el: Element): void\n triggerEl(): Element | null\n}\n\nexport const tooltipContext = createDomContext<TooltipContextValue>('tooltip')\n\nlet _idSeq = 0\nconst uid = (): string => `aihu-tooltip-${(_idSeq += 1)}`\n\nexport class AihuTooltipRoot extends HTMLElement {\n static readonly observedAttributes = ['open', 'open-delay', 'close-delay', 'placement']\n\n private readonly _open = signal(false)\n private readonly _contentId = signal(uid())\n private readonly _placement = signal<Placement>('bottom')\n private readonly _openDelay = signal(700)\n private readonly _closeDelay = signal(300)\n private _trigger: Element | null = null\n private _openTimer: ReturnType<typeof setTimeout> | null = null\n private _closeTimer: ReturnType<typeof setTimeout> | null = null\n private _disposers: Array<() => void> = []\n private _ctx: TooltipContextValue\n\n constructor() {\n super()\n this._ctx = {\n open: this._open[0],\n contentId: this._contentId[0],\n placement: this._placement[0],\n openDelay: this._openDelay[0],\n closeDelay: this._closeDelay[0],\n setOpen: (n) => this._setOpen(n),\n scheduleOpen: () => this._scheduleOpen(),\n scheduleClose: () => this._scheduleClose(),\n dismiss: () => this._setOpen(false),\n registerTrigger: (el) => {\n this._trigger = el\n },\n triggerEl: () => this._trigger,\n }\n provideContext(this, tooltipContext, this._ctx)\n }\n\n get open(): Read<boolean> {\n return this._open[0]\n }\n\n connectedCallback(): void {\n this._syncFromAttrs()\n this._disposers.push(\n effect(() => {\n this.setAttribute('data-state', this._open[0]() ? 'open' : 'closed')\n }),\n )\n }\n\n disconnectedCallback(): void {\n this._clearTimers()\n for (const d of this._disposers) d()\n this._disposers = []\n }\n\n attributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n switch (name) {\n case 'open':\n this._setOpen(value !== null)\n break\n case 'open-delay':\n if (value !== null) this._openDelay[1](Number(value))\n break\n case 'close-delay':\n if (value !== null) this._closeDelay[1](Number(value))\n break\n case 'placement':\n if (isPlacement(value)) this._placement[1](value)\n break\n }\n }\n\n private _setOpen(next: boolean): void {\n this._clearTimers()\n if (next === this._open[0]()) return\n this._open[1](next)\n if (next) this.setAttribute('open', '')\n else this.removeAttribute('open')\n }\n\n private _scheduleOpen(): void {\n this._clearTimers()\n this._openTimer = setTimeout(() => this._setOpen(true), this._openDelay[0]())\n }\n\n private _scheduleClose(): void {\n this._clearTimers()\n this._closeTimer = setTimeout(() => this._setOpen(false), this._closeDelay[0]())\n }\n\n private _clearTimers(): void {\n if (this._openTimer) clearTimeout(this._openTimer)\n if (this._closeTimer) clearTimeout(this._closeTimer)\n this._openTimer = null\n this._closeTimer = null\n }\n\n private _syncFromAttrs(): void {\n if (this.hasAttribute('open-delay')) this._openDelay[1](Number(this.getAttribute('open-delay')))\n if (this.hasAttribute('close-delay'))\n this._closeDelay[1](Number(this.getAttribute('close-delay')))\n const p = this.getAttribute('placement')\n if (isPlacement(p)) this._placement[1](p)\n this._open[1](this.hasAttribute('open'))\n }\n}\n\nfunction isPlacement(v: string | null): v is Placement {\n return v === 'top' || v === 'bottom' || v === 'left' || v === 'right'\n}\n\nexport class AihuTooltipTrigger extends HTMLElement {\n private ctx!: TooltipContextValue\n private disposers: Array<() => void> = []\n\n connectedCallback(): void {\n this.ctx = injectValue(this, tooltipContext)\n this.ctx.registerTrigger(this)\n this.addEventListener('mouseenter', this._onEnter)\n this.addEventListener('mouseleave', this._onLeave)\n this.addEventListener('focus', this._onEnter)\n this.addEventListener('blur', this._onLeave)\n this.addEventListener('keydown', this._onKeydown)\n // APG: the trigger is described-by the tooltip.\n this.disposers.push(\n effect(() => {\n this.setAttribute('aria-describedby', this.ctx.contentId())\n this.setAttribute('data-state', this.ctx.open() ? 'open' : 'closed')\n }),\n )\n }\n\n disconnectedCallback(): void {\n for (const d of this.disposers) d()\n this.disposers = []\n }\n\n private readonly _onEnter = (): void => {\n this.ctx.scheduleOpen()\n }\n private readonly _onLeave = (): void => {\n this.ctx.scheduleClose()\n }\n private readonly _onKeydown = (ev: KeyboardEvent): void => {\n if (ev.key === 'Escape') this.ctx.dismiss()\n }\n}\n\nexport class AihuTooltipContent extends HTMLElement {\n private ctx!: TooltipContextValue\n private disposers: Array<() => void> = []\n\n connectedCallback(): void {\n this.ctx = injectValue(this, tooltipContext)\n // APG: tooltip content is not focusable.\n this.setAttribute('role', 'tooltip')\n this.id = this.ctx.contentId()\n this.addEventListener('keydown', this._onKeydown)\n this.disposers.push(\n effect(() => {\n const open = this.ctx.open()\n this.setAttribute('data-state', open ? 'open' : 'closed')\n if (open) this._position()\n }),\n )\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('keydown', this._onKeydown)\n for (const d of this.disposers) d()\n this.disposers = []\n }\n\n /** Position against the trigger using the REUSED css-engine shim. */\n private _position(): void {\n const anchor = this.ctx.triggerEl()\n if (!anchor) return\n position(anchor, this, { placement: this.ctx.placement() })\n }\n\n private readonly _onKeydown = (ev: KeyboardEvent): void => {\n if (ev.key === 'Escape') this.ctx.dismiss()\n }\n}\n\nconst REGISTRY: Array<[string, CustomElementConstructor]> = [\n ['aihu-tooltip-root', AihuTooltipRoot],\n ['aihu-tooltip-trigger', AihuTooltipTrigger],\n ['aihu-tooltip-content', AihuTooltipContent],\n]\n\nlet _defined = false\n/** Register all tooltip custom elements (idempotent). */\nexport function defineTooltip(): void {\n if (_defined) return\n for (const [tag, ctor] of REGISTRY) {\n if (!customElements.get(tag)) customElements.define(tag, ctor)\n }\n _defined = true\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aihu/primitives",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./context": {
|
|
15
|
+
"types": "./dist/dom-context.d.ts",
|
|
16
|
+
"import": "./dist/dom-context.js"
|
|
17
|
+
},
|
|
18
|
+
"./presence-gate": {
|
|
19
|
+
"types": "./dist/presence-gate.d.ts",
|
|
20
|
+
"import": "./dist/presence-gate.js"
|
|
21
|
+
},
|
|
22
|
+
"./form-control": {
|
|
23
|
+
"types": "./dist/form-control.d.ts",
|
|
24
|
+
"import": "./dist/form-control.js"
|
|
25
|
+
},
|
|
26
|
+
"./config-provider": {
|
|
27
|
+
"types": "./dist/config-provider.d.ts",
|
|
28
|
+
"import": "./dist/config-provider.js"
|
|
29
|
+
},
|
|
30
|
+
"./roving-focus": {
|
|
31
|
+
"types": "./dist/roving-focus.d.ts",
|
|
32
|
+
"import": "./dist/roving-focus.js"
|
|
33
|
+
},
|
|
34
|
+
"./collection": {
|
|
35
|
+
"types": "./dist/collection.d.ts",
|
|
36
|
+
"import": "./dist/collection.js"
|
|
37
|
+
},
|
|
38
|
+
"./dialog": {
|
|
39
|
+
"types": "./dist/dialog.d.ts",
|
|
40
|
+
"import": "./dist/dialog.js"
|
|
41
|
+
},
|
|
42
|
+
"./tooltip": {
|
|
43
|
+
"types": "./dist/tooltip.d.ts",
|
|
44
|
+
"import": "./dist/tooltip.js"
|
|
45
|
+
},
|
|
46
|
+
"./button": {
|
|
47
|
+
"types": "./dist/button.d.ts",
|
|
48
|
+
"import": "./dist/button.js"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"files": [
|
|
52
|
+
"dist",
|
|
53
|
+
"README.md",
|
|
54
|
+
"LICENSE"
|
|
55
|
+
],
|
|
56
|
+
"sideEffects": false,
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@aihu/signals": "0.1.0",
|
|
59
|
+
"@aihu/arbor": "0.1.4",
|
|
60
|
+
"@aihu/css-engine": "0.1.0"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "rolldown -c",
|
|
64
|
+
"test": "vitest run",
|
|
65
|
+
"typecheck": "tsc --noEmit",
|
|
66
|
+
"prepublishOnly": "bun run build"
|
|
67
|
+
},
|
|
68
|
+
"description": "aihu headless behavior primitives — WAI-ARIA APG patterns as vanilla custom elements, zero CSS.",
|
|
69
|
+
"repository": {
|
|
70
|
+
"type": "git",
|
|
71
|
+
"url": "git+https://github.com/fellwork/aihu.git",
|
|
72
|
+
"directory": "packages/primitives"
|
|
73
|
+
},
|
|
74
|
+
"homepage": "https://github.com/fellwork/aihu/tree/main/packages/primitives#readme",
|
|
75
|
+
"bugs": "https://github.com/fellwork/aihu/issues",
|
|
76
|
+
"publishConfig": {
|
|
77
|
+
"access": "public"
|
|
78
|
+
}
|
|
79
|
+
}
|