gabriel / musehub public
alpine-components.ts typescript
89 lines 4.4 KB
Raw
sha256:34035d72cef530c1ab9d6a6f53be18d803dde705fc3157617d70352a96d0747b Merge branch 'fix/wire-push-external-parent-manifest' into dev Human 8 days ago
1 /**
2 * alpine-components.ts — Alpine.js CSP-compatible component registrations.
3 *
4 * All components use the Alpine CSP build (`@alpinejs/csp`), which replaces
5 * the expression evaluator with registered function references. Inline
6 * JavaScript expressions in Alpine directives are not allowed; all directives
7 * must reference properties or methods by name.
8 *
9 * Registered during `alpine:init` so they are available before Alpine
10 * initialises the DOM.
11 */
12
13 type AlpineRoot = HTMLElement & { dataset: DOMStringMap };
14
15 document.addEventListener('alpine:init', () => {
16 const Alpine = window.Alpine;
17 if (!Alpine) return;
18
19 // ── tabSwitcher — CLI / MCP / REST tab panel (issue_detail.html) ──────────
20 //
21 // Usage: x-data="tabSwitcher"
22 // Buttons: :class="cliClass" @click="setCliTab"
23 // Panes: x-show="showCli"
24
25 Alpine.data('tabSwitcher', () => ({
26 tab: 'cli' as string,
27 get showCli() { return (this as { tab: string }).tab === 'cli'; },
28 get showMcp() { return (this as { tab: string }).tab === 'mcp'; },
29 get showRest() { return (this as { tab: string }).tab === 'rest'; },
30 get cliClass() { return { 'is-active': (this as { tab: string }).tab === 'cli' }; },
31 get mcpClass() { return { 'is-active': (this as { tab: string }).tab === 'mcp' }; },
32 get restClass() { return { 'is-active': (this as { tab: string }).tab === 'rest' }; },
33 setCliTab() { (this as { tab: string }).tab = 'cli'; },
34 setMcpTab() { (this as { tab: string }).tab = 'mcp'; },
35 setRestTab() { (this as { tab: string }).tab = 'rest'; },
36 }));
37
38 // ── newRepoForm — initialisation toggle (new_repo.html) ──────────────────
39 //
40 // Topics are managed entirely by TypeScript (initTagInput in new-repo.ts).
41 // Only the "add initial commit / show branch name" toggle lives here.
42 //
43 // Usage: x-data="newRepoForm"
44 // Checkbox: x-model="showBranch"
45 // Row: x-show="showBranch"
46
47 Alpine.data('newRepoForm', () => ({
48 showBranch: true as boolean,
49 }));
50
51 // ── settingsPage — settings navigation + confirmation modals ─────────────
52 //
53 // The active section is seeded from the root element's data-initial-section
54 // attribute so Jinja2 can set it server-side without an inline expression.
55 //
56 // Usage: x-data="settingsPage" data-initial-section="{{ active_section }}"
57 // Nav links: :class="generalNavClass" @click.prevent="setSection" data-section="general"
58 // Panels: x-show="showGeneral"
59 // Modals: x-show="archiveOpen" @click="openArchive" @click="closeArchive"
60
61 Alpine.data('settingsPage', () => ({
62 section: 'general' as string,
63 archiveOpen: false as boolean,
64 transferOpen: false as boolean,
65 deleteOpen: false as boolean,
66 init() {
67 const root = (this as unknown as { $el: AlpineRoot }).$el;
68 (this as { section: string }).section = root.dataset['initialSection'] ?? 'general';
69 },
70 get showGeneral() { return (this as { section: string }).section === 'general'; },
71 get showCollaboration() { return (this as { section: string }).section === 'collaboration'; },
72 get showMerge() { return (this as { section: string }).section === 'merge'; },
73 get showDanger() { return (this as { section: string }).section === 'danger'; },
74 get generalNavClass() { return { active: (this as { section: string }).section === 'general' }; },
75 get collaborationNavClass() { return { active: (this as { section: string }).section === 'collaboration' }; },
76 get mergeNavClass() { return { active: (this as { section: string }).section === 'merge' }; },
77 get dangerNavClass() { return { active: (this as { section: string }).section === 'danger' }; },
78 setSection(e: Event) {
79 const el = e.currentTarget as HTMLElement;
80 (this as { section: string }).section = el.dataset['section'] ?? 'general';
81 },
82 openArchive() { (this as { archiveOpen: boolean }).archiveOpen = true; },
83 closeArchive() { (this as { archiveOpen: boolean }).archiveOpen = false; },
84 openTransfer() { (this as { transferOpen: boolean }).transferOpen = true; },
85 closeTransfer() { (this as { transferOpen: boolean }).transferOpen = false; },
86 openDelete() { (this as { deleteOpen: boolean }).deleteOpen = true; },
87 closeDelete() { (this as { deleteOpen: boolean }).deleteOpen = false; },
88 }));
89 });
File History 14 commits
sha256:34035d72cef530c1ab9d6a6f53be18d803dde705fc3157617d70352a96d0747b Merge branch 'fix/wire-push-external-parent-manifest' into dev Human 8 days ago
sha256:fc04e4cae9e1774d6a21b65c45daeed0e6787eb581d13aa1b03bfe9384a34226 Merge branch 'fix/two-column-scroll-layout' into dev Human 8 days ago
sha256:408916fc5973ba59c6e4eebaa80ebdcc801c0a63205651e25009d11548f79454 chore: bump version to 0.2.0.dev2 — nightly.2, matching muse Sonnet 4.6 patch 11 days ago
sha256:d035733f21ccff27735fddebfbbe0ed24565a32a22db8de5885402262671ecd2 chore: bump version to 0.2.0rc15 for musehub#113 fix release Sonnet 4.6 patch 14 days ago
sha256:0032d6cfa33bc3c8367436ad768e7dd0e339b4332153160247da8266cb5fa352 Merge branch 'task/version-tags-phase3-server' into dev Human 17 days ago
sha256:4669620efda9ff41c55bdefd1f7bfe1c239d468428744c84ead9957e5a003a53 merge: rescue snapshot-recovery hardening (c00aa21d) into d… Opus 4.8 minor 29 days ago
sha256:a59da49c4611b970fc4b6ae48678ce4943261c213a07ddbd73ce9201df869b4a fix: remove false-positive proposal_comments index drop fro… Sonnet 4.6 patch 33 days ago
sha256:0a240d6dbff234f07d98a28a4a9a68db702f3f9ff9260196f24219bdb1c0b6f3 feat: render markdown mists as HTML with heading anchor links Sonnet 4.6 patch 34 days ago
sha256:24a7d47486ebc4ebd1832830580e177ec6f877b48dced8c000e198cdec4ce9d6 Merge 'task/bump-version-rc12' into 'dev' — proposal: Bump … Human 35 days ago
sha256:b9ff931d147e0114a1f17060f415b89ed551c170a91ff226c70437aa5c85f9ee Merge 'task/bump-version-rc12' into 'dev' — proposal: Bump … Human 35 days ago
sha256:d1122d21e73471879b460037b22c0b50fded7c423444a176f248428f75dac39c Merge 'task/fix-issue-pagination-cursor' into 'dev' — propo… Human 35 days ago
sha256:01e18975e73d2b3cd5b6db7929c895bef9aa6e0d4391dc5b2adfc548b41318dd Merge 'feat/adding-debug-logs-to-staging' into 'dev' — prop… Human 35 days ago
sha256:6b1949fc2797ca4c1936a637a4cbfec828ef56cf52398a2e74ca3c4f494e728f fix: use wire_bytes not mpack_bytes_raw in compute_object_b… Sonnet 4.6 patch 48 days ago
sha256:b99f2455dc346966d040133f5203297e6e3ef5803a93728a2c30568d0a0f7583 rename: delta_add → delta_upsert across wire format, models… Sonnet 4.6 patch 50 days ago