@refrakt-md/behaviors 0.5.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 (41) hide show
  1. package/dist/behaviors/accordion.d.ts +11 -0
  2. package/dist/behaviors/accordion.d.ts.map +1 -0
  3. package/dist/behaviors/accordion.js +85 -0
  4. package/dist/behaviors/accordion.js.map +1 -0
  5. package/dist/behaviors/copy.d.ts +9 -0
  6. package/dist/behaviors/copy.d.ts.map +1 -0
  7. package/dist/behaviors/copy.js +53 -0
  8. package/dist/behaviors/copy.js.map +1 -0
  9. package/dist/behaviors/datatable.d.ts +17 -0
  10. package/dist/behaviors/datatable.d.ts.map +1 -0
  11. package/dist/behaviors/datatable.js +210 -0
  12. package/dist/behaviors/datatable.js.map +1 -0
  13. package/dist/behaviors/form.d.ts +18 -0
  14. package/dist/behaviors/form.d.ts.map +1 -0
  15. package/dist/behaviors/form.js +88 -0
  16. package/dist/behaviors/form.js.map +1 -0
  17. package/dist/behaviors/preview.d.ts +20 -0
  18. package/dist/behaviors/preview.d.ts.map +1 -0
  19. package/dist/behaviors/preview.js +302 -0
  20. package/dist/behaviors/preview.js.map +1 -0
  21. package/dist/behaviors/reveal.d.ts +9 -0
  22. package/dist/behaviors/reveal.d.ts.map +1 -0
  23. package/dist/behaviors/reveal.js +70 -0
  24. package/dist/behaviors/reveal.js.map +1 -0
  25. package/dist/behaviors/tabs.d.ts +13 -0
  26. package/dist/behaviors/tabs.d.ts.map +1 -0
  27. package/dist/behaviors/tabs.js +142 -0
  28. package/dist/behaviors/tabs.js.map +1 -0
  29. package/dist/index.d.ts +20 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +61 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/types.d.ts +12 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +2 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/utils.d.ts +11 -0
  38. package/dist/utils.d.ts.map +1 -0
  39. package/dist/utils.js +18 -0
  40. package/dist/utils.js.map +1 -0
  41. package/package.json +31 -0
package/dist/index.js ADDED
@@ -0,0 +1,61 @@
1
+ import { isFrameworkManaged } from './utils.js';
2
+ import { copyBehavior } from './behaviors/copy.js';
3
+ import { accordionBehavior } from './behaviors/accordion.js';
4
+ import { tabsBehavior } from './behaviors/tabs.js';
5
+ import { revealBehavior } from './behaviors/reveal.js';
6
+ import { datatableBehavior } from './behaviors/datatable.js';
7
+ import { formBehavior } from './behaviors/form.js';
8
+ import { previewBehavior } from './behaviors/preview.js';
9
+ /** Map of rune type → behavior function */
10
+ const behaviors = {
11
+ accordion: accordionBehavior,
12
+ accordionitem: accordionBehavior,
13
+ tabgroup: tabsBehavior,
14
+ codegroup: tabsBehavior,
15
+ reveal: revealBehavior,
16
+ datatable: datatableBehavior,
17
+ form: formBehavior,
18
+ preview: previewBehavior,
19
+ };
20
+ /**
21
+ * Scan a container for rune elements and attach interactive behaviors.
22
+ *
23
+ * Discovers elements with `data-rune` attributes, checks for theme-framework
24
+ * overrides (Alpine.js, Stimulus), and wires up the appropriate behavior.
25
+ * Also enhances all `<pre>` elements with copy-to-clipboard buttons.
26
+ *
27
+ * Returns a cleanup function that removes all event listeners and injected elements.
28
+ */
29
+ export function initRuneBehaviors(container = document, options) {
30
+ const cleanups = [];
31
+ // Rune-specific behaviors
32
+ container.querySelectorAll('[data-rune]').forEach((el) => {
33
+ const rune = el.getAttribute('data-rune');
34
+ // Skip if a theme framework has claimed this element
35
+ if (isFrameworkManaged(el))
36
+ return;
37
+ // Apply filters
38
+ if (options?.only && !options.only.includes(rune))
39
+ return;
40
+ if (options?.exclude && options.exclude.includes(rune))
41
+ return;
42
+ const fn = behaviors[rune];
43
+ if (fn) {
44
+ const cleanup = fn(el);
45
+ if (cleanup)
46
+ cleanups.push(cleanup);
47
+ }
48
+ });
49
+ // Copy buttons for all code blocks (not rune-specific)
50
+ const copyCleanup = copyBehavior(container);
51
+ cleanups.push(copyCleanup);
52
+ return () => cleanups.forEach((fn) => fn());
53
+ }
54
+ export { copyBehavior } from './behaviors/copy.js';
55
+ export { accordionBehavior } from './behaviors/accordion.js';
56
+ export { tabsBehavior } from './behaviors/tabs.js';
57
+ export { revealBehavior } from './behaviors/reveal.js';
58
+ export { datatableBehavior } from './behaviors/datatable.js';
59
+ export { formBehavior } from './behaviors/form.js';
60
+ export { previewBehavior } from './behaviors/preview.js';
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,2CAA2C;AAC3C,MAAM,SAAS,GAA+B;IAC7C,SAAS,EAAE,iBAAiB;IAC5B,aAAa,EAAE,iBAAiB;IAChC,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,YAAY;IACvB,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,iBAAiB;IAC5B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,eAAe;CACxB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAChC,YAAoC,QAAQ,EAC5C,OAAqB;IAErB,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,0BAA0B;IAC1B,SAAS,CAAC,gBAAgB,CAAc,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACrE,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAE,CAAC;QAE3C,qDAAqD;QACrD,IAAI,kBAAkB,CAAC,EAAE,CAAC;YAAE,OAAO;QAEnC,gBAAgB;QAChB,IAAI,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO;QAC1D,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO;QAE/D,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,EAAE,EAAE,CAAC;YACR,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE3B,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Cleanup function returned by a behavior — removes event listeners, etc. */
2
+ export type CleanupFn = () => void;
3
+ /** A behavior function that enhances a rune element. Optionally returns a cleanup function. */
4
+ export type BehaviorFn = (el: HTMLElement) => CleanupFn | void;
5
+ /** Options for initRuneBehaviors */
6
+ export interface InitOptions {
7
+ /** Only initialize behaviors for these rune types */
8
+ only?: string[];
9
+ /** Skip behaviors for these rune types */
10
+ exclude?: string[];
11
+ }
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC;AAEnC,+FAA+F;AAC/F,MAAM,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,WAAW,KAAK,SAAS,GAAG,IAAI,CAAC;AAE/D,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC3B,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Check if a theme framework (Alpine.js, Stimulus, etc.) has claimed
3
+ * interactivity for this element. The base behavior library steps aside
4
+ * to avoid double-binding.
5
+ */
6
+ export declare function isFrameworkManaged(el: HTMLElement): boolean;
7
+ /** Generate a unique ID for ARIA wiring (aria-controls, aria-labelledby, etc.) */
8
+ export declare function uniqueId(prefix: string): string;
9
+ /** Reset the ID counter (for testing) */
10
+ export declare function resetIdCounter(): void;
11
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAE3D;AAID,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,yCAAyC;AACzC,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
package/dist/utils.js ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Check if a theme framework (Alpine.js, Stimulus, etc.) has claimed
3
+ * interactivity for this element. The base behavior library steps aside
4
+ * to avoid double-binding.
5
+ */
6
+ export function isFrameworkManaged(el) {
7
+ return el.hasAttribute('x-data') || el.hasAttribute('data-controller');
8
+ }
9
+ let idCounter = 0;
10
+ /** Generate a unique ID for ARIA wiring (aria-controls, aria-labelledby, etc.) */
11
+ export function uniqueId(prefix) {
12
+ return `${prefix}-${++idCounter}`;
13
+ }
14
+ /** Reset the ID counter (for testing) */
15
+ export function resetIdCounter() {
16
+ idCounter = 0;
17
+ }
18
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAe;IACjD,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;AACxE,CAAC;AAED,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,kFAAkF;AAClF,MAAM,UAAU,QAAQ,CAAC,MAAc;IACtC,OAAO,GAAG,MAAM,IAAI,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,cAAc;IAC7B,SAAS,GAAG,CAAC,CAAC;AACf,CAAC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@refrakt-md/behaviors",
3
+ "description": "Vanilla JS behavior library for refrakt.md runes — tabs, accordions, copy buttons, keyboard navigation",
4
+ "version": "0.5.0",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/refrakt-md/refrakt.git",
10
+ "directory": "packages/behaviors"
11
+ },
12
+ "bugs": "https://github.com/refrakt-md/refrakt/issues",
13
+ "homepage": "https://github.com/refrakt-md/refrakt",
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "main": "dist/index.js",
18
+ "types": "dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc"
30
+ }
31
+ }