@explorable-viz/fluid 0.7.27 → 0.7.29

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,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