@explorable-viz/fluid 0.7.27 → 0.7.29

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,343 @@
1
+ @charset "UTF-8";
2
+ @import url("https://fonts.googleapis.com/css2?family=Fira+Code&display=swap");
3
+ @import url('https://fonts.googleapis.com/css2?family=Ubuntu+Mono&display=swap');
4
+
5
+ @font-face {
6
+ font-family: 'OdiseanTech';
7
+ src: url('/font/OdiseanTech.woff2') format('woff2');
8
+ font-weight: normal;
9
+ font-style: normal;
10
+ }
11
+
12
+ @font-face {
13
+ font-family: 'GraphikLight';
14
+ src: url('/font/GraphikLight.woff2') format('woff2');
15
+ font-weight: 300;
16
+ font-style: normal;
17
+ }
18
+
19
+ @font-face {
20
+ font-family: 'GraphikLightItalic';
21
+ src: url('/font/GraphikLightItalic.woff2') format('woff2');
22
+ font-weight: 300;
23
+ font-style: italic;
24
+ }
25
+
26
+ @font-face {
27
+ font-family: 'GraphikMedium';
28
+ src: url('/font/GraphikMedium.woff2') format('woff2');
29
+ font-weight: 500;
30
+ font-style: normal;
31
+ }
32
+
33
+ @font-face {
34
+ font-family: 'GraphikMediumItalic';
35
+ src: url('/font/GraphikMediumItalic.woff2') format('woff2');
36
+ font-weight: 500;
37
+ font-style: italic;
38
+ }
39
+
40
+ .fluid-logo {
41
+ margin-bottom: 0;
42
+ }
43
+
44
+ .fluid-subtitle {
45
+ margin-bottom: 0;
46
+ margin-top: 0;
47
+ font-size: 12pt;
48
+ }
49
+
50
+ a:link {
51
+ color: darkslategray;
52
+ }
53
+
54
+ a:visited {
55
+ color: #004d40;
56
+ }
57
+
58
+ a:hover {
59
+ color: #009688;
60
+ }
61
+
62
+ a:active {
63
+ color: #003d33;
64
+ }
65
+
66
+ .right-justified {
67
+ margin-left: auto;
68
+ width: fit-content;
69
+ }
70
+
71
+ .nowrap {
72
+ white-space: nowrap;
73
+ }
74
+
75
+ code {
76
+ font-family: 'Ubuntu Mono', monospace;
77
+ }
78
+
79
+ body {
80
+ font-size: 12pt;
81
+ font-family: "GraphikLight", sans-serif;
82
+ font-weight: 300;
83
+ line-height: 1.25;
84
+ padding: 0;
85
+ margin: 0;
86
+ background-color: #FFFFFF;
87
+ color: #404040;
88
+ margin-bottom: 10em;
89
+ }
90
+
91
+ p {
92
+ margin-top: 1em;
93
+ margin-bottom: 1em;
94
+ }
95
+
96
+ p + p {
97
+ margin-top: 0;
98
+ }
99
+
100
+ .faq-question {
101
+ font-family: 'GraphikMedium';
102
+ color: darkslategrey;
103
+ }
104
+
105
+ .highlight {
106
+ font-family: 'GraphikMedium';
107
+ }
108
+
109
+ .align-right {
110
+ text-align: right;
111
+ }
112
+
113
+ h2 {
114
+ font-size: 18pt;
115
+ }
116
+
117
+ h3 {
118
+ width: 100%;
119
+ font-size: 16pt;
120
+ font-weight: bold;
121
+ margin-top: 10pt;
122
+ margin-bottom: 4pt;
123
+ border-bottom: 0.5px solid lightgray;
124
+ }
125
+
126
+ h4 {
127
+ font-size: 16pt;
128
+ font-weight: bold;
129
+ margin-top: 0.4em;
130
+ margin-bottom: 0;
131
+ }
132
+
133
+ .sub-header * {
134
+ font-size: 16pt;
135
+ margin-bottom: 4px;
136
+ }
137
+
138
+ ul {
139
+ padding-left: 20px;
140
+ margin-top: 0;
141
+ margin-bottom: 0;
142
+ }
143
+
144
+ li {
145
+ margin-bottom: 1ex;
146
+ }
147
+
148
+ li:last-child {
149
+ margin-bottom: 0;
150
+ }
151
+
152
+ .table-caption {
153
+ text-align: left;
154
+ }
155
+
156
+ nav ul {
157
+ padding-left: 0;
158
+ list-style: none;
159
+ }
160
+
161
+ nav ul li {
162
+ float: left;
163
+ overflow: hidden;
164
+ margin-bottom: 0;
165
+ }
166
+
167
+ nav ul li:not(:last-child)::after {
168
+ content: "•";
169
+ margin-right: 5px;
170
+ margin-left: 5px;
171
+ }
172
+
173
+ nav ul li.active-page a {
174
+ pointer-events: none;
175
+ color: inherit;
176
+ text-decoration: none;
177
+ cursor: default;
178
+ font-weight: bold;
179
+ color: rgb(135, 129, 255);
180
+ }
181
+
182
+ .cm-editor {
183
+ background: #2D2D2D;
184
+ color: #F0F0F0;
185
+ }
186
+
187
+ .cm-line {
188
+ font-family: 'Ubuntu Mono';
189
+ font-size: 10pt;
190
+ }
191
+
192
+ .cm-gutter {
193
+ background-color: #232323;
194
+ }
195
+
196
+ .cm-gutterElement {
197
+ font-family: 'Ubuntu Mono';
198
+ font-size: 10pt;
199
+ color: #88C0D0;
200
+ }
201
+
202
+ .right-border {
203
+ border-right: 0.5px solid lightgray;
204
+ padding-right: 6px;
205
+ }
206
+
207
+ .right-border + div {
208
+ padding-left: 4px
209
+ }
210
+
211
+ .header-grid-container {
212
+ display: grid;
213
+ background-color: #f0f0f0;
214
+ width: 100%;
215
+ grid-template-columns: 35% 1fr;
216
+ padding-top: 7px;
217
+ padding-bottom: 7px;
218
+ }
219
+
220
+ .footer-grid-container {
221
+ display: grid;
222
+ background-color: #f0f0f0;
223
+ width: 100%;
224
+ grid-template-columns: 35% 1fr;
225
+ margin-top: 10px;
226
+ }
227
+
228
+ :root {
229
+ --toggle-button-width: 24px;
230
+ --text-pane-width: 800px;
231
+ }
232
+
233
+ .grid-container {
234
+ display: grid;
235
+ grid-template-columns: auto var(--toggle-button-width) var(--text-pane-width);
236
+ justify-content: center;
237
+ }
238
+
239
+ .grid-container.data-pane-hidden {
240
+ grid-template-columns: 0 var(--toggle-button-width) var(--text-pane-width);
241
+ }
242
+
243
+ .grid-container.double-size {
244
+ max-width: 66.7vw; /* undo effect of transform: scale(1.5) for layout purposes */
245
+ }
246
+
247
+ .grid-container > :last-child {
248
+ padding-right: 10px;
249
+ }
250
+
251
+ .flex-bottom-align {
252
+ display: flex;
253
+ flex-direction: row;
254
+ }
255
+
256
+ .flex-bottom-align:first-child {
257
+ margin-top: auto;
258
+ }
259
+
260
+ .flex-left-align {
261
+ display: flex;
262
+ flex-direction: column;
263
+ align-items: start;
264
+ }
265
+
266
+ .flex-right-align {
267
+ display: flex;
268
+ flex-direction: column;
269
+ align-items: flex-end;
270
+ }
271
+
272
+ .flex-bottom-align {
273
+ display: flex;
274
+ flex-direction: row;
275
+ align-items: flex-end;
276
+ }
277
+
278
+ .data-pane-button {
279
+ font-size: 10pt;
280
+ }
281
+
282
+ .toggle-button {
283
+ color: #CCCCCC;
284
+ user-select: none;
285
+ }
286
+
287
+ .toggle-button:hover {
288
+ color: #999999;
289
+ cursor: pointer;
290
+ }
291
+
292
+ .data-pane {
293
+ border-right: 1px dotted #CCCCCC;
294
+ }
295
+
296
+ .data-pane-hidden .data-pane {
297
+ visibility: hidden;
298
+ }
299
+
300
+ .data-pane-hidden .data-pane * {
301
+ display: none;
302
+ }
303
+
304
+ .data-pane * {
305
+ font-size: 10pt;
306
+ }
307
+
308
+ .data-pane p {
309
+ margin-right: 3px;
310
+ }
311
+
312
+ /* Not actually double-size any more.. */
313
+ .double-size {
314
+ transform: scale(1.5);
315
+ transform-origin: top;
316
+ --text-pane-width: 600px;
317
+ }
318
+
319
+ body.standalone {
320
+ height: 100%;
321
+ display: grid;
322
+ justify-items: center;
323
+ align-items: start;
324
+ }
325
+
326
+ /* Needed for contained height specifications to work */
327
+ html {
328
+ height: 100%;
329
+ }
330
+
331
+ @keyframes fadeIn {
332
+ from { opacity: 0; }
333
+ to { opacity: 1; }
334
+ }
335
+
336
+ .fig-loading:only-child {
337
+ color: fuchsia;
338
+ animation: fadeIn 2s ease-in-out infinite alternate;
339
+ }
340
+
341
+ .fig-loading:not(:only-child) {
342
+ display: none;
343
+ }
@@ -0,0 +1,182 @@
1
+ .legend-box {
2
+ stroke: lightgray;
3
+ stroke-width: 0.5px;
4
+ fill: none;
5
+ }
6
+
7
+ .legend-text {
8
+ font-size: 9pt;
9
+ }
10
+
11
+ .title-text {
12
+ fill: Black;
13
+ font-size: 9pt;
14
+ }
15
+
16
+ .table-view th {
17
+ font-size: 11px;
18
+ text-align: left;
19
+ border-bottom: 'thin solid';
20
+ }
21
+
22
+ .table-view td {
23
+ font-size: 11px;
24
+ }
25
+
26
+ .table-view td:nth-child(1) {
27
+ color: lightgray;
28
+ }
29
+
30
+ table {
31
+ border-collapse: collapse;
32
+ }
33
+
34
+ thead {
35
+ border-top: 0.5px solid lightgray;
36
+ }
37
+
38
+ .table-cell {
39
+ border-radius: 0px;
40
+ }
41
+
42
+ td.table-cell {
43
+ background-color: white;
44
+ }
45
+
46
+ .table-cell.inert {
47
+ color: lightgrey;
48
+ }
49
+
50
+ .table-cell.selected-primary-persistent {
51
+ background-color: #93E9BE;
52
+ }
53
+
54
+ .table-cell.selected-secondary-persistent {
55
+ background-color: rgb(226, 226, 226);
56
+ }
57
+
58
+ .table-cell.selected-primary-transient {
59
+ color: blue;
60
+ }
61
+
62
+ .table-cell.selected-secondary-transient {
63
+ color: royalblue;
64
+ }
65
+
66
+ .table-row {
67
+ display: table-row;
68
+ }
69
+
70
+ .table-row.hidden {
71
+ visibility: collapse;
72
+ }
73
+
74
+ .linked-text {
75
+ border-radius: 0px;
76
+ background-color: White;
77
+ border-bottom-style: solid;
78
+ border-bottom-color: white;
79
+ border-bottom-width: 1px;
80
+ display: inline;
81
+ }
82
+
83
+ .linked-text.inert {
84
+ fill: lightgrey;
85
+ }
86
+
87
+ .linked-text.selected-primary-persistent {
88
+ background-color: #93E9BE;
89
+ }
90
+
91
+ .linked-text.selected-primary-transient {
92
+ border-bottom-color: blue;
93
+ }
94
+
95
+ .linked-text.selected-secondary-persistent {
96
+ background-color: rgb(226, 226, 226);
97
+ }
98
+
99
+ .linked-text.selected-secondary-transient {
100
+ border-bottom-color: lightblue;
101
+ }
102
+
103
+ .matrix-cell {
104
+ stroke: DarkGray;
105
+ fill: White;
106
+ }
107
+
108
+ .matrix-cell.inert {
109
+ stroke: DarkGray;
110
+ fill: rgb(185, 185, 185);
111
+ }
112
+
113
+ .matrix-cell.selected-primary-persistent {
114
+ fill: LightGreen;
115
+ }
116
+
117
+ .matrix-cell.selected-secondary-persistent {
118
+ fill: rgb(214, 240, 214)
119
+ }
120
+
121
+ .matrix-cell.selected-primary-transient {
122
+ }
123
+
124
+ .matrix-cell.selected-secondary-transient {
125
+ }
126
+
127
+ .matrix-cell-text {
128
+ font-size: 10pt;
129
+ font-family: "GraphikLight", sans-serif;
130
+ color: rgb(205, 205, 205)
131
+ }
132
+
133
+ .matrix-cell-text.selected-primary-persistent {
134
+ font-weight: 400;
135
+ color: darkgreen
136
+ }
137
+
138
+ .matrix-cell-text.selected-secondary-persistent {
139
+ color: green
140
+ }
141
+
142
+ .matrix-cell-text.selected-primary-transient {
143
+ font-weight: 400;
144
+ color: blue
145
+ }
146
+
147
+ .matrix-cell-text.selected-secondary-transient {
148
+ color: royalblue
149
+ }
150
+
151
+ .scatterplot-point {
152
+ fill: white;
153
+ stroke: black;
154
+ }
155
+
156
+ .scatterplot-point.inert {
157
+ fill: rgb(185,185,185);
158
+ stroke: black;
159
+ }
160
+
161
+ .scatterplot-point.selected-primary-persistent {
162
+ fill: LightGreen;
163
+ stroke: teal;
164
+ }
165
+
166
+ .scatterplot-point.selected-secondary-transient {
167
+ stroke: blue;
168
+ stroke-width: 1;
169
+ }
170
+
171
+ .scatterplot-point.selected-primary-transient {
172
+ stroke: blue;
173
+ stroke-width: 1;
174
+ }
175
+
176
+ .scatterplot-point.selected-secondary-persistent {
177
+ fill: rgb(226, 226, 226);
178
+ }
179
+
180
+ .scatterplot-point.selected-secondary-transient {
181
+ stroke-width: 1;
182
+ }
@@ -25986,6 +25986,7 @@ var mkCommand = (m) => {
25986
25986
  const $0 = v.cmdCommands;
25987
25987
  return $Tuple(v.cmdGroup, $Tuple(arrayMap(fst)($0), $Tuple((v1) => lookup4(v1)($0), void 0)));
25988
25988
  };
25989
+ var flagFieldsHasName = { name: (n) => (fields) => ({ flagNames: [n, ...fields.flagNames], flagActive: fields.flagActive }) };
25989
25990
  var modSemigroup = {
25990
25991
  append: (v) => (v1) => $Mod((x) => v1._1(v._1(x)), $DefaultProp(v1._2._1.tag === "Nothing" ? v._2._1 : v1._2._1, v1._2._2.tag === "Nothing" ? v._2._2 : v1._2._2), (x) => v1._3(v._3(x)))
25991
25992
  };
@@ -28364,6 +28365,41 @@ var graphEval2 = /* @__PURE__ */ graphEval(monadErrorAff);
28364
28365
  var fromFoldable29 = /* @__PURE__ */ (() => fromFoldableImpl(foldableList.foldr))();
28365
28366
  var Evaluate = (value0) => $Command("Evaluate", value0);
28366
28367
  var Publish = (value0) => (value1) => $Command("Publish", value0, value1);
28368
+ var publish = /* @__PURE__ */ (() => $Parser(
28369
+ "MultP",
28370
+ $MultPE(
28371
+ parserFunctor.map(Publish)(parserFunctor.map(Folder)(option(readerAsk)((() => {
28372
+ const $0 = help("root directory of website under dist/");
28373
+ const $1 = $0._2._2.tag === "Nothing" ? Nothing : $0._2._2;
28374
+ return $Mod(
28375
+ (x) => $0._1({
28376
+ optNames: [$OptName("OptShort", "w"), $OptName("OptLong", "website"), ...x.optNames],
28377
+ optCompleter: x.optCompleter,
28378
+ optNoArgError: x.optNoArgError
28379
+ }),
28380
+ $DefaultProp($Maybe("Just", "Misc"), $1.tag === "Nothing" ? Nothing : $1),
28381
+ (x) => $0._3(x)
28382
+ );
28383
+ })()))),
28384
+ $Parser(
28385
+ "AltP",
28386
+ flag$p(true)(foldableArray.foldMap(modMonoid)(identity3)([
28387
+ $Mod(
28388
+ flagFieldsHasName.name($OptName("OptLong", "local")),
28389
+ $DefaultProp(Nothing, Nothing),
28390
+ identity26
28391
+ ),
28392
+ $Mod(
28393
+ flagFieldsHasName.name($OptName("OptShort", "l")),
28394
+ $DefaultProp(Nothing, Nothing),
28395
+ identity26
28396
+ ),
28397
+ help("Are you publishing from source (false), or an npm package (true)?")
28398
+ ])),
28399
+ $Parser("NilP", false)
28400
+ )
28401
+ )
28402
+ ))();
28367
28403
  var parseImports = /* @__PURE__ */ $Parser(
28368
28404
  "BindP",
28369
28405
  /* @__PURE__ */ manyM(/* @__PURE__ */ option(readerAsk)(/* @__PURE__ */ (() => {
@@ -28400,7 +28436,7 @@ var copyOptions = {
28400
28436
  encoding: Nothing,
28401
28437
  shell: Nothing
28402
28438
  };
28403
- var copyFiles = (website) => exec2("./node_modules/@explorable-viz/fluid/script/bundle-website.sh -w " + website + " -r true")(copyOptions)((v) => {
28439
+ var copyFiles = (website) => (b) => exec2(b ? "./node_modules/@explorable-viz/fluid/script/bundle-website.sh -w " + website + " -r true" : "./script/bundle-website.sh -w " + website)(copyOptions)((v) => {
28404
28440
  if (v.error.tag === "Just") {
28405
28441
  return log(showErrorImpl(v.error._1));
28406
28442
  }
@@ -28415,11 +28451,11 @@ var copyFiles = (website) => exec2("./node_modules/@explorable-viz/fluid/script/
28415
28451
  });
28416
28452
  var dispatchCommand = (v) => {
28417
28453
  if (v.tag === "Evaluate") {
28418
- return output(v._1);
28454
+ return _map((v$1) => {
28455
+ })(output(v._1));
28419
28456
  }
28420
28457
  if (v.tag === "Publish") {
28421
- const $0 = v._1;
28422
- return _bind(_liftEffect(copyFiles(v._2)))(() => _bind(_liftEffect(log("Published")))(() => output($0)));
28458
+ return _bind(_liftEffect(copyFiles(v._1)(v._2)))(() => _liftEffect(log("Published")));
28423
28459
  }
28424
28460
  fail();
28425
28461
  };
@@ -28428,7 +28464,7 @@ var callback = (v) => {
28428
28464
  return log(showErrorImpl(v._1));
28429
28465
  }
28430
28466
  if (v.tag === "Right") {
28431
- return log(intercalate4("\n")(removeDocWS(prettyVal(highlightableUnit).pretty(v._1)).lines));
28467
+ return log("Success");
28432
28468
  }
28433
28469
  fail();
28434
28470
  };
@@ -28515,25 +28551,6 @@ var program = /* @__PURE__ */ (() => $Parser(
28515
28551
  })())
28516
28552
  )
28517
28553
  ))();
28518
- var publish = /* @__PURE__ */ (() => $Parser(
28519
- "MultP",
28520
- $MultPE(
28521
- parserFunctor.map(Publish)(program),
28522
- parserFunctor.map(Folder)(option(readerAsk)((() => {
28523
- const $0 = help("root directory of website under dist/");
28524
- const $1 = $0._2._2.tag === "Nothing" ? Nothing : $0._2._2;
28525
- return $Mod(
28526
- (x) => $0._1({
28527
- optNames: [$OptName("OptShort", "w"), $OptName("OptLong", "website"), ...x.optNames],
28528
- optCompleter: x.optCompleter,
28529
- optNoArgError: x.optNoArgError
28530
- }),
28531
- $DefaultProp($Maybe("Just", "Misc"), $1.tag === "Nothing" ? Nothing : $1),
28532
- (x) => $0._3(x)
28533
- );
28534
- })()))
28535
- )
28536
- ))();
28537
28554
  var commandParser = /* @__PURE__ */ subparser(/* @__PURE__ */ (() => {
28538
28555
  const $0 = command("evaluate")(progDesc("Evaluate a file")({
28539
28556
  infoParser: parserFunctor.map(Evaluate)(program),
Binary file
@@ -0,0 +1,6 @@
1
+ <div class="footer-grid-container">
2
+ <div></div>
3
+ <div class="flex-left-align">
4
+ <p>© Fluid Contributors 2019–2024</p>
5
+ </div>
6
+ </div>
@@ -0,0 +1,26 @@
1
+ <div class="header-grid-container">
2
+ <div class="flex-right-align right-border">
3
+ <img class="fluid-logo" src="/image/fluid-logo.png" width="150px">
4
+ <h2 class="fluid-subtitle">explorable, self-explanatory research outputs</h2>
5
+ </div>
6
+ <div class="flex-left-align" style="justify-content: center; margin-left: 5px;">
7
+ <nav>
8
+ <ul>
9
+ <li><a href="https://github.com/explorable-viz/fluid">GitHub</a></li>
10
+ <li><a href="https://dl.acm.org/doi/10.1145/3498668">POPL 2022 paper</a></li>
11
+ <li><a href="https://www.youtube.com/watch?v=M_ePrtD9axk">POPL 2022 talk</a></li>
12
+ <li><a href="https://www.youtube.com/watch?v=2-S6yVyzypU">PROPL 2024</a></li>
13
+ <li><a href="https://www.youtube.com/watch?v=F3JaftEnFfM">ICCS Summer School</a></li>
14
+ <li><a href="https://arxiv.org/abs/2403.04403">ESOP 2025 preprint</a></li>
15
+ </ul>
16
+ </nav>
17
+ <nav>
18
+ <ul>
19
+ <li><a href="/">Overview</a></li>
20
+ <li><a href="/faq">FAQ</a></li>
21
+ <li><a href="/contributors">Contributors &amp; Funding</a></li>
22
+ </ul>
23
+ </nav>
24
+ <div></div>
25
+ </div>
26
+ </div>
@@ -0,0 +1,12 @@
1
+ <div></div>
2
+ <div></div>
3
+ <div>
4
+ <h3 class="title">Overview</h3>
5
+ <nav class="sub-header">
6
+ <ul>
7
+ <li><a href="/">Transparent research outputs</a></li>
8
+ <li><a href="/convolution">Matrix convolution</a></li>
9
+ <li><a href="/moving-average">Moving average</a></li>
10
+ </ul>
11
+ </nav>
12
+ </div>
@@ -0,0 +1,72 @@
1
+ function loadHeader () {
2
+ fetch('/shared/header.html')
3
+ .then(response => response.text())
4
+ .then(data => {
5
+ const header = document.createElement('div')
6
+ header.innerHTML = data
7
+ activateCurrentLink(header)
8
+ const divElement = header.children[0]
9
+ const grid = document.getElementById('grid')
10
+ grid.parentNode.insertBefore(divElement, grid)
11
+ })
12
+ .catch(error => console.error('Error loading shared HTML:', error))
13
+
14
+ fetch('/shared/footer.html')
15
+ .then(response => response.text())
16
+ .then(data => {
17
+ const footer = document.createElement('div')
18
+ footer.innerHTML = data
19
+ const divElement = footer.children[0]
20
+ const grid = document.getElementById('grid')
21
+ grid.parentNode.appendChild(divElement)
22
+ })
23
+ .catch(error => console.error('Error loading shared HTML:', error))
24
+ }
25
+
26
+ function eqPaths (path1, path2) {
27
+ const trailingSlashes = /\/+$/
28
+ return path1.replace(trailingSlashes, '') === path2.replace(trailingSlashes, '')
29
+ }
30
+
31
+ function activateCurrentLink (el) {
32
+ const listItems = el.querySelectorAll('li')
33
+ const n_ = Array.from(listItems).findIndex(li => {
34
+ const link = li.querySelector('a')
35
+ return link && eqPaths(link.getAttribute('href'), window.location.pathname)
36
+ })
37
+ if (n_ !== -1) {
38
+ listItems[n_].classList.add('active-page')
39
+ }
40
+ }
41
+
42
+ function loadSubHeader () {
43
+ fetch('/shared/sub-header.html')
44
+ .then(response => response.text())
45
+ .then(data => {
46
+ const header = document.createElement('div')
47
+ header.innerHTML = data
48
+ activateCurrentLink(header)
49
+ const divElements = header.children
50
+ const grid = document.getElementById('grid')
51
+ for (let i = Math.min(3, divElements.length - 1); i >= 0; --i) {
52
+ grid.insertBefore(divElements[i], grid.firstChild)
53
+ }
54
+ })
55
+ .catch(error => console.error('Error loading shared HTML:', error))
56
+ }
57
+
58
+ function toggleDataPane(gridId) {
59
+ const grid = document.getElementById(gridId)
60
+ const hidden = grid.classList.contains('data-pane-hidden')
61
+ const dataPaneButton = document.querySelector('.data-pane-button')
62
+
63
+ if (hidden) {
64
+ grid.classList.remove('data-pane-hidden')
65
+ dataPaneButton.classList.remove('fa-eye-slash')
66
+ dataPaneButton.classList.add('fa-eye')
67
+ } else {
68
+ grid.classList.add('data-pane-hidden')
69
+ dataPaneButton.classList.remove('fa-eye')
70
+ dataPaneButton.classList.add('fa-eye-slash')
71
+ }
72
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorable-viz/fluid",
3
- "version": "0.7.27",
3
+ "version": "0.7.29",
4
4
  "description": "Fluid is an experimental programming language which integrates a bidirectional dynamic analysis to connect outputs to data sources in a fine-grained way. Fluid is implemented in PureScript and runs in the browser.",
5
5
  "main": "index.js",
6
6
  "repository": {
@@ -27,6 +27,11 @@ SRC_PATH=${WEBSITE//./\/}
27
27
  SRC_PATH_LISP_CASE=$($LISP_CASE "$SRC_PATH")
28
28
  echo "$SRC_PATH -> $SRC_PATH_LISP_CASE"
29
29
 
30
+ if [[ -e "website/$SRC_PATH.html" ]]; then
31
+ $CLEAN $SRC_PATH_LISP_CASE
32
+ cp website/$SRC_PATH.html dist/$SRC_PATH_LISP_CASE/index.html
33
+ fi
34
+
30
35
  shopt -s nullglob
31
36
 
32
37
  set +x
@@ -75,6 +80,7 @@ cp $DIST/fluid/load-fig.js dist/$WEBSITE_LISP_CASE/shared/load-fig.js
75
80
  cp -r $DIST/fluid/font dist/$WEBSITE_LISP_CASE/font
76
81
  cp -r $DIST/fluid/css dist/$WEBSITE_LISP_CASE/css
77
82
  cp $DIST/fluid/favicon.ico dist/$WEBSITE_LISP_CASE/favicon.ico
83
+ cp -r $DIST/fluid/image dist/$WEBSITE_LISP_CASE/image
78
84
 
79
85
  echo "Processing static files:"
80
86