From f85a71beb490a9f8cea0497af8d02358a24ce5b5 Mon Sep 17 00:00:00 2001 From: Zane Meyers Date: Tue, 5 May 2026 16:45:34 -0400 Subject: [PATCH] vault backup: 2026-05-05 16:45:34 --- .obsidian/community-plugins.json | 3 +- .obsidian/hotkeys.json | 16 + .../plugins/obsidian-toggle-list/data.json | 40 + .../plugins/obsidian-toggle-list/main.js | 1033 +++++++++++++++++ .../obsidian-toggle-list/manifest.json | 10 + .../plugins/templater-obsidian/data.json | 11 +- 1000-virginia.md | 2 +- 1990-k-street.md | 2 +- charlotte-south-end-hotel.md | 2 +- distributed-antenna-systems-takeoff.md | 6 +- emergency-communications-systems.md | 2 +- fire-alarm-takeoff.md | 9 +- hilltop-gardens.md | 14 +- ibc-construction-types.md | 2 +- ibc_s0403.md | 15 +- lightning-protection-takeoff.md | 2 +- pdi-building-types.md | 2 +- periodic/daily/2026-05-05.md | 10 + ...al-modeling-for-construction-estimating.md | 2 +- temp-power-takeoff.md | 11 +- timestamped/2026-01-09_10-00-03.md | 2 +- timestamped/2026-02-26_10-06-19.md | 2 +- timestamped/2026-05-05_11-53-09.md | 42 + two-way-takeoff.md | 27 +- 24 files changed, 1226 insertions(+), 41 deletions(-) create mode 100644 .obsidian/plugins/obsidian-toggle-list/data.json create mode 100644 .obsidian/plugins/obsidian-toggle-list/main.js create mode 100644 .obsidian/plugins/obsidian-toggle-list/manifest.json create mode 100644 periodic/daily/2026-05-05.md create mode 100644 timestamped/2026-05-05_11-53-09.md diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 9ca5ed7..4f0fd62 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -24,5 +24,6 @@ "pdf-plus", "copy-document-as-html", "templater-obsidian", - "wikipedia-search" + "wikipedia-search", + "obsidian-toggle-list" ] \ No newline at end of file diff --git a/.obsidian/hotkeys.json b/.obsidian/hotkeys.json index d941875..5259e3e 100644 --- a/.obsidian/hotkeys.json +++ b/.obsidian/hotkeys.json @@ -77,5 +77,21 @@ ], "key": "S" } + ], + "obsidian-toggle-list:Progress Checklist-Next": [ + { + "modifiers": [ + "Alt" + ], + "key": "A" + } + ], + "obsidian-toggle-list:Progress Checklist-Prev": [ + { + "modifiers": [ + "Alt" + ], + "key": "X" + } ] } \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-toggle-list/data.json b/.obsidian/plugins/obsidian-toggle-list/data.json new file mode 100644 index 0000000..7ee7a44 --- /dev/null +++ b/.obsidian/plugins/obsidian-toggle-list/data.json @@ -0,0 +1,40 @@ +{ + "pop_state": { + "popon": false, + "hot": false, + "incr": 0 + }, + "plot": false, + "cmd_list": [ + { + "index": 0, + "name": "Progress Checklist", + "tmp_name": "Command 0", + "bindings": [ + 0 + ], + "isPopOver": true + } + ], + "setup_list": [ + { + "index": 0, + "all_states": "* [ ]\n* [/]\n* [x]", + "states": [ + "* [ ]", + "* [/]", + "* [x]" + ], + "sorteds": [ + "* [ ]", + "* [/]", + "* [x]" + ], + "states_dict": {} + } + ], + "registedCmdName": [ + "Progress Checklist-Next", + "Progress Checklist-Prev" + ] +} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-toggle-list/main.js b/.obsidian/plugins/obsidian-toggle-list/main.js new file mode 100644 index 0000000..a63035a --- /dev/null +++ b/.obsidian/plugins/obsidian-toggle-list/main.js @@ -0,0 +1,1033 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// node_modules/colormap/colorScale.js +var require_colorScale = __commonJS({ + "node_modules/colormap/colorScale.js"(exports, module2) { + module2.exports = { + "jet": [{ "index": 0, "rgb": [0, 0, 131] }, { "index": 0.125, "rgb": [0, 60, 170] }, { "index": 0.375, "rgb": [5, 255, 255] }, { "index": 0.625, "rgb": [255, 255, 0] }, { "index": 0.875, "rgb": [250, 0, 0] }, { "index": 1, "rgb": [128, 0, 0] }], + "hsv": [{ "index": 0, "rgb": [255, 0, 0] }, { "index": 0.169, "rgb": [253, 255, 2] }, { "index": 0.173, "rgb": [247, 255, 2] }, { "index": 0.337, "rgb": [0, 252, 4] }, { "index": 0.341, "rgb": [0, 252, 10] }, { "index": 0.506, "rgb": [1, 249, 255] }, { "index": 0.671, "rgb": [2, 0, 253] }, { "index": 0.675, "rgb": [8, 0, 253] }, { "index": 0.839, "rgb": [255, 0, 251] }, { "index": 0.843, "rgb": [255, 0, 245] }, { "index": 1, "rgb": [255, 0, 6] }], + "hot": [{ "index": 0, "rgb": [0, 0, 0] }, { "index": 0.3, "rgb": [230, 0, 0] }, { "index": 0.6, "rgb": [255, 210, 0] }, { "index": 1, "rgb": [255, 255, 255] }], + "spring": [{ "index": 0, "rgb": [255, 0, 255] }, { "index": 1, "rgb": [255, 255, 0] }], + "summer": [{ "index": 0, "rgb": [0, 128, 102] }, { "index": 1, "rgb": [255, 255, 102] }], + "autumn": [{ "index": 0, "rgb": [255, 0, 0] }, { "index": 1, "rgb": [255, 255, 0] }], + "winter": [{ "index": 0, "rgb": [0, 0, 255] }, { "index": 1, "rgb": [0, 255, 128] }], + "bone": [{ "index": 0, "rgb": [0, 0, 0] }, { "index": 0.376, "rgb": [84, 84, 116] }, { "index": 0.753, "rgb": [169, 200, 200] }, { "index": 1, "rgb": [255, 255, 255] }], + "copper": [{ "index": 0, "rgb": [0, 0, 0] }, { "index": 0.804, "rgb": [255, 160, 102] }, { "index": 1, "rgb": [255, 199, 127] }], + "greys": [{ "index": 0, "rgb": [0, 0, 0] }, { "index": 1, "rgb": [255, 255, 255] }], + "yignbu": [{ "index": 0, "rgb": [8, 29, 88] }, { "index": 0.125, "rgb": [37, 52, 148] }, { "index": 0.25, "rgb": [34, 94, 168] }, { "index": 0.375, "rgb": [29, 145, 192] }, { "index": 0.5, "rgb": [65, 182, 196] }, { "index": 0.625, "rgb": [127, 205, 187] }, { "index": 0.75, "rgb": [199, 233, 180] }, { "index": 0.875, "rgb": [237, 248, 217] }, { "index": 1, "rgb": [255, 255, 217] }], + "greens": [{ "index": 0, "rgb": [0, 68, 27] }, { "index": 0.125, "rgb": [0, 109, 44] }, { "index": 0.25, "rgb": [35, 139, 69] }, { "index": 0.375, "rgb": [65, 171, 93] }, { "index": 0.5, "rgb": [116, 196, 118] }, { "index": 0.625, "rgb": [161, 217, 155] }, { "index": 0.75, "rgb": [199, 233, 192] }, { "index": 0.875, "rgb": [229, 245, 224] }, { "index": 1, "rgb": [247, 252, 245] }], + "yiorrd": [{ "index": 0, "rgb": [128, 0, 38] }, { "index": 0.125, "rgb": [189, 0, 38] }, { "index": 0.25, "rgb": [227, 26, 28] }, { "index": 0.375, "rgb": [252, 78, 42] }, { "index": 0.5, "rgb": [253, 141, 60] }, { "index": 0.625, "rgb": [254, 178, 76] }, { "index": 0.75, "rgb": [254, 217, 118] }, { "index": 0.875, "rgb": [255, 237, 160] }, { "index": 1, "rgb": [255, 255, 204] }], + "bluered": [{ "index": 0, "rgb": [0, 0, 255] }, { "index": 1, "rgb": [255, 0, 0] }], + "rdbu": [{ "index": 0, "rgb": [5, 10, 172] }, { "index": 0.35, "rgb": [106, 137, 247] }, { "index": 0.5, "rgb": [190, 190, 190] }, { "index": 0.6, "rgb": [220, 170, 132] }, { "index": 0.7, "rgb": [230, 145, 90] }, { "index": 1, "rgb": [178, 10, 28] }], + "picnic": [{ "index": 0, "rgb": [0, 0, 255] }, { "index": 0.1, "rgb": [51, 153, 255] }, { "index": 0.2, "rgb": [102, 204, 255] }, { "index": 0.3, "rgb": [153, 204, 255] }, { "index": 0.4, "rgb": [204, 204, 255] }, { "index": 0.5, "rgb": [255, 255, 255] }, { "index": 0.6, "rgb": [255, 204, 255] }, { "index": 0.7, "rgb": [255, 153, 255] }, { "index": 0.8, "rgb": [255, 102, 204] }, { "index": 0.9, "rgb": [255, 102, 102] }, { "index": 1, "rgb": [255, 0, 0] }], + "rainbow": [{ "index": 0, "rgb": [150, 0, 90] }, { "index": 0.125, "rgb": [0, 0, 200] }, { "index": 0.25, "rgb": [0, 25, 255] }, { "index": 0.375, "rgb": [0, 152, 255] }, { "index": 0.5, "rgb": [44, 255, 150] }, { "index": 0.625, "rgb": [151, 255, 0] }, { "index": 0.75, "rgb": [255, 234, 0] }, { "index": 0.875, "rgb": [255, 111, 0] }, { "index": 1, "rgb": [255, 0, 0] }], + "portland": [{ "index": 0, "rgb": [12, 51, 131] }, { "index": 0.25, "rgb": [10, 136, 186] }, { "index": 0.5, "rgb": [242, 211, 56] }, { "index": 0.75, "rgb": [242, 143, 56] }, { "index": 1, "rgb": [217, 30, 30] }], + "blackbody": [{ "index": 0, "rgb": [0, 0, 0] }, { "index": 0.2, "rgb": [230, 0, 0] }, { "index": 0.4, "rgb": [230, 210, 0] }, { "index": 0.7, "rgb": [255, 255, 255] }, { "index": 1, "rgb": [160, 200, 255] }], + "earth": [{ "index": 0, "rgb": [0, 0, 130] }, { "index": 0.1, "rgb": [0, 180, 180] }, { "index": 0.2, "rgb": [40, 210, 40] }, { "index": 0.4, "rgb": [230, 230, 50] }, { "index": 0.6, "rgb": [120, 70, 20] }, { "index": 1, "rgb": [255, 255, 255] }], + "electric": [{ "index": 0, "rgb": [0, 0, 0] }, { "index": 0.15, "rgb": [30, 0, 100] }, { "index": 0.4, "rgb": [120, 0, 100] }, { "index": 0.6, "rgb": [160, 90, 0] }, { "index": 0.8, "rgb": [230, 200, 0] }, { "index": 1, "rgb": [255, 250, 220] }], + "alpha": [{ "index": 0, "rgb": [255, 255, 255, 0] }, { "index": 1, "rgb": [255, 255, 255, 1] }], + "viridis": [{ "index": 0, "rgb": [68, 1, 84] }, { "index": 0.13, "rgb": [71, 44, 122] }, { "index": 0.25, "rgb": [59, 81, 139] }, { "index": 0.38, "rgb": [44, 113, 142] }, { "index": 0.5, "rgb": [33, 144, 141] }, { "index": 0.63, "rgb": [39, 173, 129] }, { "index": 0.75, "rgb": [92, 200, 99] }, { "index": 0.88, "rgb": [170, 220, 50] }, { "index": 1, "rgb": [253, 231, 37] }], + "inferno": [{ "index": 0, "rgb": [0, 0, 4] }, { "index": 0.13, "rgb": [31, 12, 72] }, { "index": 0.25, "rgb": [85, 15, 109] }, { "index": 0.38, "rgb": [136, 34, 106] }, { "index": 0.5, "rgb": [186, 54, 85] }, { "index": 0.63, "rgb": [227, 89, 51] }, { "index": 0.75, "rgb": [249, 140, 10] }, { "index": 0.88, "rgb": [249, 201, 50] }, { "index": 1, "rgb": [252, 255, 164] }], + "magma": [{ "index": 0, "rgb": [0, 0, 4] }, { "index": 0.13, "rgb": [28, 16, 68] }, { "index": 0.25, "rgb": [79, 18, 123] }, { "index": 0.38, "rgb": [129, 37, 129] }, { "index": 0.5, "rgb": [181, 54, 122] }, { "index": 0.63, "rgb": [229, 80, 100] }, { "index": 0.75, "rgb": [251, 135, 97] }, { "index": 0.88, "rgb": [254, 194, 135] }, { "index": 1, "rgb": [252, 253, 191] }], + "plasma": [{ "index": 0, "rgb": [13, 8, 135] }, { "index": 0.13, "rgb": [75, 3, 161] }, { "index": 0.25, "rgb": [125, 3, 168] }, { "index": 0.38, "rgb": [168, 34, 150] }, { "index": 0.5, "rgb": [203, 70, 121] }, { "index": 0.63, "rgb": [229, 107, 93] }, { "index": 0.75, "rgb": [248, 148, 65] }, { "index": 0.88, "rgb": [253, 195, 40] }, { "index": 1, "rgb": [240, 249, 33] }], + "warm": [{ "index": 0, "rgb": [125, 0, 179] }, { "index": 0.13, "rgb": [172, 0, 187] }, { "index": 0.25, "rgb": [219, 0, 170] }, { "index": 0.38, "rgb": [255, 0, 130] }, { "index": 0.5, "rgb": [255, 63, 74] }, { "index": 0.63, "rgb": [255, 123, 0] }, { "index": 0.75, "rgb": [234, 176, 0] }, { "index": 0.88, "rgb": [190, 228, 0] }, { "index": 1, "rgb": [147, 255, 0] }], + "cool": [{ "index": 0, "rgb": [125, 0, 179] }, { "index": 0.13, "rgb": [116, 0, 218] }, { "index": 0.25, "rgb": [98, 74, 237] }, { "index": 0.38, "rgb": [68, 146, 231] }, { "index": 0.5, "rgb": [0, 204, 197] }, { "index": 0.63, "rgb": [0, 247, 146] }, { "index": 0.75, "rgb": [0, 255, 88] }, { "index": 0.88, "rgb": [40, 255, 8] }, { "index": 1, "rgb": [147, 255, 0] }], + "rainbow-soft": [{ "index": 0, "rgb": [125, 0, 179] }, { "index": 0.1, "rgb": [199, 0, 180] }, { "index": 0.2, "rgb": [255, 0, 121] }, { "index": 0.3, "rgb": [255, 108, 0] }, { "index": 0.4, "rgb": [222, 194, 0] }, { "index": 0.5, "rgb": [150, 255, 0] }, { "index": 0.6, "rgb": [0, 255, 55] }, { "index": 0.7, "rgb": [0, 246, 150] }, { "index": 0.8, "rgb": [50, 167, 222] }, { "index": 0.9, "rgb": [103, 51, 235] }, { "index": 1, "rgb": [124, 0, 186] }], + "bathymetry": [{ "index": 0, "rgb": [40, 26, 44] }, { "index": 0.13, "rgb": [59, 49, 90] }, { "index": 0.25, "rgb": [64, 76, 139] }, { "index": 0.38, "rgb": [63, 110, 151] }, { "index": 0.5, "rgb": [72, 142, 158] }, { "index": 0.63, "rgb": [85, 174, 163] }, { "index": 0.75, "rgb": [120, 206, 163] }, { "index": 0.88, "rgb": [187, 230, 172] }, { "index": 1, "rgb": [253, 254, 204] }], + "cdom": [{ "index": 0, "rgb": [47, 15, 62] }, { "index": 0.13, "rgb": [87, 23, 86] }, { "index": 0.25, "rgb": [130, 28, 99] }, { "index": 0.38, "rgb": [171, 41, 96] }, { "index": 0.5, "rgb": [206, 67, 86] }, { "index": 0.63, "rgb": [230, 106, 84] }, { "index": 0.75, "rgb": [242, 149, 103] }, { "index": 0.88, "rgb": [249, 193, 135] }, { "index": 1, "rgb": [254, 237, 176] }], + "chlorophyll": [{ "index": 0, "rgb": [18, 36, 20] }, { "index": 0.13, "rgb": [25, 63, 41] }, { "index": 0.25, "rgb": [24, 91, 59] }, { "index": 0.38, "rgb": [13, 119, 72] }, { "index": 0.5, "rgb": [18, 148, 80] }, { "index": 0.63, "rgb": [80, 173, 89] }, { "index": 0.75, "rgb": [132, 196, 122] }, { "index": 0.88, "rgb": [175, 221, 162] }, { "index": 1, "rgb": [215, 249, 208] }], + "density": [{ "index": 0, "rgb": [54, 14, 36] }, { "index": 0.13, "rgb": [89, 23, 80] }, { "index": 0.25, "rgb": [110, 45, 132] }, { "index": 0.38, "rgb": [120, 77, 178] }, { "index": 0.5, "rgb": [120, 113, 213] }, { "index": 0.63, "rgb": [115, 151, 228] }, { "index": 0.75, "rgb": [134, 185, 227] }, { "index": 0.88, "rgb": [177, 214, 227] }, { "index": 1, "rgb": [230, 241, 241] }], + "freesurface-blue": [{ "index": 0, "rgb": [30, 4, 110] }, { "index": 0.13, "rgb": [47, 14, 176] }, { "index": 0.25, "rgb": [41, 45, 236] }, { "index": 0.38, "rgb": [25, 99, 212] }, { "index": 0.5, "rgb": [68, 131, 200] }, { "index": 0.63, "rgb": [114, 156, 197] }, { "index": 0.75, "rgb": [157, 181, 203] }, { "index": 0.88, "rgb": [200, 208, 216] }, { "index": 1, "rgb": [241, 237, 236] }], + "freesurface-red": [{ "index": 0, "rgb": [60, 9, 18] }, { "index": 0.13, "rgb": [100, 17, 27] }, { "index": 0.25, "rgb": [142, 20, 29] }, { "index": 0.38, "rgb": [177, 43, 27] }, { "index": 0.5, "rgb": [192, 87, 63] }, { "index": 0.63, "rgb": [205, 125, 105] }, { "index": 0.75, "rgb": [216, 162, 148] }, { "index": 0.88, "rgb": [227, 199, 193] }, { "index": 1, "rgb": [241, 237, 236] }], + "oxygen": [{ "index": 0, "rgb": [64, 5, 5] }, { "index": 0.13, "rgb": [106, 6, 15] }, { "index": 0.25, "rgb": [144, 26, 7] }, { "index": 0.38, "rgb": [168, 64, 3] }, { "index": 0.5, "rgb": [188, 100, 4] }, { "index": 0.63, "rgb": [206, 136, 11] }, { "index": 0.75, "rgb": [220, 174, 25] }, { "index": 0.88, "rgb": [231, 215, 44] }, { "index": 1, "rgb": [248, 254, 105] }], + "par": [{ "index": 0, "rgb": [51, 20, 24] }, { "index": 0.13, "rgb": [90, 32, 35] }, { "index": 0.25, "rgb": [129, 44, 34] }, { "index": 0.38, "rgb": [159, 68, 25] }, { "index": 0.5, "rgb": [182, 99, 19] }, { "index": 0.63, "rgb": [199, 134, 22] }, { "index": 0.75, "rgb": [212, 171, 35] }, { "index": 0.88, "rgb": [221, 210, 54] }, { "index": 1, "rgb": [225, 253, 75] }], + "phase": [{ "index": 0, "rgb": [145, 105, 18] }, { "index": 0.13, "rgb": [184, 71, 38] }, { "index": 0.25, "rgb": [186, 58, 115] }, { "index": 0.38, "rgb": [160, 71, 185] }, { "index": 0.5, "rgb": [110, 97, 218] }, { "index": 0.63, "rgb": [50, 123, 164] }, { "index": 0.75, "rgb": [31, 131, 110] }, { "index": 0.88, "rgb": [77, 129, 34] }, { "index": 1, "rgb": [145, 105, 18] }], + "salinity": [{ "index": 0, "rgb": [42, 24, 108] }, { "index": 0.13, "rgb": [33, 50, 162] }, { "index": 0.25, "rgb": [15, 90, 145] }, { "index": 0.38, "rgb": [40, 118, 137] }, { "index": 0.5, "rgb": [59, 146, 135] }, { "index": 0.63, "rgb": [79, 175, 126] }, { "index": 0.75, "rgb": [120, 203, 104] }, { "index": 0.88, "rgb": [193, 221, 100] }, { "index": 1, "rgb": [253, 239, 154] }], + "temperature": [{ "index": 0, "rgb": [4, 35, 51] }, { "index": 0.13, "rgb": [23, 51, 122] }, { "index": 0.25, "rgb": [85, 59, 157] }, { "index": 0.38, "rgb": [129, 79, 143] }, { "index": 0.5, "rgb": [175, 95, 130] }, { "index": 0.63, "rgb": [222, 112, 101] }, { "index": 0.75, "rgb": [249, 146, 66] }, { "index": 0.88, "rgb": [249, 196, 65] }, { "index": 1, "rgb": [232, 250, 91] }], + "turbidity": [{ "index": 0, "rgb": [34, 31, 27] }, { "index": 0.13, "rgb": [65, 50, 41] }, { "index": 0.25, "rgb": [98, 69, 52] }, { "index": 0.38, "rgb": [131, 89, 57] }, { "index": 0.5, "rgb": [161, 112, 59] }, { "index": 0.63, "rgb": [185, 140, 66] }, { "index": 0.75, "rgb": [202, 174, 88] }, { "index": 0.88, "rgb": [216, 209, 126] }, { "index": 1, "rgb": [233, 246, 171] }], + "velocity-blue": [{ "index": 0, "rgb": [17, 32, 64] }, { "index": 0.13, "rgb": [35, 52, 116] }, { "index": 0.25, "rgb": [29, 81, 156] }, { "index": 0.38, "rgb": [31, 113, 162] }, { "index": 0.5, "rgb": [50, 144, 169] }, { "index": 0.63, "rgb": [87, 173, 176] }, { "index": 0.75, "rgb": [149, 196, 189] }, { "index": 0.88, "rgb": [203, 221, 211] }, { "index": 1, "rgb": [254, 251, 230] }], + "velocity-green": [{ "index": 0, "rgb": [23, 35, 19] }, { "index": 0.13, "rgb": [24, 64, 38] }, { "index": 0.25, "rgb": [11, 95, 45] }, { "index": 0.38, "rgb": [39, 123, 35] }, { "index": 0.5, "rgb": [95, 146, 12] }, { "index": 0.63, "rgb": [152, 165, 18] }, { "index": 0.75, "rgb": [201, 186, 69] }, { "index": 0.88, "rgb": [233, 216, 137] }, { "index": 1, "rgb": [255, 253, 205] }], + "cubehelix": [{ "index": 0, "rgb": [0, 0, 0] }, { "index": 0.07, "rgb": [22, 5, 59] }, { "index": 0.13, "rgb": [60, 4, 105] }, { "index": 0.2, "rgb": [109, 1, 135] }, { "index": 0.27, "rgb": [161, 0, 147] }, { "index": 0.33, "rgb": [210, 2, 142] }, { "index": 0.4, "rgb": [251, 11, 123] }, { "index": 0.47, "rgb": [255, 29, 97] }, { "index": 0.53, "rgb": [255, 54, 69] }, { "index": 0.6, "rgb": [255, 85, 46] }, { "index": 0.67, "rgb": [255, 120, 34] }, { "index": 0.73, "rgb": [255, 157, 37] }, { "index": 0.8, "rgb": [241, 191, 57] }, { "index": 0.87, "rgb": [224, 220, 93] }, { "index": 0.93, "rgb": [218, 241, 142] }, { "index": 1, "rgb": [227, 253, 198] }] + }; + } +}); + +// node_modules/lerp/index.js +var require_lerp = __commonJS({ + "node_modules/lerp/index.js"(exports, module2) { + function lerp(v0, v1, t) { + return v0 * (1 - t) + v1 * t; + } + module2.exports = lerp; + } +}); + +// node_modules/colormap/index.js +var require_colormap = __commonJS({ + "node_modules/colormap/index.js"(exports, module2) { + "use strict"; + var colorScale = require_colorScale(); + var lerp = require_lerp(); + module2.exports = createColormap; + function createColormap(spec) { + var indicies, fromrgba, torgba, nsteps, cmap, colormap2, format, nshades, colors, alpha, i; + if (!spec) + spec = {}; + nshades = (spec.nshades || 72) - 1; + format = spec.format || "hex"; + colormap2 = spec.colormap; + if (!colormap2) + colormap2 = "jet"; + if (typeof colormap2 === "string") { + colormap2 = colormap2.toLowerCase(); + if (!colorScale[colormap2]) { + throw Error(colormap2 + " not a supported colorscale"); + } + cmap = colorScale[colormap2]; + } else if (Array.isArray(colormap2)) { + cmap = colormap2.slice(); + } else { + throw Error("unsupported colormap option", colormap2); + } + if (cmap.length > nshades + 1) { + throw new Error(colormap2 + " map requires nshades to be at least size " + cmap.length); + } + if (!Array.isArray(spec.alpha)) { + if (typeof spec.alpha === "number") { + alpha = [spec.alpha, spec.alpha]; + } else { + alpha = [1, 1]; + } + } else if (spec.alpha.length !== 2) { + alpha = [1, 1]; + } else { + alpha = spec.alpha.slice(); + } + indicies = cmap.map(function(c) { + return Math.round(c.index * nshades); + }); + alpha[0] = Math.min(Math.max(alpha[0], 0), 1); + alpha[1] = Math.min(Math.max(alpha[1], 0), 1); + var steps = cmap.map(function(c, i2) { + var index = cmap[i2].index; + var rgba = cmap[i2].rgb.slice(); + if (rgba.length === 4 && rgba[3] >= 0 && rgba[3] <= 1) { + return rgba; + } + rgba[3] = alpha[0] + (alpha[1] - alpha[0]) * index; + return rgba; + }); + var colors = []; + for (i = 0; i < indicies.length - 1; ++i) { + nsteps = indicies[i + 1] - indicies[i]; + fromrgba = steps[i]; + torgba = steps[i + 1]; + for (var j = 0; j < nsteps; j++) { + var amt = j / nsteps; + colors.push([ + Math.round(lerp(fromrgba[0], torgba[0], amt)), + Math.round(lerp(fromrgba[1], torgba[1], amt)), + Math.round(lerp(fromrgba[2], torgba[2], amt)), + lerp(fromrgba[3], torgba[3], amt) + ]); + } + } + colors.push(cmap[cmap.length - 1].rgb.concat(alpha[1])); + if (format === "hex") + colors = colors.map(rgb2hex); + else if (format === "rgbaString") + colors = colors.map(rgbaStr); + else if (format === "float") + colors = colors.map(rgb2float); + return colors; + } + function rgb2float(rgba) { + return [ + rgba[0] / 255, + rgba[1] / 255, + rgba[2] / 255, + rgba[3] + ]; + } + function rgb2hex(rgba) { + var dig, hex = "#"; + for (var i = 0; i < 3; ++i) { + dig = rgba[i]; + dig = dig.toString(16); + hex += ("00" + dig).substr(dig.length); + } + return hex; + } + function rgbaStr(rgba) { + return "rgba(" + rgba.join(",") + ")"; + } + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => ToggleList +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian3 = require("obsidian"); + +// src/suggester.ts +var import_obsidian = require("obsidian"); + +// src/settings.ts +var DEFAULT_STATEGROUP = [ + [ + "- ", + "- [ ] ", + "- [x] || {tasks-today}", + "" + ], + [ + "- [ ] ", + "- [ ] #p1 ", + "- [ ] #p2 ", + "- [ ] #p3 " + ], + [ + "- ? ", + "- ! ", + "- ~ " + ] +]; +var DEFAULT_CMD = [ + { + index: 0, + pop: false, + name: "Task", + tmp_name: "Task", + bindings: [0] + }, + { + index: 1, + pop: false, + name: "Task Priority", + tmp_name: "Task Priority", + bindings: [1] + }, + { + index: 2, + pop: false, + name: "Call out", + tmp_name: "Call out", + bindings: [2] + }, + { + index: 3, + pop: false, + name: "Task + Callout", + tmp_name: "Task + Callout", + bindings: [2, 0] + } +]; +var EMPTY_TOKEN = "{PARAGRAPH}"; +var OLD_DATE = "{tasks-today}"; +var PopState = class { + constructor() { + this.popon = false; + this.hot = false; + this.incr = 0; + } +}; +var Setup = class { + constructor(text) { + this.index = 0; + this.update(text); + } + update(text = "") { + this.all_states = text.replace(EMPTY_TOKEN, ""); + this.all_states = this.all_states.replace(OLD_DATE, "\u2705 {time:: YYYY-MM-DD}"); + this.states = this.all_states.split("\n"); + const ori_states = this.states; + const tmp = /* @__PURE__ */ new Map(); + const new_tmp = /* @__PURE__ */ new Map(); + ori_states.forEach((os, idx) => tmp.set(os, idx)); + this.sorteds = ori_states.slice(0); + this.sorteds = this.sorteds.sort((a, b) => b.length - a.length); + this.sorteds.forEach((ss, idx) => new_tmp.set(idx, tmp.get(ss))); + this.states_dict = new_tmp; + } +}; +var Command = class { + constructor(cmd) { + this.index = cmd.index || 0; + this.name = cmd.name || ""; + this.tmp_name = this.name; + this.bindings = cmd.bindings || Array(); + this.isPopOver = cmd.isPopOver || false; + } +}; +var ToggleListSettings = class { + constructor(fromFile) { + var _a; + this.pop_state = new PopState(); + this.plot = false; + this.cmd_list = fromFile == null ? void 0 : fromFile.cmd_list.map((cmd) => new Command(cmd)); + this.setup_list = (_a = fromFile == null ? void 0 : fromFile.setup_list) == null ? void 0 : _a.map((setup) => new Setup((setup == null ? void 0 : setup.all_states) || "")); + if (!this.setup_list) { + this.reset_setup_list(); + } + if (!this.cmd_list) { + this.reset_cmd_list(); + } + this.validate(); + } + addStateGroup() { + const chosen = DEFAULT_STATEGROUP.at(Math.floor(Math.random() * DEFAULT_STATEGROUP.length)) || []; + this.setup_list.push(new Setup(chosen.join("\n"))); + } + validate() { + this.cleanSetupList(); + this.cleanCmdList(); + } + reset_setup_list() { + this.setup_list = DEFAULT_STATEGROUP.map((setup) => { + return new Setup(setup.join("\n")); + }); + } + reset_cmd_list() { + this.cmd_list = DEFAULT_CMD.map((cmd) => { + return new Command(cmd); + }); + } + reset() { + this.reset_setup_list(); + this.reset_cmd_list(); + this.validate(); + } + cleanSetupList() { + this.setup_list = this.setup_list.map((setup) => { + const states = setup.states; + const states_ary = [...new Set(states)]; + return new Setup(states_ary.join("\n")); + }); + this.setup_list.forEach((setup, idx) => setup.index = idx); + } + cleanCmdList() { + this.cmd_list.forEach((cmd) => { + cmd.bindings = cmd.bindings.filter((b) => b < this.setup_list.length); + }); + this.cmd_list = this.cmd_list.filter((cmd) => cmd.bindings.length > 0); + } + cleanCmdListAfterSetupRemoved(removedIdx) { + this.cmd_list.forEach((cmd) => { + const nbinding = cmd.bindings.map(function(b) { + return b > removedIdx ? b - 1 : b == removedIdx ? -1 : b; + }); + cmd.bindings = nbinding.filter((b) => b >= 0); + }); + } + removeSetup(setup) { + const index = setup.index; + this.cleanCmdListAfterSetupRemoved(index); + this.setup_list.splice(index, 1)[0]; + this.validate(); + } +}; + +// src/tlAction.ts +var timeFormats = [ + { rule: /\\{time:: YYYY-MM-DD hh:mm\\}/, pattern: "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}" }, + { rule: /\\{time:: YYYY\/MM\/DD hh:mm\\}/, pattern: "\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}" }, + { rule: /\\{time:: YYYY-MM-DD\\}/, pattern: "\\d{4}-\\d{2}-\\d{2}" }, + { rule: /\\{time:: YYYY\/MM\/DD\\}/, pattern: "\\d{4}/\\d{2}/\\d{2}" }, + { rule: /\\{time:: hh:mm:ss\\}/, pattern: "\\d{2}:\\d{2}:\\d{2}" }, + { rule: /\\{time:: hh:mm\\}/, pattern: "\\d{2}:\\d{2}" }, + { rule: /\\{time:: YYYY-MM\\}/, pattern: "\\d{4}-\\d{2}" }, + { rule: /\\{time:: YYYY\/MM\\}/, pattern: "\\d{4}/\\d{2}" }, + { rule: /\\{time:: MM-DD\\}/, pattern: "\\d{2}-\\d{2}" }, + { rule: /\\{time:: MM\/DD\\}/, pattern: "\\d{2}/\\d{2}" }, + { rule: /\\{time:: YYYY\\}/, pattern: "\\d{4}" }, + { rule: /\\{time:: MM\\}/, pattern: "\\d{2}" }, + { rule: /\\{time:: DD\\}/, pattern: "\\d{2}" }, + { rule: /\\{time:: hh\\}/, pattern: "\\d{2}" }, + { rule: /\\{time:: mm\\}/, pattern: "\\d{2}" }, + { rule: /\\{time:: ss\\}/, pattern: "\\d{2}" } +]; +function formatDate(format, date) { + const day = date.getDate(); + const month = date.getMonth() + 1; + const year = date.getFullYear(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const seconds = date.getSeconds(); + const replacements = { + "YYYY": year.toString(), + "YY": String(year).slice(-2), + "MM": month.toString().padStart(2, "0"), + "DD": day.toString().padStart(2, "0"), + "hh": hours.toString().padStart(2, "0"), + "mm": minutes.toString().padStart(2, "0"), + "ss": seconds.toString().padStart(2, "0"), + "M": month.toString(), + "D": day.toString(), + "h": hours.toString(), + "m": minutes.toString(), + "s": seconds.toString() + }; + let formattedDate = format; + for (let key in replacements) { + formattedDate = formattedDate.replace(key, replacements[key]); + } + return formattedDate; +} +function setupCursor(cursor, offset, origin_set, new_set) { + const x0 = (origin_set == null ? void 0 : origin_set.x) || 0; + const y0 = (origin_set == null ? void 0 : origin_set.y) || 0; + const x1 = (new_set == null ? void 0 : new_set.x) || 0; + const y1 = (new_set == null ? void 0 : new_set.y) || 0; + const a = (origin_set == null ? void 0 : origin_set.a) || 0; + const z = (origin_set == null ? void 0 : origin_set.z) || 0; + if (cursor.ch <= x0) + cursor.ch = x1; + else if (cursor.ch <= x0 + a) + cursor.ch = cursor.ch + offset; + else if (cursor.ch > x0 + a && cursor.ch <= x0 + a + y0) + cursor.ch = x1 + a; + else + cursor.ch = x1 + a + y1 + z; + return cursor; +} +function triggerSuggestionEditorByToggleState(editor, cmd, settings, direction) { + const cursor = editor.getCursor(); + const line = editor.getLine(cursor.line); + for (let i = 0; i < cmd.bindings.length; i++) { + const setup = settings.setup_list[cmd.bindings[i]]; + const r = match_sg(line, setup); + if (r.success) { + const stateIdx = r.offset; + const result = processOneLine(line, setup, -1, direction); + editor.setLine(cursor.line, result.content); + const new_cursor = setupCursor(cursor, result.offset, result.origin_set, result.new_set); + editor.setCursor(new_cursor.line, new_cursor.ch); + if (cmd.isPopOver) + settings.pop_state.hot = true; + settings.pop_context = { setup, stateIdx, direction }; + return; + } + } +} +function popAction(editor, cmd, settings, direction, app) { + const selections = editor.listSelections()[0]; + const isMultiLine = selections.anchor.line != selections.head.line; + if (!isMultiLine) { + return triggerSuggestionEditorByToggleState(editor, cmd, settings, direction); + } else { + return toggleAction(editor, settings.setup_list, cmd.bindings, direction); + } +} +function renderEmptyLine(text) { + const emptyline = EMPTY_TOKEN + "\n"; + const emptyline_last = "\n" + EMPTY_TOKEN; + let result = text.replace(/(^\n)/gm, emptyline); + result = result.replace(/\n$/gm, emptyline_last); + if (result == "") + result = EMPTY_TOKEN; + return result; +} +function getFormatTime(time_format) { + const now = new Date(new Date().getTime()); + const convertTime = formatDate(time_format, now) || ""; + return convertTime; +} +function applyTimeFormats(text) { + const regex = /\{(time::.*)\}/; + const ff = text.match(regex); + const found = ff || []; + let suffix = text; + if (found.length > 0) { + const tag = found[1]; + const tag_ = tag.split(":: "); + const time_format = tag_[1]; + const convertTime = getFormatTime(time_format); + suffix = suffix.replace("{" + found[1] + "}", convertTime); + } + return suffix; +} +function ChangeState(text, prev, next) { + const pre = applyTimeFormats(next[0]) || ""; + const sur = applyTimeFormats(next[1]) || ""; + return pre + text + sur; +} +function getRegExp(text) { + let t = text || ""; + t = t.replace(/([\.\+\*\?\^\$\(\)\[\]\{\}\|\\])/g, "\\$1"); + for (let i = 0; i < timeFormats.length; i++) + t = t.replace(timeFormats[i].rule, timeFormats[i].pattern); + return t; +} +function getCurrentState(text, states) { + for (let i = 0; i < states.length; i++) { + const s = states[i].split("||"); + const prefix = getRegExp(s[0]); + const suffix = getRegExp(s[1]); + let state_regex = new RegExp(`^(\\s*)${prefix}(.*)${suffix}$`); + const result = text.match(state_regex) || []; + if (result.length > 0) { + return { sorted_idx: i, raw: result[2], idents: result[1] }; + } + } + return { sorted_idx: -1, raw: "" }; +} +function separatePreSur(state) { + const strings = state.split("||"); + strings.push(""); + return strings; +} +function roundAdd(a, b, low, high) { + let result = a + b; + if (result == high) + result = low; + if (result < low) + result = high - 1; + return result; +} +function getBlkID(line) { + const blockIdRegex = /( \^[a-zA-Z0-9-]+)/; + const blockIdMatch = line.match(blockIdRegex); + const blockId = blockIdMatch ? blockIdMatch[0] : ""; + const lineWithoutBlockId = line.replace(blockIdRegex, ""); + return { blockId, lineWithoutBlockId }; +} +function processOneLine(text, setup, specifyIdx, direction) { + const { blockId, lineWithoutBlockId } = getBlkID(text); + const cur_match = getCurrentState(lineWithoutBlockId, setup.sorteds); + if (cur_match.sorted_idx < 0) { + return { success: false, content: lineWithoutBlockId, offset: 0, origin_set: { x: 0, a: 0, y: 0, z: 0 }, new_set: { x: 0, a: 0, y: 0, z: 0 } }; + } + const cur_idx = setup.states_dict.get(cur_match.sorted_idx) || 0; + let next_idx = specifyIdx; + if (specifyIdx < 0) + next_idx = roundAdd(cur_idx, direction, 0, setup.states.length); + const cur_pair = separatePreSur(setup.states[cur_idx]); + const next_pair = separatePreSur(setup.states[next_idx]); + let new_text = cur_match.idents + ChangeState(cur_match.raw, cur_pair, next_pair); + let next_txt = next_pair[0]; + let cur_txt = cur_pair[0]; + next_txt = applyTimeFormats(next_txt); + cur_txt = applyTimeFormats(cur_txt); + new_text = new_text + blockId; + const offset = next_txt.length - cur_txt.length; + let x0 = applyTimeFormats(cur_pair[0]).length || 0; + let y0 = applyTimeFormats(cur_pair[1]).length || 0; + let z = blockId.length || 0; + let x1 = applyTimeFormats(next_pair[0]).length || 0; + let y1 = applyTimeFormats(next_pair[1]).length || 0; + let A = cur_match.raw.length || 0; + return { + success: true, + content: new_text, + offset, + origin_set: { x: x0, a: A, y: y0, z }, + new_set: { x: x1, a: A, y: y1, z } + }; +} +function match_sg(text, setup) { + const cur_match = getCurrentState(text, setup.sorteds); + if (cur_match.sorted_idx < 0) { + return { success: false, content: text, offset: 0 }; + } + const cur_idx = setup.states_dict.get(cur_match.sorted_idx) || 0; + const cur_pair = separatePreSur(setup.states[cur_idx]); + return { success: true, content: cur_pair[0], offset: cur_idx }; +} +function toggleAction(editor, sg_list, bindings, direction) { + let selection = editor.listSelections()[0]; + let cursor = editor.getCursor(); + let set_cur = false; + if (selection.head.ch == selection.anchor.ch && selection.head.line == selection.anchor.line) + set_cur = true; + const head = selection.head.line; + const anchor = selection.anchor.line; + let start_line = head; + let end_line = anchor; + if (start_line > end_line) { + start_line = anchor; + end_line = head; + } + for (let i = start_line; i <= end_line; i++) { + const origin = editor.getLine(i); + let r = { success: false, content: origin, offset: 0, origin_set: { x: 0, y: 0, a: 0, z: 0 }, new_set: { x: 0, y: 0, a: 0, z: 0 } }; + for (let i2 = 0; i2 < bindings.length; i2++) { + r = processOneLine(origin, sg_list[bindings[i2]], -1, direction); + if (r.success) + break; + } + editor.setLine(i, r.content); + if (i == cursor.line) { + cursor = setupCursor(cursor, r.offset, r.origin_set, r.new_set); + } + if (i == head) { + const head_cursor = setupCursor(selection.head, r.offset, r.origin_set, r.new_set); + selection.head = head_cursor; + } + if (i == anchor) { + const anchor_cursor = setupCursor(selection.anchor, r.offset, r.origin_set, r.new_set); + selection.anchor = anchor_cursor; + } + } + editor.setSelection(selection.anchor, selection.head); + if (set_cur) + editor.setCursor(cursor); +} + +// src/suggester.ts +function buildSuggestions(line_num, line, idx, setup, direction) { + let suggestions = []; + const N = setup.states.length; + const nidx = (idx + direction + N) % N; + const final = [...Array(N).keys()].map((i) => (i * direction + nidx + N) % N); + for (let i = 0; i < N - 1; i++) { + const curIdx = final[i]; + suggestions.push({ + displayText: setup.states[curIdx], + appendText: line, + insertAt: line_num, + insertSkip: curIdx + }); + } + return suggestions; +} +var EditorSuggestor = class extends import_obsidian.EditorSuggest { + constructor(app, settings) { + super(app); + this.settings = settings; + this.popw = settings.pop_state; + } + onTrigger(cursor, editor, _file) { + if (!this.popw.hot) { + this.popw.popon = false; + } else { + this.popw.hot = false; + const context = this.settings.pop_context; + const line = editor.getLine(cursor.line); + return { start: cursor, end: { line: cursor.line, ch: context.stateIdx }, query: line }; + } + return null; + } + getSuggestions(context) { + const line = context.query; + const line_idx = context.start.line; + let state_idx = context.end.ch; + const pop_context = this.settings.pop_context; + const N = pop_context.setup.states.length; + this.popw.incr = 0; + state_idx += (N + pop_context.direction) % N; + const suggestions = buildSuggestions(line_idx, line, state_idx, pop_context.setup, pop_context.direction); + const suggestionsWithContext = []; + for (const suggestion of suggestions) + suggestionsWithContext.push({ ...suggestion, context }); + this.popw.popon = true; + return suggestionsWithContext; + } + renderSuggestion(value, el) { + el.setText(value.displayText); + } + selectSuggestion(value, _evt) { + const editor = value.context.editor; + const line = value.appendText; + const cur_steup = this.settings.pop_context.setup; + const r = processOneLine(line, cur_steup, value.insertSkip || 0, 1); + const line_idx = value.insertAt || 0; + const cursor = editor.getCursor(); + editor.setLine(line_idx, r.content); + const ch = cursor.ch + r.offset > r.content.length ? r.content.length : cursor.ch + r.offset; + editor.setCursor(line_idx, ch); + this.popw.popon = false; + this.popw.incr = 0; + } +}; + +// src/UI.ts +var import_obsidian2 = require("obsidian"); + +// src/stateDiagram.ts +var import_colormap = __toESM(require_colormap()); +function genColorMap(samples) { + const num = samples < 256 ? 256 : samples; + const colors = (0, import_colormap.default)({ + colormap: "rainbow-soft", + nshades: num, + format: "hex", + alpha: 0.5 + }); + return colors; +} +function drawConnectionForSG(state_group, statesAry, cmdIdx) { + const edgeList = []; + const sgLen = state_group.length; + let fromIdx = 0; + let toIdx = 0; + for (let j = 0; j < sgLen - 1; j++) { + for (let k = 0; k < statesAry.length; k++) { + if (state_group[j] == statesAry[k]) + fromIdx = k; + if (state_group[j + 1] == statesAry[k]) + toIdx = k; + } + edgeList.push({ + id: `edge${fromIdx}->${toIdx}`, + fromNode: `${fromIdx}`, + fromSide: "bottom", + toNode: `${toIdx}`, + toSide: "top", + toEnd: "arrow", + color: `${cmdIdx}` + }); + } + fromIdx = 0; + toIdx = 0; + for (let k = 0; k < statesAry.length; k++) { + if (state_group[sgLen - 1] == statesAry[k]) + fromIdx = k; + if (state_group[0] == statesAry[k]) + toIdx = k; + } + edgeList.push({ + id: `edge${fromIdx}->${toIdx}`, + fromNode: `${fromIdx}`, + fromSide: "bottom", + toNode: `${toIdx}`, + toSide: "left", + toEnd: "arrow", + color: `${cmdIdx}` + }); + return edgeList; +} +async function genDiagramCanvas(settings, fileName) { + const colors = genColorMap(settings.cmd_list.length); + let transitions = []; + const cmdNodes = []; + for (let i = 0; i < settings.cmd_list.length; i++) { + const cmd = settings.cmd_list[i]; + cmd.bindings.forEach((cmdIdx) => { + transitions = transitions.concat(settings.setup_list[cmdIdx].states); + }); + cmdNodes.push({ + id: `cmd${i}`, + x: i * 200, + y: -100, + width: 150, + height: 40, + type: "text", + text: cmd.name, + color: `${i}` + }); + } + const statesSet = new Set(transitions); + const statesAry = Array.from(statesSet); + const stateNodes = statesAry.map((state, index) => ({ + id: `${index}`, + x: index * 120, + y: index * 80, + width: 150, + height: 40, + type: "text", + text: state.trim(), + color: `${-1}` + })); + let edgeList = []; + for (let i = 0; i < settings.cmd_list.length; i++) { + const cmd = settings.cmd_list[i]; + cmd.bindings.forEach((cmdIdx) => { + edgeList = edgeList.concat(drawConnectionForSG(settings.setup_list[cmdIdx].states, statesAry, i)); + }); + } + await this.app.vault.create(fileName, JSON.stringify({ + nodes: cmdNodes.concat(stateNodes), + edges: edgeList + })); +} + +// src/UI.ts +function genSGSection(tab) { + const plugin = tab.plugin; + const settings = tab.plugin.settings; + tab.containerEl.createEl("h3", { text: "Setup The States to Toggle" }); + const setup_list = settings.setup_list; + settings.setup_list.forEach((setup) => { + addSetupUI(tab, setup); + }); + new import_obsidian2.Setting(tab.containerEl).addButton((cb) => { + cb.setButtonText("+ State Group").setCta().onClick(() => { + settings.addStateGroup(); + plugin.checkNreload(); + }); + }).addButton((cb) => { + cb.setIcon("checkmark"); + cb.setCta(); + cb.onClick(() => { + plugin.checkNreload(); + }); + }); +} +function addCmdUI(tab, cmd, cmdIdx) { + const cmd_list = tab.plugin.settings.cmd_list; + const settings = tab.plugin.settings; + const plugin = tab.plugin; + let desc = `${cmd.name}: ${cmd.isPopOver ? "popover" : ""} binding: ${cmd.bindings}`; + const cmd_section = new import_obsidian2.Setting(tab.containerEl).setName(`${cmd.name}`).setDesc(desc).addToggle((cb) => { + cb.setValue(cmd.isPopOver); + cb.onChange((value) => { + cmd.isPopOver = value; + plugin.checkNreload(); + }); + }).addText((cb) => { + cb.setValue(cmd.name); + cb.setPlaceholder("Command Name"); + cb.onChange((value) => { + cmd.name = value; + }); + }).addText((cb) => { + cb.setValue(cmd.bindings.map((x) => x.toString()).join(", ")); + cb.setPlaceholder("Indices of State Groups: 0, 1, 2"); + cb.onChange((value) => { + cmd.bindings = value.split(",").map((x) => parseInt(x, 10)); + }); + }).addButton((cb) => { + cb.setIcon("cross").setTooltip("Delete"); + cb.setCta(); + cb.onClick(() => { + cmd_list.splice(cmdIdx, 1); + plugin.checkNreload(); + }); + }); +} +function genCMDSection(tab) { + tab.containerEl.createEl("h3", { text: "Bind the Commands with State Groups" }); + tab.containerEl.createEl("p", { text: "Order of bindings matters if two SG share the same states" }); + tab.containerEl.createEl("p", { text: "Turn on suggestion will show a suggestion window to access all states" }); + tab.containerEl.createEl("p", { text: `[Suggection] [Name] [Binding SG]` }); + const cmd_list = tab.plugin.settings.cmd_list; + for (let i = 0; i < cmd_list.length; i++) { + addCmdUI(tab, cmd_list[i], i); + } + new import_obsidian2.Setting(tab.containerEl).addButton((cb) => { + cb.setButtonText("+ Command"); + cb.setCta(); + cb.onClick(() => { + const name = `Command ${cmd_list.length}`; + if (tab.plugin.settings.setup_list.length > 0) { + cmd_list.push(new Command({ index: cmd_list.length, name, bindings: [0] })); + tab.plugin.checkNreload(); + } else { + tab.plugin.sendNotify("No State Groups to bind"); + } + }); + }).addButton((cb) => { + cb.setButtonText("Click to validate"); + cb.setIcon("checkmark"); + cb.setCta(); + cb.onClick(() => { + tab.plugin.checkNreload(); + }); + }); +} +function genMISCSection(tab) { + const cmd_list = tab.plugin.settings.cmd_list; + const settings = tab.plugin.settings; + const plugin = tab.plugin; + const other = new import_obsidian2.Setting(tab.containerEl); + other.addButton((cb) => { + cb.setButtonText("\u{1F517} Generate State Diagram").setCta().onClick(async () => { + const stamp = new Date().toISOString(); + const fileName = `TL-StateDiagram-${stamp}.canvas`.replace(/:/g, "-"); + genDiagramCanvas(tab.plugin.settings, fileName); + new import_obsidian2.Notice(`ToggleList: Generate State Diagram at ./${fileName}`); + }); + }); + other.addButton((cb) => { + cb.setButtonText("\u{1F525} Hotkeys").setCta().onClick(() => { + this.app.setting.openTabById("hotkeys").setQuery("ToggleList"); + }); + }); + other.addButton((cb) => { + cb.setButtonText("\u21BB Reset").setCta().onClick(async () => { + const stamp = new Date().toISOString(); + await this.app.vault.writeConfigJson(`plugins/obsidian-toggle-list/backup-${stamp}`, settings); + new import_obsidian2.Notice(`ToggleList: Original config is saved in plugins/obsidian-toggle-list/backup-${stamp}.json`); + plugin.reset(); + plugin.reloadSettingUI(); + }); + }); +} +function genExplanation(tab) { + const exp = tab.containerEl.createEl("div", { cls: "togglelist_div" }); + exp.innerHTML = ``; +} +function addSetupUI(container, setup) { + const plugin = container.plugin; + const sg_ui = new import_obsidian2.Setting(container.containerEl).addButton((cb) => { + cb.setIcon("cross").setTooltip("Delete"); + cb.setCta().setCta().onClick(() => { + plugin.settings.removeSetup(setup); + plugin.checkNreload(); + }); + }); + const renderedText = renderEmptyLine(setup.all_states); + sg_ui.setName("State Group: " + setup.index.toString()); + const ta = sg_ui.addTextArea((text) => { + text.setValue(renderedText); + text.onChange(async (text_value) => { + setup.update(text_value); + }); + text.inputEl.setAttribute("rows", setup.states.length.toFixed()); + text.inputEl.setAttribute("cols", "25"); + text.inputEl.style.cssText = "resize: none"; + }); +} +var ToggleListSettingTab = class extends import_obsidian2.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + addSettingUI() { + genSGSection(this); + genCMDSection(this); + genMISCSection(this); + genExplanation(this); + } + display() { + this.containerEl.empty(); + this.addSettingUI(); + } +}; + +// src/main.ts +function deleteObsidianCommand(app, commandId) { + if (app.commands.findCommand(commandId)) { + delete app.commands.commands[commandId]; + delete app.commands.editorCommands[commandId]; + } +} +var ToggleList = class extends import_obsidian3.Plugin { + async onload() { + await this.loadSettings(); + this.tab = new ToggleListSettingTab(this.app, this); + this.addSettingTab(this.tab); + this.registerActions(); + this.registerEditorSuggest(new EditorSuggestor(this.app, this.settings)); + this.cleanHotkeys(); + } + async loadSettings() { + const settings = await this.loadData(); + this.settings = new ToggleListSettings(settings); + this.saveSettings(); + } + async saveSettings() { + await this.saveData(this.settings); + } + cleanHotkeys() { + const customKeys = this.app.hotkeyManager.customKeys; + let cc = Object.keys(customKeys); + for (let i = 0; i < cc.length; i++) { + if (cc[i].slice(0, 20) == "obsidian-toggle-list") { + if (cc[i].slice(-4) != "Prev" && cc[i].slice(-4) != "Next") { + if (cc[i].slice(-4) == "-POP") { + const name = cc[i].slice(0, -3) + "Next"; + customKeys[name] = customKeys[cc[i]]; + } + delete customKeys[cc[i]]; + } + } + } + const cmds = this.settings.cmd_list; + cc = Object.keys(customKeys); + for (let i = 0; i < cc.length; i++) { + const name = cc[i].slice(21, -5); + if (cmds.find((e) => e.name == name) !== void 0) { + delete customKeys[cc[i]]; + } + } + } + unregisterActions() { + this.settings.registedCmdName.forEach((cmd) => this.unregistAction(`obsidian-toggle-list:${cmd}`)); + this.settings.registedCmdName = []; + } + unregistAction(cmd) { + deleteObsidianCommand(this.app, cmd); + } + registerActions() { + const sg_list = this.settings.setup_list; + const reg = Array(); + this.settings.cmd_list.forEach((cmd) => { + this.registerAction(cmd, sg_list); + reg.push(`${cmd.name}-Next`); + reg.push(`${cmd.name}-Prev`); + }); + this.settings.registedCmdName = reg; + } + registerAction(cmd, sg_list) { + const n_name = `${cmd.name}-Next`; + const p_name = `${cmd.name}-Prev`; + this.addCommand({ + id: n_name, + name: n_name, + icon: "right-arrow", + editorCallback: (editor, view) => { + popAction(editor, cmd, this.settings, 1, this.app); + } + }); + this.addCommand({ + id: p_name, + name: p_name, + icon: "left-arrow", + editorCallback: (editor, view) => { + popAction(editor, cmd, this.settings, -1, this.app); + } + }); + } + checkNreload() { + this.settings.validate(); + this.unregisterActions(); + this.registerActions(); + this.saveSettings(); + this.reloadSettingUI(); + } + reloadSettingUI() { + this.tab.display(); + } + reset() { + this.unregisterActions(); + this.settings.reset(); + } + sendNotify(text) { + new import_obsidian3.Notice(text); + } +}; + +/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-toggle-list/manifest.json b/.obsidian/plugins/obsidian-toggle-list/manifest.json new file mode 100644 index 0000000..225ab7a --- /dev/null +++ b/.obsidian/plugins/obsidian-toggle-list/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "obsidian-toggle-list", + "name": "ToggleList", + "version": "1.2.7", + "minAppVersion": "0.15.0", + "description": "Toggle the list/checklist with custom states/prefixes and suffixes", + "author": "Lite C", + "authorUrl": "https://github.com/thingnotok/obsidian-toggle-list/", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/templater-obsidian/data.json b/.obsidian/plugins/templater-obsidian/data.json index dfdfe0b..a8b51b6 100644 --- a/.obsidian/plugins/templater-obsidian/data.json +++ b/.obsidian/plugins/templater-obsidian/data.json @@ -14,6 +14,10 @@ "user_scripts_folder": "scripts", "enable_folder_templates": true, "folder_templates": [ + { + "folder": "timestamped", + "template": "templates/timestamped.md" + }, { "folder": "periodic/daily", "template": "templates/daily.md" @@ -54,5 +58,10 @@ "startup_templates": [ "templates/startup.md" ], - "intellisense_render": 1 + "intellisense_render": 1, + "ignore_folders_on_creation": [ + { + "folder": "" + } + ] } \ No newline at end of file diff --git a/1000-virginia.md b/1000-virginia.md index 5d08f43..952c620 100644 --- a/1000-virginia.md +++ b/1000-virginia.md @@ -7,7 +7,7 @@ up: "[[conest-projects]]" Project Status: Warranty Region: DIV-4 Dan Bacon -Building Type: High Rise +Building Type: High-Rise Contract Type: Design Build Units: 454 Square Feet: 545,051 diff --git a/1990-k-street.md b/1990-k-street.md index 9732430..75670c3 100644 --- a/1990-k-street.md +++ b/1990-k-street.md @@ -6,7 +6,7 @@ up: "[[conest-projects]]" --- # 1990 K Street -High rise apartment +High-rise apartment ## My Role diff --git a/charlotte-south-end-hotel.md b/charlotte-south-end-hotel.md index c5cd5eb..47c500a 100644 --- a/charlotte-south-end-hotel.md +++ b/charlotte-south-end-hotel.md @@ -6,7 +6,7 @@ up: "[[conest-projects]]" --- # Charlotte South End Hotel -High rise hotel +High-rise hotel [[2026-03-09_15-50-49|Pre-Takeoff Confirmation]] diff --git a/distributed-antenna-systems-takeoff.md b/distributed-antenna-systems-takeoff.md index 47935b8..326518e 100644 --- a/distributed-antenna-systems-takeoff.md +++ b/distributed-antenna-systems-takeoff.md @@ -36,7 +36,7 @@ up: "[[takeoff-scripts]]" * **Length** = _Match Fire Alarm takeoff Length_ * **Count** = _Match Fire Alarm takeoff Count_ -### Stairwell Riser Every 2 Floors +### Stairwell Riser (Every 2 Floors) 1. * `Area` = "Typical - Stairwells Building Even Levels" @@ -64,8 +64,10 @@ Weatherhead for antenna. One per building. ## Horizontal > [!important] -> Usually only for cellular DAS. +> Usually only for cellular DAS.[^1] > Confirm takeoff requirement with [[pdi-bid-estimating|Bid]]. +[^1]: [[2026-05-05_11-53-09]] + 1. .../`CORRIDORS ...` * **Length** = Length measured for every corridor/garage diff --git a/emergency-communications-systems.md b/emergency-communications-systems.md index a43a774..50100ae 100644 --- a/emergency-communications-systems.md +++ b/emergency-communications-systems.md @@ -36,7 +36,7 @@ All systems currently listed in this note are described as "two-way communication systems". Those listed directly below have no overlap: -* stairway communication systems --- [[ibc_s0403#403.5.3.1 Stairway communication system.|IFC 403.5.3.1]] +* stairway communication systems (high-rise only) --- [[ibc_s0403#403.5.3.1 Stairway communication system.|IFC 403.5.3.1]] * elevator landing communication systems --- [[ibc_s1009#1009.8 Two-way communication.|IFC 1009.8]] * area of refuge communication systems --- [[ibc_s1009#1009.6.5 Two-way communication.|IFC 1009.6.5]] * emergency responder communication coverage system -- [[ifc_s0510#SECTION 510---EMERGENCY RESPONDER RADIO COVERAGE|IFC Section 510]] diff --git a/fire-alarm-takeoff.md b/fire-alarm-takeoff.md index d072a88..55595fd 100644 --- a/fire-alarm-takeoff.md +++ b/fire-alarm-takeoff.md @@ -87,7 +87,7 @@ For each elevator shaft: > Adjacent elevators may be in the same or parallel shafts. > Count the shafts accordingly: > -> ``` +> ```none > +-----------------------------+--------------------------------+ > | | | > | || +--------+ +--------+ || | || +--------+ || +--------+ || | @@ -133,6 +133,9 @@ For each stairwell: `... RISER` * **Length** = 10ft +> [!important] +> [[sleeving-takeoff]] + ## Annunciator Panels > [!info] Also Known As @@ -199,11 +202,11 @@ _Design Build (alternative method):_ > [!info] > Refers to fire, smoke, and combination fire/smoke dampers. -In [[pdi-building-types#High Rise|high rise construction]], +In [[pdi-building-types#High Rise|high-rise construction]], usually found on every level with units. > [!tip] -> If possible, use +> If possible, use > * `Area` = "Typical - Fire Smoke Dampers" > with quantity per level as shown. diff --git a/hilltop-gardens.md b/hilltop-gardens.md index 27c3f92..237eb23 100644 --- a/hilltop-gardens.md +++ b/hilltop-gardens.md @@ -37,11 +37,15 @@ up: "[[conest-projects]]" * [x] Backbone * [x] Homeruns * [-] [[low-voltage-takeoff]] -* [ ] [[fire-alarm-takeoff]] -* [ ] [[two-way-takeoff]] -* [ ] [[distributed-antenna-systems-takeoff]] -* [?] [[lightning-protection-takeoff]] -* [ ] [[misc-budgets-takeoff]] +* [x] [[fire-alarm-takeoff]] +* [x] [[two-way-takeoff]] + * [?] Stairwells? Elevator lobbies? Both? See [[2026-05-05_11-53-09]]. +* [x] [[distributed-antenna-systems-takeoff]] + * [-] Corridor assemblies +* [-] [[lightning-protection-takeoff]] + * Not mentioned in drawings or proposal, + no cost included in Bid Sheet. +* [x] [[misc-budgets-takeoff]] * [ ] [[temp-power-takeoff]] ## ConEst Questions diff --git a/ibc-construction-types.md b/ibc-construction-types.md index a2bee84..e8e6a79 100644 --- a/ibc-construction-types.md +++ b/ibc-construction-types.md @@ -32,7 +32,7 @@ Building elements are noncombustible[^1] ### Type I-A: Protected Fire-Resistive Non-Combustible -Common of [[pdi-building-types#High Rise|high rise]] +Common of [[pdi-building-types#High Rise|high-rise]] and [[ibc-occupancy-classifications#Group I Institutional|Group I]] occupancies. * 3hr Exterior Walls diff --git a/ibc_s0403.md b/ibc_s0403.md index 55caf00..00b3c0d 100644 --- a/ibc_s0403.md +++ b/ibc_s0403.md @@ -10,6 +10,16 @@ title: SECTION 403---HIGH-RISE BUILDINGS --- # SECTION 403---HIGH-RISE BUILDINGS +%% + +> [!quote] [[ibc_ch02]] +> **HIGH-RISE BUILDING.** +> A building with an occupied floor +> located more than 75 feet (22 860 mm) +> above the lowest level of fire department vehicle access. + +%% + ## 403.1 Applicability. High-rise buildings shall comply with Sections 403.2 through 403.6. @@ -18,7 +28,8 @@ High-rise buildings shall comply with Sections 403.2 through 403.6. ## 403.4 Emergency systems. -The detection, alarm and emergency systems of high-rise buildings shall comply with Sections 403.4.1 through 403.4.8. +The detection, alarm and emergency systems of high-rise buildings +shall comply with Sections 403.4.1 through 403.4.8. %% TODO %% @@ -53,4 +64,4 @@ connected to an approved constantly attended station shall be provided at not less than every fifth floor in each stairway where the doors to the stairway are locked. Systems shall be listed in accordance with UL 2525 -and installed in accordance with NFPA 72. \ No newline at end of file +and installed in accordance with NFPA 72. diff --git a/lightning-protection-takeoff.md b/lightning-protection-takeoff.md index 768ee84..47a1e4c 100644 --- a/lightning-protection-takeoff.md +++ b/lightning-protection-takeoff.md @@ -32,7 +32,7 @@ If no quote is available: * **Downlead locations** = building corners + additional locations such that downlead spacing is not greater than 100ft - * Minimum 10 locations for High Rise + * Minimum 10 locations for High-rise * **Total downlead conduit length** = building height * downlead locations diff --git a/pdi-building-types.md b/pdi-building-types.md index d4ab00c..7a842a4 100644 --- a/pdi-building-types.md +++ b/pdi-building-types.md @@ -17,7 +17,7 @@ and even less for dormitories. %% TODO %% > [!info] -> A high rise building has an occupied floor more than 75 feet +> A high-rise building has an occupied floor more than 75 feet > above the lowest level of fire department vehicle access. ### Mid Rise diff --git a/periodic/daily/2026-05-05.md b/periodic/daily/2026-05-05.md new file mode 100644 index 0000000..2bd5b3d --- /dev/null +++ b/periodic/daily/2026-05-05.md @@ -0,0 +1,10 @@ +--- +id: 2026-05-05 +title: 2026-05-05 +tags: [] +weekly: "[[2026w19]]" +monthly: "[[2026-05]]" +quarterly: "[[2026q2]]" +previous: "[[2026-05-04]]" +--- +# 2026-05-05 diff --git a/statistical-modeling-for-construction-estimating.md b/statistical-modeling-for-construction-estimating.md index 3bf1ad2..de7b4b1 100644 --- a/statistical-modeling-for-construction-estimating.md +++ b/statistical-modeling-for-construction-estimating.md @@ -34,7 +34,7 @@ but the reader should be assumed not to be especially skeptical. #### User Story -Frank is estimating a 20-story high rise +Frank is estimating a 20-story high-rise and notices that their are roughly, but not exactly, the same number of receptacles in the corridors of levels 2 to 19. Frank starts a new takeoff for duplex receptacles, diff --git a/temp-power-takeoff.md b/temp-power-takeoff.md index 29365a0..5ad8176 100644 --- a/temp-power-takeoff.md +++ b/temp-power-takeoff.md @@ -36,7 +36,7 @@ up: "[[takeoff-scripts]]" _Garden Style:_ * Takeoff: .../`TEMPORARY POWER - T POLE (EACH)`[^1] - * **Count** = 1 per 150ft per building + * **Count** = 1 per building _All others:_ * Takeoff: .../`* - TEMPORARY LIGHTING / PWR PNL (PER BLDG AREA SFT)` @@ -47,8 +47,13 @@ up: "[[takeoff-scripts]]" * `System` = "TPD - Temp Power Distribution (Gag. & Bldg.)" * `BidItem` = "2 - Garage" - Takeoff: .../`* - TEMPORARY LIGHTING / PWR PNL (PER BLDG AREA SFT)` - * **Count** = Garage GSF + _Garden Style:_ + * Takeoff: .../`TEMPORARY POWER - T POLE (EACH)` + * **Count** = 1 per building + + _All others:_ + * Takeoff: .../`* - TEMPORARY LIGHTING / PWR PNL (PER BLDG AREA SFT)` + * **Count** = Garage GSF [^1]: Field constructed assembly of receptacles. Sometimes called a "spider box". diff --git a/timestamped/2026-01-09_10-00-03.md b/timestamped/2026-01-09_10-00-03.md index 201ef11..e17d1fa 100644 --- a/timestamped/2026-01-09_10-00-03.md +++ b/timestamped/2026-01-09_10-00-03.md @@ -56,4 +56,4 @@ $$ \mathbb{E}\left[\frac{\text{Hours Per Unit}}{\text{Openings Per Unit}}\right] \approx .75~\text{Hours Per Opening} $$ -High Rise .110--.120 hr/sqft +High-Rise .110--.120 hr/sqft diff --git a/timestamped/2026-02-26_10-06-19.md b/timestamped/2026-02-26_10-06-19.md index 80f9be0..23f4963 100644 --- a/timestamped/2026-02-26_10-06-19.md +++ b/timestamped/2026-02-26_10-06-19.md @@ -36,7 +36,7 @@ as confirmed by [[joel-jansen]]: > Confirmed, follow Pre-Takeoff email. > > In general, -> for [[pdi-building-types#High Rise|High Rise]] projects, +> for [[pdi-building-types#High Rise|high-rise]] projects, > assume Free-Air devices will not be allowed > in other than [[units-takeoff|Units]]. diff --git a/timestamped/2026-05-05_11-53-09.md b/timestamped/2026-05-05_11-53-09.md new file mode 100644 index 0000000..d1c9e05 --- /dev/null +++ b/timestamped/2026-05-05_11-53-09.md @@ -0,0 +1,42 @@ +--- +id: 2026-05-05T11:53:09-0400 +title: 2026-05-05 11:53:09 +tags: [] +daily: "[[2026-05-05]]" +--- +# 2026-05-05 11:53:09 + +Direction from [[joel-jansen|Joel]] +on acceptable [[conest|ConEst]] takeoff +for [[emergency-communications-systems]] +received while working on [[hilltop-gardens|Hilltop Gardens]]. + +## Two-Way Horizontal + +Relevant to [[two-way-takeoff]]: + + + +> [!quote] Ben O'Brien's OneNote: Takeoff/(FA RISER + 2-WAY) +> * Horizontal: +> * Length: +> * If shown on Plans (FA/Systems/ etc.) +> * based on FCR to Elevator Lobbies & FCR to Stairwells* (Whichever is longer) + +> [!quote] [[joel-jansen]] via Microsoft Teams @ 2026-05-05 12:12 +> it defaults to elevator lobbies +> when no dedicated area of refuge is defined. +> stairwells they are required for buildings 5 floors +> AND when the inside door of the stair going to the floor locks +> so then they would be required every 5th floor +> +> from our FA team + +## DAS Corridor Assemblies + +Relevant to [[distributed-antenna-systems-takeoff]]: + +> [!quote] [[joel-jansen]] at around 2026-05-05 11:50 (pp.) +> Corridor assemblies are usually only necessary for _cellular_ DAS, +> because Life Safety DAS, especially as designed PDI, +> does not usually require remote antennas. diff --git a/two-way-takeoff.md b/two-way-takeoff.md index 1112c67..1448f8f 100644 --- a/two-way-takeoff.md +++ b/two-way-takeoff.md @@ -17,25 +17,20 @@ up: "[[takeoff-scripts]]" > `System` = "FA - Two Way Communication" -%% -It's curious we use the longer of FCR to elevator lobbies/FCR to stairwells -rather than just the total length, -since in high-rises _all_ stairwells with locking doors -require communication systems per -[[ibc_s0403#403.5.3.1 Stairway communication system.]] -%% - ## Horizontal 1. * `Area` = Same as Fire Command Room `FIRE ALARM & DAS SYSTEMS`/`TWO WAY COMMUNICATION ASSEMBLIES`/`2-WAY COMMUNICATION = 1" CONDUIT ...` - **Length** = Per drawings if shown, otherwise use longer of - * FCR to elevator lobbies - * FCR to stairwells + **Length** = Per drawings if shown, + otherwise measure from FCR to every elevator lobby. + For [[pdi-building-types#High Rise|high-rise]] buildings, + _also_ measure from the FCR to every stairwell.[^1] - **Count** = Count of elevator lobbies or stairwells (match length) + **Count** = Count of elevator lobbies and stairwells if high-rise (match length) + +[^1]: See [[ibc_s0403#403.5.3.1 Stairway communication system.|IBC 403.5.3.1]]. ## Vertical @@ -46,14 +41,18 @@ require communication systems per * **Length** = 15ft * Count * **Count** = match Horizontal +> [!important] +> [[sleeving-takeoff]] + ## Firefighter Phone System > [!important] > These are ICC definition two-way communication systems, > redundant with the standard takeoff described above. > These assemblies can be ignored -> unless given specific direction otherwise. -> Confirmed by [[joel-jansen]] 2025-12-08 in reference to [[2100-crystal-drive|2100 Crystal Drive]]. +> unless given specific direction otherwise.[^2] + +[^2]: Confirmed by [[joel-jansen]] 2025-12-08 in reference to [[2100-crystal-drive|2100 Crystal Drive]]. `COMMON ASSEMBLIES`/`FIRE ALARM & DAS SYSTEMS`/`COMMUNICATION DEVICES ...`/`...`