diff --git a/crates/snowbound/assets/icons/badge-add.svg b/crates/snowbound/assets/icons/badge-add.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6a24fd7b57dbbe1c67d61bcfee83f7d0015cfdda
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-add.svg
@@ -0,0 +1,9 @@
+
diff --git a/crates/snowbound/assets/icons/badge-brush.svg b/crates/snowbound/assets/icons/badge-brush.svg
new file mode 100644
index 0000000000000000000000000000000000000000..488947e7945335b5a59d0f667165e9fe7d514321
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-brush.svg
@@ -0,0 +1,9 @@
+
diff --git a/crates/snowbound/assets/icons/badge-check.svg b/crates/snowbound/assets/icons/badge-check.svg
new file mode 100644
index 0000000000000000000000000000000000000000..be4bb448613d30e0f77ce78ccc0a27ca9fdb76d2
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-check.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/badge-close.svg b/crates/snowbound/assets/icons/badge-close.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2ead4c106109576a4143bbd04572986f53cb2465
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-close.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/badge-command.svg b/crates/snowbound/assets/icons/badge-command.svg
new file mode 100644
index 0000000000000000000000000000000000000000..450dd8626d03f8a5900f5616c787891717c79627
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-command.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/badge-drop.svg b/crates/snowbound/assets/icons/badge-drop.svg
new file mode 100644
index 0000000000000000000000000000000000000000..892deb92b4332ba08122c3b971a44ebc4c43097c
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-drop.svg
@@ -0,0 +1,9 @@
+
diff --git a/crates/snowbound/assets/icons/badge-edit.svg b/crates/snowbound/assets/icons/badge-edit.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2bc5bae27184923c8c5f9f329750328fee3f8268
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-edit.svg
@@ -0,0 +1,13 @@
+
diff --git a/crates/snowbound/assets/icons/badge-go.svg b/crates/snowbound/assets/icons/badge-go.svg
new file mode 100644
index 0000000000000000000000000000000000000000..29e0bb1dda227c2f86bc3653cf8a83f64023c53a
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-go.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/badge-history.svg b/crates/snowbound/assets/icons/badge-history.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5ea55cc3e28815d98276380702c2e91f24784bf8
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-history.svg
@@ -0,0 +1,10 @@
+
diff --git a/crates/snowbound/assets/icons/badge-link.svg b/crates/snowbound/assets/icons/badge-link.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ecd1881e768ad55fa3c101cc1e48849cf1966c83
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-link.svg
@@ -0,0 +1,18 @@
+
diff --git a/crates/snowbound/assets/icons/badge-live.svg b/crates/snowbound/assets/icons/badge-live.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8903bae0794d8f1975c7b4ac2db22d6f61de91db
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-live.svg
@@ -0,0 +1,9 @@
+
diff --git a/crates/snowbound/assets/icons/badge-lock.svg b/crates/snowbound/assets/icons/badge-lock.svg
new file mode 100644
index 0000000000000000000000000000000000000000..133ed9c7a428580a3a0334f8020b4fc52b10c5be
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-lock.svg
@@ -0,0 +1,12 @@
+
diff --git a/crates/snowbound/assets/icons/badge-merge.svg b/crates/snowbound/assets/icons/badge-merge.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2ec9135836d2faf7b502f4fd74888e8c93c19e73
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-merge.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/badge-picture.svg b/crates/snowbound/assets/icons/badge-picture.svg
new file mode 100644
index 0000000000000000000000000000000000000000..204336904187ef3a42f0a2787f1505b2717531c6
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-picture.svg
@@ -0,0 +1,9 @@
+
diff --git a/crates/snowbound/assets/icons/badge-play.svg b/crates/snowbound/assets/icons/badge-play.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4c282d86afe0597efcd5adbe6226f3cb642f88ea
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-play.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/badge-remove.svg b/crates/snowbound/assets/icons/badge-remove.svg
new file mode 100644
index 0000000000000000000000000000000000000000..dd63aa98104e3aadc53d4001a5cd326ac84bbc9e
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-remove.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/badge-search.svg b/crates/snowbound/assets/icons/badge-search.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8b693e69012fe8032ad0ac004b0514bf9dc53b99
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-search.svg
@@ -0,0 +1,17 @@
+
diff --git a/crates/snowbound/assets/icons/badge-text.svg b/crates/snowbound/assets/icons/badge-text.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ff52e8a46222dfa73ff52fb4bea41a4d796d3e28
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-text.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/badge-unread.svg b/crates/snowbound/assets/icons/badge-unread.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e57fb3b82ce4d4f7f4cd7a999bb47a7768630c45
--- /dev/null
+++ b/crates/snowbound/assets/icons/badge-unread.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/citation.svg b/crates/snowbound/assets/icons/citation.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ca47a0a0ccb85a199fc18d9c33d485a300ab8d28
--- /dev/null
+++ b/crates/snowbound/assets/icons/citation.svg
@@ -0,0 +1,4 @@
+
diff --git a/crates/snowbound/assets/icons/code.svg b/crates/snowbound/assets/icons/code.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b6cada06a764a762b9e880b416b3da00c750bd4f
--- /dev/null
+++ b/crates/snowbound/assets/icons/code.svg
@@ -0,0 +1,5 @@
+
diff --git a/crates/snowbound/assets/icons/delete.svg b/crates/snowbound/assets/icons/delete.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fcb15dd49f9029d32793159828a130214be037e7
--- /dev/null
+++ b/crates/snowbound/assets/icons/delete.svg
@@ -0,0 +1,9 @@
+
diff --git a/crates/snowbound/assets/icons/digit-1.svg b/crates/snowbound/assets/icons/digit-1.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3adbd06eb828f49e0f27aa23ed27cc0db20fe8a8
--- /dev/null
+++ b/crates/snowbound/assets/icons/digit-1.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/snowbound/assets/icons/digit-2.svg b/crates/snowbound/assets/icons/digit-2.svg
new file mode 100644
index 0000000000000000000000000000000000000000..38db6d9a6f4311428957be6c64e72b0b6998d210
--- /dev/null
+++ b/crates/snowbound/assets/icons/digit-2.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/snowbound/assets/icons/digit-3.svg b/crates/snowbound/assets/icons/digit-3.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7f84c67ade9a631a4c8484427ca36253b3010af0
--- /dev/null
+++ b/crates/snowbound/assets/icons/digit-3.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/snowbound/assets/icons/digit-4.svg b/crates/snowbound/assets/icons/digit-4.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1f20a46cc0eefb4644e76206f29f9f8071ef2386
--- /dev/null
+++ b/crates/snowbound/assets/icons/digit-4.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/snowbound/assets/icons/digit-5.svg b/crates/snowbound/assets/icons/digit-5.svg
new file mode 100644
index 0000000000000000000000000000000000000000..91dab683c7e175b56980ff06e4632e3aaedb09ba
--- /dev/null
+++ b/crates/snowbound/assets/icons/digit-5.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/snowbound/assets/icons/digit-6.svg b/crates/snowbound/assets/icons/digit-6.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c94448cbc412248dd5025c7a6f40c79ba03eb60f
--- /dev/null
+++ b/crates/snowbound/assets/icons/digit-6.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/snowbound/assets/icons/fast-forward.svg b/crates/snowbound/assets/icons/fast-forward.svg
new file mode 100644
index 0000000000000000000000000000000000000000..12f27e4f50aeeadfa92f89ff594914017e0a0985
--- /dev/null
+++ b/crates/snowbound/assets/icons/fast-forward.svg
@@ -0,0 +1,10 @@
+
diff --git a/crates/snowbound/assets/icons/folder-open.svg b/crates/snowbound/assets/icons/folder-open.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c2c396a75326a0704c5e7f070dbe492c304197e3
--- /dev/null
+++ b/crates/snowbound/assets/icons/folder-open.svg
@@ -0,0 +1,14 @@
+
diff --git a/crates/snowbound/assets/icons/full-page.svg b/crates/snowbound/assets/icons/full-page.svg
new file mode 100644
index 0000000000000000000000000000000000000000..79bc8809c0e2ba7800643084ff2192664f1eef0c
--- /dev/null
+++ b/crates/snowbound/assets/icons/full-page.svg
@@ -0,0 +1,10 @@
+
diff --git a/crates/snowbound/assets/icons/heading.svg b/crates/snowbound/assets/icons/heading.svg
new file mode 100644
index 0000000000000000000000000000000000000000..286e08ba13283981a788d6cc4e05fd760e45c3d6
--- /dev/null
+++ b/crates/snowbound/assets/icons/heading.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/snowbound/assets/icons/help.svg b/crates/snowbound/assets/icons/help.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fc766d227a68a4ae1108e57fd7249cb87b97e550
--- /dev/null
+++ b/crates/snowbound/assets/icons/help.svg
@@ -0,0 +1,10 @@
+
diff --git a/crates/snowbound/assets/icons/lock.svg b/crates/snowbound/assets/icons/lock.svg
new file mode 100644
index 0000000000000000000000000000000000000000..87172b29cf4f4592053c81c1c5121ae0385d568c
--- /dev/null
+++ b/crates/snowbound/assets/icons/lock.svg
@@ -0,0 +1,13 @@
+
diff --git a/crates/snowbound/assets/icons/markdown.svg b/crates/snowbound/assets/icons/markdown.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b226a0f7fc0b06e32cea4f49ffe3dc2e17e7769c
--- /dev/null
+++ b/crates/snowbound/assets/icons/markdown.svg
@@ -0,0 +1,9 @@
+
diff --git a/crates/snowbound/assets/icons/move-down.svg b/crates/snowbound/assets/icons/move-down.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8a70447047cfdf6536693ba504595e367b50dcfb
--- /dev/null
+++ b/crates/snowbound/assets/icons/move-down.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/move-up.svg b/crates/snowbound/assets/icons/move-up.svg
new file mode 100644
index 0000000000000000000000000000000000000000..646ea33b380ac30c9f14e646cd2ef076d0522b58
--- /dev/null
+++ b/crates/snowbound/assets/icons/move-up.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/normal.svg b/crates/snowbound/assets/icons/normal.svg
new file mode 100644
index 0000000000000000000000000000000000000000..de22a34f73774c73b37af7ac7ee6f20045336f57
--- /dev/null
+++ b/crates/snowbound/assets/icons/normal.svg
@@ -0,0 +1,4 @@
+
diff --git a/crates/snowbound/assets/icons/notebook-accent.svg b/crates/snowbound/assets/icons/notebook-accent.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2edeb40e090ab520b7ea4946049fad5580cb5a97
--- /dev/null
+++ b/crates/snowbound/assets/icons/notebook-accent.svg
@@ -0,0 +1,6 @@
+
diff --git a/crates/snowbound/assets/icons/page-list.svg b/crates/snowbound/assets/icons/page-list.svg
new file mode 100644
index 0000000000000000000000000000000000000000..60ee976254d0f805c775a8ed344e2b9a850c2bac
--- /dev/null
+++ b/crates/snowbound/assets/icons/page-list.svg
@@ -0,0 +1,14 @@
+
diff --git a/crates/snowbound/assets/icons/page-title.svg b/crates/snowbound/assets/icons/page-title.svg
new file mode 100644
index 0000000000000000000000000000000000000000..245a7029944c6d0dfd7a0f055e6dc1c2ba3281c9
--- /dev/null
+++ b/crates/snowbound/assets/icons/page-title.svg
@@ -0,0 +1,6 @@
+
diff --git a/crates/snowbound/assets/icons/pages-match-theme.svg b/crates/snowbound/assets/icons/pages-match-theme.svg
new file mode 100644
index 0000000000000000000000000000000000000000..97709c3486c46440699e3cb43668b33f309d35d6
--- /dev/null
+++ b/crates/snowbound/assets/icons/pages-match-theme.svg
@@ -0,0 +1,14 @@
+
diff --git a/crates/snowbound/assets/icons/palette.svg b/crates/snowbound/assets/icons/palette.svg
new file mode 100644
index 0000000000000000000000000000000000000000..00dcdb8396d989e54f146521f13ab5723496b0c4
--- /dev/null
+++ b/crates/snowbound/assets/icons/palette.svg
@@ -0,0 +1,13 @@
+
diff --git a/crates/snowbound/assets/icons/pause.svg b/crates/snowbound/assets/icons/pause.svg
new file mode 100644
index 0000000000000000000000000000000000000000..52b1f09ea96cce2221ae482e55096c2c210013e2
--- /dev/null
+++ b/crates/snowbound/assets/icons/pause.svg
@@ -0,0 +1,12 @@
+
diff --git a/crates/snowbound/assets/icons/pdf.svg b/crates/snowbound/assets/icons/pdf.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fc092d4e4af92031b1cf4526d68cc91b2987e3d4
--- /dev/null
+++ b/crates/snowbound/assets/icons/pdf.svg
@@ -0,0 +1,14 @@
+
diff --git a/crates/snowbound/assets/icons/print.svg b/crates/snowbound/assets/icons/print.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1920fb98beac88ccfa668650f63cb79ad0330954
--- /dev/null
+++ b/crates/snowbound/assets/icons/print.svg
@@ -0,0 +1,17 @@
+
diff --git a/crates/snowbound/assets/icons/properties.svg b/crates/snowbound/assets/icons/properties.svg
new file mode 100644
index 0000000000000000000000000000000000000000..58577cdacbf19c49c11aefb4e2873c60746015cd
--- /dev/null
+++ b/crates/snowbound/assets/icons/properties.svg
@@ -0,0 +1,13 @@
+
diff --git a/crates/snowbound/assets/icons/quote.svg b/crates/snowbound/assets/icons/quote.svg
new file mode 100644
index 0000000000000000000000000000000000000000..450ab375175d1df562fc0b571189acb864351300
--- /dev/null
+++ b/crates/snowbound/assets/icons/quote.svg
@@ -0,0 +1,10 @@
+
diff --git a/crates/snowbound/assets/icons/recycle-bin.svg b/crates/snowbound/assets/icons/recycle-bin.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d756cd96c9a7cdc5158e66d82b5c8524d26eb014
--- /dev/null
+++ b/crates/snowbound/assets/icons/recycle-bin.svg
@@ -0,0 +1,14 @@
+
diff --git a/crates/snowbound/assets/icons/rename.svg b/crates/snowbound/assets/icons/rename.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5db86dc5a1a14ecdfd7b1157a2d994fe69b93dee
--- /dev/null
+++ b/crates/snowbound/assets/icons/rename.svg
@@ -0,0 +1,11 @@
+
diff --git a/crates/snowbound/assets/icons/rewind.svg b/crates/snowbound/assets/icons/rewind.svg
new file mode 100644
index 0000000000000000000000000000000000000000..64fa9fabde130ef93bd9e82558d8c29a9736fdc5
--- /dev/null
+++ b/crates/snowbound/assets/icons/rewind.svg
@@ -0,0 +1,10 @@
+
diff --git a/crates/snowbound/assets/icons/save.svg b/crates/snowbound/assets/icons/save.svg
new file mode 100644
index 0000000000000000000000000000000000000000..108ababff2a64a2c9160c840521cd6518f0ef9b9
--- /dev/null
+++ b/crates/snowbound/assets/icons/save.svg
@@ -0,0 +1,14 @@
+
diff --git a/crates/snowbound/assets/icons/select-all.svg b/crates/snowbound/assets/icons/select-all.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b18fd21f9fcc8b43853d522531b98cff0b19ed57
--- /dev/null
+++ b/crates/snowbound/assets/icons/select-all.svg
@@ -0,0 +1,11 @@
+
diff --git a/crates/snowbound/assets/icons/snap-to-grid.svg b/crates/snowbound/assets/icons/snap-to-grid.svg
new file mode 100644
index 0000000000000000000000000000000000000000..95a16f8c4b6885dcd79dcbc37c1ce5fc46035341
--- /dev/null
+++ b/crates/snowbound/assets/icons/snap-to-grid.svg
@@ -0,0 +1,10 @@
+
diff --git a/crates/snowbound/assets/icons/stop.svg b/crates/snowbound/assets/icons/stop.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2a46a309938c4f4cdef30fda99c4979bfb26e1c2
--- /dev/null
+++ b/crates/snowbound/assets/icons/stop.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/subpage.svg b/crates/snowbound/assets/icons/subpage.svg
new file mode 100644
index 0000000000000000000000000000000000000000..7db2928a3b5f1acdc38ba450c3ce802cedcf8791
--- /dev/null
+++ b/crates/snowbound/assets/icons/subpage.svg
@@ -0,0 +1,13 @@
+
diff --git a/crates/snowbound/assets/icons/sync-now.svg b/crates/snowbound/assets/icons/sync-now.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0fee84561056e421f87e5a5d7d68fa84d9086242
--- /dev/null
+++ b/crates/snowbound/assets/icons/sync-now.svg
@@ -0,0 +1,13 @@
+
diff --git a/crates/snowbound/assets/icons/tab.svg b/crates/snowbound/assets/icons/tab.svg
new file mode 100644
index 0000000000000000000000000000000000000000..da46ad2b534f6a8c6eb540fc7b86b7f46004c0db
--- /dev/null
+++ b/crates/snowbound/assets/icons/tab.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/tag.svg b/crates/snowbound/assets/icons/tag.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bfe52cb78931674863b544d7d39230175726c311
--- /dev/null
+++ b/crates/snowbound/assets/icons/tag.svg
@@ -0,0 +1,8 @@
+
diff --git a/crates/snowbound/assets/icons/theme.svg b/crates/snowbound/assets/icons/theme.svg
new file mode 100644
index 0000000000000000000000000000000000000000..09ce4ccd58161d1eee5795e9710e3a422e1e9d87
--- /dev/null
+++ b/crates/snowbound/assets/icons/theme.svg
@@ -0,0 +1,18 @@
+
diff --git a/crates/snowbound/assets/icons/to-do.svg b/crates/snowbound/assets/icons/to-do.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3b4befd4483206e8ca05099481bcab51eb9f67a1
--- /dev/null
+++ b/crates/snowbound/assets/icons/to-do.svg
@@ -0,0 +1,14 @@
+
diff --git a/crates/snowbound/assets/icons/update.svg b/crates/snowbound/assets/icons/update.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b2abf52eec5c88b0867bc56f49ca7e097ef2f69a
--- /dev/null
+++ b/crates/snowbound/assets/icons/update.svg
@@ -0,0 +1,9 @@
+
diff --git a/crates/snowbound/assets/icons/zoom-actual.svg b/crates/snowbound/assets/icons/zoom-actual.svg
new file mode 100644
index 0000000000000000000000000000000000000000..053a7e3d92c8e3ec9126b6c2b2b5b4098c42d30d
--- /dev/null
+++ b/crates/snowbound/assets/icons/zoom-actual.svg
@@ -0,0 +1,15 @@
+
diff --git a/crates/snowbound/src/art.rs b/crates/snowbound/src/art.rs
index ae7b4fe72debcf94cca1c646f4f7ea02cf8db9da..68988569e7a511920eb7a1a344236255dcdb2063 100644
--- a/crates/snowbound/src/art.rs
+++ b/crates/snowbound/src/art.rs
@@ -1,8 +1,9 @@
//! Artwork for the window's chrome: tinted interface icons and the toolbar's tag buttons.
+/// Artwork of one or more files under `assets/`, painted in order, as a badge over its icon.
macro_rules! art {
- ($path:literal) => {
- &[include_str!(concat!("../assets/", $path, ".svg"))]
+ ($($path:literal),+) => {
+ &[$(include_str!(concat!("../assets/", $path, ".svg"))),+]
};
}
@@ -97,3 +98,104 @@ pub const SHAPE_ARROW: &[&str] = art!("icons/shape-arrow");
pub const SHAPE_LINE: &[&str] = art!("icons/shape-line");
pub const SHAPE_OVAL: &[&str] = art!("icons/shape-oval");
pub const SHAPE_RECTANGLE: &[&str] = art!("icons/shape-rectangle");
+
+pub const ADD_TO_DICTIONARY: &[&str] = art!("icons/spelling", "icons/badge-add");
+pub const CITATION: &[&str] = art!("icons/citation");
+pub const CLOSE_NOTEBOOK: &[&str] = art!(
+ "icons/notebook-back",
+ "icons/notebook-accent",
+ "icons/notebook",
+ "icons/badge-close"
+);
+pub const CODE: &[&str] = art!("icons/code");
+pub const COMMAND_PALETTE: &[&str] = art!("icons/palette", "icons/badge-command");
+pub const COPY_LINK: &[&str] = art!("icons/page", "icons/badge-link");
+pub const CUSTOMIZE_THEME: &[&str] = art!("icons/theme", "icons/badge-edit");
+pub const CUSTOMIZE_TAGS: &[&str] = art!("icons/tag", "icons/badge-edit");
+pub const DELETE: &[&str] = art!("icons/delete");
+pub const EMPTY_RECYCLE_BIN: &[&str] = art!("icons/recycle-bin", "icons/badge-remove");
+pub const EXPORT_PDF: &[&str] = art!("icons/pdf");
+pub const FAST_FORWARD: &[&str] = art!("icons/fast-forward");
+pub const FIND: &[&str] = art!("icons/page", "icons/badge-search");
+pub const FULL_PAGE: &[&str] = art!("icons/full-page");
+pub const GO_TO: &[&str] = art!("icons/palette", "icons/badge-go");
+/// Heading 1 to 6, in order.
+pub const HEADINGS: [&[&str]; 6] = [
+ art!("icons/heading", "icons/digit-1"),
+ art!("icons/heading", "icons/digit-2"),
+ art!("icons/heading", "icons/digit-3"),
+ art!("icons/heading", "icons/digit-4"),
+ art!("icons/heading", "icons/digit-5"),
+ art!("icons/heading", "icons/digit-6"),
+];
+pub const HELP: &[&str] = art!("icons/help");
+pub const KEEP_SOURCE_FORMATTING: &[&str] = art!("icons/paste", "icons/badge-brush");
+pub const KEEP_TEXT_ONLY: &[&str] = art!("icons/paste", "icons/badge-text");
+pub const LIVE_SHARE: &[&str] = art!(
+ "icons/notebook-back",
+ "icons/notebook-accent",
+ "icons/notebook",
+ "icons/badge-live"
+);
+pub const LOCK: &[&str] = art!("icons/lock");
+pub const MARKDOWN: &[&str] = art!("icons/markdown");
+pub const MARK_NOTEBOOK_READ: &[&str] = art!(
+ "icons/notebook-back",
+ "icons/notebook-accent",
+ "icons/notebook",
+ "icons/badge-check"
+);
+pub const MARK_READ: &[&str] = art!("icons/page", "icons/badge-check");
+pub const MERGE_FORMATTING: &[&str] = art!("icons/paste", "icons/badge-merge");
+pub const MOVE: &[&str] = art!("icons/page", "icons/badge-go");
+pub const MOVE_DOWN: &[&str] = art!("icons/move-down");
+pub const MOVE_UP: &[&str] = art!("icons/move-up");
+pub const NEW_NOTEBOOK: &[&str] = art!(
+ "icons/notebook-back",
+ "icons/notebook-accent",
+ "icons/notebook",
+ "icons/badge-add"
+);
+pub const NEW_PAGE: &[&str] = art!("icons/page", "icons/badge-add");
+pub const NEW_SECTION: &[&str] = art!("icons/tab", "icons/badge-add");
+pub const NEW_SECTION_GROUP: &[&str] = art!("icons/section-group", "icons/badge-add");
+pub const NEW_SUBPAGE: &[&str] = art!("icons/subpage", "icons/badge-add");
+pub const NEXT_UNREAD: &[&str] = art!("icons/page", "icons/badge-unread");
+pub const NORMAL: &[&str] = art!("icons/normal");
+pub const OPEN: &[&str] = art!("icons/folder-open");
+pub const OPEN_SHARED: &[&str] = art!("icons/folder-open", "icons/badge-live");
+pub const PAGE_LIST: &[&str] = art!("icons/page-list");
+pub const PAGE_TITLE: &[&str] = art!("icons/page-title");
+pub const PAGE_VERSIONS: &[&str] = art!("icons/page", "icons/badge-history");
+pub const PAGES_MATCH_THEME: &[&str] = art!("icons/pages-match-theme");
+pub const PASSWORD: &[&str] = art!("icons/tab", "icons/badge-lock");
+pub const PASTE_PICTURE: &[&str] = art!("icons/paste", "icons/badge-picture");
+pub const PAUSE: &[&str] = art!("icons/pause");
+pub const PRINT: &[&str] = art!("icons/print");
+pub const PROPERTIES: &[&str] = art!("icons/properties");
+pub const QUOTE: &[&str] = art!("icons/quote");
+pub const RECYCLE_BIN: &[&str] = art!("icons/recycle-bin");
+pub const REMOVE_LINK: &[&str] = art!("icons/link", "icons/badge-remove");
+pub const REMOVE_TAG: &[&str] = art!("icons/tag", "icons/badge-remove");
+pub const RENAME: &[&str] = art!("icons/rename");
+pub const REWIND: &[&str] = art!("icons/rewind");
+pub const SAVE: &[&str] = art!("icons/save");
+pub const SEARCH_RESULTS: &[&str] = art!("icons/page-list", "icons/badge-search");
+pub const SECTION_COLOR: &[&str] = art!("icons/tab", "icons/badge-drop");
+pub const SEE_PLAYBACK: &[&str] = art!("icons/page", "icons/badge-play");
+pub const SEEK: &[&str] = art!("icons/clock", "icons/badge-go");
+pub const SELECT_ALL: &[&str] = art!("icons/select-all");
+pub const SHOW_UNREAD: &[&str] = art!(
+ "icons/notebook-back",
+ "icons/notebook-accent",
+ "icons/notebook",
+ "icons/badge-unread"
+);
+pub const SNAP_TO_GRID: &[&str] = art!("icons/snap-to-grid");
+pub const STOP: &[&str] = art!("icons/stop");
+pub const SUBPAGE: &[&str] = art!("icons/subpage");
+pub const SYNC_NOW: &[&str] = art!("icons/sync-now");
+pub const THEME: &[&str] = art!("icons/theme");
+pub const TO_DO: &[&str] = art!("icons/to-do");
+pub const UPDATE: &[&str] = art!("icons/update");
+pub const ZOOM_ACTUAL: &[&str] = art!("icons/zoom-actual");
diff --git a/crates/snowbound/src/history.rs b/crates/snowbound/src/history.rs
index d45d5b5ded4c2e3f6b09fc799bd1d0632b234d06..8e7ecdab19069b818739233798a54f83f18f8e10 100644
--- a/crates/snowbound/src/history.rs
+++ b/crates/snowbound/src/history.rs
@@ -96,25 +96,29 @@ pub fn menu(
text,
..Default::default()
};
+ let drawn = |text, icon| ui::popup::Item {
+ icon: Some(icon),
+ ..item(text)
+ };
let items = [
- item("Restore Version"),
- item("Delete Version"),
+ drawn("Restore Version", art::UNDO),
+ drawn("Delete Version", art::DELETE),
ui::popup::Item {
disabled: sections.is_empty(),
- ..item("Copy Page To…")
+ ..drawn("Copy Page To…", art::COPY)
},
ui::popup::Item {
separated: true,
- ..item("Delete All Versions in Section")
+ ..drawn("Delete All Versions in Section", art::DELETE)
},
ui::popup::Item {
disabled: !grouped,
- ..item("Delete All Versions in Section Group")
+ ..drawn("Delete All Versions in Section Group", art::DELETE)
},
- item("Delete All Versions in Notebook"),
+ drawn("Delete All Versions in Notebook", art::DELETE),
ui::popup::Item {
separated: true,
- ..item("Hide Page Versions")
+ ..drawn("Hide Page Versions", art::PAGE_VERSIONS)
},
];
let chosen = match ui::popup::menu(ui, menu, anchor, &items, None) {
diff --git a/crates/snowbound/src/link.rs b/crates/snowbound/src/link.rs
index 82f86b5059a3e8d201a44a9aacf44e271c512545..b7ccea295901f515bdb4087a7afcb9a93089da8d 100644
--- a/crates/snowbound/src/link.rs
+++ b/crates/snowbound/src/link.rs
@@ -2,7 +2,7 @@
//! the page's context menu, and following a clicked link, to a page
//! of the notebook or with the system's handler.
-use crate::{Command, State, commands, page, platform};
+use crate::{Command, State, art, commands, page, platform};
use onestore::ExGuid;
use onestore::page::link::{LinkTarget, internal_link};
use std::error::Error;
@@ -292,14 +292,18 @@ impl State {
text,
..Item::default()
};
+ let drawn = |text, icon| Item {
+ icon: Some(icon),
+ ..item(text)
+ };
// OneNote 2010 heads the menu on a marked word with its corrections.
let mut items = match &context.spelling {
Some(correction) if correction.repeated => vec![
- item("Delete Repeated Word"),
+ drawn("Delete Repeated Word", art::DELETE),
item("Ignore"),
Item {
separated: true,
- ..item("Spelling…")
+ ..drawn("Spelling…", art::SPELLING)
},
],
Some(correction) => {
@@ -319,10 +323,10 @@ impl State {
separated: true,
..item("Ignore")
},
- item("Add to Dictionary"),
+ drawn("Add to Dictionary", art::ADD_TO_DICTIONARY),
Item {
separated: true,
- ..item("Spelling…")
+ ..drawn("Spelling…", art::SPELLING)
},
]);
items
@@ -340,45 +344,46 @@ impl State {
.collect::>();
items.extend(if context.attachment.is_some() {
// OneNote 2010's commands for the file itself; its clipboard holds text alone.
- vec![item("Open"), item("Save As…")]
+ vec![drawn("Open", art::OPEN), drawn("Save As…", art::SAVE)]
} else {
let mut items = vec![
Item {
disabled: !context.selected,
separated: corrections > 0,
- ..item("Cut")
+ ..drawn("Cut", art::CUT)
},
Item {
disabled: !context.selected,
- ..item("Copy")
+ ..drawn("Copy", art::COPY)
},
- item("Paste"),
+ drawn("Paste", art::PASTE),
];
match &context.link {
Some(_) => items.extend([
Item {
separated: true,
- ..item("Edit Link…")
+ ..drawn("Edit Link…", art::LINK)
},
- item("Copy Link to Paragraph"),
+ drawn("Copy Link to Paragraph", art::COPY_LINK),
Item {
separated: true,
- ..item("Copy Link")
+ ..drawn("Copy Link", art::COPY_LINK)
},
- item("Select Link"),
- item("Remove Link"),
+ drawn("Select Link", art::SELECT),
+ drawn("Remove Link", art::REMOVE_LINK),
]),
None => items.extend([
Item {
separated: true,
- ..item("Link…")
+ ..drawn("Link…", art::LINK)
},
- item("Copy Link to Paragraph"),
+ drawn("Copy Link to Paragraph", art::COPY_LINK),
]),
}
for (at, id) in lists.iter().enumerate() {
items.push(Item {
separated: at == 0,
+ icon: crate::artwork(*id),
..item(commands::command(*id).title)
});
}
@@ -386,9 +391,9 @@ impl State {
items.extend([
Item {
separated: true,
- ..item("Professional")
+ ..drawn("Professional", art::EQUATION)
},
- item("Linear"),
+ drawn("Linear", art::EQUATION),
]);
}
items
diff --git a/crates/snowbound/src/main.rs b/crates/snowbound/src/main.rs
index 1a7143234bb15f86f428031cea8c93d37a3818df..4e47a319333a13ab2638e013a37f3c8873bf2912 100644
--- a/crates/snowbound/src/main.rs
+++ b/crates/snowbound/src/main.rs
@@ -2227,18 +2227,19 @@ impl State {
choice = dropdown(ui, "menu", head, &entries, status_of).or(choice);
// Pasting keeps only the text until #25.
let options = [
- ("Keep Source Formatting", false),
- ("Merge Formatting", false),
- ("Keep Text Only", true),
- ("Picture", false),
+ ("Keep Source Formatting", false, art::KEEP_SOURCE_FORMATTING),
+ ("Merge Formatting", false, art::MERGE_FORMATTING),
+ ("Keep Text Only", true, art::KEEP_TEXT_ONLY),
+ ("Picture", false, art::PASTE_PICTURE),
];
let mut items = vec![ui::popup::Item {
text: "Paste Options",
heading: true,
..Default::default()
}];
- items.extend(options.map(|(text, enabled)| ui::popup::Item {
+ items.extend(options.map(|(text, enabled, icon)| ui::popup::Item {
text,
+ icon: Some(icon),
disabled: !enabled,
..Default::default()
}));
@@ -4710,21 +4711,25 @@ fn conflict_bar(ui: &mut Ui, bar: Bar, sections: &[&str], steps: [bool; 2]) -> O
let items = [
ui::popup::Item {
text: "Delete Conflict Page",
+ icon: Some(art::DELETE),
..Default::default()
},
ui::popup::Item {
text: "Copy Page To…",
+ icon: Some(art::COPY),
disabled: sections.is_empty(),
..Default::default()
},
ui::popup::Item {
text: "Select Previous Conflicting Change",
+ icon: Some(art::MOVE_UP),
disabled: !steps[0],
separated: true,
..Default::default()
},
ui::popup::Item {
text: "Select Next Conflicting Change",
+ icon: Some(art::MOVE_DOWN),
disabled: !steps[1],
..Default::default()
},
@@ -5545,10 +5550,12 @@ fn tag_tool(
clicked.then_some(commands::Choice::Command(commands::Id::Tag(place)))
}
-/// The artwork the toolbar and its menus show for command `id`.
+/// The artwork the toolbar, the menus and the palette show for command `id`; none for a
+/// tag, which shows its own.
fn artwork(id: commands::Id) -> Option<&'static [&'static str]> {
use canvas::editor::{Alignment, Toggle};
use commands::Id as Cmd;
+ use recording::Transport;
Some(match id {
Cmd::Back => art::BACK,
Cmd::Forward => art::FORWARD,
@@ -5601,7 +5608,64 @@ fn artwork(id: commands::Id) -> Option<&'static [&'static str]> {
Cmd::ZoomIn => art::ZOOM_IN,
Cmd::ZoomOut => art::ZOOM_OUT,
Cmd::HideSpelling | Cmd::Spelling => art::SPELLING,
- _ => return None,
+ Cmd::Settings => art::OPTIONS,
+ Cmd::NewNotebook => art::NEW_NOTEBOOK,
+ Cmd::OpenNotebook => art::OPEN,
+ Cmd::OpenFromServer => art::SERVER,
+ Cmd::CloseNotebook => art::CLOSE_NOTEBOOK,
+ Cmd::NewSection => art::NEW_SECTION,
+ Cmd::NewSectionGroup => art::NEW_SECTION_GROUP,
+ Cmd::NewPage => art::NEW_PAGE,
+ Cmd::NewSubpage => art::NEW_SUBPAGE,
+ Cmd::PageVersions => art::PAGE_VERSIONS,
+ Cmd::CopyPageLink => art::COPY_LINK,
+ Cmd::PasswordProtect => art::PASSWORD,
+ Cmd::LockAll => art::LOCK,
+ Cmd::ShowNotebook => art::FOLDER,
+ Cmd::SaveAs => art::SAVE,
+ Cmd::RecycleBin => art::RECYCLE_BIN,
+ Cmd::EmptyRecycleBin => art::EMPTY_RECYCLE_BIN,
+ Cmd::MarkRead => art::MARK_READ,
+ Cmd::MarkNotebookRead => art::MARK_NOTEBOOK_READ,
+ Cmd::ShowUnread => art::SHOW_UNREAD,
+ Cmd::NextUnread => art::NEXT_UNREAD,
+ Cmd::ExportPdf => art::EXPORT_PDF,
+ Cmd::Print => art::PRINT,
+ Cmd::SelectAll => art::SELECT_ALL,
+ Cmd::Find => art::FIND,
+ Cmd::Search => art::SEARCH,
+ Cmd::SearchResults => art::SEARCH_RESULTS,
+ Cmd::GoTo => art::GO_TO,
+ Cmd::CommandPalette => art::COMMAND_PALETTE,
+ Cmd::ActualSize => art::ZOOM_ACTUAL,
+ Cmd::Sidebar => art::SIDEBAR_EXPAND,
+ Cmd::PageList => art::PAGE_LIST,
+ Cmd::PagesMatchTheme => art::PAGES_MATCH_THEME,
+ Cmd::FullPageView => art::FULL_PAGE,
+ Cmd::Transport(Transport::Pause) => art::PAUSE,
+ Cmd::Transport(Transport::Stop) => art::STOP,
+ Cmd::Transport(Transport::Skip(seconds)) if seconds < 0 => art::REWIND,
+ Cmd::Transport(Transport::Skip(_)) => art::FAST_FORWARD,
+ Cmd::Transport(Transport::SeekTo) => art::SEEK,
+ Cmd::Transport(Transport::SeePlayback) => art::SEE_PLAYBACK,
+ Cmd::SnapToGrid => art::SNAP_TO_GRID,
+ Cmd::Style(level @ 0..6) => art::HEADINGS[level],
+ Cmd::Style(6) => art::PAGE_TITLE,
+ Cmd::Style(7) => art::CITATION,
+ Cmd::Style(8) => art::QUOTE,
+ Cmd::Style(9) => art::CODE,
+ Cmd::Style(_) => art::NORMAL,
+ Cmd::Themes => art::CUSTOMIZE_THEME,
+ Cmd::OpenShared => art::OPEN_SHARED,
+ Cmd::LiveShare => art::LIVE_SHARE,
+ Cmd::MarkdownShortcuts => art::MARKDOWN,
+ Cmd::CustomizeTags => art::CUSTOMIZE_TAGS,
+ Cmd::RemoveTags => art::REMOVE_TAG,
+ Cmd::ToDoList => art::TO_DO,
+ Cmd::BulletedList => art::BULLETS,
+ Cmd::Help => art::HELP,
+ Cmd::CheckForUpdates => art::UPDATE,
+ Cmd::Tag(_) => return None,
})
}
diff --git a/crates/snowbound/src/menus.rs b/crates/snowbound/src/menus.rs
index 07cc5337978dbfdfa739226fb0c961bfdac599fa..198c6e33aa6bb2e705583bcec740bebd4bd318dd 100644
--- a/crates/snowbound/src/menus.rs
+++ b/crates/snowbound/src/menus.rs
@@ -127,6 +127,49 @@ pub enum Action {
LiveShare,
}
+impl Action {
+ /// The artwork its menu item shows; none for a place or colour, which shows its own.
+ pub(crate) fn art(&self) -> Option<&'static [&'static str]> {
+ use crate::art;
+ Some(match self {
+ Action::Open => art::OPEN,
+ Action::Rename => art::RENAME,
+ Action::Delete => art::DELETE,
+ Action::Move => art::MOVE,
+ Action::Copy => art::COPY,
+ Action::SaveAs => art::SAVE,
+ Action::RecycleBin => art::RECYCLE_BIN,
+ Action::EmptyRecycleBin => art::EMPTY_RECYCLE_BIN,
+ Action::MarkNotebookRead => art::MARK_NOTEBOOK_READ,
+ Action::CopyLink => art::COPY_LINK,
+ Action::NewPage => art::NEW_PAGE,
+ Action::NewSubpage => art::NEW_SUBPAGE,
+ Action::MakeSubpage => art::SUBPAGE,
+ Action::PromoteSubpage => art::OUTDENT,
+ Action::Versions(_) => art::PAGE_VERSIONS,
+ Action::NewSection => art::NEW_SECTION,
+ Action::NewGroup => art::NEW_SECTION_GROUP,
+ Action::Reveal => art::FOLDER,
+ Action::Close => art::CLOSE_NOTEBOOK,
+ Action::Theme => art::THEME,
+ Action::Colors => art::SECTION_COLOR,
+ Action::Sync => art::SYNC_NOW,
+ Action::NewNotebook => art::NEW_NOTEBOOK,
+ Action::Raise(true) => art::MOVE_UP,
+ Action::Raise(false) => art::MOVE_DOWN,
+ Action::Properties => art::PROPERTIES,
+ Action::Password => art::PASSWORD,
+ #[cfg(feature = "live")]
+ Action::LiveShare => art::LIVE_SHARE,
+ Action::Run
+ | Action::MoveTo(_)
+ | Action::CopyTo(_)
+ | Action::SyncStatus
+ | Action::Color(_) => return None,
+ })
+ }
+}
+
/// OneNote 2010's section and notebook colours, COLORREF, with their names in its Section
/// Color menu's order (`corpus/section-color/native`).
pub(crate) const SECTION_COLORS: [(u32, &str); 16] = [
@@ -281,6 +324,7 @@ impl State {
let badge = None;
let item = Item {
text,
+ icon: action.art(),
disabled,
separated,
submenu,
diff --git a/crates/snowbound/src/palette.rs b/crates/snowbound/src/palette.rs
index 4aca480a7d674177eb4441de8f9532b385619866..9102a4b9c519c4f959e5e594fc11260129f163fe 100644
--- a/crates/snowbound/src/palette.rs
+++ b/crates/snowbound/src/palette.rs
@@ -196,6 +196,7 @@ impl State {
Action::Run,
Item {
text: "Run",
+ icon: crate::artwork(id),
disabled: !self.status(&Choice::Command(id), &format).enabled,
..Item::default()
},
@@ -207,6 +208,7 @@ impl State {
Action::Open,
Item {
text: "Open",
+ icon: Action::Open.art(),
..Item::default()
},
),
diff --git a/crates/snowbound/src/themes.rs b/crates/snowbound/src/themes.rs
index 8bc8370444b8be2d09c1e5358a93293e8ea67708..76e49440bc97b971925e496ce34d9431ba3e0aa5 100644
--- a/crates/snowbound/src/themes.rs
+++ b/crates/snowbound/src/themes.rs
@@ -604,6 +604,11 @@ impl State {
.enumerate()
.map(|(at, (scope, _))| Item {
text: scope.name(),
+ icon: Some(match scope {
+ Scope::Page => crate::art::PAGE,
+ Scope::Section => crate::art::SECTION,
+ Scope::Notebook => crate::art::NOTEBOOK,
+ }),
current: at == 0,
..Item::default()
})
diff --git a/crates/ui/src/popup.rs b/crates/ui/src/popup.rs
index c68715a0753fbe01ef54978e9ec07e0f32455954..54411e33d5c3bf75bbd766782755f2664bb91cf1 100644
--- a/crates/ui/src/popup.rs
+++ b/crates/ui/src/popup.rs
@@ -656,19 +656,23 @@ fn menu_row(ui: &mut Ui, style: &Menu, matches: &Matches, owner: Role, row: Row)
if matches.icons {
let checked = item.checked == Some(true);
let tint = match item.tint {
- Some([red, green, blue, _]) if !checked => [red, green, blue, color[3]],
+ Some([red, green, blue, _]) if !checked => [red, green, blue, 1.0],
+ _ if item.disabled => style.text,
_ => color,
};
+ // Fading the whole icon dims art in its own colours too, as the toolbar does.
+ let [red, green, blue, alpha] = tint;
ui.leaf(
"icon",
Spec {
size: [px(ICON), fill()],
icon: if checked { Some(CHECK) } else { item.icon },
- color: Some(if item.disabled {
- mix(tint, style.fill, 0.5)
- } else {
- tint
- }),
+ color: Some([
+ red,
+ green,
+ blue,
+ alpha * if item.disabled { 0.4 } else { 1.0 },
+ ]),
..Spec::default()
},
);