@refrakt-md/behaviors 0.14.4 → 0.16.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.
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Drawer behavior (SPEC-060, WORK-258).
3
+ *
4
+ * Progressive enhancement for `<section class="rf-drawer">` produced by the
5
+ * drawer rune (WORK-257). On init:
6
+ *
7
+ * 1. Replace the section with a `<dialog>`, preserving id and attributes so
8
+ * fragment navigation and `data-rune` queries still work.
9
+ * 2. Reveal the close button (the schema marks it `hidden` so the no-JS
10
+ * rendering doesn't show a non-functional control).
11
+ * 3. Wire every `a[data-target-type="drawer"]` whose href fragment matches
12
+ * this drawer's id — clicking intercepts navigation and opens the dialog.
13
+ * 4. Wire the close button, backdrop clicks, and `keyboard shortcut` if set.
14
+ * 5. URL hash sync: open on load if `location.hash` matches; update the
15
+ * hash via `replaceState` on open / clear it on close; close on
16
+ * `popstate` when the hash changes away.
17
+ *
18
+ * Esc-to-close, focus trap, and `inert` background come from native
19
+ * `<dialog>` semantics — the platform handles them, this module doesn't.
20
+ *
21
+ * The module keeps a per-document registry of enhanced drawers so the
22
+ * shortcut and popstate listeners run once globally instead of once per
23
+ * drawer. Cleanups remove listeners and (best-effort) restore the
24
+ * original `<section>` for HMR-style re-init scenarios.
25
+ */
26
+ import type { CleanupFn } from '../types.js';
27
+ interface ParsedShortcut {
28
+ key: string;
29
+ cmd: boolean;
30
+ ctrl: boolean;
31
+ alt: boolean;
32
+ shift: boolean;
33
+ }
34
+ /** Clear all per-document drawer state. Intended for tests — production
35
+ * code should rely on the cleanup function returned by `drawerBehavior`. */
36
+ export declare function __resetDrawerState(): void;
37
+ /** Parse a shortcut string into modifiers + key. Accepts forms like
38
+ * `"."`, `"k"`, `"cmd+k"`, `"shift+/"`, `"ctrl+alt+x"`. Returns null when
39
+ * the input is unparsable so the caller can drop it silently. */
40
+ export declare function parseShortcut(input: string): ParsedShortcut | null;
41
+ /**
42
+ * Drawer behavior — enhance one `[data-rune="drawer"]` element.
43
+ *
44
+ * The function detects the no-JS shape (a `<section>`), replaces it with
45
+ * a `<dialog>` carrying the same attributes (id, class, data-*), and
46
+ * registers the dialog with the per-document state so global listeners
47
+ * (shortcut, popstate) can act on it.
48
+ */
49
+ export declare function drawerBehavior(el: HTMLElement): CleanupFn;
50
+ export {};
51
+ //# sourceMappingURL=drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../src/behaviors/drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ7C,UAAU,cAAc;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CACf;AAiBD;6EAC6E;AAC7E,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED;;kEAEkE;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAalE;AA4BD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,CAiIzD"}
@@ -0,0 +1,392 @@
1
+ /**
2
+ * Drawer behavior (SPEC-060, WORK-258).
3
+ *
4
+ * Progressive enhancement for `<section class="rf-drawer">` produced by the
5
+ * drawer rune (WORK-257). On init:
6
+ *
7
+ * 1. Replace the section with a `<dialog>`, preserving id and attributes so
8
+ * fragment navigation and `data-rune` queries still work.
9
+ * 2. Reveal the close button (the schema marks it `hidden` so the no-JS
10
+ * rendering doesn't show a non-functional control).
11
+ * 3. Wire every `a[data-target-type="drawer"]` whose href fragment matches
12
+ * this drawer's id — clicking intercepts navigation and opens the dialog.
13
+ * 4. Wire the close button, backdrop clicks, and `keyboard shortcut` if set.
14
+ * 5. URL hash sync: open on load if `location.hash` matches; update the
15
+ * hash via `replaceState` on open / clear it on close; close on
16
+ * `popstate` when the hash changes away.
17
+ *
18
+ * Esc-to-close, focus trap, and `inert` background come from native
19
+ * `<dialog>` semantics — the platform handles them, this module doesn't.
20
+ *
21
+ * The module keeps a per-document registry of enhanced drawers so the
22
+ * shortcut and popstate listeners run once globally instead of once per
23
+ * drawer. Cleanups remove listeners and (best-effort) restore the
24
+ * original `<section>` for HMR-style re-init scenarios.
25
+ */
26
+ // Per-document state. The behavior is scoped to `document` rather than
27
+ // per-element because shortcuts + popstate are global concerns, and
28
+ // trigger anchors live anywhere on the page (not just inside the drawer).
29
+ const drawerRegistry = new Map();
30
+ const globalListenersAttached = new WeakSet();
31
+ function getRegistry(doc) {
32
+ let m = drawerRegistry.get(doc);
33
+ if (!m) {
34
+ m = new Map();
35
+ drawerRegistry.set(doc, m);
36
+ }
37
+ return m;
38
+ }
39
+ /** Clear all per-document drawer state. Intended for tests — production
40
+ * code should rely on the cleanup function returned by `drawerBehavior`. */
41
+ export function __resetDrawerState() {
42
+ for (const doc of drawerRegistry.keys()) {
43
+ doc.documentElement.classList.remove('rf-drawer-open');
44
+ }
45
+ drawerRegistry.clear();
46
+ }
47
+ /** Parse a shortcut string into modifiers + key. Accepts forms like
48
+ * `"."`, `"k"`, `"cmd+k"`, `"shift+/"`, `"ctrl+alt+x"`. Returns null when
49
+ * the input is unparsable so the caller can drop it silently. */
50
+ export function parseShortcut(input) {
51
+ const parts = input.split('+').map((p) => p.trim().toLowerCase()).filter(Boolean);
52
+ if (parts.length === 0)
53
+ return null;
54
+ const key = parts[parts.length - 1];
55
+ if (!key)
56
+ return null;
57
+ const mods = new Set(parts.slice(0, -1));
58
+ return {
59
+ key,
60
+ cmd: mods.has('cmd') || mods.has('meta'),
61
+ ctrl: mods.has('ctrl') || mods.has('control'),
62
+ alt: mods.has('alt') || mods.has('option'),
63
+ shift: mods.has('shift'),
64
+ };
65
+ }
66
+ /** True when the event matches the parsed shortcut. cmd and ctrl are
67
+ * intentionally collapsed — authors writing `cmd+k` mean "the platform's
68
+ * primary modifier", which is Cmd on macOS and Ctrl elsewhere. */
69
+ function shortcutMatches(parsed, ev) {
70
+ if (ev.key.toLowerCase() !== parsed.key)
71
+ return false;
72
+ // Allow either cmd OR ctrl when the shortcut requests one of them.
73
+ const primaryHeld = ev.metaKey || ev.ctrlKey;
74
+ const primaryNeeded = parsed.cmd || parsed.ctrl;
75
+ if (primaryNeeded && !primaryHeld)
76
+ return false;
77
+ if (!primaryNeeded && primaryHeld)
78
+ return false;
79
+ if (parsed.alt !== ev.altKey)
80
+ return false;
81
+ if (parsed.shift !== ev.shiftKey)
82
+ return false;
83
+ return true;
84
+ }
85
+ /** True when keyboard focus is in a form field or content-editable area;
86
+ * shortcuts skip these to avoid hijacking what the user is typing. */
87
+ function focusInTextInput(doc) {
88
+ const el = doc.activeElement;
89
+ if (!el)
90
+ return false;
91
+ const tag = el.tagName;
92
+ if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT')
93
+ return true;
94
+ if (el.isContentEditable)
95
+ return true;
96
+ return false;
97
+ }
98
+ /**
99
+ * Drawer behavior — enhance one `[data-rune="drawer"]` element.
100
+ *
101
+ * The function detects the no-JS shape (a `<section>`), replaces it with
102
+ * a `<dialog>` carrying the same attributes (id, class, data-*), and
103
+ * registers the dialog with the per-document state so global listeners
104
+ * (shortcut, popstate) can act on it.
105
+ */
106
+ export function drawerBehavior(el) {
107
+ const doc = el.ownerDocument;
108
+ if (!doc || !doc.defaultView)
109
+ return () => { };
110
+ const win = doc.defaultView;
111
+ // Enhancement step — replace the section with a dialog. If the element
112
+ // is already a <dialog> (re-init), skip the replacement and just reuse it.
113
+ const dialog = el instanceof win.HTMLDialogElement ? el : enhanceToDialog(el);
114
+ if (!dialog)
115
+ return () => { };
116
+ const id = dialog.id;
117
+ if (!id) {
118
+ // A drawer without an id can't be addressed — leave it as a styled
119
+ // inline section by not enhancing further. The schema enforces id,
120
+ // so this is a defensive branch.
121
+ return () => { };
122
+ }
123
+ // Reveal the close button — schema marks it hidden so the no-JS
124
+ // rendering doesn't show a non-functional control.
125
+ const closeBtn = dialog.querySelector('.rf-drawer__close');
126
+ if (closeBtn)
127
+ closeBtn.hidden = false;
128
+ const shortcutAttr = dialog.getAttribute('data-shortcut') ?? undefined;
129
+ const shortcut = shortcutAttr ? parseShortcut(shortcutAttr) ?? undefined : undefined;
130
+ const registry = getRegistry(doc);
131
+ if (registry.has(id)) {
132
+ // Two drawers with the same id on one page shouldn't happen — the
133
+ // register hook warns at build time — but if it does, defensively
134
+ // keep the first.
135
+ return () => { };
136
+ }
137
+ // Shortcut collision detection. The spec says last-registered wins;
138
+ // we still warn so authors notice.
139
+ if (shortcut) {
140
+ for (const other of registry.values()) {
141
+ if (other.shortcut && describeShortcut(other.shortcut) === describeShortcut(shortcut)) {
142
+ // eslint-disable-next-line no-console
143
+ console.warn(`[refrakt drawer] shortcut "${shortcutAttr}" is registered by drawers "${other.id}" and "${id}"; the later one wins.`);
144
+ }
145
+ }
146
+ }
147
+ registry.set(id, { dialog, id, shortcut });
148
+ const cleanups = [];
149
+ // ── Trigger interception ─────────────────────────────────────────
150
+ const fragment = `#${id}`;
151
+ const onTriggerClick = (ev) => {
152
+ ev.preventDefault();
153
+ openDrawer(dialog);
154
+ };
155
+ const triggers = [];
156
+ doc.querySelectorAll(`a[data-target-type="drawer"]`).forEach((link) => {
157
+ const href = link.getAttribute('href') ?? '';
158
+ if (href === fragment || href.endsWith(fragment)) {
159
+ link.addEventListener('click', onTriggerClick);
160
+ triggers.push(link);
161
+ }
162
+ });
163
+ cleanups.push(() => {
164
+ for (const link of triggers)
165
+ link.removeEventListener('click', onTriggerClick);
166
+ });
167
+ // ── Close button ──────────────────────────────────────────────────
168
+ if (closeBtn) {
169
+ const onClose = () => closeDrawer(dialog);
170
+ closeBtn.addEventListener('click', onClose);
171
+ cleanups.push(() => closeBtn.removeEventListener('click', onClose));
172
+ }
173
+ // ── Backdrop click ────────────────────────────────────────────────
174
+ const onBackdropClick = (ev) => {
175
+ if (ev.target === dialog)
176
+ closeDrawer(dialog);
177
+ };
178
+ dialog.addEventListener('click', onBackdropClick);
179
+ cleanups.push(() => dialog.removeEventListener('click', onBackdropClick));
180
+ // ── Esc / native cancel — animate out instead of snapping shut ────
181
+ // `<dialog>` fires `cancel` when the user presses Esc. We preventDefault
182
+ // so the browser doesn't immediately call `close()` itself, then drive
183
+ // the close through our animated path.
184
+ const onCancel = (ev) => {
185
+ ev.preventDefault();
186
+ closeDrawer(dialog);
187
+ };
188
+ dialog.addEventListener('cancel', onCancel);
189
+ cleanups.push(() => dialog.removeEventListener('cancel', onCancel));
190
+ // ── Hash maintenance on natural close ─────────────────────────────
191
+ const onDialogClose = () => {
192
+ dialog.setAttribute('data-state', 'closed');
193
+ if (win.location.hash === fragment) {
194
+ win.history.replaceState(null, '', win.location.pathname + win.location.search);
195
+ }
196
+ // Lift the body-scroll lock once no other drawer is still open.
197
+ releaseBodyScrollLockIfIdle(doc);
198
+ };
199
+ dialog.addEventListener('close', onDialogClose);
200
+ cleanups.push(() => dialog.removeEventListener('close', onDialogClose));
201
+ // ── Hash deep-link on load ────────────────────────────────────────
202
+ // Use a microtask so the dialog is sure to be in the DOM and any sibling
203
+ // drawers have also had a chance to register (last drawer with the matching
204
+ // hash wins — duplicates would already have surfaced a build warning).
205
+ if (win.location.hash === fragment) {
206
+ win.queueMicrotask(() => {
207
+ if (!dialog.open)
208
+ openDrawer(dialog);
209
+ });
210
+ }
211
+ // ── Global listeners (attached once per document) ────────────────
212
+ if (!globalListenersAttached.has(doc)) {
213
+ globalListenersAttached.add(doc);
214
+ attachGlobalListeners(doc);
215
+ }
216
+ return () => {
217
+ for (const fn of cleanups)
218
+ fn();
219
+ registry.delete(id);
220
+ // Lift the body-scroll lock if no drawer remains active.
221
+ releaseBodyScrollLockIfIdle(doc);
222
+ // Leave global listeners attached — they no-op when the registry is empty.
223
+ };
224
+ }
225
+ function enhanceToDialog(el) {
226
+ const doc = el.ownerDocument;
227
+ if (!doc)
228
+ return null;
229
+ const dialog = doc.createElement('dialog');
230
+ // Copy attributes from the section to the dialog (id, class, data-*).
231
+ for (const attr of Array.from(el.attributes)) {
232
+ dialog.setAttribute(attr.name, attr.value);
233
+ }
234
+ // Move children.
235
+ while (el.firstChild)
236
+ dialog.appendChild(el.firstChild);
237
+ // Swap in the DOM.
238
+ if (el.parentNode)
239
+ el.parentNode.replaceChild(dialog, el);
240
+ dialog.setAttribute('data-state', 'closed');
241
+ return dialog;
242
+ }
243
+ function openDrawer(dialog) {
244
+ const doc = dialog.ownerDocument;
245
+ if (!doc || !doc.defaultView)
246
+ return;
247
+ const win = doc.defaultView;
248
+ // Close any other open drawer first. Native `<dialog>.showModal()`
249
+ // throws if another modal is open, so this is also a correctness
250
+ // requirement, not just UX polish.
251
+ const registry = drawerRegistry.get(doc);
252
+ if (registry) {
253
+ for (const other of registry.values()) {
254
+ if (other.dialog !== dialog && other.dialog.open) {
255
+ other.dialog.close();
256
+ }
257
+ }
258
+ }
259
+ if (!dialog.open) {
260
+ try {
261
+ dialog.showModal();
262
+ }
263
+ catch {
264
+ // Some environments (jsdom without explicit polyfill) may not
265
+ // implement showModal. Fall back to setting the `open` attribute
266
+ // so tests can still observe state changes.
267
+ dialog.setAttribute('open', '');
268
+ }
269
+ }
270
+ dialog.setAttribute('data-state', 'open');
271
+ applyBodyScrollLock(doc);
272
+ if (dialog.id) {
273
+ const fragment = `#${dialog.id}`;
274
+ if (win.location.hash !== fragment) {
275
+ win.history.replaceState(null, '', win.location.pathname + win.location.search + fragment);
276
+ }
277
+ }
278
+ }
279
+ /** Animation duration for the close transition. Mirrors
280
+ * `--rf-drawer-anim-duration` (220ms) in CSS — kept in JS as a fallback
281
+ * in case `animationend` doesn't fire (reduced motion, environments
282
+ * without real animations like jsdom). Slightly longer than the CSS
283
+ * value so the event has a chance to land first. */
284
+ const CLOSE_ANIMATION_FALLBACK_MS = 280;
285
+ function closeDrawer(dialog) {
286
+ if (!dialog.open)
287
+ return;
288
+ if (dialog.getAttribute('data-state') === 'closing')
289
+ return;
290
+ // Flip into the closing state — CSS picks up the slide-out keyframe
291
+ // animation off `[data-state="closing"]`. We then wait for the
292
+ // animation to land before actually calling `dialog.close()`, so the
293
+ // browser keeps painting the dialog (with its modal backdrop and top-
294
+ // layer placement) during the slide.
295
+ dialog.setAttribute('data-state', 'closing');
296
+ let finished = false;
297
+ const finish = () => {
298
+ if (finished)
299
+ return;
300
+ finished = true;
301
+ dialog.removeEventListener('animationend', onAnimationEnd);
302
+ if (fallbackTimer !== undefined)
303
+ clearTimeout(fallbackTimer);
304
+ try {
305
+ dialog.close();
306
+ }
307
+ catch {
308
+ dialog.removeAttribute('open');
309
+ }
310
+ // `data-state` is reset to `closed` by the `close` event listener
311
+ // on the dialog itself — same path the native dialog close uses.
312
+ };
313
+ const onAnimationEnd = (ev) => {
314
+ // Filter to the drawer's own animations so a child animation
315
+ // finishing (e.g. an embedded reveal) doesn't trigger close early.
316
+ if (ev.target !== dialog)
317
+ return;
318
+ if (ev.animationName && !ev.animationName.startsWith('rf-drawer-slide-out'))
319
+ return;
320
+ finish();
321
+ };
322
+ dialog.addEventListener('animationend', onAnimationEnd);
323
+ const fallbackTimer = setTimeout(finish, CLOSE_ANIMATION_FALLBACK_MS);
324
+ }
325
+ /** Body-scroll lock — set when any drawer is open, lifted when the last
326
+ * open drawer closes. Implemented as a class on `<html>` so themes can
327
+ * add additional rules (e.g. preserving scrollbar gutter) by extending
328
+ * the selector. */
329
+ function applyBodyScrollLock(doc) {
330
+ doc.documentElement.classList.add('rf-drawer-open');
331
+ }
332
+ function releaseBodyScrollLockIfIdle(doc) {
333
+ const registry = drawerRegistry.get(doc);
334
+ if (!registry) {
335
+ doc.documentElement.classList.remove('rf-drawer-open');
336
+ return;
337
+ }
338
+ for (const record of registry.values()) {
339
+ if (record.dialog.open)
340
+ return;
341
+ }
342
+ doc.documentElement.classList.remove('rf-drawer-open');
343
+ }
344
+ function describeShortcut(s) {
345
+ const parts = [];
346
+ if (s.cmd || s.ctrl)
347
+ parts.push('mod');
348
+ if (s.alt)
349
+ parts.push('alt');
350
+ if (s.shift)
351
+ parts.push('shift');
352
+ parts.push(s.key);
353
+ return parts.join('+');
354
+ }
355
+ function attachGlobalListeners(doc) {
356
+ const win = doc.defaultView;
357
+ if (!win)
358
+ return;
359
+ // ── Keyboard shortcut listener ────────────────────────────────────
360
+ const onKeydown = (ev) => {
361
+ if (focusInTextInput(doc))
362
+ return;
363
+ const registry = drawerRegistry.get(doc);
364
+ if (!registry)
365
+ return;
366
+ let match;
367
+ for (const record of registry.values()) {
368
+ if (record.shortcut && shortcutMatches(record.shortcut, ev)) {
369
+ // Last-registered wins (matches build warning policy).
370
+ match = record;
371
+ }
372
+ }
373
+ if (!match)
374
+ return;
375
+ ev.preventDefault();
376
+ openDrawer(match.dialog);
377
+ };
378
+ doc.addEventListener('keydown', onKeydown);
379
+ // ── Popstate (back button) ────────────────────────────────────────
380
+ const onPopstate = () => {
381
+ const registry = drawerRegistry.get(doc);
382
+ if (!registry)
383
+ return;
384
+ for (const record of registry.values()) {
385
+ if (record.dialog.open && win.location.hash !== `#${record.id}`) {
386
+ closeDrawer(record.dialog);
387
+ }
388
+ }
389
+ };
390
+ win.addEventListener('popstate', onPopstate);
391
+ }
392
+ //# sourceMappingURL=drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer.js","sourceRoot":"","sources":["../../src/behaviors/drawer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CleanupFn } from '../types.js';
2
+ export declare function themeToggleBehavior(container: HTMLElement | Document): CleanupFn;
3
+ //# sourceMappingURL=theme-toggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../src/behaviors/theme-toggle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAwC7C,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAiChF"}
@@ -0,0 +1,56 @@
1
+ function readPref() {
2
+ try {
3
+ const saved = localStorage.getItem('rf-theme');
4
+ if (saved === 'light' || saved === 'dark' || saved === 'auto')
5
+ return saved;
6
+ }
7
+ catch (_) {
8
+ // localStorage may be unavailable (private mode, file://, etc.).
9
+ }
10
+ return 'auto';
11
+ }
12
+ function applyPref(pref) {
13
+ const d = document.documentElement;
14
+ if (pref === 'auto')
15
+ delete d.dataset.theme;
16
+ else
17
+ d.dataset.theme = pref;
18
+ }
19
+ function labelFor(pref) {
20
+ return pref === 'auto' ? 'Theme: auto (system)' : pref === 'light' ? 'Theme: light' : 'Theme: dark';
21
+ }
22
+ export function themeToggleBehavior(container) {
23
+ const buttons = Array.from(container.querySelectorAll('[data-theme-toggle]'));
24
+ if (buttons.length === 0)
25
+ return () => { };
26
+ const reflect = (pref) => {
27
+ const label = labelFor(pref);
28
+ for (const btn of buttons) {
29
+ btn.dataset.themePref = pref;
30
+ btn.setAttribute('aria-label', label);
31
+ btn.setAttribute('title', label);
32
+ }
33
+ };
34
+ const cycle = () => {
35
+ const cur = readPref();
36
+ const next = cur === 'auto' ? 'light' : cur === 'light' ? 'dark' : 'auto';
37
+ try {
38
+ localStorage.setItem('rf-theme', next);
39
+ }
40
+ catch (_) {
41
+ // Persist failures are silent — the in-tab change still applies.
42
+ }
43
+ applyPref(next);
44
+ reflect(next);
45
+ };
46
+ // Sync the button icon/label to the saved preference (the pre-paint script
47
+ // already applied `data-theme` before first paint).
48
+ reflect(readPref());
49
+ for (const btn of buttons)
50
+ btn.addEventListener('click', cycle);
51
+ return () => {
52
+ for (const btn of buttons)
53
+ btn.removeEventListener('click', cycle);
54
+ };
55
+ }
56
+ //# sourceMappingURL=theme-toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-toggle.js","sourceRoot":"","sources":["../../src/behaviors/theme-toggle.ts"],"names":[],"mappings":"AAoBA,SAAS,QAAQ;IAChB,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;IAC7E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,iEAAiE;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAe;IACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC;IACnC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;;QACvC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAe;IAChC,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiC;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,qBAAqB,CAAC,CAAC,CAAC;IAC3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,CAAC,IAAe,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC3B,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACtC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE;QAClB,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAc,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACrF,IAAI,CAAC;YACJ,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,iEAAiE;QAClE,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,2EAA2E;IAC3E,oDAAoD;IACpD,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEpB,KAAK,MAAM,GAAG,IAAI,OAAO;QAAE,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChE,OAAO,GAAG,EAAE;QACX,KAAK,MAAM,GAAG,IAAI,OAAO;YAAE,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -39,6 +39,7 @@ export declare function initLayoutBehaviors(container?: HTMLElement | Document):
39
39
  export declare function getBehaviorNames(): Set<string>;
40
40
  export { copyBehavior } from './behaviors/copy.js';
41
41
  export { accordionBehavior } from './behaviors/accordion.js';
42
+ export { drawerBehavior } from './behaviors/drawer.js';
42
43
  export { tabsBehavior } from './behaviors/tabs.js';
43
44
  export { revealBehavior } from './behaviors/reveal.js';
44
45
  export { datatableBehavior } from './behaviors/datatable.js';
@@ -49,6 +50,7 @@ export { versionSwitcherBehavior } from './behaviors/version-switcher.js';
49
50
  export { mobileMenuBehavior } from './behaviors/mobile-menu.js';
50
51
  export { sectionNavBehavior } from './behaviors/section-nav.js';
51
52
  export { searchBehavior } from './behaviors/search.js';
53
+ export { themeToggleBehavior } from './behaviors/theme-toggle.js';
52
54
  export { galleryBehavior } from './behaviors/gallery.js';
53
55
  export { juxtaposeBehavior } from './behaviors/juxtapose.js';
54
56
  export { navCollapsibleBehavior } from './behaviors/nav-collapsible.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA4C1D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,CAM9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI,CAEnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAChC,SAAS,GAAE,WAAW,GAAG,QAAmB,EAC5C,OAAO,CAAC,EAAE,WAAW,GACnB,MAAM,IAAI,CAkCZ;AASD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,SAAS,GAAE,WAAW,GAAG,QAAmB,GAC1C,MAAM,IAAI,CAeZ;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,CAAC,CAE9C;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;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtG,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA+C1D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,CAM9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI,CAEnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAChC,SAAS,GAAE,WAAW,GAAG,QAAmB,EAC5C,OAAO,CAAC,EAAE,WAAW,GACnB,MAAM,IAAI,CAkCZ;AAUD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,SAAS,GAAE,WAAW,GAAG,QAAmB,GAC1C,MAAM,IAAI,CAeZ;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,CAAC,CAE9C;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,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;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtG,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { isFrameworkManaged } from './utils.js';
2
2
  import { copyBehavior } from './behaviors/copy.js';
3
3
  import { accordionBehavior } from './behaviors/accordion.js';
4
+ import { drawerBehavior } from './behaviors/drawer.js';
4
5
  import { tabsBehavior } from './behaviors/tabs.js';
5
6
  import { revealBehavior } from './behaviors/reveal.js';
6
7
  import { datatableBehavior } from './behaviors/datatable.js';
@@ -10,6 +11,7 @@ import { scrollspyBehavior } from './behaviors/scrollspy.js';
10
11
  import { versionSwitcherBehavior } from './behaviors/version-switcher.js';
11
12
  import { mobileMenuBehavior } from './behaviors/mobile-menu.js';
12
13
  import { searchBehavior } from './behaviors/search.js';
14
+ import { themeToggleBehavior } from './behaviors/theme-toggle.js';
13
15
  import { sectionNavBehavior } from './behaviors/section-nav.js';
14
16
  import { galleryBehavior } from './behaviors/gallery.js';
15
17
  import { juxtaposeBehavior } from './behaviors/juxtapose.js';
@@ -38,6 +40,7 @@ const behaviors = {
38
40
  gallery: galleryBehavior,
39
41
  juxtapose: juxtaposeBehavior,
40
42
  nav: navBehavior,
43
+ drawer: drawerBehavior,
41
44
  };
42
45
  /**
43
46
  * Register additional behavior functions (e.g., from community/official packages).
@@ -102,6 +105,7 @@ export function initRuneBehaviors(container = document, options) {
102
105
  const layoutBehaviors = {
103
106
  'mobile-menu': mobileMenuBehavior,
104
107
  'search': searchBehavior,
108
+ 'theme-toggle': themeToggleBehavior,
105
109
  'section-nav': sectionNavBehavior,
106
110
  };
107
111
  /**
@@ -139,6 +143,7 @@ export function getBehaviorNames() {
139
143
  }
140
144
  export { copyBehavior } from './behaviors/copy.js';
141
145
  export { accordionBehavior } from './behaviors/accordion.js';
146
+ export { drawerBehavior } from './behaviors/drawer.js';
142
147
  export { tabsBehavior } from './behaviors/tabs.js';
143
148
  export { revealBehavior } from './behaviors/reveal.js';
144
149
  export { datatableBehavior } from './behaviors/datatable.js';
@@ -149,6 +154,7 @@ export { versionSwitcherBehavior } from './behaviors/version-switcher.js';
149
154
  export { mobileMenuBehavior } from './behaviors/mobile-menu.js';
150
155
  export { sectionNavBehavior } from './behaviors/section-nav.js';
151
156
  export { searchBehavior } from './behaviors/search.js';
157
+ export { themeToggleBehavior } from './behaviors/theme-toggle.js';
152
158
  export { galleryBehavior } from './behaviors/gallery.js';
153
159
  export { juxtaposeBehavior } from './behaviors/juxtapose.js';
154
160
  export { navCollapsibleBehavior } from './behaviors/nav-collapsible.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/behaviors",
3
3
  "description": "Vanilla JS behavior library for refrakt.md runes — tabs, accordions, copy buttons, keyboard navigation",
4
- "version": "0.14.4",
4
+ "version": "0.16.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {