source("scripts/project.R")
analysis_setup()
source("scripts/reporting/publication.R")Publication figures and tables
The preceding pages prepare the data, fit the models, and display their results. This page assembles the figures and tables used in the manuscript and its supplementary material. Every input is generated earlier in the same project render. The table objects retain the data and formatting shown on the analysis pages; the paired CSV files make the displayed values available independently.
Descriptive and hypothesis tables
The main participant table and the detailed supplementary results use the same styled table objects that are displayed beside their analyses. The table below identifies each source by its executable Quarto cell label. These are regenerated objects, so changing an analysis propagates to the manuscript in the same render.
source_tables <- tibble::tribble(
~publication_table, ~analysis_cell,
"table-1", "tbl-participant-site-manuscript",
"table-s1", "tbl-descriptive-sample-flow",
"table-s2", "tbl-near-eye-metrics",
"table-s3", "tbl-recommendation-context",
"table-s7", "tbl-h01-primary-publication-summary",
"table-s8", "tbl-h07-near-results",
"table-s9", "tbl-h06-primary-effects",
"table-s11a", "tbl-h05-near-results-a",
"table-s11b", "tbl-h05-near-results-b",
"table-s12", "tbl-h08-near-eye-results",
"table-s13", "tbl-h09-near-eye-results",
"table-s14", "tbl-h10-main-results",
"table-s15", "tbl-h11-global-tests"
)
source_tables# A tibble: 13 × 2
publication_table analysis_cell
<chr> <chr>
1 table-1 tbl-participant-site-manuscript
2 table-s1 tbl-descriptive-sample-flow
3 table-s2 tbl-near-eye-metrics
4 table-s3 tbl-recommendation-context
5 table-s7 tbl-h01-primary-publication-summary
6 table-s8 tbl-h07-near-results
7 table-s9 tbl-h06-primary-effects
8 table-s11a tbl-h05-near-results-a
9 table-s11b tbl-h05-near-results-b
10 table-s12 tbl-h08-near-eye-results
11 table-s13 tbl-h09-near-eye-results
12 table-s14 tbl-h10-main-results
13 table-s15 tbl-h11-global-tests
for (i in seq_len(nrow(source_tables))) {
table <- read_analysis_table(source_tables$analysis_cell[[i]])
if (source_tables$publication_table[[i]] == "table-s8") {
table <- gt::text_transform(table, function(x) ifelse(x == ";", "Not applicable", x),
locations = gt::cells_body())
}
save_publication_table(table, source_tables$publication_table[[i]])
}Table 3 combines the metric definitions, descriptive distributions, fitted associations and represented variation. Its inferential quantities are those shown in the geographic analysis, and the supplementary tables retain the complete geographic and photoperiod results. The compact table uses the same regenerated distributions as the descriptive metric dictionary, with site colours and no site-name labels inside the thumbnails. Decimal hours are used for duration summaries, while timing summaries retain clock notation.
metric_context_table <- build_metric_publication_table()
save_publication_table(metric_context_table, "table-3")
publication_html_metric_table(metric_context_table)| Near-eye personal light-exposure metrics and their geographic and photoperiod context | |||||
| Metric |
Descriptive summary
|
Association evidence
|
Modelled variation
|
||
|---|---|---|---|---|---|
| Overall distribution | Site distribution | Overall site | Civil photoperiod | R² summary | |
| Duration | |||||
| Time above 1,000 lx melEDI Bright-light exposure duration; relevant to daytime alerting and circadian entrainment. |
Unit h Median 0.683 IQR 0.183 to 1.558 Participants 141 Days 816 |
FDR not supported; adjusted p 0.071 Part R² 4.7% (2.6% to 12.1%) |
Estimate Ratio per 1 h: 1.206 (1.128 to 1.288) FDR supported; adjusted p <0.001 Part R² 9.0% (3.7% to 15.7%) |
Marginal 21.5% (16.3% to 32.3%) Conditional 50.1% (40.2% to 57.6%) Participant-associated 28.6% (17.7% to 34.2%) | |
| Time above 250 lx melEDI during wake Waking time in recommended daytime light; relevant to alertness, entrainment, and subsequent sleep. |
Unit h Median 2.417 IQR 0.850 to 4.617 Participants 141 Days 737 |
FDR supported; adjusted p 0.007 Part R² 8.6% (5.2% to 18.7%) |
Estimate Ratio per 1 h: 1.136 (1.073 to 1.202) FDR supported; adjusted p <0.001 Part R² 6.4% (2.0% to 12.7%) |
Marginal 18.0% (12.9% to 29.1%) Conditional 50.1% (41.6% to 58.0%) Participant-associated 32.1% (20.7% to 36.7%) | |
| Time below 10 lx melEDI before sleep Low-light time before bed; limits evening melatonin suppression and circadian delay. |
Unit h Median 1.883 IQR 1.025 to 2.583 Participants 139 Days 655 |
FDR supported; adjusted p 0.049 Part R² 5.4% (3.2% to 13.4%) |
Estimate Difference per 1 h: -0.134 (-0.201 to -0.066) FDR supported; adjusted p <0.001 Part R² 4.9% (1.2% to 10.5%) |
Marginal 7.6% (4.6% to 17.2%) Conditional 38.3% (31.8% to 48.5%) Participant-associated 30.7% (21.7% to 38.1%) | |
| Time below 1 lx melEDI during sleep Darkness during sleep; supports nocturnal melatonin and an undisturbed sleep environment. |
Unit h Median 7.133 IQR 5.967 to 8.250 Participants 141 Days 778 |
FDR not supported; adjusted p 0.058 Part R² 5.4% (3.2% to 14.2%) |
Estimate Ratio per 1 h: 0.987 (0.968 to 1.006) FDR not supported; adjusted p 0.227 Part R² 0.6% (0.0% to 3.8%) |
Marginal 8.0% (5.1% to 18.2%) Conditional 40.9% (32.8% to 48.5%) Participant-associated 32.9% (22.0% to 37.8%) | |
| Longest period above 250 lx melEDI Longest sustained bright-light bout; captures continuity of daytime circadian stimulation. |
Unit h Median 0.633 IQR 0.283 to 1.204 Participants 141 Days 816 |
FDR not supported; adjusted p 0.398 Part R² 2.2% (1.4% to 8.1%) |
Estimate Ratio per 1 h: 1.125 (1.065 to 1.187) FDR supported; adjusted p <0.001 Part R² 4.9% (1.3% to 9.6%) |
Marginal 10.0% (6.1% to 17.9%) Conditional 36.3% (29.9% to 45.3%) Participant-associated 26.3% (18.7% to 33.0%) | |
| Dynamics | |||||
| Interdaily stability Day-to-day regularity of the light–dark pattern; higher regularity supports circadian stability. |
Unit dimensionless Median 0.308 IQR 0.248 to 0.380 Participants 141 Days 816 |
FDR not supported; adjusted p 0.228 Part R² 6.9% (4.1% to 20.4%) |
Estimate Odds ratio per 1 h: 0.983 (0.944 to 1.024) FDR not supported; adjusted p 0.401 Part R² 0.4% (0.0% to 4.6%) |
Marginal 15.4% (10.4% to 30.8%) Conditional 15.4% (10.4% to 30.8%) Participant-associated Not applicable | |
| Intradaily variability Within-day fragmentation of light exposure; higher values indicate less consolidated light–dark input. |
Unit dimensionless Median 1.253 IQR 0.930 to 1.502 Participants 141 Days 816 |
FDR not supported; adjusted p 0.483 Part R² 5.1% (3.8% to 18.7%) |
Estimate Difference per 1 h: -0.019 (-0.056 to 0.019) FDR not supported; adjusted p 0.327 Part R² 0.7% (0.0% to 5.7%) |
Marginal 5.9% (4.6% to 21.2%) Conditional 5.9% (4.6% to 21.2%) Participant-associated Not applicable | |
| Exposure history | |||||
| melEDI dose Intensity–duration-weighted melanopic exposure; summarizes cumulative non-visual retinal light input. |
Unit klx·h Median 4.960 IQR 1.936 to 12.313 Participants 141 Days 761 |
FDR not supported; adjusted p 0.209 Part R² 2.8% (1.7% to 8.6%) |
Estimate Ratio per 1 h: 1.275 (1.169 to 1.391) FDR supported; adjusted p <0.001 Part R² 7.5% (3.1% to 12.9%) |
Marginal 11.8% (7.7% to 19.7%) Conditional 33.8% (26.7% to 42.8%) Participant-associated 22.0% (14.5% to 28.7%) | |
| Level | |||||
| Mean melEDI Geometric average of daily melEDI values, including zeros; summarizes overall exposure while reducing peak influence. |
Unit lx Median 5.154 IQR 2.831 to 9.225 Participants 141 Days 816 |
FDR supported; adjusted p <0.001 Part R² 8.4% (4.8% to 16.6%) |
Estimate Ratio per 1 h: 1.181 (1.109 to 1.257) FDR supported; adjusted p <0.001 Part R² 7.7% (2.9% to 13.9%) |
Marginal 25.4% (18.6% to 34.4%) Conditional 57.7% (51.9% to 65.1%) Participant-associated 32.3% (24.5% to 39.4%) | |
| Brightest 10 h mean Mean of the brightest 10 hours; reflects the strength of the main daytime light episode. |
Unit lx Median 110.566 IQR 41.513 to 243.212 Participants 141 Days 816 |
FDR supported; adjusted p 0.011 Part R² 5.7% (3.3% to 12.7%) |
Estimate Ratio per 1 h: 1.243 (1.133 to 1.363) FDR supported; adjusted p <0.001 Part R² 5.8% (1.9% to 11.1%) |
Marginal 17.6% (12.1% to 26.0%) Conditional 46.0% (39.6% to 54.3%) Participant-associated 28.4% (20.9% to 35.4%) | |
| Darkest 10 h mean Mean of the darkest 10 hours; lower values during the biological night favour melatonin preservation and sleep. |
Unit lx Median 0.103 IQR 0.020 to 0.253 Participants 141 Days 816 |
FDR supported; adjusted p <0.001 Part R² 13.7% (9.2% to 23.9%) |
Estimate Ratio per 1 h: 1.088 (1.034 to 1.144) FDR supported; adjusted p 0.002 Part R² 3.4% (0.5% to 8.3%) |
Marginal 22.0% (15.8% to 31.8%) Conditional 61.1% (55.3% to 68.1%) Participant-associated 39.1% (30.4% to 46.2%) | |
| Spectrum | |||||
| Melanopic daylight efficacy ratio Mean of viable one-minute melEDI/illuminance ratios; indicates melanopic efficacy relative to visual light. |
Unit dimensionless Median 0.724 IQR 0.643 to 0.795 Participants 137 Days 687 |
FDR supported; adjusted p <0.001 Part R² 9.6% (6.0% to 17.8%) |
Estimate Difference per 1 h: 0.024 (0.017 to 0.031) FDR supported; adjusted p <0.001 Part R² 13.0% (6.7% to 20.6%) |
Marginal 27.8% (21.3% to 38.1%) Conditional 60.5% (54.6% to 68.2%) Participant-associated 32.7% (24.1% to 40.0%) | |
| Timing | |||||
| Midpoint of the brightest 10 hours Centre time of the brightest 10 hours; indexes the main daily circadian light cue. |
Unit clock time Median 13:44 IQR 12:48 to 15:00 Participants 141 Days 816 |
FDR supported; adjusted p <0.001 Part R² 6.5% (4.4% to 12.6%) |
Estimate Difference per 1 h: 0.054 (-0.045 to 0.153) FDR not supported; adjusted p 0.305 Part R² 0.2% (0.0% to 1.8%) |
Marginal 6.7% (4.6% to 13.0%) Conditional 22.9% (16.9% to 31.6%) Participant-associated 16.2% (9.6% to 22.4%) | |
| Midpoint of the darkest 10 hours Centre time of the darkest 10 hours; indexes the main daily darkness cue. |
Unit clock time Median 02:54 IQR 02:01 to 03:50 Participants 141 Days 816 |
FDR supported; adjusted p 0.020 Part R² 4.6% (3.0% to 10.5%) |
Estimate Difference per 1 h: -0.148 (-0.245 to -0.050) FDR supported; adjusted p 0.004 Part R² 2.1% (0.3% to 5.6%) |
Marginal 8.6% (5.9% to 15.8%) Conditional 28.2% (22.1% to 36.7%) Participant-associated 19.6% (12.6% to 25.8%) | |
| First light timing above 250 lx melEDI First waking bright-light exposure; morning timing can advance circadian phase and promote alertness. |
Unit clock time Median 09:08 IQR 08:02 to 10:40 Participants 140 Days 727 |
FDR not supported; adjusted p 0.112 Part R² 3.8% (2.3% to 10.2%) |
Estimate Difference per 1 h: -0.097 (-0.247 to 0.053) FDR not supported; adjusted p 0.227 Part R² 0.5% (0.0% to 2.8%) |
Marginal 6.8% (4.4% to 14.4%) Conditional 31.0% (24.6% to 40.5%) Participant-associated 24.2% (16.2% to 31.5%) | |
| Last light timing above 250 lx melEDI Last bright-light exposure; later timing may delay circadian phase and sleep onset. |
Unit clock time Median 18:08 IQR 16:27 to 19:42 Participants 141 Days 687 |
FDR supported; adjusted p <0.001 Part R² 11.6% (8.3% to 18.6%) |
Estimate Difference per 1 h: 0.323 (0.186 to 0.460) FDR supported; adjusted p <0.001 Part R² 4.5% (1.5% to 8.5%) |
Marginal 22.2% (17.0% to 30.2%) Conditional 37.9% (31.6% to 46.3%) Participant-associated 15.8% (9.7% to 22.3%) | |
| Mean timing of exposure above 250 lx melEDI Average bright-light timing; summarizes the phase of daily circadian stimulation. |
Unit clock time Median 13:29 IQR 12:29 to 14:39 Participants 141 Days 742 |
FDR supported; adjusted p <0.001 Part R² 12.7% (9.4% to 19.2%) |
Estimate Difference per 1 h: 0.121 (0.028 to 0.213) FDR supported; adjusted p 0.013 Part R² 1.2% (0.1% to 3.6%) |
Marginal 14.7% (10.7% to 21.9%) Conditional 25.7% (19.8% to 34.2%) Participant-associated 11.0% (5.3% to 17.2%) | |
| Overall distributions are medians and interquartile ranges. Participants and Days give descriptive support; model-specific samples are in Supplementary Table S7. Site and photoperiod part-R² can overlap and must not be summed. Participant-associated R² is conditional minus marginal R² and is not applicable to participant-level outcomes. Distribution colours follow the shared site key in Figure 1 and Supplementary Table S2. MDER is the mean of viable minute-level ratios. Grey site or photoperiod cells did not meet the corresponding FDR criterion. These observational associations are not causal allocations. | |||||
Recommendation adherence
The main adherence table combines descriptive pooled-minute fractions with modelled recommendation-window estimates. These have different denominators. Only the primary any-valid sample contributes the model estimates in this table; coverage sensitivities remain on the recommendation-adherence analysis page.
adherence_table <- build_adherence_publication_table()
save_publication_table(adherence_table, "table-2")
adherence_table| Recommendation |
Observed pooled-minute adherence
|
Site-average recommendation-window model
|
||||
|---|---|---|---|---|---|---|
| Valid minutes meeting recommendation, n/N (%) | Work-day adherence, % (95% CI) | Free-day adherence, % (95% CI) | Free minus Work, percentage points (95% CI) | FDR-adjusted p | ||
| Daytime | At least 250 lx melanopic EDI during daytime | 137,792/573,712 (24.0%) | 26.6 (24.5 to 28.7) | 21.5 (19.2 to 23.8) | -5.1 (-7.8 to -2.4) | <0.001 |
| Pre-sleep | No more than 10 lx melanopic EDI during the three hours before sleep | 81,894/129,390 (63.3%) | 62.0 (58.8 to 65.2) | 67.9 (64.2 to 71.6) | +5.9 (+1.4 to +10.5) | 0.011 |
| Sleep | No more than 1 lx melanopic EDI in the sleep environment | 336,052/383,366 (87.7%) | 90.4 (88.9 to 91.9) | 83.9 (81.4 to 86.5) | -6.5 (-9.1 to -3.8) | <0.001 |
| Only the primary any-valid sample is shown. Observed minute fractions and fitted recommendation-window estimates are different quantities. Each of the nine sites receives equal weight in fitted estimates. Windows qualify independently and inherit day type from the wake-start date. Sleep describes the bedside sleep environment. Temporal dependence remains unresolved; the pre-sleep interval includes zero under the 80% coverage restriction. | ||||||
The exploratory cross-window table separates within-participant contrasts from between-participant differences. Its displayed effects come from the four-effect FDR family and preserve the temporal-dependence qualification.
cross_window_table <- build_cross_window_table()
save_publication_table(cross_window_table, "table-s4")
cross_window_table| Window | Difference, percentage points (95% CI) | FDR-adjusted p |
|---|---|---|
| Within participant | ||
| Sleep | -0.26 (-0.95 to 0.43) | 0.453 |
| Pre-sleep | -1.09 (-2.75 to 0.56) | 0.258 |
| Between participants | ||
| Sleep | -2.52 (-3.55 to -1.48) | <0.001 |
| Pre-sleep | -3.59 (-5.94 to -1.25) | 0.005 |
| Contrasts are per 10 percentage points higher daytime adherence. Within-participant contrasts concern deviations from each participant's monitoring-period average; between-participant contrasts concern those averages. The four associations form one FDR family. Unresolved temporal dependence precludes a within-participant day-level claim. | ||
Daily-pattern variation
Fitted-curve dispersion and Shapley allocation summarise different aspects of the same daily-pattern models. Each position is assembled separately from its regenerated estimates and bootstrap intervals. The bootstrap count follows the central full or quick-run setting.
near_eye_variation <- build_temporal_summary_table("glasses")
save_publication_table(near_eye_variation, "table-s5")
near_eye_variation| Fitted-curve result (95% CI) | Shapley allocation (95% CI) | Share of full-model R² (95% CI) | |
|---|---|---|---|
| Shared local-clock curve | Not applicable | 0.611 (0.550 to 0.657) | 78.9 (73.6 to 82.6)% |
| Site pattern | 0.100 (0.041 to 0.139) | 0.016 (0.007 to 0.026) | 2.0 (0.9 to 3.5)% |
| Participant pattern | 0.180 (0.126 to 0.214) | 0.100 (0.079 to 0.125) | 12.9 (10.1 to 16.4)% |
| Participant-day shift | 0.019 (0.010 to 0.024) | 0.048 (0.035 to 0.064) | 6.2 (4.4 to 8.6)% |
| Participant pattern + day shift | 0.200 (0.140 to 0.230) | Not separately allocated | Not applicable |
| Participant / site | 1.797 (1.157 to 4.332) | 6.41 (3.85 to 15.14) | Not applicable |
| (Participant + day) / site | 1.991 (1.291 to 4.767) | 9.49 (5.77 to 21.81) | 90.5 (85.2 to 95.6)% |
| Fitted-curve variation is in squared log10(melanopic EDI + 0.1 lx) prediction units; ratios are unitless. The shared local-clock curve remains the baseline in every component model. Intervals are conditional hierarchical cluster-bootstrap percentiles from 2,000 replicates. In the final row, the percentage is the participant-plus-day share of heterogeneity, excluding the shared local-clock contribution. Dispersion and R² allocation are distinct estimands. | |||
chest_variation <- build_temporal_summary_table("chest")
save_publication_table(chest_variation, "table-s6")
chest_variation| Fitted-curve result (95% CI) | Shapley allocation (95% CI) | Share of full-model R² (95% CI) | |
|---|---|---|---|
| Shared local-clock curve | Not applicable | 0.583 (0.523 to 0.629) | 79.1 (73.6 to 82.8)% |
| Site pattern | 0.101 (0.049 to 0.116) | 0.015 (0.008 to 0.024) | 2.1 (1.1 to 3.3)% |
| Participant pattern | 0.148 (0.100 to 0.199) | 0.087 (0.071 to 0.110) | 11.9 (9.5 to 15.3)% |
| Participant-day shift | 0.035 (0.020 to 0.039) | 0.051 (0.040 to 0.067) | 7.0 (5.3 to 9.4)% |
| Participant pattern + day shift | 0.183 (0.127 to 0.228) | Not separately allocated | Not applicable |
| Participant / site | 1.465 (0.973 to 3.179) | 5.69 (3.72 to 10.68) | Not applicable |
| (Participant + day) / site | 1.809 (1.219 to 3.736) | 9.02 (6.01 to 17.03) | 90.0 (85.7 to 94.5)% |
| Fitted-curve variation is in squared log10(melanopic EDI + 0.1 lx) prediction units; ratios are unitless. The shared local-clock curve remains the baseline in every component model. Intervals are conditional hierarchical cluster-bootstrap percentiles from 2,000 replicates. In the final row, the percentage is the participant-plus-day share of heterogeneity, excluding the shared local-clock contribution. Dispersion and R² allocation are distinct estimands. | |||
Person-level synthesis
The synthesis selects the prespecified near-eye analyses. Retained associations, confidence intervals, exact samples and FDR decisions are read from the current model outputs. This keeps an inconclusive association distinct from evidence of absence and keeps the two chronotype instruments separate.
person_level_table <- build_person_level_summary()
save_publication_table(person_level_table, "table-s10")
person_level_table| Scale | Result | FDR family | Decision | Sample | Qualification | |
|---|---|---|---|---|---|---|
| Light-exposure behaviour and awareness | Metric associations per participant-level factor SD | None retained; 4 cells were unfit for inference | 68 factor-by-metric tests | None retained | Metric-specific samples in Supplementary Table S11 | Non-retention is inconclusive rather than evidence of no association. |
| Visual light sensitivity | Metric associations per VLSQ-8 SD | Melanopic EDI dose ratio: 0.846 (0.716 to 0.999) | 9 metric tests | None retained; dose adjusted p = 0.160 | 141 participants; 761 participant-days; 9 sites | Confidence intervals and FDR decisions are separate summaries. |
| Corrected midsleep on free days | Timing per one-hour later corrected midsleep | First light timing above 250 lx melEDI: 0.381 (0.146 to 0.616) h; Midpoint of the darkest 10 hours: 0.276 (0.118 to 0.435) h; Midpoint of the brightest 10 hours: 0.205 (0.045 to 0.366) h | 5 MCTQ timing outcomes | 3 associations retained | 139 to 140 participants; 722 to 810 participant-days; 9 sites | The two chronotype instruments are analysed separately; associations do not identify causal direction. |
| Morningness-eveningness preference | Timing per 10 points greater morning preference | First light timing above 250 lx melEDI: -0.444 (-0.699 to -0.189) h; Midpoint of the darkest 10 hours: -0.314 (-0.487 to -0.142) h; Midpoint of the brightest 10 hours: -0.278 (-0.451 to -0.105) h | 5 MEQ timing outcomes | 3 associations retained | 140 to 141 participants; 727 to 816 participant-days; 9 sites | The two chronotype instruments are analysed separately; associations do not identify causal direction. |
| Age | Metric associations per 10 years | Brightest 10 h mean: 1.31× (1.09–1.58); Time above 1,000 lx melEDI: 1.27× (1.11–1.45); melEDI dose: 1.31× (1.09–1.56) | 17 near-eye metric tests | 3 associations retained | 141 participants; 761 to 816 participant-days; 9 sites | Cross-sectional associations may reflect cohort, occupation, behaviour or other confounding. |
| Metric-level biological sex | Female minus Male | None retained | 17 near-eye metric tests | None retained | Metric-specific samples in Supplementary Table S14 | Biological sex and gender were recorded separately; gender was not analysed. |
| Biological-sex-specific daily curve | Complete curve and activity-complete sensitivity | Complete available-data curve: FDR-adjusted p = 0.028. Activity-complete adjusted curve: exploratory global curve not supported. | Global complete-curve tests and separate sensitivity decisions | Analysis-specific global decisions | 141 participants; 816 participant-days; 9 sites; 37,756 observations | Restriction and activity adjustment cannot be disentangled as mechanisms. Clock-specific intervals are pointwise. |
Light-source and activity figure assembly
The temporal curve panels are generated on the light-source and activity pages. Here, the site-average estimates, site-specific ratios, confidence intervals, FDR decisions, and exact category support are read from their current CSV exports and laid out as the fourth panel. The activity display keeps Other as an additive descriptive estimate separate from its five-category interaction.
source("scripts/reporting/context-figures.R")
build_light_source_publication_figure()
build_activity_publication_figure()Figures
The figure files below are produced by their respective analyses. This page assigns manuscript filenames to the regenerated images. Vector images are used when available; PNG versions provide a portable alternative for Word. Each analysis also exports the exact data used to draw its figures.
figure_sources <- tibble::tribble(
~figure, ~source_pattern,
"figure-1", "^descriptive_overview[.](svg|png)$",
"figure-2", "^daily_patterns[.](svg|png)$",
"figure-3", "^H04.*manuscript_figure3[.](svg|png)$",
"figure-s1", "^near_eye_metric_distributions[.](svg|png)$",
"figure-s2", "^time_series_to_metrics[.](svg|png)$",
"figure-s3", "^latitude_photoperiod_diagnostic[.](svg|png)$",
"figure-s4", "^main_adherence_levels[.](svg|png)$",
"figure-s5a", "^main_site_workday[.](svg|png)$",
"figure-s5b", "^main_site_free_work[.](svg|png)$",
"figure-s6", "^participant_state_raincloud[.](svg|png)$",
"figure-s7", "^H01.*model_support[.](svg|png)$",
"figure-s8", "^H07.*smooth_derivative_pairs_near_eye[.](svg|png)$",
"figure-s9", "^H03_light_source_patterns[.](svg|png)$",
"figure-s10", "^H06_paired_placement_effects[.](svg|png)$",
"figure-s11", "^H06_reader_temporal_day_type[.](svg|png)$",
"figure-s12", "^H06_reader_temporal_activity[.](svg|png)$",
"figure-s13", "^H06.*site_specific_significance_screen[.](svg|png)$",
"figure-s14", "^H05_reader_near_eye_effects[.](svg|png)$",
"figure-s15", "^H08_near_eye_effects[.](svg|png)$",
"figure-s16", "^H09_primary_effects[.](svg|png)$",
"figure-s17", "^H09_observed_timing_patterns[.](svg|png)$",
"figure-s18", "^H10_age_site_significant_associations[.](svg|png)$",
"figure-s19", "^H11_reader_primary_near_eye_curves[.](svg|png)$"
)
figure_sources# A tibble: 23 × 2
figure source_pattern
<chr> <chr>
1 figure-1 ^descriptive_overview[.](svg|png)$
2 figure-2 ^daily_patterns[.](svg|png)$
3 figure-3 ^H04.*manuscript_figure3[.](svg|png)$
4 figure-s1 ^near_eye_metric_distributions[.](svg|png)$
5 figure-s2 ^time_series_to_metrics[.](svg|png)$
6 figure-s3 ^latitude_photoperiod_diagnostic[.](svg|png)$
7 figure-s4 ^main_adherence_levels[.](svg|png)$
8 figure-s5a ^main_site_workday[.](svg|png)$
9 figure-s5b ^main_site_free_work[.](svg|png)$
10 figure-s6 ^participant_state_raincloud[.](svg|png)$
# ℹ 13 more rows
figure_paths <- purrr::map2_dfr(
figure_sources$figure,
figure_sources$source_pattern,
publish_figure
)
readr::write_csv(
figure_paths,
"results/csv/source_data/publication/figure-paths.csv"
)
figure_paths# A tibble: 23 × 3
figure path png
<chr> <chr> <chr>
1 figure-1 results/images/manuscript/figure-1.svg results/images/manuscrip…
2 figure-2 results/images/manuscript/figure-2.svg results/images/manuscrip…
3 figure-3 results/images/manuscript/figure-3.svg results/images/manuscrip…
4 figure-s1 results/images/manuscript/figure-s1.svg results/images/manuscrip…
5 figure-s2 results/images/manuscript/figure-s2.svg results/images/manuscrip…
6 figure-s3 results/images/manuscript/figure-s3.svg results/images/manuscrip…
7 figure-s4 results/images/manuscript/figure-s4.svg results/images/manuscrip…
8 figure-s5a results/images/manuscript/figure-s5a.svg results/images/manuscrip…
9 figure-s5b results/images/manuscript/figure-s5b.svg results/images/manuscrip…
10 figure-s6 results/images/manuscript/figure-s6.svg results/images/manuscrip…
# ℹ 13 more rows
The manuscript and supplementary material now read these tables and images. Their figures and tables do not require pre-existing rendered pages or manual copying.
Word table layout
The manuscript uses native, editable Word tables. After Quarto writes docs/index.docx, the project hook scripts/reporting/word-layout.R normalises paragraph alignment, keeps table rows together, repeats column headings and gives wide tables landscape pages. It reads the newly rendered Word file and changes layout properties only; the text, numerical cells and embedded figures are preserved. This step runs automatically as part of quarto render.