Last Sync: 2026-06-05 03:26 (Mobile)

This commit is contained in:
choibk committed 2026-06-05 03:26:55 +09:00
1 parent 7583b9e7d6
commit 97b79b8de6
27 files changed
+7728 -6659

No files matched your search

Binary file not shown.
Binary file not shown.
+93 -46
View File
@@ -27,7 +27,7 @@ __export(main_exports, {
default: () => AdvancedCanvasPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian19 = require("obsidian");
var import_obsidian20 = require("obsidian");
// src/utils/icons-helper.ts
var import_obsidian = require("obsidian");
@@ -1661,6 +1661,7 @@ var DEFAULT_SETTINGS_VALUES = {
disableFontSizeRelativeToZoom: false,
canvasMetadataCompatibilityEnabled: true,
enableSingleNodeLinks: true,
enableSingleNodePopupReferenceCopy: false,
combineCustomStylesInDropdown: false,
nodeStylingFeatureEnabled: true,
customNodeStyleAttributes: [],
@@ -1814,7 +1815,12 @@ var SETTINGS = {
children: {
enableSingleNodeLinks: {
label: "Enable support for linking to a node using a [[wikilink]]",
description: "When enabled, you can link and embed a node using [[canvas-file#node-id]].",
description: 'When enabled, you can link and embed a node using [[canvas-file#node-id]] (Use the "Copy wikilink to node" command to get an id).',
type: "boolean"
},
enableSingleNodePopupReferenceCopy: {
label: "Show button to copy node [[wikilink]]",
description: "When enabled, the node popup will show a button to copy the [[wikilink]] of the node for easy reference in other notes.",
type: "boolean"
}
}
@@ -2205,6 +2211,7 @@ var AdvancedCanvasPluginSettingTab = class extends import_obsidian4.PluginSettin
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.classList.add("ac-settings");
this.createKofiBanner(containerEl);
for (const [headingId, heading] of Object.entries(SETTINGS)) {
this.createFeatureHeading(
@@ -2249,7 +2256,7 @@ var AdvancedCanvasPluginSettingTab = class extends import_obsidian4.PluginSettin
const setting = new import_obsidian4.Setting(containerEl).setHeading().setClass("ac-settings-heading").setName(label).setDesc(description);
if (infoSection !== void 0) {
setting.addExtraButton(
(button) => button.setTooltip("Open github documentation").setIcon("info").onClick(async () => {
(button) => button.setTooltip("Open GitHub documentation").setIcon("info").onClick(async () => {
const anchor = activeDocument.createElement("a");
anchor.href = `${README_URL}#${infoSection}`;
anchor.target = "_blank";
@@ -3059,9 +3066,15 @@ var AdvancedCanvasEmbed = class extends import_obsidian7.Component {
if (canvasNode.type === "text") nodeContent = canvasNode.text;
else if (canvasNode.type === "group") nodeContent = `**Group Node:** ${canvasNode.label}`;
else if (canvasNode.type === "file") nodeContent = `**File Node:** ${canvasNode.file}`;
this.context.containerEl.classList.add("markdown-embed");
this.context.containerEl.empty();
await import_obsidian7.MarkdownRenderer.render(this.context.app, nodeContent, this.context.containerEl, this.file.path, this);
this.context.containerEl.classList.add("ac-card-embed");
if (canvasNode.color !== void 0) {
this.context.containerEl.classList.add("is-themed");
this.context.containerEl.classList.add(`mod-canvas-color-${canvasNode.color}`);
}
const markdownContainer = this.context.containerEl.createSpan();
markdownContainer.classList.add("markdown-content");
await import_obsidian7.MarkdownRenderer.render(this.context.app, nodeContent, markdownContainer, this.file.path, this);
}
};
@@ -4483,7 +4496,45 @@ var EncapsulateCanvasExtension = class extends CanvasExtension {
};
// src/canvas-extensions/commands-canvas-extension.ts
var import_obsidian15 = require("obsidian");
// src/canvas-extensions/copy-node-reference-canvas-extension.ts
var import_obsidian14 = require("obsidian");
var CopyNodeReferenceCanvasExtension = class _CopyNodeReferenceCanvasExtension extends CanvasExtension {
isEnabled() {
return "enableSingleNodePopupReferenceCopy";
}
init() {
this.plugin.registerEvent(this.plugin.app.workspace.on(
"advanced-canvas:popup-menu-created",
(canvas) => this.onPopupMenuCreated(canvas)
));
}
onPopupMenuCreated(canvas) {
var _a;
const popupMenuEl = (_a = canvas == null ? void 0 : canvas.menu) == null ? void 0 : _a.menuEl;
if (!popupMenuEl) return;
const selectionData = canvas.getSelectionData();
if (selectionData.nodes.length !== 1 && selectionData.edges.length === 0) return;
const menuOption = {
id: "node-popup-menu-option-copy-reference",
label: "Copy wikilink to node",
icon: "link",
callback: () => _CopyNodeReferenceCanvasExtension.copyWikilinkToNode(canvas.view.file, selectionData.nodes[0])
};
const popupMenuOption = CanvasHelper.createPopupMenuOption(menuOption);
CanvasHelper.addPopupMenuOption(canvas, popupMenuOption);
}
static copyWikilinkToNode(file, nodeData) {
const nodeTypeString = TextHelper.toTitleCase(nodeData.type);
const wikilink = `[[${file.path}#${nodeData.id}|${file.name} (${nodeTypeString} node)]]`;
navigator.clipboard.writeText(wikilink).then(
() => new import_obsidian14.Notice("Copied wikilink to node to clipboard.", 2e3)
).catch(() => new import_obsidian14.Notice("Failed to copy wikilink to node to clipboard.", 2e3));
}
};
// src/canvas-extensions/commands-canvas-extension.ts
var DIRECTIONS = ["up", "down", "left", "right"];
var CommandsCanvasExtension = class extends CanvasExtension {
isEnabled() {
@@ -4655,10 +4706,7 @@ var CommandsCanvasExtension = class extends CanvasExtension {
if (!file) return;
const nodeData = canvas.getSelectionData().nodes[0];
if (!nodeData) return;
const wikilink = `[[${file.path}#${nodeData.id}|${file.name} (${TextHelper.toTitleCase(nodeData.type)} node)]]`;
navigator.clipboard.writeText(wikilink).then(
() => new import_obsidian14.Notice("Copied wikilink to node to clipboard.", 2e3)
).catch(() => new import_obsidian14.Notice("Failed to copy wikilink to node to clipboard.", 2e3));
CopyNodeReferenceCanvasExtension.copyWikilinkToNode(file, nodeData);
}
)
});
@@ -4690,7 +4738,7 @@ var CommandsCanvasExtension = class extends CanvasExtension {
if (!nodeOutgoingLinks) continue;
for (const nodeOutgoingLink of nodeOutgoingLinks) {
const resolvedLink = this.plugin.app.metadataCache.getFirstLinkpathDest(nodeOutgoingLink.link, relativeFile.path);
if (!(resolvedLink instanceof import_obsidian14.TFile)) continue;
if (!(resolvedLink instanceof import_obsidian15.TFile)) continue;
outgoingLinks.add(resolvedLink);
}
}
@@ -4726,7 +4774,7 @@ var CommandsCanvasExtension = class extends CanvasExtension {
if (!nodeBacklinks) continue;
for (const nodeBacklink of nodeBacklinks.data.keys()) {
const resolvedLink = this.plugin.app.metadataCache.getFirstLinkpathDest(nodeBacklink, file.path);
if (!(resolvedLink instanceof import_obsidian14.TFile)) continue;
if (!(resolvedLink instanceof import_obsidian15.TFile)) continue;
backlinks.add(resolvedLink);
}
}
@@ -4735,7 +4783,7 @@ var CommandsCanvasExtension = class extends CanvasExtension {
if (!canvasBacklinks) return;
for (const canvasBacklink of canvasBacklinks.data.keys()) {
const resolvedLink = this.plugin.app.metadataCache.getFirstLinkpathDest(canvasBacklink, canvasFile.path);
if (!(resolvedLink instanceof import_obsidian14.TFile)) continue;
if (!(resolvedLink instanceof import_obsidian15.TFile)) continue;
backlinks.add(resolvedLink);
}
}
@@ -5011,7 +5059,7 @@ var AutoResizeNodeCanvasExtension = class extends CanvasExtension {
};
// src/canvas-extensions/portals-canvas-extension.ts
var import_obsidian15 = require("obsidian");
var import_obsidian16 = require("obsidian");
var PORTAL_ID_DELIMITER = "||";
var PORTAL_ID_PREFIX = `acportal${PORTAL_ID_DELIMITER}`;
var PORTAL_PADDING = 50;
@@ -5073,7 +5121,7 @@ var PortalsCanvasExtension = class _PortalsCanvasExtension extends CanvasExtensi
setData(newData);
}).catch((error) => {
console.error("Error loading portal data:", error);
new import_obsidian15.Notice("An error occurred while loading portal data. Please check console for details.");
new import_obsidian16.Notice("An error occurred while loading portal data. Please check console for details.");
});
}
));
@@ -5153,13 +5201,13 @@ var PortalsCanvasExtension = class _PortalsCanvasExtension extends CanvasExtensi
onEdgeConnectionTryDraggingBefore(_canvas, edge, _event, cancelRef) {
if (!_PortalsCanvasExtension.isPortalElement(edge.id)) return;
cancelRef.value = true;
new import_obsidian15.Notice("Updating edges from portals is not supported yet.");
new import_obsidian16.Notice("Updating edges from portals is not supported yet.");
}
onEdgeConnectionDraggingAfter(canvas, edge, _event, _newEdge, _side, _previousEnds) {
if (_PortalsCanvasExtension.isPortalElement(edge.id)) return;
if (!_PortalsCanvasExtension.isPortalElement(edge.from.node.id) || !_PortalsCanvasExtension.isPortalElement(edge.to.node.id)) return;
canvas.removeEdge(edge);
new import_obsidian15.Notice("Creating edges with both ends in portals are not supported yet.");
new import_obsidian16.Notice("Creating edges with both ends in portals are not supported yet.");
}
onPopupMenu(canvas) {
if (canvas.readonly) return;
@@ -5246,7 +5294,7 @@ var PortalsCanvasExtension = class _PortalsCanvasExtension extends CanvasExtensi
if (nestedPortalFiles.has(portalNodeData.file)) return addedData;
nestedPortalFiles.add(portalNodeData.file);
const portalFile = this.plugin.app.vault.getAbstractFileByPath(portalNodeData.file);
if (!(portalFile instanceof import_obsidian15.TFile) || portalFile.extension !== "canvas") return addedData;
if (!(portalFile instanceof import_obsidian16.TFile) || portalFile.extension !== "canvas") return addedData;
const portalFileDataString = await this.plugin.app.vault.cachedRead(portalFile);
if (portalFileDataString === "") return addedData;
const portalFileData = JSON.parse(portalFileDataString);
@@ -5337,7 +5385,7 @@ var PortalsCanvasExtension = class _PortalsCanvasExtension extends CanvasExtensi
};
// src/canvas-extensions/frontmatter-control-button-canvas-extension.ts
var import_obsidian16 = require("obsidian");
var import_obsidian17 = require("obsidian");
var FrontmatterControlButtonCanvasExtension = class extends CanvasExtension {
isEnabled() {
return "canvasMetadataCompatibilityEnabled";
@@ -5363,7 +5411,7 @@ var FrontmatterControlButtonCanvasExtension = class extends CanvasExtension {
var _a2;
const propertiesPlugin = this.plugin.app.internalPlugins.plugins["properties"];
if (!(propertiesPlugin == null ? void 0 : propertiesPlugin._loaded)) {
new import_obsidian16.Notice(`Core plugin "Properties view" was not found or isn't enabled. Enable it and restart Obsidian.`);
new import_obsidian17.Notice(`Core plugin "Properties view" was not found or isn't enabled. Enable it and restart Obsidian.`);
return;
}
let propertiesLeaf = (_a2 = this.plugin.app.workspace.getLeavesOfType("file-properties").first()) != null ? _a2 : null;
@@ -5610,7 +5658,7 @@ var ColorPaletteCanvasExtension = class extends CanvasExtension {
};
// src/canvas-extensions/collapsible-groups-canvas-extension.ts
var import_obsidian17 = require("obsidian");
var import_obsidian18 = require("obsidian");
var CollapsibleGroupsCanvasExtension = class extends CanvasExtension {
isEnabled() {
return "collapsibleGroupsFeatureEnabled";
@@ -5658,7 +5706,7 @@ var CollapsibleGroupsCanvasExtension = class extends CanvasExtension {
(_a = groupNode.collapseEl) == null ? void 0 : _a.remove();
const collapseEl = activeDocument.createElement("div");
collapseEl.className = "collapse-button";
(0, import_obsidian17.setIcon)(collapseEl, groupNodeData.collapsed ? "plus-circle" : "minus-circle");
(0, import_obsidian18.setIcon)(collapseEl, groupNodeData.collapsed ? "plus-circle" : "minus-circle");
collapseEl.onclick = () => this.toggleCollapseGroup(canvas, groupNode);
groupNode.collapseEl = collapseEl;
(_b = groupNode.labelEl) == null ? void 0 : _b.insertAdjacentElement("afterend", collapseEl);
@@ -6746,7 +6794,7 @@ async function toPng(node, options = {}) {
}
// src/canvas-extensions/export-canvas-extension.ts
var import_obsidian18 = require("obsidian");
var import_obsidian19 = require("obsidian");
var MAX_ALLOWED_LOADING_TIME = 1e4;
var ExportCanvasExtension = class extends CanvasExtension {
isEnabled() {
@@ -6782,7 +6830,7 @@ var ExportCanvasExtension = class extends CanvasExtension {
});
}
async showExportImageSettingsModal(canvas, nodesToExport) {
const modal = new import_obsidian18.Modal(this.plugin.app);
const modal = new import_obsidian19.Modal(this.plugin.app);
modal.setTitle("Export image settings");
let pixelRatioSetting = null;
let noFontExportSetting = null;
@@ -6800,7 +6848,7 @@ var ExportCanvasExtension = class extends CanvasExtension {
}
};
let svg = false;
new import_obsidian18.Setting(modal.contentEl).setName("Export file format").setDesc("Choose the file format to export the canvas as.").addDropdown(
new import_obsidian19.Setting(modal.contentEl).setName("Export file format").setDesc("Choose the file format to export the canvas as.").addDropdown(
(dropdown) => dropdown.addOptions({
png: "PNG",
svg: "SVG"
@@ -6810,33 +6858,33 @@ var ExportCanvasExtension = class extends CanvasExtension {
})
);
let pixelRatioFactor = 1;
pixelRatioSetting = new import_obsidian18.Setting(modal.contentEl).setName("Pixel ratio").setDesc("Higher pixel ratios result in higher resolution images but also larger file sizes.").addSlider(
pixelRatioSetting = new import_obsidian19.Setting(modal.contentEl).setName("Pixel ratio").setDesc("Higher pixel ratios result in higher resolution images but also larger file sizes.").addSlider(
(slider) => slider.setDynamicTooltip().setLimits(0.2, 5, 0.1).setValue(pixelRatioFactor).onChange((value) => pixelRatioFactor = value)
);
let noFontExport = true;
noFontExportSetting = new import_obsidian18.Setting(modal.contentEl).setName("Skip font export").setDesc("This will not include the fonts in the exported SVG. This will make the SVG file smaller.").addToggle(
noFontExportSetting = new import_obsidian19.Setting(modal.contentEl).setName("Skip font export").setDesc("This will not include the fonts in the exported SVG. This will make the SVG file smaller.").addToggle(
(toggle) => toggle.setValue(noFontExport).onChange((value) => noFontExport = value)
);
let theme = activeDocument.body.classList.contains("theme-dark") ? "dark" : "light";
new import_obsidian18.Setting(modal.contentEl).setName("Theme").setDesc("The theme used for the export.").addDropdown(
new import_obsidian19.Setting(modal.contentEl).setName("Theme").setDesc("The theme used for the export.").addDropdown(
(dropdown) => dropdown.addOptions({
light: "Light",
dark: "Dark"
}).setValue(theme).onChange((value) => theme = value)
);
let watermark = false;
new import_obsidian18.Setting(modal.contentEl).setName("Show logo").setDesc("This will add an Obsidian + Advanced Canvas logo to the bottom left.").addToggle(
new import_obsidian19.Setting(modal.contentEl).setName("Show logo").setDesc("This will add an Obsidian + Advanced Canvas logo to the bottom left.").addToggle(
(toggle) => toggle.setValue(watermark).onChange((value) => watermark = value)
);
let garbledText = false;
new import_obsidian18.Setting(modal.contentEl).setName("Privacy mode").setDesc("This will obscure any text on your canvas.").addToggle(
new import_obsidian19.Setting(modal.contentEl).setName("Privacy mode").setDesc("This will obscure any text on your canvas.").addToggle(
(toggle) => toggle.setValue(garbledText).onChange((value) => garbledText = value)
);
let transparentBackground = false;
transparentBackgroundSetting = new import_obsidian18.Setting(modal.contentEl).setName("Transparent background").setDesc("This will make the background of the image transparent.").addToggle(
transparentBackgroundSetting = new import_obsidian19.Setting(modal.contentEl).setName("Transparent background").setDesc("This will make the background of the image transparent.").addToggle(
(toggle) => toggle.setValue(transparentBackground).onChange((value) => transparentBackground = value)
);
new import_obsidian18.Setting(modal.contentEl).addButton(
new import_obsidian19.Setting(modal.contentEl).addButton(
(button) => button.setButtonText("Save").setCta().onClick(async () => {
modal.close();
await this.exportImage(
@@ -6870,7 +6918,7 @@ var ExportCanvasExtension = class extends CanvasExtension {
return nodesToExportIds.includes(edgeData.fromNode) && nodesToExportIds.includes(edgeData.toNode);
});
const backgroundColor = transparentBackground ? void 0 : window.getComputedStyle(canvas.canvasEl).getPropertyValue("--canvas-background");
new import_obsidian18.Notice("Exporting the canvas. Please wait...");
new import_obsidian19.Notice("Exporting the canvas. Please wait...");
const interactionBlocker = this.getInteractionBlocker();
activeDocument.body.appendChild(interactionBlocker);
canvas.screenshotting = true;
@@ -6971,7 +7019,7 @@ var ExportCanvasExtension = class extends CanvasExtension {
downloadEl.click();
} else {
const ERROR_MESSAGE = "Export cancelled: Nodes did not finish loading in time";
new import_obsidian18.Notice(ERROR_MESSAGE);
new import_obsidian19.Notice(ERROR_MESSAGE);
console.error(ERROR_MESSAGE);
}
} finally {
@@ -7296,16 +7344,14 @@ var EdgeExposerExtension = class extends CanvasExtension {
for (const exposedDataKey of getExposedEdgeData(this.plugin.settings)) {
const datasetPairs = edgeData[exposedDataKey] && typeof edgeData[exposedDataKey] === "object" ? Object.entries(edgeData[exposedDataKey]) : [[exposedDataKey, edgeData[exposedDataKey]]];
for (const [key, value] of datasetPairs) {
const stringifiedKey = JSON.stringify(key);
if (!stringifiedKey) continue;
if (!value) {
delete edge.path.display.dataset[stringifiedKey];
if ((_a = edge.fromLineEnd) == null ? void 0 : _a.el) delete edge.fromLineEnd.el.dataset[stringifiedKey];
if ((_b = edge.toLineEnd) == null ? void 0 : _b.el) delete edge.toLineEnd.el.dataset[stringifiedKey];
delete edge.path.display.dataset[key];
if ((_a = edge.fromLineEnd) == null ? void 0 : _a.el) delete edge.fromLineEnd.el.dataset[key];
if ((_b = edge.toLineEnd) == null ? void 0 : _b.el) delete edge.toLineEnd.el.dataset[key];
} else {
edge.path.display.dataset[stringifiedKey] = JSON.stringify(value);
if ((_c = edge.fromLineEnd) == null ? void 0 : _c.el) edge.fromLineEnd.el.dataset[stringifiedKey] = JSON.stringify(value);
if ((_d = edge.toLineEnd) == null ? void 0 : _d.el) edge.toLineEnd.el.dataset[stringifiedKey] = JSON.stringify(value);
edge.path.display.dataset[key] = value;
if ((_c = edge.fromLineEnd) == null ? void 0 : _c.el) edge.fromLineEnd.el.dataset[key] = value;
if ((_d = edge.toLineEnd) == null ? void 0 : _d.el) edge.toLineEnd.el.dataset[key] = value;
}
}
}
@@ -7423,10 +7469,10 @@ var PATCHERS = [
FileManagerPatcher,
// Direct metadata dependant patchers
PropertiesPatcher,
!(0, import_obsidian19.requireApiVersion)("1.12.0") && BacklinksPatcher,
!(0, import_obsidian20.requireApiVersion)("1.12.0") && BacklinksPatcher,
OutgoingLinksPatcher,
// Metadata dependant patchers
(0, import_obsidian19.requireApiVersion)("1.9.0") && BasesTableViewPatcher,
(0, import_obsidian20.requireApiVersion)("1.9.0") && BasesTableViewPatcher,
LinkSuggestionsPatcher,
EmbedPatcher,
SearchPatcher
@@ -7462,9 +7508,10 @@ var CANVAS_EXTENSIONS = [
ExportCanvasExtension,
FocusModeCanvasExtension,
EncapsulateCanvasExtension,
EdgeSelectionCanvasExtension
EdgeSelectionCanvasExtension,
CopyNodeReferenceCanvasExtension
];
var AdvancedCanvasPlugin = class extends import_obsidian19.Plugin {
var AdvancedCanvasPlugin = class extends import_obsidian20.Plugin {
async onload() {
IconsHelper.addIcons();
this.settings = new SettingsManager(this);
@@ -7496,7 +7543,7 @@ var AdvancedCanvasPlugin = class extends import_obsidian19.Plugin {
}).filter((canvas) => canvas);
}
getCurrentCanvasView() {
const canvasView = this.app.workspace.getActiveViewOfType(import_obsidian19.ItemView);
const canvasView = this.app.workspace.getActiveViewOfType(import_obsidian20.ItemView);
if ((canvasView == null ? void 0 : canvasView.getViewType()) !== "canvas") return null;
return canvasView;
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "advanced-canvas",
"name": "Advanced Canvas",
"version": "6.1.6",
"version": "6.2.0",
"minAppVersion": "1.7.2",
"description": "Supercharge your canvas experience! Create presentations, flowcharts and more!",
"author": "Developer-Mike",
+49 -17
View File
@@ -1,55 +1,55 @@
/* src/styles.scss */
.properties-field > .setting-item-info {
.ac-settings .properties-field > .setting-item-info {
flex: 0;
margin: 0;
padding: var(--size-4-1) var(--size-4-2);
border: var(--input-border-width) solid var(--background-modifier-border);
border-radius: var(--input-radius) 0 0 var(--input-radius);
}
.properties-field > .setting-item-control > input {
.ac-settings .properties-field > .setting-item-control > input {
width: 100%;
border-radius: 0 var(--input-radius) var(--input-radius) 0;
}
.ac-settings-heading:not(:first-child) {
.ac-settings .ac-settings-heading:not(:first-child) {
margin-top: var(--size-4-10) !important;
}
.ac-settings-heading:has(.checkbox-container:not(.is-enabled)) {
.ac-settings .ac-settings-heading:has(.checkbox-container:not(.is-enabled)) {
border-bottom-color: var(--background-modifier-border-hover);
}
.ac-settings-heading .setting-item-description {
.ac-settings .ac-settings-heading .setting-item-description {
margin-inline-end: 20px;
}
.settings-header-children {
.ac-settings .settings-header-children {
transform-origin: top center;
transform: scaleY(1);
transition: transform 0.2s ease-in-out;
}
.ac-settings-heading:has(.checkbox-container:not(.is-enabled)) + .settings-header-children {
.ac-settings .ac-settings-heading:has(.checkbox-container:not(.is-enabled)) + .settings-header-children {
opacity: 0.5;
pointer-events: none;
height: 0;
transform: scaleY(0);
}
.setting-item > .setting-item-control input[type=text] {
.ac-settings .setting-item > .setting-item-control input[type=text] {
width: 75px;
}
details.setting-item {
.ac-settings details.setting-item {
flex-direction: column;
align-items: initial;
}
details.setting-item:not([open]) {
.ac-settings details.setting-item:not([open]) {
row-gap: 0;
}
details.setting-item[open] {
.ac-settings details.setting-item[open] {
padding-bottom: var(--size-4-2);
}
details.setting-item[open] > summary {
.ac-settings details.setting-item[open] > summary {
margin-bottom: var(--size-4-2);
}
details.setting-item > *:not(summary) {
.ac-settings details.setting-item > *:not(summary) {
border: 1px solid var(--background-primary);
}
.kofi-banner {
.ac-settings .kofi-banner {
display: flex;
flex-direction: row;
align-items: center;
@@ -58,17 +58,17 @@ details.setting-item > *:not(summary) {
background-color: var(--background-primary-alt);
border-radius: var(--radius-m);
}
.kofi-banner .ac-kofi-banner-title {
.ac-settings .kofi-banner .ac-kofi-banner-title {
margin: 0;
font-size: var(--font-ui-small);
font-weight: 600;
}
.kofi-banner .ac-kofi-button {
.ac-settings .kofi-banner .ac-kofi-button {
width: min-content;
height: min-content;
line-height: 0;
}
.kofi-banner .ac-kofi-button img {
.ac-settings .kofi-banner .ac-kofi-button img {
min-width: 75px;
width: 25%;
max-width: 100px;
@@ -491,3 +491,35 @@ details.setting-item > *:not(summary) {
.canvas-node-interaction-layer[data-is-from-portal=true] .canvas-node-resizer .canvas-node-connection-point {
pointer-events: all;
}
.ac-card-embed {
display: flex;
flex-direction: column;
contain: strict;
overflow: hidden;
background-color: var(--background-primary);
border: 1px solid rgb(var(--canvas-color));
border-radius: var(--radius-m);
box-shadow: var(--shadow-stationary);
}
.ac-card-embed.is-themed {
background-color: rgba(var(--canvas-color), 0.07);
border-color: rgba(var(--canvas-color), 0.7);
box-shadow: inset 0 0 0 1px rgba(var(--canvas-color), 0.7), var(--shadow-stationary);
}
.ac-card-embed > .markdown-content {
position: relative;
overflow-y: auto;
overflow-wrap: break-word;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
padding: 0 var(--size-4-4);
font-size: var(--font-text-size);
font-family: var(--font-text);
line-height: var(--line-height-normal);
color: var(--text-normal);
user-select: text;
-webkit-user-select: text;
scrollbar-gutter: stable;
}
+33 -44
View File
@@ -4,31 +4,21 @@
"type": "split",
"children": [
{
"id": "4de6e4e8f2d3eae9",
"id": "8c864a1a13e218c8",
"type": "tabs",
"children": [
{
"id": "7793305178417da9",
"id": "5777e4c663df3488",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "대검 현황.md",
"file": "30연대 26년도 예산.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "대검 현황"
}
},
{
"id": "6c10e3bc95a711fa",
"type": "leaf",
"state": {
"type": "empty",
"state": {},
"icon": "lucide-file",
"title": "새 탭"
"title": "30연대 26년도 예산"
}
}
]
@@ -59,7 +49,7 @@
"state": {
"type": "search",
"state": {
"query": "File:대검",
"query": "Section:임헌",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
@@ -110,7 +100,7 @@
}
},
{
"id": "a266ae39a6642653",
"id": "a6dccc22ecaeacfc",
"type": "leaf",
"state": {
"type": "file-explorer",
@@ -123,7 +113,7 @@
}
},
{
"id": "56597f278861a3d6",
"id": "beab859baf93e69a",
"type": "leaf",
"state": {
"type": "mk-path-view",
@@ -191,7 +181,7 @@
"state": {
"type": "file-properties",
"state": {
"file": "대검 현황.md"
"file": "30연대 26년도 예산.md"
},
"icon": "lucide-info",
"title": "파일 속성"
@@ -215,35 +205,34 @@
"notion-bases:Notion bases": false
}
},
"active": "7793305178417da9",
"active": "5777e4c663df3488",
"lastOpenFiles": [
"물자현황/대검.md",
"대검 현황.md",
"2026년 월력형 메모형 일정(2월).canvas",
"병영생활관 에어컨 교체소요.md",
"하계재난대비계획.md",
"방독면살균소독장비.md",
"은닉초과재산탄약회수활동.md",
"inbox/개인장구류 불출 문제발생.md",
"inbox/소방.md",
"매연측정.md",
"지휘관 교체 재물조사.md",
"성인지교육.md",
"inbox/사이버 보안 진단의 날 시행-1.md",
"inbox/보급품 수령 , 분배, 반납.md",
"월하약품불출.md",
"대형정수기 필터교체 업체방문.md",
"월하준비.md",
"시설물 정기 자체관리 대상시설 안전점검.md",
"대한민국 안전대전환 집중 안전점검.md",
"물자유지비 추가배정건의.md",
"30연대 26년도 예산.md",
"안전활동유공.md",
"장비.md",
"2026년 월력형 메모형 일정(2월).canvas",
"inbox/보급품 수령 , 분배, 반납.md",
"inbox/위임보수.md",
"총기관리.md",
"27~33장비불용결정계획.md",
"27저장화생방장비물자신뢰성평가대상품목보유현황.md",
"소방시설.md",
"혹서기일과.md",
"inbox/당직근무간 특이사항.md",
"26년 30연대 전술훈련평가 수검자료 정리.md",
"전술훈련평가.md",
"위생점검.md",
"일일결산.md",
"k2총기 편제 초과 조정 의견보고.md",
"하게 재난대비계획 기간.md",
"재해재난대비계획.md",
"재난안전통신망.md",
"재난관계관.md",
"하계재난대비계획.md",
"당직근무.md",
"대한민국 안전대전환 집중 안전점검.md",
"장비탄약 관리실태 현장확인 및 지도.md",
"inbox/25년 전투장비지휘검열-1.md",
"inbox/25년 전투장비지휘검열.md",
"장비정비.md",
"방독면살균소독장비.md",
"차량 2부제.md",
"월단위업무.md",
"files/24_result.pdf",
"2025년 월력형 메모형 일정.canvas",
"1778129959563.jpg",
Binary file not shown.
File diff suppressed because it is too large. Load diff
+2
View File
@@ -0,0 +1,2 @@
# 불용대상목록 작성(기능과) 및 작성양식 야전전파 :5월한
# 자원관리부대 > 군지사군지여단 통보 :6월한
@@ -0,0 +1,3 @@
# 보유현황 조사
# 로트추가,사진첨부
# 소량로트 지정항목
+18 -4
View File
@@ -4,7 +4,7 @@
2. 2500-2536-301-013-210-01-0103. 생활쓰레기
2. 1차 집행, 집행전금액 9758970, 집행액 4869900, 집행후금액 4889070
3. 2차 집행, 집행전 금액 4889070 집해액 1623300 집행후금액 3265770
4.
4. 3차 집행, 집행전금액 3265770 집행액 1623300 집행후금액
# 위생시설종사자건강진단비
1. 2200-2231-301-005-001-000-210-01-000
@@ -46,8 +46,21 @@
19. 13차 집행, 3교육대, 12중대 에어컨, 집행전금액 13080200 집행액 4774000 집행후금액 8306200
20. 근거입력방법: 정비관리>군직정비수행관리>부대야전정비관리(지상)-육군>물자의무장비정비의뢰등록(육군)
21. 14차 집행, 1교육대, 집행전금액 8306200 집행액 517000 집행후금액 7789200
22. 15차 집행, 대형정수기, 집행전금액 7789200 집행액 900000 집행후금액 6889200
23.
22. 15차 집행, 교육대전체 대형정수기, 집행전금액 7789200 집행액 900000 집행후금액 6889200
23. 16차 집행, 2교육대 제빙기, 집행전금액 6889200 집행액 112000 집행후금액 6777200
24. 17차 집행, 취사장 에어커튼, 집행전금액 6777200 집행액 187000 집행후금액 6590200
25. 18차 집행, 1교 3중대 에어컨, 집행전금액 6590200 집행액 880000 집행후금액 5710200
26. 19차 집행, 11중대 쇼냉장고, 집행전금액 5710200 집행액 110000 집행후금액 5600200
27. 20차 집행, 10중대 에어컨정비, 집행전금액 5600200 집행액 585000 집행후금액 5015200
28. 21차 집행, 3교(11중대) 에어컨정비, 집행전금액 5015200 집행액 1045000 집행후금액 3970200
29. 추가건의,
1. 대헝정수기 170만
2. 에어컨 정비 4774000,1045000,120만
3. 에어컨 청소비 벽걸이 총239,스탠드15
1. 벼걸이 239 * 8만 = 19120000
2. 스탠드 15* 16만 = 2400000
4. 건조기 청소 100×13만 = 13000000
5.
# 보온대
1. 2300-2332-302-003-000-000-210-11
@@ -105,8 +118,9 @@
17. 24차 집행, 지원과(별관식당 가스계량기교체), 집행전금액 14354050 집행액 699600 집행후금액 13654450
18. 25차 집행, 지원과(2층리모델링), 집행전금액 13654450 집행액 910500 집행후금액 12743950
19. 26차 집행, 지원과(2층리모델링), 집행전금액 12743950 집해액 150000 직행후금액 12593950
20.
20. 27차 집행, 7중대(강화도어), 집행전금액 12593950 집행액 200000 집행후금액 12393950
21.
22.
# 재난 및 안전관리 예산(301-002-210-09,11)
1. 재난예방 및 보수비(2300-2337-301-002-000-000-210-11)
+22 -1
View File
@@ -44,4 +44,25 @@
- 화장실용 나프탈렌 없음
- 피복 나프탈롄 16,16,16
- 본부는 남는거
-
# 26.5.26(화) 대형산풍기 3대수령,37x031236
- 민간위탁 식당에 3대 인계(본부중대에 재산전환예정)
# 26.5.27(수) A4종이 375173441,90박스
1. 교육대 25박스씩 75박스, 15박스 본부
# 26.5.28(목) 표백제,37x192488, 114통(pl)2리터짜리
1. 분배 교육대 35개씩, 9개 본부
# 26.5.28(목) 화생방물자 수령.이승민주무관님, 정비대, 1330
1. 11749919, 마크1,22개
2. 011188172,보호덧신(소),24개
3. 010215978,보호덧신(대),18개
- 근거:소군수과-2612(26.5.26)치장화생방물자(mark,보호덧신) 불출지시
- 치장창고 보관중
# 26.5.26(화) 1500, 모기향 160개수령
# 26.6.4(목)1500, 야전배낭노후교체 보급,75세트
# 26.6.2 1500 9번창고 예초기 6대수령
+4 -1
View File
@@ -5,4 +5,7 @@
# 5월, 중대재해대응훈련(취약시설 현장점검(교통/수송연계, 부딪힘(충격사고)))
1. 반기단위 민간업체 의견수렴 (안전보건 의견수렴 후 개선조치)
2. 3교, 5.11실시
3. 2교, 5.6실시
3. 2교, 5.6실시
# 전반기 육직부대 안전진단시 안전보건확보의무이행 분야 중 공무직 근로자 및 병영, 민영식당 종사자 간담회 결과 꼭 반영 해주세요
- 부대별 보고 기한 : 6. 11일 한
+3 -2
View File
@@ -68,8 +68,9 @@
# 26.3분기 소요
1. 3교 기계실 스팀 메인 증기관 감압변 교체,서원석,3분기위임보수반영필요
2. 식당 벗겨짐 공사, 세척장 바닥 코팅
3. 2분기 부결
2. 1교 목욕탕 압력탱크 마개 누수 보수
3. 식당 벗겨짐 공사, 세척장 바닥 코팅
4. 2분기 부결
1. 교육대 중앙 노후창호
2. 노후계단 미크럼방지등
3. 중대행정반 화장실보수
@@ -3,6 +3,9 @@
* 훈련병 교육대별 916명기준
# 장비
1. 현역 377, 교육 2,781
2. 26.5.26 총기재산 용도 변경 교육용>현역용 1정
3. 현역 378, 교육 2780
4.
# 예비
1. 현역 5
+101
View File
@@ -0,0 +1,101 @@
휴일 당직 수고들 많습니다.
유동병력, 부대활동 특이사항, 순찰 등 보고해주세요.
* 시간, 인원수 등 포함해서 보고 바랍니다~
---
당직사령 8중대장입니다.
이방 초대된 사람은 오늘 연대를 책임질 사람들이고, 내일 교대까지 현재방에서 지시 하달될 예정이니 참고
-오늘 연대 회의 : 19:00
⭐️ 핸드토키 지참, 번개조 및 타격대 편성표 지참 ⭐️
-주요확인 회의파악 사항
1. 유동병력 (오늘~내일)
- 휴가, 외출, 외박 및 기타 퇴원 후 복귀자 등
- 입실자, 병역심사대 입소현황
2. 기타사항
- 상호 협조 및 보고사항
- 동문경계 외진 등
오늘 근무자 아닌사람은 퇴장해주시고
변경인원 초대 후 이글을 다시 올려주시고 퇴장해주십시요
---
---
2020부 ~ 2028 교육사령부 소 사령
이상훈 중령님한테 전화왔었습니다.
1. 금일 당직사관 확인
- 30연대 1교육대 당직사관 중사 김주희
2. 총기 총 몇정인지?, 어떻게 관리하고 있는지
- 1교육대 총 1056정, 현재 무기고에 있으며 키는 상황실 통제성 함에 있고 이원화하여 관리중
3. 26년 전반기 생명존중활동 및 생명보호강조기간 인지상태 확인
4. 식중독 관련 식당 근무자에 의해 확인 하는지?
- 교육기에는 훈지관, 준비기에는 당직사관이 올라가서 같이 확인중
5. 휴가 출발자, 복귀자 몇명인지 체크리스트 관련하여 하고있는지?
- 1교육대 휴가 출발자 1명, 복귀자 없으며, 체크리스트 활용하여 출타자교육 2040 진행 예정
6. 야간 환자나오면 어떻게하는지? 인근 병원이 어디있는지?
- 지구병원 응급실 문의 후 이용
7. 도움배려현황 있는지?
- 1교육대 1명 있으며, 현재 본부중대 파견중 , 훈련병은 오늘 입소하여 신상파악 중으로 파악되면 다시 연락드린다 하였으나, 괜찮다고 하셨습니다
이상없이 답변하였습니다
---
---
충성! 1교육대 당직근무 투입보고 입니다.
1.금일근무자
- 당직사관 : 상사 이태일
- 인원현황(기간병/훈련병)
- 총원 77명 열외27명 현재원 50명
- 열외내용 휴가6명 교육파견2명 본부중대
파견1명 외박18명
- 총원 865명 현재원 865명
2.출타자
- 오늘 휴가복귀자 : 없음
- 오늘 외박복귀자 : 18명
- 내일 휴가출발자 : 1명
- 내일 휴가복귀자 : 1명
3.도움배려현황 : 19명(소대장급)
*향정신성 의약품 복용등 신경쓰겠습니다.
4.오늘 예정사항
- 개인정비 여건보장
- 주,야간 종교활동 실시예정
*종파별 임시전우조 편성, 인솔분대장에 의한
인원,환자 파악 철저
- 휴대폰 사용 실시예정
- 개인화기 CBT 시청 및 사전학습 실시
- 석식 전,후 테니스공 투척예정
*통제 : 훈육지도관 및 생활지도분대장
- 내일 혹서기 일과 실시예정
이상입니다. 충성!
---
충성
본부중대 당직근무자 군수지원부사관
최병규상사입니다
1.인원,장비현황
- 총원 16
- 열외 3(휴가1,외박1,외출1)
- 복귀 2(외박1,외출1)
- 종교행사자 2명(천주교)
- 총기 15정 이상무
2.순회진료 1010-1110
3.부대활동 개인정비,체육활동
4.도움배려용사 없음
이상입니다
+3 -1
View File
@@ -3,4 +3,6 @@
- 박성현하사가 주임원사님에게는 보고하고, 연대장님께서 현재 미보고상태
- 행정보급관 톡방에서 관련 의견을 물어보고 계속 사용할지 판단
- 주임원사님은 폐기하라고 했다고함.
- 안녕하세요. 그린테크 냉온수기회사입니다. 육군훈련소30연대 5/19(화) 필터교체 방문 안내드립니다.방문자: 1명 /서흥석 /890210 /010.4414.7029 /렉스턴스포츠칸, 89노5703다음주 화요일 방문 드리겠습니다.감사합니다.353-21 그린테크주식회사
- 안녕하세요. 그린테크 냉온수기회사입니다. 육군훈련소30연대 5/19(화) 필터교체 방문 안내드립니다.방문자: 1명 /서흥석 /890210 /010.4414.7029 /렉스턴스포츠칸, 89노5703다음주 화요일 방문 드리겠습니다.감사합니다.353-21 그린테크주식회사
# 연대장님에게 보고, 필터교체시 정수기 배관교체 필요
+41
View File
@@ -0,0 +1,41 @@
2교육대. 정정
ㅇ벽걸이 83
ㅇ스탠드 8
---
3교육대
벽걸이 에어컨 (83개)
1중대 16개
2중대 16개
3중대 16개
4중대 16개
3층 기간병 생활관 10개
상황실 1개, 휴게실 1개,
행보관실 3개
중대장실 4개
스탠드 에어컨 (행정반 5개)
3층 교육대장님실 1개
---
1교육대
벽걸이 에어컨 (73개)
1중대 16개
2중대 16개
3중대 16개
4중대 16개
3층 기간병 생활관 9개
스탠드 에어컨 (2개)
3층 교육대장님실 1개
2층 상황실 1개
---
에어컨 청소
건조기 청소
세탁기청소
대형정수기 유지비
+4 -1
View File
@@ -9,4 +9,7 @@
![[Resized_20251127_141053.jpeg]]
![[Resized_20251127_141040.jpeg]]
# 26년 점검,6.2(화)
# 26년 점검,6.2(화)
1. 01040302369,김혜웅소방관리사(업체)
2. 09시 점검예정
3.
+2
View File
@@ -0,0 +1,2 @@
# 월말, 무기고 총기/대검 손질
# 월말, 국방군수통합정보체계(Deliis) 전산재산 결산
+3 -1
View File
@@ -18,4 +18,6 @@
살균소독제 40
연막 방역용살충제 1
화장실 나프탈렌 25
피복용 나프탈렌 53
피복용 나프탈렌 53
# 26.5.26(화) 박성현하사 월하약품 추가 수령
+7
View File
@@ -9,3 +9,10 @@
# 26.4. 한서욱 주무관, K-3기관총 관리전환예정,연대급부대
# 부사관학교, 지원과 백민지 상사(958-1161, 01050807779), 오세열 주무관 01088229555,
1. 009304260, 나침반m2, 11개
2. 담당주무관님 01063216612
3. 내비주소:옥금동길 6 (거리상15분소요)
4. 1교육단 본부(위병소 직진500미터 푯말 우회전 작은하연건물)
5.
@@ -0,0 +1 @@
# 예방정비,장비가동율,화생방장비물자관리,장비보유울
View File
Whitespace-only changes.
+2 -1
View File
@@ -1,4 +1,5 @@
# 최용과장, 담당관님~
점심 맛있게 드셨나요??
4일에 전입 오신 의무과장님 차량
121어 8037도 2부제 제외차량 신청가능 할까요??
121어 8037도 2부제 제외차량 신청가능 할까요??
+1
View File
@@ -0,0 +1 @@
이승민 주무관님
+2
View File
@@ -18,5 +18,7 @@
# 재난관계관 소집교육 : 5.29(금) 13:00 김낙중영웅실
# 하계 재난대비 추진평가회의 : 6.25(목) 주간 상황평가회의시
### 부대별 하계 재난대비결과 추진결과 보고
### 메모전파, 일자,대상자(행보관,당직근무자), 보고양식,설치 참고자료 전파, 일주전전파
### 훈련실시, 시간(?),장소(3개소), 준비물,차수벽설치,배수로점검청소
# 부대별 하계 재난 대웅흔련 : 6월한 실시후 결과보고(공문)