File size: 16,325 Bytes
b83101c
 
 
 
 
72be969
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b83101c
8ed13f7
 
 
 
 
 
 
 
 
35c7332
8ed13f7
 
35c7332
8ed13f7
 
35c7332
8ed13f7
35c7332
50d87da
 
 
 
 
186bc23
 
b83101c
50d87da
 
 
72be969
50d87da
 
 
 
72be969
50d87da
 
72be969
 
 
 
 
b83101c
5daef86
35c7332
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8ed13f7
0ad2b04
35c7332
 
 
 
 
72be969
 
 
 
 
 
35c7332
 
 
 
b83101c
 
35c7332
8ed13f7
35c7332
8ed13f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35c7332
8ed13f7
 
 
 
 
72be969
 
 
 
 
8ed13f7
 
 
 
35c7332
 
 
 
72be969
35c7332
 
8ed13f7
72be969
 
 
35c7332
 
 
5daef86
b83101c
35c7332
 
 
 
 
 
 
 
 
 
 
 
b83101c
 
35c7332
b83101c
 
35c7332
 
 
b83101c
35c7332
b83101c
 
 
 
50d87da
b83101c
72be969
35c7332
f982d69
35c7332
f982d69
 
 
b83101c
 
 
 
 
 
72be969
 
 
 
 
 
 
b83101c
72be969
 
 
 
b83101c
 
 
 
8ed13f7
 
 
72be969
8ed13f7
 
50d87da
 
72be969
50d87da
72be969
50d87da
8ed13f7
50d87da
72be969
50d87da
 
 
 
72be969
 
 
 
 
 
50d87da
8ed13f7
50d87da
b83101c
 
 
 
 
72be969
 
 
 
b83101c
f982d69
72be969
 
 
f982d69
 
 
 
 
 
50d87da
8ed13f7
35c7332
8ed13f7
 
b83101c
f982d69
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Machine Learning and Society at Hugging Face</title>
    
    <!-- SEO Meta Tags -->
    <meta name="description" content="The Machine Learning and Society team at Hugging Face works on the sustainability, agency, and ecosystems of AI systems through open research and collaborative development.">
    <meta name="keywords" content="machine learning, AI ethics, AI sustainability, AI agency, AI ecosystems, open source AI, Hugging Face">
    <meta name="author" content="Hugging Face - Machine Learning and Society Team">
    
    <!-- Open Graph / Facebook -->
    <meta property="og:type" content="website">
    <meta property="og:url" content="https://huggingface.co/">
    <meta property="og:title" content="Machine Learning and Society at Hugging Face">
    <meta property="og:description" content="Research on the sustainability, agency, and ecosystems of AI systems through open and collaborative development.">
    <meta property="og:image" content="/images/background_ai.png">
    
    <!-- Twitter -->
    <meta property="twitter:card" content="summary_large_image">
    <meta property="twitter:url" content="https://huggingface.co/">
    <meta property="twitter:title" content="Machine Learning and Society at Hugging Face">
    <meta property="twitter:description" content="Research on the sustainability, agency, and ecosystems of AI systems through open and collaborative development.">
    <meta property="twitter:image" content="/images/background_ai.png">
    
    <!-- Performance: Preconnect to CDN origins -->
    <link rel="preconnect" href="https://cdn.tailwindcss.com">
    <link rel="preconnect" href="https://cdn.jsdelivr.net">
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    
    <script src="https://cdn.tailwindcss.com"></script>
    <!-- Import map for lit-html -->
    <script type="importmap">
    {
        "imports": {
            "lit-html": "https://cdn.jsdelivr.net/npm/lit-html@3/+esm"
        }
    }
    </script>
    <!-- Load areas data synchronously FIRST (before Alpine.js) -->
    <script type="module">
        import { areasData, getNavigationData, homeBackgroundImage, overallBackgroundImage } from './js/data/areas.js';
        window.areasData = areasData;
        window.navigationAreas = getNavigationData();
        window.homeBackgroundImage = homeBackgroundImage;
        window.overallBackgroundImage = overallBackgroundImage;
    </script>
    <!-- Alpine.js can now safely use window.navigationAreas -->
    <script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
    <!-- Google Fonts Import -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&family=Source+Sans+Pro:wght@400;600&display=swap" rel="stylesheet">
    
    <!-- Custom Styles -->
    <link rel="stylesheet" href="styles.css">
</head>
<body class="bg-gray-50 text-gray-800">
    <!-- Overall Background Image - Only for header and sidebars -->
    <div id="overall-background" class="fixed opacity-100 z-40 pointer-events-none" style="top: 0; left: 0; right: 0; height: var(--header-height);">
        <img src="/images/background_ai.png" alt="" class="w-full h-full object-cover object-left-top" loading="eager">
    </div>
    
    <!-- Right Sidebar Background (when open) -->
    <div id="right-sidebar-background" class="fixed opacity-60 z-0 pointer-events-none hidden" style="top: var(--header-height); right: 0; width: 320px; bottom: 0;">
        <img src="/images/background_ai.png" alt="" class="w-full h-full object-cover object-right" loading="lazy">
    </div>

    <!-- Skip to main content link for accessibility -->
    <a href="#main-content" class="sr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:z-50 focus:px-4 focus:py-2 focus:bg-blue-600 focus:text-white focus:rounded">
        Skip to main content
    </a>

    <!-- Top Navigation -->
    <header role="banner" aria-label="Main navigation" class="bg-white/80 shadow-md border-b border-gray-300 fixed top-0 left-0 right-0 z-50" style="height: var(--header-height);" x-data="{ 
        mobileMenuOpen: false, 
        areas: window.navigationAreas || [],
        currentArea: null,
        init() {
            // Listen for navigation changes
            window.addEventListener('navigation-changed', (e) => {
                this.currentArea = e.detail.currentArea;
            });
            // Get initial current area from Alpine store if available
            if (window.Alpine && window.Alpine.store('navigation')) {
                this.currentArea = window.Alpine.store('navigation').currentArea;
            }
        },
        isActiveArea(areaId) {
            return this.currentArea === areaId;
        }
    }">
        <div class="h-full flex items-stretch">
            <!-- Left: Title as Home Link (always two lines) -->
            <div class="flex items-center justify-between flex-1 xl:flex-initial border-r-0 xl:border-r border-gray-300 px-4 xl:px-6">
                <a href="/" class="text-xl xl:text-2xl font-bold text-gray-800 leading-tight hover:text-blue-600 transition-colors">
                    <span class="block">Machine Learning</span>
                    <span class="block">and Society at πŸ€—</span>
                </a>
                
                <!-- Mobile menu button -->
                <button @click="mobileMenuOpen = !mobileMenuOpen" 
                        class="xl:hidden p-2 text-gray-600"
                        aria-label="Toggle mobile menu"
                        aria-expanded="false"
                        :aria-expanded="mobileMenuOpen.toString()">
                    <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
                        <path x-show="!mobileMenuOpen" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
                        <path x-show="mobileMenuOpen" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
                    </svg>
                </button>
            </div>
            
            <!-- Spacer between title and navigation -->
            <div class="hidden xl:block flex-1"></div>
            
            <!-- Right: Two-column Navigation Menu -->
            <div class="hidden xl:flex items-stretch ml-auto" style="padding-right: 2rem;">
                <!-- Left Column: Three Area Titles (horizontal, larger text) -->
                <div class="flex items-center border-r border-gray-200">
                    <a :href="areas[0] ? `/${areas[0].id}` : '#'" 
                       class="flex items-center justify-center px-8 py-2 text-xl font-semibold transition-colors border-r border-gray-200"
                       :class="isActiveArea(areas[0]?.id) ? 'text-blue-600 bg-blue-50' : 'text-gray-700 hover:text-blue-600 hover:bg-blue-50/50'"
                       x-text="areas[0]?.navTitle || 'Area 1'"></a>
                    
                    <a :href="areas[1] ? `/${areas[1].id}` : '#'" 
                       class="flex items-center justify-center px-8 py-2 text-xl font-semibold transition-colors border-r border-gray-200"
                       :class="isActiveArea(areas[1]?.id) ? 'text-blue-600 bg-blue-50' : 'text-gray-700 hover:text-blue-600 hover:bg-blue-50/50'"
                       x-text="areas[1]?.navTitle || 'Area 2'"></a>
                    
                    <a :href="areas[2] ? `/${areas[2].id}` : '#'" 
                       class="flex items-center justify-center px-8 py-2 text-xl font-semibold transition-colors"
                       :class="isActiveArea(areas[2]?.id) ? 'text-blue-600 bg-blue-50' : 'text-gray-700 hover:text-blue-600 hover:bg-blue-50/50'"
                       x-text="areas[2]?.navTitle || 'Area 3'"></a>
                </div>
                
                <!-- Right Column: Press and Search (stacked vertically) -->
                <div class="flex flex-col">
                    <a href="/about" 
                       class="flex items-center justify-center px-8 py-2 text-lg font-medium text-gray-700 hover:text-blue-600 hover:bg-blue-50/50 transition-colors border-b border-gray-200 flex-1">Press</a>
                    
                    <button id="search-toggle" 
                            class="flex items-center justify-center px-8 py-2 text-gray-700 hover:text-blue-600 hover:bg-blue-50/50 transition-colors flex-1"
                            aria-label="Open search"
                            aria-controls="search-sidebar">
                        <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6" aria-hidden="true">
                            <path stroke-linecap="round" stroke-linejoin="round" d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z" />
                        </svg>                      
                    </button>
                </div>
            </div>
        </div>
        
        <!-- Mobile Menu (Dropdown) -->
        <nav x-show="mobileMenuOpen" 
             x-transition
             @click.away="mobileMenuOpen = false"
             class="xl:hidden absolute top-full left-0 right-0 bg-white shadow-lg border-b border-gray-200 z-40"
             x-data="mobileTopicNav()"
             role="navigation"
             aria-label="Mobile navigation menu">
            <div class="px-4 py-3 space-y-2 max-h-[70vh] overflow-y-auto">
                <!-- Areas with Topics -->
                <div>
                    <p class="px-3 text-sm font-semibold text-gray-500 uppercase tracking-wide mb-2">Research Areas</p>
                    
                    <template x-for="area in areas" :key="area.id">
                        <div class="mb-2">
                            <a :href="`/${area.id}`" 
                               class="block px-3 py-2 text-sm font-semibold text-gray-800 hover:bg-blue-50 hover:text-blue-600 rounded transition-colors"
                               x-text="area.title"></a>
                            <!-- Topics for this area -->
                            <div class="ml-4 mt-1 space-y-1">
                                <template x-for="topic in area.topics" :key="topic.id">
                                    <a :href="`/${area.id}/${topic.id}`"
                                       class="block px-3 py-1.5 text-xs text-gray-600 hover:bg-blue-50 hover:text-blue-600 rounded transition-colors"
                                       x-text="topic.name"></a>
                                </template>
                            </div>
                        </div>
                    </template>
                </div>
                
                <!-- Press -->
                <div class="border-t border-gray-200 pt-2">
                    <a href="/about" class="block px-3 py-2 text-base font-medium text-gray-700 hover:bg-blue-50 hover:text-blue-600 rounded transition-colors">Press</a>
                </div>
            </div>
        </div>
    </header>

    <!-- Main Layout -->
    <div id="main-layout" class="flex" style="padding-top: var(--header-height);">
        <!-- Main Content -->
        <main role="main" class="flex-1 transition-all duration-300 overflow-x-hidden" id="main-content">
            <div class="w-full py-8">
                <!-- Content will be loaded dynamically by the SPA router -->
                <div class="bg-white rounded-lg shadow-sm p-8 mx-4 sm:mx-6 lg:mx-8" style="max-width: min(90%, 1400px); margin-left: auto; margin-right: auto;">
                    <div class="text-center py-8">
                        <div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-4"></div>
                        <p class="text-gray-600">Loading...</p>
                    </div>
                </div>
            </div>
        </main>

        <!-- Right Sidebar - Search (Collapsible) -->
        <aside id="search-sidebar" 
               role="search" 
               aria-label="Search sidebar"
               class="fixed right-0 h-full w-80 bg-white/85 backdrop-blur-sm shadow-sm border-l border-gray-200 transform translate-x-full z-40 transition-transform duration-300" 
               style="top: var(--header-height);">
            <div class="p-6">
                <div class="flex items-center justify-between mb-4">
                    <h3 class="text-lg font-semibold text-gray-900">Search</h3>
                    <button id="search-close" 
                            class="p-1 rounded-md text-gray-400 hover:text-gray-500 transition-colors"
                            aria-label="Close search">
                        <svg class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
                        </svg>
                    </button>
                </div>

                <!-- Search Description -->
                <div class="mb-4">
                    <p class="text-sm text-gray-600" style="line-height: var(--leading-relaxed);">We have produced or collaborated on a fair amount of papers, writings, and technical artifacts over the years. Use the search functionality here to navigate those!</p>
                </div>

                <!-- Search Input -->
                <div class="mb-4">
                    <label for="search-input" class="sr-only">Search works by the ML & Society team</label>
                    <input 
                        type="search" 
                        id="search-input" 
                        placeholder="Search works by the ML & Society team" 
                        class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
                        aria-describedby="search-description"
                    >
                </div>
                
                <!-- Search Results - Fixed height with proper scrolling -->
                <div id="search-results" 
                     class="overflow-y-auto" 
                     style="height: calc(100vh - 193px);"
                     role="region"
                     aria-live="polite"
                     aria-label="Search results">
                    <div class="text-gray-500 text-center py-8">
                        <p>Enter a search term to find related works by the ML & Society team.</p>
                    </div>
                </div>
            </div>
        </aside>
    </div>

    <!-- Overlay for mobile (darker on mobile for better visibility) -->
    <div id="sidebar-overlay" 
         class="fixed inset-0 bg-black bg-opacity-30 md:bg-opacity-30 z-30 hidden"
         aria-hidden="true"></div>

    <!-- Scroll to Top Button -->
    <button id="scroll-to-top" 
            class="fixed bottom-6 right-6 w-12 h-12 bg-blue-600 hover:bg-blue-700 text-white rounded-full shadow-lg hover:shadow-xl transition-all duration-300 opacity-0 invisible z-50 flex items-center justify-center group"
            aria-label="Scroll to top">
        <svg class="w-5 h-5 transform group-hover:scale-110 transition-transform duration-200" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7"></path>
        </svg>
        <span class="sr-only">Scroll to top</span>
    </button>

    <script src="https://cdn.jsdelivr.net/npm/minisearch@6.0.1/dist/umd/index.js"></script>
    <!-- Alpine.js component definitions (uses window.navigationAreas loaded in head) -->
    <script src="js/alpine-init.js"></script>
    <!-- SINGLE ENTRY POINT - orchestrates all initialization -->
    <script type="module" src="js/bootstrap.js"></script>
</body>
</html>