diff --git a/GGDoc/.obsidian/app.json b/GGDoc/.obsidian/app.json index 9e26dfe..1f037ed 100644 --- a/GGDoc/.obsidian/app.json +++ b/GGDoc/.obsidian/app.json @@ -1 +1,4 @@ -{} \ No newline at end of file +{ + "readableLineLength": false, + "rightToLeft": false +} \ No newline at end of file diff --git a/GGDoc/.obsidian/community-plugins.json b/GGDoc/.obsidian/community-plugins.json index 2d4e2e7..e341df4 100644 --- a/GGDoc/.obsidian/community-plugins.json +++ b/GGDoc/.obsidian/community-plugins.json @@ -8,5 +8,6 @@ "obsidian-thumbnails", "dataview", "awesome-image", - "automatic-table-of-contents" + "automatic-table-of-contents", + "multi-properties" ] \ No newline at end of file diff --git a/GGDoc/.obsidian/plugins/multi-properties/main.js b/GGDoc/.obsidian/plugins/multi-properties/main.js new file mode 100644 index 0000000..660cd5b --- /dev/null +++ b/GGDoc/.obsidian/plugins/multi-properties/main.js @@ -0,0 +1,3026 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +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 __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => MultiPropPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian6 = require("obsidian"); + +// src/AddPropModal.ts +var import_obsidian2 = require("obsidian"); + +// node_modules/svelte/src/runtime/internal/utils.js +function noop() { +} +function run(fn) { + return fn(); +} +function blank_object() { + return /* @__PURE__ */ Object.create(null); +} +function run_all(fns) { + fns.forEach(run); +} +function is_function(thing) { + return typeof thing === "function"; +} +function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function"; +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} + +// node_modules/svelte/src/runtime/internal/globals.js +var globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : ( + // @ts-ignore Node typings have this + global +); + +// node_modules/svelte/src/runtime/internal/ResizeObserverSingleton.js +var ResizeObserverSingleton = class { + /** @param {ResizeObserverOptions} options */ + constructor(options) { + /** + * @private + * @readonly + * @type {WeakMap} + */ + __publicField(this, "_listeners", "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0); + /** + * @private + * @type {ResizeObserver} + */ + __publicField(this, "_observer"); + /** @type {ResizeObserverOptions} */ + __publicField(this, "options"); + this.options = options; + } + /** + * @param {Element} element + * @param {import('./private.js').Listener} listener + * @returns {() => void} + */ + observe(element2, listener) { + this._listeners.set(element2, listener); + this._getObserver().observe(element2, this.options); + return () => { + this._listeners.delete(element2); + this._observer.unobserve(element2); + }; + } + /** + * @private + */ + _getObserver() { + var _a; + return (_a = this._observer) != null ? _a : this._observer = new ResizeObserver((entries) => { + var _a2; + for (const entry of entries) { + ResizeObserverSingleton.entries.set(entry.target, entry); + (_a2 = this._listeners.get(entry.target)) == null ? void 0 : _a2(entry); + } + }); + } +}; +ResizeObserverSingleton.entries = "WeakMap" in globals ? /* @__PURE__ */ new WeakMap() : void 0; + +// node_modules/svelte/src/runtime/internal/dom.js +var is_hydrating = false; +function start_hydrating() { + is_hydrating = true; +} +function end_hydrating() { + is_hydrating = false; +} +function append(target, node) { + target.appendChild(node); +} +function append_styles(target, style_sheet_id, styles) { + const append_styles_to = get_root_for_style(target); + if (!append_styles_to.getElementById(style_sheet_id)) { + const style = element("style"); + style.id = style_sheet_id; + style.textContent = styles; + append_stylesheet(append_styles_to, style); + } +} +function get_root_for_style(node) { + if (!node) + return document; + const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; + if (root && /** @type {ShadowRoot} */ + root.host) { + return ( + /** @type {ShadowRoot} */ + root + ); + } + return node.ownerDocument; +} +function append_stylesheet(node, style) { + append( + /** @type {Document} */ + node.head || node, + style + ); + return style.sheet; +} +function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); +} +function detach(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +} +function destroy_each(iterations, detaching) { + for (let i = 0; i < iterations.length; i += 1) { + if (iterations[i]) + iterations[i].d(detaching); + } +} +function element(name) { + return document.createElement(name); +} +function text(data) { + return document.createTextNode(data); +} +function space() { + return text(" "); +} +function empty() { + return text(""); +} +function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); +} +function prevent_default(fn) { + return function(event) { + event.preventDefault(); + return fn.call(this, event); + }; +} +function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); +} +function children(element2) { + return Array.from(element2.childNodes); +} +function set_data(text2, data) { + data = "" + data; + if (text2.data === data) + return; + text2.data = /** @type {string} */ + data; +} +function set_input_value(input, value) { + input.value = value == null ? "" : value; +} +function select_option(select, value, mounting) { + for (let i = 0; i < select.options.length; i += 1) { + const option = select.options[i]; + if (option.__value === value) { + option.selected = true; + return; + } + } + if (!mounting || value !== void 0) { + select.selectedIndex = -1; + } +} +function select_value(select) { + const selected_option = select.querySelector(":checked"); + return selected_option && selected_option.__value; +} +function get_custom_elements_slots(element2) { + const result = {}; + element2.childNodes.forEach( + /** @param {Element} node */ + (node) => { + result[node.slot || "default"] = true; + } + ); + return result; +} + +// node_modules/svelte/src/runtime/internal/lifecycle.js +var current_component; +function set_current_component(component) { + current_component = component; +} +function get_current_component() { + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; +} +function onMount(fn) { + get_current_component().$$.on_mount.push(fn); +} +function bubble(component, event) { + const callbacks = component.$$.callbacks[event.type]; + if (callbacks) { + callbacks.slice().forEach((fn) => fn.call(this, event)); + } +} + +// node_modules/svelte/src/runtime/internal/scheduler.js +var dirty_components = []; +var binding_callbacks = []; +var render_callbacks = []; +var flush_callbacks = []; +var resolved_promise = /* @__PURE__ */ Promise.resolve(); +var update_scheduled = false; +function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } +} +function tick() { + schedule_update(); + return resolved_promise; +} +function add_render_callback(fn) { + render_callbacks.push(fn); +} +function add_flush_callback(fn) { + flush_callbacks.push(fn); +} +var seen_callbacks = /* @__PURE__ */ new Set(); +var flushidx = 0; +function flush() { + if (flushidx !== 0) { + return; + } + const saved_component = current_component; + do { + try { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + } catch (e) { + dirty_components.length = 0; + flushidx = 0; + throw e; + } + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); +} +function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } +} +function flush_render_callbacks(fns) { + const filtered = []; + const targets = []; + render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c)); + targets.forEach((c) => c()); + render_callbacks = filtered; +} + +// node_modules/svelte/src/runtime/internal/transitions.js +var outroing = /* @__PURE__ */ new Set(); +var outros; +function group_outros() { + outros = { + r: 0, + c: [], + p: outros + // parent group + }; +} +function check_outros() { + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; +} +function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } +} +function transition_out(block, local, detach2, callback) { + if (block && block.o) { + if (outroing.has(block)) + return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach2) + block.d(1); + callback(); + } + }); + block.o(local); + } else if (callback) { + callback(); + } +} + +// node_modules/svelte/src/runtime/internal/each.js +function ensure_array_like(array_like_or_iterator) { + return (array_like_or_iterator == null ? void 0 : array_like_or_iterator.length) !== void 0 ? array_like_or_iterator : Array.from(array_like_or_iterator); +} +function outro_and_destroy_block(block, lookup) { + transition_out(block, 1, 1, () => { + lookup.delete(block.key); + }); +} +function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block6, next, get_context) { + let o = old_blocks.length; + let n = list.length; + let i = o; + const old_indexes = {}; + while (i--) + old_indexes[old_blocks[i].key] = i; + const new_blocks = []; + const new_lookup = /* @__PURE__ */ new Map(); + const deltas = /* @__PURE__ */ new Map(); + const updates = []; + i = n; + while (i--) { + const child_ctx = get_context(ctx, list, i); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block6(key, child_ctx); + block.c(); + } else if (dynamic) { + updates.push(() => block.p(child_ctx, dirty)); + } + new_lookup.set(key, new_blocks[i] = block); + if (key in old_indexes) + deltas.set(key, Math.abs(i - old_indexes[key])); + } + const will_move = /* @__PURE__ */ new Set(); + const did_move = /* @__PURE__ */ new Set(); + function insert2(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n--; + } + while (o && n) { + const new_block = new_blocks[n - 1]; + const old_block = old_blocks[o - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + next = new_block.first; + o--; + n--; + } else if (!new_lookup.has(old_key)) { + destroy(old_block, lookup); + o--; + } else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert2(new_block); + } else if (did_move.has(old_key)) { + o--; + } else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert2(new_block); + } else { + will_move.add(old_key); + o--; + } + } + while (o--) { + const old_block = old_blocks[o]; + if (!new_lookup.has(old_block.key)) + destroy(old_block, lookup); + } + while (n) + insert2(new_blocks[n - 1]); + run_all(updates); + return new_blocks; +} + +// node_modules/svelte/src/shared/boolean_attributes.js +var _boolean_attributes = ( + /** @type {const} */ + [ + "allowfullscreen", + "allowpaymentrequest", + "async", + "autofocus", + "autoplay", + "checked", + "controls", + "default", + "defer", + "disabled", + "formnovalidate", + "hidden", + "inert", + "ismap", + "loop", + "multiple", + "muted", + "nomodule", + "novalidate", + "open", + "playsinline", + "readonly", + "required", + "reversed", + "selected" + ] +); +var boolean_attributes = /* @__PURE__ */ new Set([..._boolean_attributes]); + +// node_modules/svelte/src/runtime/internal/Component.js +function bind(component, name, callback) { + const index = component.$$.props[name]; + if (index !== void 0) { + component.$$.bound[index] = callback; + callback(component.$$.ctx[index]); + } +} +function create_component(block) { + block && block.c(); +} +function mount_component(component, target, anchor) { + const { fragment, after_update } = component.$$; + fragment && fragment.m(target, anchor); + add_render_callback(() => { + const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); + if (component.$$.on_destroy) { + component.$$.on_destroy.push(...new_on_destroy); + } else { + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + flush_render_callbacks($$.after_update); + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[i / 31 | 0] |= 1 << i % 31; +} +function init(component, options, instance6, create_fragment6, not_equal, props, append_styles2 = null, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: [], + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root + }; + append_styles2 && append_styles2($$.root); + let ready = false; + $$.ctx = instance6 ? instance6(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) : []; + $$.update(); + ready = true; + run_all($$.before_update); + $$.fragment = create_fragment6 ? create_fragment6($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + start_hydrating(); + const nodes = children(options.target); + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor); + end_hydrating(); + flush(); + } + set_current_component(parent_component); +} +var SvelteElement; +if (typeof HTMLElement === "function") { + SvelteElement = class extends HTMLElement { + constructor($$componentCtor, $$slots, use_shadow_dom) { + super(); + /** The Svelte component constructor */ + __publicField(this, "$$ctor"); + /** Slots */ + __publicField(this, "$$s"); + /** The Svelte component instance */ + __publicField(this, "$$c"); + /** Whether or not the custom element is connected */ + __publicField(this, "$$cn", false); + /** Component props data */ + __publicField(this, "$$d", {}); + /** `true` if currently in the process of reflecting component props back to attributes */ + __publicField(this, "$$r", false); + /** @type {Record} Props definition (name, reflected, type etc) */ + __publicField(this, "$$p_d", {}); + /** @type {Record} Event listeners */ + __publicField(this, "$$l", {}); + /** @type {Map} Event listener unsubscribe functions */ + __publicField(this, "$$l_u", /* @__PURE__ */ new Map()); + this.$$ctor = $$componentCtor; + this.$$s = $$slots; + if (use_shadow_dom) { + this.attachShadow({ mode: "open" }); + } + } + addEventListener(type, listener, options) { + this.$$l[type] = this.$$l[type] || []; + this.$$l[type].push(listener); + if (this.$$c) { + const unsub = this.$$c.$on(type, listener); + this.$$l_u.set(listener, unsub); + } + super.addEventListener(type, listener, options); + } + removeEventListener(type, listener, options) { + super.removeEventListener(type, listener, options); + if (this.$$c) { + const unsub = this.$$l_u.get(listener); + if (unsub) { + unsub(); + this.$$l_u.delete(listener); + } + } + } + async connectedCallback() { + this.$$cn = true; + if (!this.$$c) { + let create_slot = function(name) { + return () => { + let node; + const obj = { + c: function create() { + node = element("slot"); + if (name !== "default") { + attr(node, "name", name); + } + }, + /** + * @param {HTMLElement} target + * @param {HTMLElement} [anchor] + */ + m: function mount(target, anchor) { + insert(target, node, anchor); + }, + d: function destroy(detaching) { + if (detaching) { + detach(node); + } + } + }; + return obj; + }; + }; + await Promise.resolve(); + if (!this.$$cn) { + return; + } + const $$slots = {}; + const existing_slots = get_custom_elements_slots(this); + for (const name of this.$$s) { + if (name in existing_slots) { + $$slots[name] = [create_slot(name)]; + } + } + for (const attribute of this.attributes) { + const name = this.$$g_p(attribute.name); + if (!(name in this.$$d)) { + this.$$d[name] = get_custom_element_value(name, attribute.value, this.$$p_d, "toProp"); + } + } + this.$$c = new this.$$ctor({ + target: this.shadowRoot || this, + props: { + ...this.$$d, + $$slots, + $$scope: { + ctx: [] + } + } + }); + const reflect_attributes = () => { + this.$$r = true; + for (const key in this.$$p_d) { + this.$$d[key] = this.$$c.$$.ctx[this.$$c.$$.props[key]]; + if (this.$$p_d[key].reflect) { + const attribute_value = get_custom_element_value( + key, + this.$$d[key], + this.$$p_d, + "toAttribute" + ); + if (attribute_value == null) { + this.removeAttribute(this.$$p_d[key].attribute || key); + } else { + this.setAttribute(this.$$p_d[key].attribute || key, attribute_value); + } + } + } + this.$$r = false; + }; + this.$$c.$$.after_update.push(reflect_attributes); + reflect_attributes(); + for (const type in this.$$l) { + for (const listener of this.$$l[type]) { + const unsub = this.$$c.$on(type, listener); + this.$$l_u.set(listener, unsub); + } + } + this.$$l = {}; + } + } + // We don't need this when working within Svelte code, but for compatibility of people using this outside of Svelte + // and setting attributes through setAttribute etc, this is helpful + attributeChangedCallback(attr2, _oldValue, newValue) { + var _a; + if (this.$$r) + return; + attr2 = this.$$g_p(attr2); + this.$$d[attr2] = get_custom_element_value(attr2, newValue, this.$$p_d, "toProp"); + (_a = this.$$c) == null ? void 0 : _a.$set({ [attr2]: this.$$d[attr2] }); + } + disconnectedCallback() { + this.$$cn = false; + Promise.resolve().then(() => { + if (!this.$$cn) { + this.$$c.$destroy(); + this.$$c = void 0; + } + }); + } + $$g_p(attribute_name) { + return Object.keys(this.$$p_d).find( + (key) => this.$$p_d[key].attribute === attribute_name || !this.$$p_d[key].attribute && key.toLowerCase() === attribute_name + ) || attribute_name; + } + }; +} +function get_custom_element_value(prop, value, props_definition, transform) { + var _a; + const type = (_a = props_definition[prop]) == null ? void 0 : _a.type; + value = type === "Boolean" && typeof value !== "boolean" ? value != null : value; + if (!transform || !props_definition[prop]) { + return value; + } else if (transform === "toAttribute") { + switch (type) { + case "Object": + case "Array": + return value == null ? null : JSON.stringify(value); + case "Boolean": + return value ? "" : null; + case "Number": + return value == null ? null : value; + default: + return value; + } + } else { + switch (type) { + case "Object": + case "Array": + return value && JSON.parse(value); + case "Boolean": + return value; + case "Number": + return value != null ? +value : value; + default: + return value; + } + } +} +var SvelteComponent = class { + constructor() { + /** + * ### PRIVATE API + * + * Do not use, may change at any time + * + * @type {any} + */ + __publicField(this, "$$"); + /** + * ### PRIVATE API + * + * Do not use, may change at any time + * + * @type {any} + */ + __publicField(this, "$$set"); + } + /** @returns {void} */ + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + /** + * @template {Extract} K + * @param {K} type + * @param {((e: Events[K]) => void) | null | undefined} callback + * @returns {() => void} + */ + $on(type, callback) { + if (!is_function(callback)) { + return noop; + } + const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + /** + * @param {Partial} props + * @returns {void} + */ + $set(props) { + if (this.$$set && !is_empty(props)) { + this.$$.skip_bound = true; + this.$$set(props); + this.$$.skip_bound = false; + } + } +}; + +// node_modules/svelte/src/shared/version.js +var PUBLIC_VERSION = "4"; + +// node_modules/svelte/src/runtime/internal/disclose-version/index.js +if (typeof window !== "undefined") + (window.__svelte || (window.__svelte = { v: /* @__PURE__ */ new Set() })).v.add(PUBLIC_VERSION); + +// node_modules/tslib/tslib.es6.js +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +// src/AddPropInput.svelte +function add_css(target) { + append_styles(target, "svelte-lb92c0", "input.svelte-lb92c0{max-height:25px;overflow-x:auto}select.svelte-lb92c0{height:21px}#name-input.svelte-lb92c0{flex-grow:0}.modal-input-container.svelte-lb92c0{width:95%;display:flex;flex-direction:row;align-items:center;gap:10px;margin-top:10px}.btn-inactive.svelte-lb92c0{cursor:not-allowed;pointer-events:none;opacity:0.7}"); +} +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[11] = list[i]; + return child_ctx; +} +function create_each_block(ctx) { + let option; + let t_value = ( + /*key*/ + ctx[11] + "" + ); + let t; + let option_value_value; + return { + c() { + option = element("option"); + t = text(t_value); + option.__value = option_value_value = /*options*/ + ctx[6][ + /*key*/ + ctx[11] + ]; + set_input_value(option, option.__value); + }, + m(target, anchor) { + insert(target, option, anchor); + append(option, t); + }, + p: noop, + d(detaching) { + if (detaching) { + detach(option); + } + } + }; +} +function create_fragment(ctx) { + let div; + let a; + let t0; + let a_class_value; + let a_tabindex_value; + let t1; + let select; + let t2; + let input0; + let t3; + let input1; + let mounted; + let dispose; + let each_value = ensure_array_like(Object.keys( + /*options*/ + ctx[6] + )); + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); + } + return { + c() { + div = element("div"); + a = element("a"); + t0 = text("X"); + t1 = space(); + select = element("select"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t2 = space(); + input0 = element("input"); + t3 = space(); + input1 = element("input"); + attr(a, "id", "del-btn"); + attr(a, "class", a_class_value = "btn-del " + /*isFirst*/ + (ctx[1] ? "btn-inactive" : "") + " svelte-lb92c0"); + attr(a, "tabindex", a_tabindex_value = /*isFirst*/ + ctx[1] ? -1 : 0); + attr(a, "href", "href"); + attr(select, "id", "type-input"); + attr(select, "class", "flex-obj svelte-lb92c0"); + if ( + /*inputType*/ + ctx[4] === void 0 + ) + add_render_callback(() => ( + /*select_change_handler*/ + ctx[8].call(select) + )); + attr(input0, "id", "name-input"); + attr(input0, "class", "name-input flex-obj svelte-lb92c0"); + attr(input0, "type", "text"); + attr(input0, "name", "name[]"); + attr(input0, "placeholder", "name"); + input0.required = true; + attr(input1, "id", "value-input"); + attr( + input1, + "type", + /*inputType*/ + ctx[4] + ); + attr(input1, "name", "value[]"); + attr(input1, "placeholder", "value"); + attr(input1, "class", "value-input flex-obj svelte-lb92c0"); + attr(div, "class", "modal-input-container svelte-lb92c0"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, a); + append(a, t0); + append(div, t1); + append(div, select); + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(select, null); + } + } + select_option( + select, + /*inputType*/ + ctx[4], + true + ); + append(div, t2); + append(div, input0); + ctx[9](input0); + set_input_value( + input0, + /*nameVal*/ + ctx[0] + ); + append(div, t3); + append(div, input1); + if (!mounted) { + dispose = [ + listen( + a, + "click", + /*click_handler*/ + ctx[7] + ), + listen( + select, + "change", + /*select_change_handler*/ + ctx[8] + ), + listen( + input0, + "input", + /*input0_input_handler*/ + ctx[10] + ) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & /*isFirst*/ + 2 && a_class_value !== (a_class_value = "btn-del " + /*isFirst*/ + (ctx2[1] ? "btn-inactive" : "") + " svelte-lb92c0")) { + attr(a, "class", a_class_value); + } + if (dirty & /*isFirst*/ + 2 && a_tabindex_value !== (a_tabindex_value = /*isFirst*/ + ctx2[1] ? -1 : 0)) { + attr(a, "tabindex", a_tabindex_value); + } + if (dirty & /*options, Object*/ + 64) { + each_value = ensure_array_like(Object.keys( + /*options*/ + ctx2[6] + )); + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(select, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + if (dirty & /*inputType, options, Object*/ + 80) { + select_option( + select, + /*inputType*/ + ctx2[4] + ); + } + if (dirty & /*nameVal*/ + 1 && input0.value !== /*nameVal*/ + ctx2[0]) { + set_input_value( + input0, + /*nameVal*/ + ctx2[0] + ); + } + if (dirty & /*inputType, options, Object*/ + 80) { + attr( + input1, + "type", + /*inputType*/ + ctx2[4] + ); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) { + detach(div); + } + destroy_each(each_blocks, detaching); + ctx[9](null); + mounted = false; + run_all(dispose); + } + }; +} +function instance($$self, $$props, $$invalidate) { + let { isFirst } = $$props; + let { removeInput } = $$props; + let { id } = $$props; + let { nameVal = "" } = $$props; + let inputType; + let inputEl; + const options = { + Text: "string", + Number: "number", + Checkbox: "checkbox", + Date: "date", + Datetime: "datetime-local" + }; + onMount(() => __awaiter(void 0, void 0, void 0, function* () { + yield tick(); + inputEl.focus(); + inputEl.select(); + })); + const click_handler = () => isFirst ? false : removeInput(id); + function select_change_handler() { + inputType = select_value(this); + $$invalidate(4, inputType); + $$invalidate(6, options); + } + function input0_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + inputEl = $$value; + $$invalidate(5, inputEl); + }); + } + function input0_input_handler() { + nameVal = this.value; + $$invalidate(0, nameVal); + } + $$self.$$set = ($$props2) => { + if ("isFirst" in $$props2) + $$invalidate(1, isFirst = $$props2.isFirst); + if ("removeInput" in $$props2) + $$invalidate(2, removeInput = $$props2.removeInput); + if ("id" in $$props2) + $$invalidate(3, id = $$props2.id); + if ("nameVal" in $$props2) + $$invalidate(0, nameVal = $$props2.nameVal); + }; + return [ + nameVal, + isFirst, + removeInput, + id, + inputType, + inputEl, + options, + click_handler, + select_change_handler, + input0_binding, + input0_input_handler + ]; +} +var AddPropInput = class extends SvelteComponent { + constructor(options) { + super(); + init( + this, + options, + instance, + create_fragment, + safe_not_equal, + { + isFirst: 1, + removeInput: 2, + id: 3, + nameVal: 0 + }, + add_css + ); + } +}; +var AddPropInput_default = AddPropInput; + +// src/helpers.ts +function parseValue(input, type) { + switch (type) { + case "number": + return Number(input.value); + case "checkbox": + return Boolean(input.checked); + default: + return input.value; + } +} +function removeExtraCommas(str) { + return str.replace(/^,*(.*?),*$/g, "$1").replace(/,{2,}/g, ","); +} +function cleanTags(str) { + let cleanStr = str; + for (let index in KNOWN_BAD_CHARACTERS) { + cleanStr = cleanStr.replaceAll(KNOWN_BAD_CHARACTERS[index], ""); + } + return cleanStr; +} +var KNOWN_BAD_CHARACTERS = [ + "\u2012", + "\u2013", + "\u2014", + "\u2015", + "\u204F", + "\u203D", + "\u2018", + "\u201A", + "\u201B", + "\u2039", + "\u203A", + "\u201C", + "\u201D", + "\u201E", + "\u201F", + "\u2045", + "\u2046", + "\u204B", + "\u204E", + "\u2051", + "\u2044", + "\u204A", + "\u2030", + "\u2031", + "\u2052", + "\u2020", + "\u2021", + "\u2022", + "\u2023", + "\u2043", + "\u204C", + "\u204D", + "\u2032", + "\u2035", + "\u2038", + "\u203B", + "\u2050", + "\u2041", + "\u2042", + "\u2016", + "\u2011", + "\u2033", + "\u2034", + "\u2057", + "\u2036", + "\u2037", + "`", + "^", + "\u203E", + "\u2017", + "\u2053", + ";", + ":", + "!", + "\u203C", + "\u2049", + "?", + "\u2048", + "\u2047", + ".", + "\u2024", + "\u2025", + "\u2026", + "'", + '"', + "(", + ")", + "[", + "]", + "{", + "}", + "@", + "*", + "&", + "%", + "\u2054", + "+", + "<", + "=", + ">", + "|", + "~", + "$", + "\u2055", + "\u2056", + "\u2058", + "\u2059", + "\u205A", + "\u205B", + "\u205C", + "\u205D", + "\u205E", + "\u2E00", + "\u2E01", + "\u2E02", + "\u2E03", + "\u2E04", + "\u2E05", + "\u2E06", + "\u2E07", + "\u2E08", + "\u2E09", + "\u2E0A", + "\u2E0B", + "\u2E0C", + "\u2E0D", + "\u2E0E", + "\u2E0F", + "\u2E10", + "\u2E11", + "\u2E12", + "\u2E13", + "\u2E14", + "\u2E15", + "\u2E16", + "\u2E17", + "\u2E1C", + "\u2E1D", + " ", + "#" +]; + +// src/AddPropForm.svelte +var { Map: Map_1 } = globals; +function add_css2(target) { + append_styles(target, "svelte-1ied4k", ".modal-inputs-container.svelte-1ied4k{height:200px;width:100%;overflow-y:scroll;border-radius:5px;border-style:solid;display:flex;flex-direction:column;align-items:center}.modal-add-container.svelte-1ied4k{margin-top:10px}.alert-container.svelte-1ied4k{display:flex;flex-direction:column;align-items:center;justify-content:center;margin-bottom:10px;background-color:red;font-weight:bold}.hidden.svelte-1ied4k{display:none}"); +} +function get_each_context2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[19] = list[i]; + child_ctx[20] = list; + child_ctx[21] = i; + return child_ctx; +} +function create_each_block2(key_1, ctx) { + let first; + let propinput; + let updating_nameVal; + let current; + function propinput_nameVal_binding(value) { + ctx[14]( + value, + /*input*/ + ctx[19] + ); + } + let propinput_props = { + isFirst: ( + /*input*/ + ctx[19].isFirst + ), + id: ( + /*input*/ + ctx[19].id + ), + removeInput: ( + /*removeInput*/ + ctx[8] + ) + }; + if ( + /*input*/ + ctx[19].nameDef !== void 0 + ) { + propinput_props.nameVal = /*input*/ + ctx[19].nameDef; + } + propinput = new AddPropInput_default({ props: propinput_props }); + binding_callbacks.push(() => bind(propinput, "nameVal", propinput_nameVal_binding)); + return { + key: key_1, + first: null, + c() { + first = empty(); + create_component(propinput.$$.fragment); + this.first = first; + }, + m(target, anchor) { + insert(target, first, anchor); + mount_component(propinput, target, anchor); + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + const propinput_changes = {}; + if (dirty & /*inputEls*/ + 32) + propinput_changes.isFirst = /*input*/ + ctx[19].isFirst; + if (dirty & /*inputEls*/ + 32) + propinput_changes.id = /*input*/ + ctx[19].id; + if (!updating_nameVal && dirty & /*inputEls*/ + 32) { + updating_nameVal = true; + propinput_changes.nameVal = /*input*/ + ctx[19].nameDef; + add_flush_callback(() => updating_nameVal = false); + } + propinput.$set(propinput_changes); + }, + i(local) { + if (current) + return; + transition_in(propinput.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(propinput.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) { + detach(first); + } + destroy_component(propinput, detaching); + } + }; +} +function create_fragment2(ctx) { + let div6; + let div2; + let div0; + let t1; + let div1; + let t2; + let t3; + let p0; + let t5; + let p1; + let t6; + let t7; + let t8; + let t9; + let p2; + let t11; + let form; + let label; + let input_1; + let t12_value = "Overwrite existing properties"; + let t12; + let t13; + let div3; + let each_blocks = []; + let each_1_lookup = new Map_1(); + let t14; + let div4; + let a; + let t16; + let div5; + let button; + let current; + let mounted; + let dispose; + let each_value = ensure_array_like( + /*inputEls*/ + ctx[5] + ); + const get_key = (ctx2) => ( + /*input*/ + ctx2[19].id + ); + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context2(ctx, each_value, i); + let key = get_key(child_ctx); + each_1_lookup.set(key, each_blocks[i] = create_each_block2(key, child_ctx)); + } + return { + c() { + div6 = element("div"); + div2 = element("div"); + div0 = element("div"); + div0.textContent = "ERROR"; + t1 = space(); + div1 = element("div"); + t2 = text( + /*alertText*/ + ctx[4] + ); + t3 = space(); + p0 = element("p"); + p0.textContent = "Type in a property name, then value. Use the dropbox to choose what type of\r\n data you wish to store."; + t5 = space(); + p1 = element("p"); + t6 = text('If you want to make a List property, use the Text data type and separate\r\n each value with a "'); + t7 = text( + /*delimiter*/ + ctx[1] + ); + t8 = text('".'); + t9 = space(); + p2 = element("p"); + p2.textContent = 'If you want to add Tags, use the name "tags".'; + t11 = space(); + form = element("form"); + label = element("label"); + input_1 = element("input"); + t12 = text(t12_value); + t13 = space(); + div3 = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t14 = space(); + div4 = element("div"); + a = element("a"); + a.textContent = "Add"; + t16 = space(); + div5 = element("div"); + button = element("button"); + button.textContent = "Submit"; + attr(div1, "id", "alert-text"); + attr(div2, "id", "alert-container"); + attr(div2, "class", "alert-container hidden svelte-1ied4k"); + attr(input_1, "type", "checkbox"); + input_1.checked = /*overwrite*/ + ctx[0]; + attr(div3, "class", "modal-inputs-container svelte-1ied4k"); + attr(a, "class", "a-btn"); + attr(a, "href", "href"); + attr(div4, "class", "modal-add-container svelte-1ied4k"); + attr(button, "class", "btn-submit"); + attr(div5, "class", "modal-button-container"); + attr(div6, "id", "multi-properties-modal"); + attr(div6, "class", "modal-content"); + }, + m(target, anchor) { + insert(target, div6, anchor); + append(div6, div2); + append(div2, div0); + append(div2, t1); + append(div2, div1); + append(div1, t2); + ctx[13](div2); + append(div6, t3); + append(div6, p0); + append(div6, t5); + append(div6, p1); + append(p1, t6); + append(p1, t7); + append(p1, t8); + append(div6, t9); + append(div6, p2); + append(div6, t11); + append(div6, form); + append(form, label); + append(label, input_1); + append(label, t12); + append(form, t13); + append(form, div3); + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(div3, null); + } + } + append(form, t14); + append(form, div4); + append(div4, a); + append(form, t16); + append(form, div5); + append(div5, button); + ctx[15](form); + current = true; + if (!mounted) { + dispose = [ + listen( + input_1, + "change", + /*onCheckboxChange*/ + ctx[6] + ), + listen( + a, + "click", + /*addInput*/ + ctx[7] + ), + listen( + button, + "click", + /*onSubmit*/ + ctx[9] + ), + listen(form, "submit", prevent_default( + /*submit_handler*/ + ctx[12] + )) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (!current || dirty & /*alertText*/ + 16) + set_data( + t2, + /*alertText*/ + ctx2[4] + ); + if (!current || dirty & /*delimiter*/ + 2) + set_data( + t7, + /*delimiter*/ + ctx2[1] + ); + if (!current || dirty & /*overwrite*/ + 1) { + input_1.checked = /*overwrite*/ + ctx2[0]; + } + if (dirty & /*inputEls, removeInput*/ + 288) { + each_value = ensure_array_like( + /*inputEls*/ + ctx2[5] + ); + group_outros(); + each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx2, each_value, each_1_lookup, div3, outro_and_destroy_block, create_each_block2, null, get_each_context2); + check_outros(); + } + }, + i(local) { + if (current) + return; + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } + current = true; + }, + o(local) { + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + current = false; + }, + d(detaching) { + if (detaching) { + detach(div6); + } + ctx[13](null); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + ctx[15](null); + mounted = false; + run_all(dispose); + } + }; +} +function instance2($$self, $$props, $$invalidate) { + let { submission } = $$props; + let { overwrite } = $$props; + let { delimiter = "," } = $$props; + let { changeBool } = $$props; + let countInputs = 1; + let formEl; + let errorEl; + let alertText = "."; + function onCheckboxChange() { + $$invalidate(0, overwrite = !overwrite); + changeBool(overwrite); + } + let inputEls = [{ id: 1, isFirst: true, nameDef: "" }]; + function addInput() { + countInputs++; + const newInput = { + id: countInputs, + isFirst: false, + nameDef: "" + }; + $$invalidate(5, inputEls = [...inputEls, newInput]); + } + function removeInput(id) { + return __awaiter(this, void 0, void 0, function* () { + $$invalidate(5, inputEls = inputEls.filter((input) => input.id !== id)); + yield tick(); + let inputs = formEl.querySelectorAll("input"); + if (!inputs) + return; + inputs[inputs.length - 2].focus(); + }); + } + function checkDuplicateNames() { + let set = /* @__PURE__ */ new Set(); + for (let input of inputEls) + set.add(input.nameDef); + if (set.size < inputEls.length) + return true; + else + return false; + } + function runError(errorText) { + $$invalidate(4, alertText = errorText); + errorEl.classList.remove("hidden"); + } + function onSubmit() { + if (checkDuplicateNames()) { + runError("Duplicate property names are not allowed."); + return; + } + let obj = /* @__PURE__ */ new Map(); + let inputs = formEl.querySelectorAll('input[name^="name[]"]'); + inputs.forEach((input) => { + if (!(input.nextElementSibling instanceof HTMLInputElement)) + return; + if (!(input.previousElementSibling instanceof HTMLSelectElement)) + return; + if (!(input.previousElementSibling.children[0] instanceof HTMLOptionElement)) + return; + let name = input.value; + if (name === "") { + input.reportValidity(); + return; + } + let value = parseValue(input.nextElementSibling, input.nextElementSibling.type); + if (typeof value === "string") { + if (name === "tags") { + value = cleanTags(value); + } + if (value.contains(delimiter)) { + let str = removeExtraCommas(value); + value = str.split(delimiter); + } + } + let inputType = input.previousElementSibling.children[0].innerText.toLowerCase(); + let propObj = { + type: inputType, + data: value, + overwrite: false, + delimiter + }; + obj.set(name, propObj); + }); + if (obj.size < inputs.length) + return; + submission(obj); + } + function submit_handler(event) { + bubble.call(this, $$self, event); + } + function div2_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + errorEl = $$value; + $$invalidate(3, errorEl); + }); + } + function propinput_nameVal_binding(value, input) { + if ($$self.$$.not_equal(input.nameDef, value)) { + input.nameDef = value; + $$invalidate(5, inputEls); + } + } + function form_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + formEl = $$value; + $$invalidate(2, formEl); + }); + } + $$self.$$set = ($$props2) => { + if ("submission" in $$props2) + $$invalidate(10, submission = $$props2.submission); + if ("overwrite" in $$props2) + $$invalidate(0, overwrite = $$props2.overwrite); + if ("delimiter" in $$props2) + $$invalidate(1, delimiter = $$props2.delimiter); + if ("changeBool" in $$props2) + $$invalidate(11, changeBool = $$props2.changeBool); + }; + return [ + overwrite, + delimiter, + formEl, + errorEl, + alertText, + inputEls, + onCheckboxChange, + addInput, + removeInput, + onSubmit, + submission, + changeBool, + submit_handler, + div2_binding, + propinput_nameVal_binding, + form_binding + ]; +} +var AddPropForm = class extends SvelteComponent { + constructor(options) { + super(); + init( + this, + options, + instance2, + create_fragment2, + safe_not_equal, + { + submission: 10, + overwrite: 0, + delimiter: 1, + changeBool: 11 + }, + add_css2 + ); + } +}; +var AddPropForm_default = AddPropForm; + +// src/AddConfirmModal.ts +var import_obsidian = require("obsidian"); + +// src/AddConfirmForm.svelte +function add_css3(target) { + append_styles(target, "svelte-135liin", ".msg.svelte-135liin{font-weight:bold;padding-bottom:10px}"); +} +function get_each_context3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[7] = list[i][0]; + child_ctx[8] = list[i][1]; + return child_ctx; +} +function create_each_block3(ctx) { + let li; + let t0_value = ( + /*propName*/ + ctx[7] + "" + ); + let t0; + let t1; + let t2_value = ( + /*prop*/ + ctx[8].data + "" + ); + let t2; + let t3; + return { + c() { + li = element("li"); + t0 = text(t0_value); + t1 = text(": "); + t2 = text(t2_value); + t3 = space(); + }, + m(target, anchor) { + insert(target, li, anchor); + append(li, t0); + append(li, t1); + append(li, t2); + append(li, t3); + }, + p(ctx2, dirty) { + if (dirty & /*props*/ + 1 && t0_value !== (t0_value = /*propName*/ + ctx2[7] + "")) + set_data(t0, t0_value); + if (dirty & /*props*/ + 1 && t2_value !== (t2_value = /*prop*/ + ctx2[8].data + "")) + set_data(t2, t2_value); + }, + d(detaching) { + if (detaching) { + detach(li); + } + } + }; +} +function create_fragment3(ctx) { + let div; + let form; + let p0; + let t1; + let p1; + let t3; + let ul; + let t4; + let p2; + let t6; + let button0; + let t8; + let button1; + let mounted; + let dispose; + let each_value = ensure_array_like([.../*props*/ + ctx[0]]); + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block3(get_each_context3(ctx, each_value, i)); + } + return { + c() { + div = element("div"); + form = element("form"); + p0 = element("p"); + p0.textContent = `${/*msg*/ + ctx[4]}`; + t1 = space(); + p1 = element("p"); + p1.textContent = "The following props will be added:"; + t3 = space(); + ul = element("ul"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t4 = space(); + p2 = element("p"); + p2.textContent = "Are you sure you wish to proceed?"; + t6 = space(); + button0 = element("button"); + button0.textContent = "Confirm"; + t8 = space(); + button1 = element("button"); + button1.textContent = "Cancel"; + attr(p0, "class", "msg svelte-135liin"); + attr(button0, "class", "mod-warning"); + attr(button0, "type", "submit"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, form); + append(form, p0); + append(form, t1); + append(form, p1); + append(form, t3); + append(form, ul); + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(ul, null); + } + } + append(form, t4); + append(form, p2); + append(form, t6); + append(form, button0); + append(form, t8); + append(form, button1); + ctx[6](button1); + if (!mounted) { + dispose = [ + listen(button1, "click", function() { + if (is_function( + /*cancel*/ + ctx[2] + )) + ctx[2].apply(this, arguments); + }), + listen(form, "submit", prevent_default(function() { + if (is_function( + /*submission*/ + ctx[1] + )) + ctx[1].apply(this, arguments); + })) + ]; + mounted = true; + } + }, + p(new_ctx, [dirty]) { + ctx = new_ctx; + if (dirty & /*props*/ + 1) { + each_value = ensure_array_like([.../*props*/ + ctx[0]]); + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context3(ctx, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block3(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(ul, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) { + detach(div); + } + destroy_each(each_blocks, detaching); + ctx[6](null); + mounted = false; + run_all(dispose); + } + }; +} +function instance3($$self, $$props, $$invalidate) { + let { props } = $$props; + let { overwrite = true } = $$props; + let { submission } = $$props; + let { cancel } = $$props; + let btnCancel; + const msg = overwrite ? "Any pre-existing text props will have their values overwritten." : "Any pre-existing text props will have their values be appended to."; + onMount(() => { + btnCancel.focus(); + }); + function button1_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + btnCancel = $$value; + $$invalidate(3, btnCancel); + }); + } + $$self.$$set = ($$props2) => { + if ("props" in $$props2) + $$invalidate(0, props = $$props2.props); + if ("overwrite" in $$props2) + $$invalidate(5, overwrite = $$props2.overwrite); + if ("submission" in $$props2) + $$invalidate(1, submission = $$props2.submission); + if ("cancel" in $$props2) + $$invalidate(2, cancel = $$props2.cancel); + }; + return [props, submission, cancel, btnCancel, msg, overwrite, button1_binding]; +} +var AddConfirmForm = class extends SvelteComponent { + constructor(options) { + super(); + init( + this, + options, + instance3, + create_fragment3, + safe_not_equal, + { + props: 0, + overwrite: 5, + submission: 1, + cancel: 2 + }, + add_css3 + ); + } +}; +var AddConfirmForm_default = AddConfirmForm; + +// src/AddConfirmModal.ts +var AddConfirmModal = class extends import_obsidian.Modal { + constructor(app, props, overwrite, submission) { + super(app); + this.props = props; + this.overwrite = overwrite; + this.submission = submission; + } + onSubmit() { + this.submission(true); + this.close(); + } + onCancel() { + this.submission(false); + this.close(); + } + onOpen() { + this.titleEl.createEl("h2", { text: "Add Properties" }); + this.component = new AddConfirmForm_default({ + target: this.contentEl, + props: { + props: this.props, + overwrite: this.overwrite, + submission: this.onSubmit.bind(this), + cancel: this.onCancel.bind(this) + } + }); + } +}; + +// src/AddPropModal.ts +var PropModal = class extends import_obsidian2.Modal { + constructor(app, submission, overwrite, delimiter, changeBool) { + super(app); + this.submission = submission; + this.overwrite = overwrite; + this.delimiter = delimiter; + this.changeBool = changeBool; + } + //Run form submission if user clicks confirm. + onConfirm(bool) { + if (bool) { + this.submission(this.props); + this.close(); + } + } + updateBool(bool) { + this.overwrite = bool; + this.changeBool(bool); + } + //Pull up confirmation form when user submits base form. + onSubmit(props) { + this.props = props; + new AddConfirmModal( + this.app, + this.props, + this.overwrite, + this.onConfirm.bind(this) + ).open(); + } + onOpen() { + this.titleEl.createEl("h2", { text: "Add Properties" }); + this.component = new AddPropForm_default({ + target: this.contentEl, + props: { + submission: this.onSubmit.bind(this), + overwrite: this.overwrite, + delimiter: this.delimiter, + changeBool: this.updateBool.bind(this) + } + }); + } +}; + +// src/SettingTab.ts +var import_obsidian3 = require("obsidian"); +var SettingTab = class extends import_obsidian3.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + let { containerEl } = this; + containerEl.empty(); + new import_obsidian3.Setting(containerEl).setName("Overwrite existing text").setDesc( + "When adding a property with a name that already exists, the text will overwrite the prop's existing value. If left disabled, the new value will be appended to the old as a List." + ).addToggle((toggle) => { + toggle.setValue(this.plugin.settings.overwrite); + toggle.onChange(async (value) => { + this.plugin.settings.overwrite = value; + await this.plugin.saveSettings(); + }); + }); + new import_obsidian3.Setting(containerEl).setName("Recursive Iteration").setDesc( + "When toggled on, while looping through all files in a folder, you will also loop through any sub-folders." + ).addToggle((toggle) => { + toggle.setValue(this.plugin.settings.recursive); + toggle.onChange(async (value) => { + this.plugin.settings.recursive = value; + await this.plugin.saveSettings(); + }); + }); + new import_obsidian3.Setting(containerEl).setName("List Delimiter").setDesc( + "Set delimiter to use when creating a list. Commas(,) are used by default." + ).addText((text2) => { + text2.setValue(this.plugin.settings.delimiter); + text2.onChange(async (value) => { + if (value.length > 1) { + text2.setValue(value[0]); + new import_obsidian3.Notice("Delimiter must be a single character."); + return; + } + this.plugin.settings.delimiter = value; + await this.plugin.saveSettings(); + }); + }); + } +}; + +// src/RemoveModal.ts +var import_obsidian5 = require("obsidian"); + +// src/RemovePropForm.svelte +function add_css4(target) { + append_styles(target, "svelte-1264666", ".name-container.svelte-1264666{display:flex;flex-direction:column;gap:5px;margin-top:10px;margin-bottom:20px}.alert-container.svelte-1264666{display:flex;flex-direction:column;align-items:center;justify-content:center;margin-bottom:10px;background-color:red;font-weight:bold}.button-container.svelte-1264666{display:flex;flex-direction:row;justify-content:space-between}.hidden.svelte-1264666{display:none}"); +} +function get_each_context4(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[14] = list[i]; + child_ctx[15] = list; + child_ctx[16] = i; + return child_ctx; +} +function create_each_block4(ctx) { + let label; + let input_1; + let t0; + let t1_value = ( + /*input*/ + ctx[14].name + "" + ); + let t1; + let t2; + let mounted; + let dispose; + function input_1_change_handler() { + ctx[12].call( + input_1, + /*each_value*/ + ctx[15], + /*input_index*/ + ctx[16] + ); + } + return { + c() { + label = element("label"); + input_1 = element("input"); + t0 = space(); + t1 = text(t1_value); + t2 = space(); + attr(input_1, "type", "checkbox"); + }, + m(target, anchor) { + insert(target, label, anchor); + append(label, input_1); + set_input_value( + input_1, + /*input*/ + ctx[14].name + ); + input_1.checked = /*input*/ + ctx[14].isChecked; + append(label, t0); + append(label, t1); + append(label, t2); + if (!mounted) { + dispose = [ + listen(input_1, "change", input_1_change_handler), + listen( + input_1, + "change", + /*change_handler*/ + ctx[13] + ) + ]; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & /*inputs*/ + 8) { + set_input_value( + input_1, + /*input*/ + ctx[14].name + ); + } + if (dirty & /*inputs*/ + 8) { + input_1.checked = /*input*/ + ctx[14].isChecked; + } + if (dirty & /*inputs*/ + 8 && t1_value !== (t1_value = /*input*/ + ctx[14].name + "")) + set_data(t1, t1_value); + }, + d(detaching) { + if (detaching) { + detach(label); + } + mounted = false; + run_all(dispose); + } + }; +} +function create_fragment4(ctx) { + let div5; + let div2; + let div0; + let t1; + let div1; + let t2; + let t3; + let p; + let t5; + let form; + let div3; + let t6; + let div4; + let button0; + let t8; + let button1; + let t9_value = ( + /*isMaxChecked*/ + ctx[0] ? "Uncheck All" : "Check All" + ); + let t9; + let mounted; + let dispose; + let each_value = ensure_array_like( + /*inputs*/ + ctx[3] + ); + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block4(get_each_context4(ctx, each_value, i)); + } + return { + c() { + div5 = element("div"); + div2 = element("div"); + div0 = element("div"); + div0.textContent = "ERROR"; + t1 = space(); + div1 = element("div"); + t2 = text( + /*alertText*/ + ctx[2] + ); + t3 = space(); + p = element("p"); + p.textContent = "Select the properties you wish to remove from the file selection."; + t5 = space(); + form = element("form"); + div3 = element("div"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t6 = space(); + div4 = element("div"); + button0 = element("button"); + button0.textContent = "Confirm"; + t8 = space(); + button1 = element("button"); + t9 = text(t9_value); + attr(div1, "id", "alert-text"); + attr(div2, "id", "alert-container"); + attr(div2, "class", "alert-container hidden svelte-1264666"); + attr(div3, "class", "name-container svelte-1264666"); + attr(button0, "type", "submit"); + attr(div4, "class", "button-container svelte-1264666"); + }, + m(target, anchor) { + insert(target, div5, anchor); + append(div5, div2); + append(div2, div0); + append(div2, t1); + append(div2, div1); + append(div1, t2); + ctx[11](div2); + append(div5, t3); + append(div5, p); + append(div5, t5); + append(div5, form); + append(form, div3); + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(div3, null); + } + } + append(form, t6); + append(form, div4); + append(div4, button0); + append(div4, t8); + append(div4, button1); + append(button1, t9); + if (!mounted) { + dispose = [ + listen( + button0, + "click", + /*onSubmit*/ + ctx[6] + ), + listen( + button1, + "click", + /*toggleAll*/ + ctx[5] + ), + listen(form, "submit", prevent_default( + /*submit_handler*/ + ctx[10] + )) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & /*alertText*/ + 4) + set_data( + t2, + /*alertText*/ + ctx2[2] + ); + if (dirty & /*inputs, onCheckboxChange*/ + 24) { + each_value = ensure_array_like( + /*inputs*/ + ctx2[3] + ); + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context4(ctx2, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block4(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div3, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + if (dirty & /*isMaxChecked*/ + 1 && t9_value !== (t9_value = /*isMaxChecked*/ + ctx2[0] ? "Uncheck All" : "Check All")) + set_data(t9, t9_value); + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) { + detach(div5); + } + ctx[11](null); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; +} +function instance4($$self, $$props, $$invalidate) { + let isMaxChecked; + let { names = [] } = $$props; + let { submission } = $$props; + let errorEl; + let alertText = "."; + let checkCount = 0; + let inputs = []; + for (let name of names) { + inputs.push({ name, isChecked: false }); + } + names.sort(); + function onCheckboxChange(event) { + let checked = event.target.checked; + checked ? $$invalidate(9, checkCount++, checkCount) : $$invalidate(9, checkCount--, checkCount); + } + function toggleAll() { + if (isMaxChecked) { + $$invalidate(3, inputs = inputs.map((input) => Object.assign(Object.assign({}, input), { isChecked: false }))); + $$invalidate(9, checkCount = 0); + } else { + $$invalidate(3, inputs = inputs.map((input) => Object.assign(Object.assign({}, input), { isChecked: true }))); + $$invalidate(9, checkCount = names.length); + } + } + function onSubmit() { + if (checkCount === 0) { + $$invalidate(2, alertText = "Please select at least one property to remove."); + errorEl.classList.remove("hidden"); + return; + } + let propNames = inputs.filter((input) => input.isChecked).map((input) => input.name); + submission(propNames); + } + function submit_handler(event) { + bubble.call(this, $$self, event); + } + function div2_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + errorEl = $$value; + $$invalidate(1, errorEl); + }); + } + function input_1_change_handler(each_value, input_index) { + each_value[input_index].name = this.value; + each_value[input_index].isChecked = this.checked; + $$invalidate(3, inputs); + } + const change_handler = (event) => onCheckboxChange(event); + $$self.$$set = ($$props2) => { + if ("names" in $$props2) + $$invalidate(7, names = $$props2.names); + if ("submission" in $$props2) + $$invalidate(8, submission = $$props2.submission); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & /*checkCount, names*/ + 640) { + $: + $$invalidate(0, isMaxChecked = checkCount >= names.length); + } + if ($$self.$$.dirty & /*isMaxChecked*/ + 1) { + $: + console.log(isMaxChecked); + } + }; + return [ + isMaxChecked, + errorEl, + alertText, + inputs, + onCheckboxChange, + toggleAll, + onSubmit, + names, + submission, + checkCount, + submit_handler, + div2_binding, + input_1_change_handler, + change_handler + ]; +} +var RemovePropForm = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance4, create_fragment4, safe_not_equal, { names: 7, submission: 8 }, add_css4); + } +}; +var RemovePropForm_default = RemovePropForm; + +// src/RemoveConfirmModal.ts +var import_obsidian4 = require("obsidian"); + +// src/RemoveConfirmForm.svelte +function get_each_context5(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[6] = list[i]; + return child_ctx; +} +function create_each_block5(ctx) { + let li; + let t0_value = ( + /*name*/ + ctx[6] + "" + ); + let t0; + let t1; + return { + c() { + li = element("li"); + t0 = text(t0_value); + t1 = space(); + }, + m(target, anchor) { + insert(target, li, anchor); + append(li, t0); + append(li, t1); + }, + p(ctx2, dirty) { + if (dirty & /*names*/ + 1 && t0_value !== (t0_value = /*name*/ + ctx2[6] + "")) + set_data(t0, t0_value); + }, + d(detaching) { + if (detaching) { + detach(li); + } + } + }; +} +function create_fragment5(ctx) { + let div; + let form; + let p0; + let t3; + let ul; + let t4; + let p1; + let t6; + let button0; + let t8; + let button1; + let mounted; + let dispose; + let each_value = ensure_array_like( + /*names*/ + ctx[0] + ); + let each_blocks = []; + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block5(get_each_context5(ctx, each_value, i)); + } + return { + c() { + div = element("div"); + form = element("form"); + p0 = element("p"); + p0.textContent = `The following ${/*word*/ + ctx[4]} will be removed:`; + t3 = space(); + ul = element("ul"); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + t4 = space(); + p1 = element("p"); + p1.textContent = "Are you sure you wish to proceed?"; + t6 = space(); + button0 = element("button"); + button0.textContent = "Delete"; + t8 = space(); + button1 = element("button"); + button1.textContent = "Cancel"; + attr(button0, "class", "mod-warning"); + attr(button0, "type", "submit"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, form); + append(form, p0); + append(form, t3); + append(form, ul); + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(ul, null); + } + } + append(form, t4); + append(form, p1); + append(form, t6); + append(form, button0); + append(form, t8); + append(form, button1); + ctx[5](button1); + if (!mounted) { + dispose = [ + listen(button1, "click", function() { + if (is_function( + /*cancel*/ + ctx[2] + )) + ctx[2].apply(this, arguments); + }), + listen(form, "submit", prevent_default(function() { + if (is_function( + /*submission*/ + ctx[1] + )) + ctx[1].apply(this, arguments); + })) + ]; + mounted = true; + } + }, + p(new_ctx, [dirty]) { + ctx = new_ctx; + if (dirty & /*names*/ + 1) { + each_value = ensure_array_like( + /*names*/ + ctx[0] + ); + let i; + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context5(ctx, each_value, i); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block5(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(ul, null); + } + } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + each_blocks.length = each_value.length; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) { + detach(div); + } + destroy_each(each_blocks, detaching); + ctx[5](null); + mounted = false; + run_all(dispose); + } + }; +} +function instance5($$self, $$props, $$invalidate) { + let { names = ["test", "test2"] } = $$props; + let { submission } = $$props; + let { cancel } = $$props; + let btnCancel; + const word = names.length > 1 ? "properties" : "property"; + onMount(() => { + btnCancel.focus(); + }); + function button1_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + btnCancel = $$value; + $$invalidate(3, btnCancel); + }); + } + $$self.$$set = ($$props2) => { + if ("names" in $$props2) + $$invalidate(0, names = $$props2.names); + if ("submission" in $$props2) + $$invalidate(1, submission = $$props2.submission); + if ("cancel" in $$props2) + $$invalidate(2, cancel = $$props2.cancel); + }; + return [names, submission, cancel, btnCancel, word, button1_binding]; +} +var RemoveConfirmForm = class extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance5, create_fragment5, safe_not_equal, { names: 0, submission: 1, cancel: 2 }); + } +}; +var RemoveConfirmForm_default = RemoveConfirmForm; + +// src/RemoveConfirmModal.ts +var RemoveConfirmModal = class extends import_obsidian4.Modal { + constructor(app, names, submission) { + super(app); + this.names = names; + this.submission = submission; + } + onSubmit() { + this.submission(true); + this.close(); + } + onCancel() { + this.submission(false); + this.close(); + } + onOpen() { + if (!this.names || this.names.length === 0) { + new import_obsidian4.Notice("Please check at least one property to remove."); + this.close(); + } + this.titleEl.createEl("h2", { text: "Remove Properties" }); + this.component = new RemoveConfirmForm_default({ + target: this.contentEl, + props: { + names: this.names, + submission: this.onSubmit.bind(this), + cancel: this.onCancel.bind(this) + } + }); + } +}; + +// src/RemoveModal.ts +var RemoveModal = class extends import_obsidian5.Modal { + constructor(app, names, submission) { + if (!names || names.length === 0) { + new import_obsidian5.Notice("No properties to remove"); + return; + } + super(app); + this.names = names; + this.submission = submission; + } + onConfirm(bool) { + if (bool) { + this.submission(this.props); + this.close(); + } + } + onSubmit(props) { + this.props = props; + new RemoveConfirmModal( + this.app, + this.props, + this.onConfirm.bind(this) + ).open(); + } + onOpen() { + this.titleEl.createEl("h2", { text: "Remove Properties" }); + this.component = new RemovePropForm_default({ + target: this.contentEl, + props: { + names: this.names, + submission: this.onSubmit.bind(this) + } + }); + } +}; + +// src/frontmatter.ts +function addProperties(app, file, props, overwrite) { + let propCache = app.metadataCache.getAllPropertyInfos(); + app.fileManager.processFrontMatter(file, (frontmatter) => { + for (const [key, value] of props) { + if (!frontmatter[key] || overwrite) { + frontmatter[key] = value.data; + continue; + } + let type1 = value.type; + let type2 = propCache[key.toLowerCase()].type; + if (canBeAppended(type1, type2)) { + if (frontmatter[key] === value.data) + continue; + let arr = mergeIntoArrays(frontmatter[key], value.data); + frontmatter[key] = arr; + continue; + } else { + frontmatter[key] = value.data; + continue; + } + } + }); +} +async function addPropToSet(app, set, file) { + await app.fileManager.processFrontMatter(file, (frontmatter) => { + for (const key in frontmatter) { + set.add(key); + } + }); + return set; +} +function removeProperties(app, file, props) { + app.fileManager.processFrontMatter(file, (frontmatter) => { + for (const prop of props) { + frontmatter[prop] = void 0; + } + }); +} +function canBeAppended(str1, str2) { + let arr = ["number", "date", "datetime", "checkbox"]; + if (arr.includes(str1) || arr.includes(str2)) + return false; + return true; +} +function mergeIntoArrays(...args) { + const arrays = args.map((arg) => Array.isArray(arg) ? arg : [arg]); + const flattened = arrays.flat(); + const unique = [...new Set(flattened)]; + return unique; +} + +// src/main.ts +var defaultSettings = { + overwrite: false, + recursive: true, + delimiter: "," +}; +var MultiPropPlugin = class extends import_obsidian6.Plugin { + async loadSettings() { + this.settings = Object.assign({}, defaultSettings, await this.loadData()); + } + async saveSettings() { + await this.saveData(this.settings); + } + async changeOverwrite(bool) { + this.settings.overwrite = bool; + await this.saveSettings(); + } + async onload() { + await this.loadSettings(); + console.log(this.app.metadataCache); + this.addSettingTab(new SettingTab(this.app, this)); + this.registerEvent( + this.app.workspace.on("file-menu", (menu, folder) => { + if (folder instanceof import_obsidian6.TFolder) { + menu.addItem((item) => { + item.setIcon("archive").setTitle("Add props to folder's notes").onClick(() => this.createPropModal(folder)); + }); + } + }) + ); + this.registerEvent( + this.app.workspace.on("file-menu", (menu, folder) => { + if (folder instanceof import_obsidian6.TFolder) { + menu.addItem((item) => { + item.setIcon("archive").setTitle("Remove props from folder's notes").onClick(async () => this.createRemoveModal(folder)); + }); + } + }) + ); + this.registerEvent( + this.app.workspace.on("files-menu", (menu, files) => { + menu.addItem((item) => { + item.setIcon("archive").setTitle("Add props to selected files").onClick(() => this.createPropModal(files)); + }); + }) + ); + this.registerEvent( + this.app.workspace.on("files-menu", (menu, files) => { + menu.addItem((item) => { + item.setIcon("archive").setTitle("Remove props from selected files").onClick(async () => this.createRemoveModal(files)); + }); + }) + ); + this.registerEvent( + this.app.workspace.on("search:results-menu", (menu, leaf) => { + menu.addItem((item) => { + item.setIcon("archive").setTitle("Add props to search results").onClick(() => { + let files = this.getFilesFromSearch(leaf); + if (!files.length) { + new import_obsidian6.Notice("No files to add properties to.", 4e3); + return; + } + this.createPropModal(files); + }); + }); + }) + ); + this.registerEvent( + this.app.workspace.on("search:results-menu", (menu, leaf) => { + menu.addItem((item) => { + item.setIcon("archive").setTitle("Remove props from search results").onClick(async () => { + let files = this.getFilesFromSearch(leaf); + if (!files.length) { + new import_obsidian6.Notice("No files to remove properties from.", 4e3); + return; + } + this.createRemoveModal(files); + }); + }); + }) + ); + } + async getPropsFromFolder(folder, names) { + for (let obj of folder.children) { + if (obj instanceof import_obsidian6.TFile && obj.extension === "md") { + names = await addPropToSet(this.app, names, obj); + } + if (obj instanceof import_obsidian6.TFolder) { + if (this.settings.recursive) { + this.getPropsFromFolder(obj, names); + } + } + } + return [...names]; + } + async getPropsFromFiles(files, names) { + for (let file of files) { + if (file instanceof import_obsidian6.TFile && file.extension === "md") { + names = await addPropToSet(this.app, names, file); + } + } + return [...names]; + } + /** Iterates through all files in a folder and runs callback on each file. */ + searchFolders(folder, callback) { + for (let obj of folder.children) { + if (obj instanceof import_obsidian6.TFolder) { + if (this.settings.recursive) { + this.searchFolders(obj, callback); + } + } + if (obj instanceof import_obsidian6.TFile && obj.extension === "md") { + callback(obj); + } + } + } + /** Iterates through selection of files and runs a given callback function on that file. */ + searchFiles(files, callback) { + for (let file of files) { + if (file instanceof import_obsidian6.TFile && file.extension === "md") { + callback(file); + } + } + } + /** Get all files from a search result. */ + getFilesFromSearch(leaf) { + let files = []; + leaf.dom.vChildren.children.forEach((e) => { + files.push(e.file); + }); + return files; + } + /** Create modal for removing properties. + * Will call a different function depending on whether files or a folder is used. */ + createPropModal(iterable) { + let iterateFunc; + if (iterable instanceof import_obsidian6.TFolder) { + iterateFunc = (props) => this.searchFolders(iterable, this.addPropsCallback(props)); + } else { + iterateFunc = (props) => this.searchFiles(iterable, this.addPropsCallback(props)); + } + new PropModal( + this.app, + iterateFunc, + this.settings.overwrite, + this.settings.delimiter, + this.changeOverwrite.bind(this) + ).open(); + } + /** Create modal for removing properties. + * Will call a different function depending on whether files or a folder is used. */ + async createRemoveModal(iterable) { + let names; + let iterateFunc; + if (iterable instanceof import_obsidian6.TFolder) { + names = await this.getPropsFromFolder(iterable, /* @__PURE__ */ new Set()); + iterateFunc = (props) => this.searchFolders(iterable, this.removePropsCallback(props)); + } else { + names = await this.getPropsFromFiles(iterable, /* @__PURE__ */ new Set()); + iterateFunc = (props) => this.searchFiles(iterable, this.removePropsCallback(props)); + } + if (names.length === 0) { + new import_obsidian6.Notice("No properties to remove"); + return; + } + new RemoveModal(this.app, names, iterateFunc).open(); + } + /** Callback function to run addProperties inside iterative functions.*/ + addPropsCallback(props) { + return (file) => { + addProperties(this.app, file, props, this.settings.overwrite); + }; + } + /** Callback function to run removeProperties inside iterative functions. */ + removePropsCallback(props) { + return (file) => { + removeProperties(this.app, file, props); + }; + } +}; diff --git a/GGDoc/.obsidian/plugins/multi-properties/manifest.json b/GGDoc/.obsidian/plugins/multi-properties/manifest.json new file mode 100644 index 0000000..ba199b2 --- /dev/null +++ b/GGDoc/.obsidian/plugins/multi-properties/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "multi-properties", + "name": "Multi Properties", + "version": "1.1.2", + "minAppVersion": "1.4.13", + "description": "Adds Properties to multiple notes at once. Either right-click a folder, or select multiple notes and right-click the selection.", + "author": "technohiker", + "authorUrl": "https://github.com/technohiker", + "isDesktopOnly": false +} diff --git a/GGDoc/.obsidian/plugins/multi-properties/styles.css b/GGDoc/.obsidian/plugins/multi-properties/styles.css new file mode 100644 index 0000000..4a40c69 --- /dev/null +++ b/GGDoc/.obsidian/plugins/multi-properties/styles.css @@ -0,0 +1,28 @@ +/* Basic button styling */ +#multi-properties-modal a { + display: inline-block; + padding: var(--size-4-1) var(--size-4-2); + text-decoration: none; + background-color: var(--interactive-normal); + box-shadow: var(--input-shadow); + color: var(--text-normal); + border-radius: 4px; /* Rounded corners */ + cursor: pointer; + text-align: center; + font-weight: var(--input-font-weight); + font-size: var(--font-ui-small); +} + +/* Hover and focus styles */ +#multi-properties-modal a:hover, +#multi-properties-modal a:focus { + outline: grey solid 2px; +} + +/* Disabled style */ +#multi-properties-modal a:disabled { + background-color: #ccc; /* Disabled background color */ + border-color: #ccc; /* Disabled border color */ + color: #999; /* Disabled text color */ + cursor: not-allowed; +} diff --git a/GGDoc/.obsidian/plugins/obsidian-file-color/data.json b/GGDoc/.obsidian/plugins/obsidian-file-color/data.json index 5815b05..0677420 100644 --- a/GGDoc/.obsidian/plugins/obsidian-file-color/data.json +++ b/GGDoc/.obsidian/plugins/obsidian-file-color/data.json @@ -73,10 +73,6 @@ "path": "60 Info", "color": "tTFdv2VYp6lARGLPMjp9f" }, - { - "path": "Tests", - "color": "6MiKFs3bdHnnogc4PtXTJ" - }, { "path": "10 Design", "color": "CPrDSGPNfbzbEdB5ZVbIp" diff --git a/GGDoc/.obsidian/plugins/obsidian-minimal-settings/data.json b/GGDoc/.obsidian/plugins/obsidian-minimal-settings/data.json index 528b4f9..38020bc 100644 --- a/GGDoc/.obsidian/plugins/obsidian-minimal-settings/data.json +++ b/GGDoc/.obsidian/plugins/obsidian-minimal-settings/data.json @@ -29,6 +29,6 @@ "underlineExternal": true, "folding": true, "lineNumbers": false, - "readableLineLength": true, + "readableLineLength": false, "devBlockWidth": false } \ No newline at end of file diff --git a/GGDoc/.obsidian/workspace.json b/GGDoc/.obsidian/workspace.json index 3434da4..c436e7f 100644 --- a/GGDoc/.obsidian/workspace.json +++ b/GGDoc/.obsidian/workspace.json @@ -11,14 +11,11 @@ "id": "21a3cd5caa3c9d8f", "type": "leaf", "state": { - "type": "canvas", + "type": "markdown", "state": { - "file": "10 Design/Hypothèses.canvas", - "viewState": { - "x": 1733.123325616051, - "y": 1733.7199367088583, - "zoom": -0.7494272258221697 - } + "file": "Misc/How to Obsidian.md", + "mode": "preview", + "source": true } } } @@ -51,7 +48,7 @@ "state": { "type": "search", "state": { - "query": "", + "query": "tag:#test", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -88,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "10 Design/Hypothèses.canvas", + "file": "Misc/How to Obsidian.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -105,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "10 Design/Hypothèses.canvas", + "file": "Misc/How to Obsidian.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -128,12 +125,12 @@ "state": { "type": "outline", "state": { - "file": "10 Design/Hypothèses.canvas" + "file": "Misc/How to Obsidian.md" } } } ], - "currentTab": 3 + "currentTab": 2 }, { "id": "d534e6d64903cf46", @@ -166,23 +163,36 @@ }, "active": "21a3cd5caa3c9d8f", "lastOpenFiles": [ - "Test/Untitled.md", + "Misc/Storage/Attachments/e/b/b", + "Misc/Storage/Attachments/e/b", + "Misc/Storage/Attachments/e", + "Misc/Storage/Attachments/e/b/b/ebbb1dda8bfee815342b9f51b1cc6de5e0e8113be18679e7930bb2f039ba6573.png", + "Misc/Tags.md", + "10 Design/Hypothèses/Flow de la sauvegarde - mort.md", "Misc/How to Obsidian.md", - "10 Design/Untitled.md", + "Pasted image 20241001215011.png", + "Misc/Storage/Attachments/1/b/c", + "Misc/Storage/Attachments/1/b", + "Misc/Storage/Attachments/1", + "Misc/Storage/Attachments/1/b/c/1bc0c534c2ac86130f83455e9a8353c6d86158b31f75c1cb33f467de5b4c1568.png", + "10 Design/Hypothèses/Player Interaction.md", + "test.md", + "Test/Untitled.md", "10 Design/Hypothèses.canvas", + "10 Design/Hypothèses", + "10 Design/Hypothèses/Player Abilities.md", + "10 Design/Hypothèses/World - Population.md", + "10 Design/Hypothèses/World - Planète vaisseau.md", + "10 Design/Hypothèses/World - type de biomes.md", + "10 Design/Hypothèses/Player Experience.md", + "10 Design/Untitled.md", "Test", "Misc/Plugins.md", "Misc/Storage/Attachments/8/2/8", "Misc/Storage/Attachments/8/2", "Misc/Storage/Attachments/8", "Misc/Storage/Attachments/8/2/8/828b38e1763369b52b2efba15d4668326e86f70408af7ebaf2d99b9f1210a5ed.png", - "Misc/Storage/Attachments/9/4/e", - "Misc/Storage/Attachments/9/4", - "Misc/Storage/Attachments/9", "Misc/Storage/Attachments/9/4/e/94ebc76d29274d246b1bd9bcb4b1714cc49112ad86de394b437f3e65d4b38ec5.png", - "Misc/Storage/Attachments", - "Misc/Storage/Thumbnails", - "Misc/Storage", "Welcome.md" ] } \ No newline at end of file diff --git a/GGDoc/10 Design/Hypothèses.canvas b/GGDoc/10 Design/Hypothèses.canvas index 866d78d..dcc8c80 100644 --- a/GGDoc/10 Design/Hypothèses.canvas +++ b/GGDoc/10 Design/Hypothèses.canvas @@ -1,75 +1,12 @@ { "nodes":[ - { - "id":"e1c6a8d4bf5a1f2d", - "type":"text", - "text":"# Flow de la sauvegarde / mort\n\n## Status\n- En attente de pouvoir playtest soit\n\t- Une zone de jeu suffisamment grande\n\t- Plusieurs zones de jeu connectée ensemble\n\n## Postulat 1\nChaque biome dispose d'un moyen de respawn proche, peut être de s'y téléporter. \n\n## Postulat 2\nSuivant la taille de la zone, à la suite d'une mort, il peut être frustrant de parcourir un long chemin pour reprendre l'exploration. \n\n## Hypothèse 1\n- Chaque biome dispose d'un \"**hub**\" (dans le lore, wreckage ou station).\n- Son emplacement est fixe, disposé de façon à rejoindre rapidement les zones principales du biome (d'où son rôle de hub).\n- Le hub est découvert par le joueur la première fois qu'il explose la zone. A partir de sa découverte, il peut être utilisé pour s'y téléporter.\n\n## Hypothèse 2\n- Le joueur dispose d'un moyen de poser un item \"**beacon**\" qui peut remplir la fonction de respawn / téléportation (ref : sauvegarde manuelle de Ori 1).\n- Plusieurs alternative (probalement à diviser en plusieurs hypothèses)\n\t- Un seul point de respawn, le dernier item que le joueur a posé.\n\t- Les item restent en places, et le joueur crée lui même en réseau de téléportation (sensation de conquérir l'espace)\n\t- Si besoin, limitation par distance, nombre d'item dans une zone/biome, ressource à ramasser\n\n## Hypothèse 3\n- Dans le cas où un hub fixe est nécessaire MAIS ne couvre pas les besoins de sauvegarde manuelle / rapide retour après une mort, on peut combiner hub et beacon.\n\n", - "styleAttributes":{}, - "x":660, - "y":-140, - "width":660, - "height":1240 - }, - { - "id":"d25b70b0d62b91bd", - "type":"text", - "text":"# Player Experience\n\n## Status\n- Déterminer l'expérience joueur, ressenti / sentiment\n- Déterminer l'aspect violent / non-violent\n\n## Postulat\n\nThe AI in the spacecraft is like HAL9000 Une entité (alien) nous \"envoute\" pour nous inciter à déouvrir quelque chose dans la planete On découvre que d'autres vaisseaux sont déjà venu et leur equipage sont morts\n\n\n\n## Hypothèse 1 - Cosmic Horror\n\n- Cosmic horror\n\t- Incompréhension de l'univers\n\t- Rencontre hallucinatoire / effrayante / étrange / suspecte\n\t- Désarmé face à l'inconnu\n\n\n## Hypothèse 2 - Chercheur / Scientifique\n\n- Recherche scientifique\n- Compréhension\n\n## Hypothèse 3 - Rambo McGyver Ingénieur \n- Prise de contrôle du territoire\n- créer un \"réseau\" de hub, \n- Confronter le danger\n- Armé\n", - "styleAttributes":{}, - "x":1400, - "y":-140, - "width":660, - "height":1240 - }, - { - "id":"5c5e79711331bb66", - "type":"text", - "text":"# World - type de biomes\n\n## Status\n- En attente de base de 3C / premier Level Design \n\n## Postulat\n- La planète dispose de plusieurs couches les unes sur les autres.\n- Ces couches communiquent via des cavités (du couloir jusqu'à l'immense caverne)\n- Chaque couche dispose d'un biome propre.\n\n## Hypothèse 1 - Ensemble de biomes\n\n- crystal - grottes crystaux/basalt\n- eau lourde - bio lovecraft spaces\n- gravitium - abandonned tek city", - "styleAttributes":{}, - "x":2120, - "y":-140, - "width":660, - "height":1240 - }, - { - "id":"99fb2e7b27d99519", - "type":"text", - "text":"# Player Abilities\n\n## Status\n- Déterminer quelles sont les abilities et s'il est utile de les découper et les donner progressivement au joueur\n\n\n## Postulat\n- Le personnage joueur a d'une combinaison qui dispose d'abilities\n\t- Grappin\n\t- Glissade\n\t- Walkrun ?\n\t- Double jump\n- Ces abilities ont la possibilité d'interagir avec des éléments spéciques\n\t- Exemple : tirer un interrupteur avec un grappin\n\n\n## Hypothèse 1 - pas de déblocage\n\nref : la lanterne de Outer Wild DLC\n- Le joueur dispose dès le début de toutes les abilities (grappin, glisse, et autres pas encore développée) et de toutes les interactions disponible.\n- Non nécessaire dès le début mais accessible à un joueur qui teste des choses\n- Expliquée à un moment donnée dans la progression, puis devient nécessaire\n\n## Hypothèse 2 - metroidvania\n\n- Le joueur dispose d'un panel d'abilities de base.\n- Façon metroidvania, il découvre de nouvelles, compétences, execute son tutorial puis backtrack pour explorer les nouvelles zones accessibles.", - "styleAttributes":{}, - "x":660, - "y":1160, - "width":660, - "height":1240 - }, - { - "id":"3529ad947a961be6", - "type":"text", - "text":"# World - Planète vaisseau\n\n## Status\n- En attente de base de 3C / premier Level Design \n\n## Postulat\n- L'environnement est constitué d'un corps spatial massif, creux, disposé en couche communiquante.\n- La gravité y est altérée\n\n## Hypothèse 1\n- La planète est un genre de gros vaisseau.\n- Consience d'une civilisation ?\n- Piège façon honey pot ?\n- \n\n\n", - "styleAttributes":{}, - "x":2860, - "y":-140, - "width":660, - "height":1240 - }, - { - "id":"ecd33d83d9e1fc66", - "type":"text", - "text":"# World - Population\n## Status\n- En attente de base de 3C / premier Level Design \n\n## Postulat\nLa planète est ou a été peuple d'une ou plusieurs civilisation.\n\n## Hypothèse 1 - Faune\n- Des créatures façon AI autonome qui peuvent servir au gameplay :\n\t- \"nudge\" pour servir d'interaction avec le décor (ex : faire exploser un passage en attirant une créature gazeuse dans des flammes ?)\n\t- S'accrocher à un genre de cerf volant pour planer\n\t- Slingshot une créature pour la propulser quelque par ?\n- Grosse contrainte, 3D, anim, AI...\n- \n\n\n\n## Hypothèse 2 - Monde désolé\n\n- Voir si c'est utile pour l'expérience (Outer Wild n'en a pas)\n- Sensation de solitude\n\n", - "styleAttributes":{}, - "x":3620, - "y":-140, - "width":660, - "height":1240 - }, - { - "id":"862e57f731c30b29", - "type":"text", - "text":"# Player Interaction\n\n## Status\n- Déterminer quelles sont les abilities qui permettent d'intéragir avec l'environnement\n\n\n## Postulat\n- Le personnage joueur a d'une combinaison qui dispose d'abilities\n\t- Grappin\n\t- Glissade\n\t- Walkrun ?\n\t- Double jump\n- Ces abilities ont la possibilité d'interagir avec des éléments spéciques\n\t- Exemple : tirer un interrupteur avec un grappin\n\n\n## Hypothèse 1 - Grappin\n\nTirer un mécanisme à débloquer (ref astro bot)\n\n\n## Hypothèse 2 - Spline\n\nTirer un mécanisme le long d'une spline (ref outer wild boule de lumière)\n\n## Hypothèse 3 - Powering boots\n\nLa combinaison transmet de l'énergie au contact\nDes parties de sol / mur, peuvent être activée au contact de la combi\n(déclenche des mécanismes, etc)\n\n", - "styleAttributes":{}, - "x":1400, - "y":1160, - "width":660, - "height":1240 - } + {"id":"f2a46a23775e7b24","x":660,"y":-140,"width":660,"height":1240,"type":"file","file":"10 Design/Hypothèses/Flow de la sauvegarde - mort.md"}, + {"id":"582cbe6d7bfa356f","x":1400,"y":-140,"width":660,"height":1240,"type":"file","file":"10 Design/Hypothèses/Player Experience.md"}, + {"id":"10a829bedf18b67a","x":2120,"y":-140,"width":660,"height":1240,"type":"file","file":"10 Design/Hypothèses/World - type de biomes.md"}, + {"id":"085ce2a3664d69f3","x":3620,"y":-140,"width":660,"height":1240,"type":"file","file":"10 Design/Hypothèses/World - Population.md"}, + {"id":"cbe24978bfb7f39f","x":660,"y":1160,"width":660,"height":1240,"type":"file","file":"10 Design/Hypothèses/Player Abilities.md"}, + {"id":"9914548cc269edbf","x":1400,"y":1160,"width":660,"height":1240,"type":"file","file":"10 Design/Hypothèses/Player Interaction.md"}, + {"id":"d4985cde952d9eef","x":2880,"y":-140,"width":660,"height":1240,"type":"file","file":"10 Design/Hypothèses/World - Planète vaisseau.md"} ], "edges":[], "metadata":{} diff --git a/GGDoc/10 Design/Hypothèses/Flow de la sauvegarde - mort.md b/GGDoc/10 Design/Hypothèses/Flow de la sauvegarde - mort.md new file mode 100644 index 0000000..7831b85 --- /dev/null +++ b/GGDoc/10 Design/Hypothèses/Flow de la sauvegarde - mort.md @@ -0,0 +1,26 @@ +## Status +- En attente de pouvoir playtest soit + - Une zone de jeu suffisamment grande + - Plusieurs zones de jeu connectée ensemble + +## Postulat 1 +Chaque biome dispose d'un moyen de respawn proche, peut être de s'y téléporter. + +## Postulat 2 +Suivant la taille de la zone, à la suite d'une mort, il peut être frustrant de parcourir un long chemin pour reprendre l'exploration. + +## Hypothèse 1 +- Chaque biome dispose d'un "**hub**" (dans le lore, wreckage ou station). +- Son emplacement est fixe, disposé de façon à rejoindre rapidement les zones principales du biome (d'où son rôle de hub). +- Le hub est découvert par le joueur la première fois qu'il explose la zone. A partir de sa découverte, il peut être utilisé pour s'y téléporter. + +## Hypothèse 2 +- Le joueur dispose d'un moyen de poser un item "**beacon**" qui peut remplir la fonction de respawn / téléportation (ref : sauvegarde manuelle de Ori 1). +- Plusieurs alternative (probalement à diviser en plusieurs hypothèses) + - Un seul point de respawn, le dernier item que le joueur a posé. + - Les item restent en places, et le joueur crée lui même en réseau de téléportation (sensation de conquérir l'espace) + - Si besoin, limitation par distance, nombre d'item dans une zone/biome, ressource à ramasser + +## Hypothèse 3 +- Dans le cas où un hub fixe est nécessaire MAIS ne couvre pas les besoins de sauvegarde manuelle / rapide retour après une mort, on peut combiner hub et beacon. + diff --git a/GGDoc/10 Design/Hypothèses/Player Abilities.md b/GGDoc/10 Design/Hypothèses/Player Abilities.md new file mode 100644 index 0000000..cf2d16f --- /dev/null +++ b/GGDoc/10 Design/Hypothèses/Player Abilities.md @@ -0,0 +1,25 @@ +## Status +- Déterminer quelles sont les abilities et s'il est utile de les découper et les donner progressivement au joueur + + +## Postulat +- Le personnage joueur a d'une combinaison qui dispose d'abilities + - Grappin + - Glissade + - Walkrun ? + - Double jump +- Ces abilities ont la possibilité d'interagir avec des éléments spéciques + - Exemple : tirer un interrupteur avec un grappin + + +## Hypothèse 1 - pas de déblocage + +ref : la lanterne de Outer Wild DLC +- Le joueur dispose dès le début de toutes les abilities (grappin, glisse, et autres pas encore développée) et de toutes les interactions disponible. +- Non nécessaire dès le début mais accessible à un joueur qui teste des choses +- Expliquée à un moment donnée dans la progression, puis devient nécessaire + +## Hypothèse 2 - metroidvania + +- Le joueur dispose d'un panel d'abilities de base. +- Façon metroidvania, il découvre de nouvelles, compétences, execute son tutorial puis backtrack pour explorer les nouvelles zones accessibles. \ No newline at end of file diff --git a/GGDoc/10 Design/Hypothèses/Player Experience.md b/GGDoc/10 Design/Hypothèses/Player Experience.md new file mode 100644 index 0000000..3b7a34f --- /dev/null +++ b/GGDoc/10 Design/Hypothèses/Player Experience.md @@ -0,0 +1,28 @@ +## Status +- Déterminer l'expérience joueur, ressenti / sentiment +- Déterminer l'aspect violent / non-violent + +## Postulat + +The AI in the spacecraft is like HAL9000 Une entité (alien) nous "envoute" pour nous inciter à déouvrir quelque chose dans la planete On découvre que d'autres vaisseaux sont déjà venu et leur equipage sont morts + + + +## Hypothèse 1 - Cosmic Horror + +- Cosmic horror + - Incompréhension de l'univers + - Rencontre hallucinatoire / effrayante / étrange / suspecte + - Désarmé face à l'inconnu + + +## Hypothèse 2 - Chercheur / Scientifique + +- Recherche scientifique +- Compréhension + +## Hypothèse 3 - Rambo McGyver Ingénieur +- Prise de contrôle du territoire +- créer un "réseau" de hub, +- Confronter le danger +- Armé diff --git a/GGDoc/10 Design/Hypothèses/Player Interaction.md b/GGDoc/10 Design/Hypothèses/Player Interaction.md new file mode 100644 index 0000000..0c2a4ce --- /dev/null +++ b/GGDoc/10 Design/Hypothèses/Player Interaction.md @@ -0,0 +1,29 @@ +## Status +- Déterminer quelles sont les abilities qui permettent d'intéragir avec l'environnement + + +## Postulat +- Le personnage joueur a d'une combinaison qui dispose d'abilities + - Grappin + - Glissade + - Walkrun ? + - Double jump +- Ces abilities ont la possibilité d'interagir avec des éléments spéciques + - Exemple : tirer un interrupteur avec un grappin + + +## Hypothèse 1 - Grappin + +Tirer un mécanisme à débloquer (ref astro bot) + + +## Hypothèse 2 - Spline + +Tirer un mécanisme le long d'une spline (ref outer wild boule de lumière) + +## Hypothèse 3 - Powering boots + +La combinaison transmet de l'énergie au contact +Des parties de sol / mur, peuvent être activée au contact de la combi +(déclenche des mécanismes, etc) + diff --git a/GGDoc/10 Design/Hypothèses/World - Planète vaisseau.md b/GGDoc/10 Design/Hypothèses/World - Planète vaisseau.md new file mode 100644 index 0000000..7405900 --- /dev/null +++ b/GGDoc/10 Design/Hypothèses/World - Planète vaisseau.md @@ -0,0 +1,14 @@ +## Status +- En attente de base de 3C / premier Level Design + +## Postulat +- L'environnement est constitué d'un corps spatial massif, creux, disposé en couche communiquante. +- La gravité y est altérée + +## Hypothèse 1 +- La planète est un genre de gros vaisseau. +- Consience d'une civilisation ? +- Piège façon honey pot ? +- + + diff --git a/GGDoc/10 Design/Hypothèses/World - Population.md b/GGDoc/10 Design/Hypothèses/World - Population.md new file mode 100644 index 0000000..2d3c55e --- /dev/null +++ b/GGDoc/10 Design/Hypothèses/World - Population.md @@ -0,0 +1,21 @@ +## Status +- En attente de base de 3C / premier Level Design + +## Postulat +La planète est ou a été peuple d'une ou plusieurs civilisation. + +## Hypothèse 1 - Faune +- Des créatures façon AI autonome qui peuvent servir au gameplay : + - "nudge" pour servir d'interaction avec le décor (ex : faire exploser un passage en attirant une créature gazeuse dans des flammes ?) + - S'accrocher à un genre de cerf volant pour planer + - Slingshot une créature pour la propulser quelque par ? +- Grosse contrainte, 3D, anim, AI... +- + + + +## Hypothèse 2 - Monde désolé + +- Voir si c'est utile pour l'expérience (Outer Wild n'en a pas) +- Sensation de solitude + diff --git a/GGDoc/10 Design/Hypothèses/World - type de biomes.md b/GGDoc/10 Design/Hypothèses/World - type de biomes.md new file mode 100644 index 0000000..6509d2d --- /dev/null +++ b/GGDoc/10 Design/Hypothèses/World - type de biomes.md @@ -0,0 +1,13 @@ +## Status +- En attente de base de 3C / premier Level Design + +## Postulat +- La planète dispose de plusieurs couches les unes sur les autres. +- Ces couches communiquent via des cavités (du couloir jusqu'à l'immense caverne) +- Chaque couche dispose d'un biome propre. + +## Hypothèse 1 - Ensemble de biomes + +- crystal - grottes crystaux/basalt +- eau lourde - bio lovecraft spaces +- gravitium - abandonned tek city \ No newline at end of file diff --git a/GGDoc/Misc/How to Obsidian.md b/GGDoc/Misc/How to Obsidian.md index 0526826..10ee0e4 100644 --- a/GGDoc/Misc/How to Obsidian.md +++ b/GGDoc/Misc/How to Obsidian.md @@ -10,27 +10,48 @@ - Image viewer (TODO) ## Dataview -Various SQL like engine to request info inside others notes - -```dataview -LIST -FROM "10 Design" -``` +Query engine (sql like), to request info inside others notes and list them +> [!Info]- Query example +> Query +> +> ```dataview +> LIST +> FROM "10 Design" +> ``` +> +> Result +> ```dataview +> LIST +> FROM "10 Design" +> ``` +> +> ## File Color +Add colors to the folder tree. + ## Git - - > [!NOTE]- How to sync > Use CTRL+SHIFT+S to Commit and sync ## Iconize -## Minimal Theme Settings -## Style Settings -## Table of Content +Add icons to the folder tree. +## Minimal Theme Settings +Customize minimal theme css. Features includes : +- Image grid +- Colorful headers + +## Multi Properties +![[ebbb1dda8bfee815342b9f51b1cc6de5e0e8113be18679e7930bb2f039ba6573.png]] +Bulk edit tags for multiple files + +## Style Settings +- Customize style of many other plugins, including Minimal theme. +- +## Table of Content > [!NOTE]- Add a table of content > use > \```toc @@ -47,13 +68,16 @@ FROM "10 Design" > debugInConsole: false # Print debug info in Obsidian console > ``` - -## Thumbnails +## Tag Wrangler +![[1bc0c534c2ac86130f83455e9a8353c6d86158b31f75c1cb33f467de5b4c1568.png]] +Tag pages + rename / search options from tags view. +## Thumbnails - Get attachment from online sources and stores them in a specified folder `Misc/Storage/Thumbnails` # Non-default Shortcuts -![[94ebc76d29274d246b1bd9bcb4b1714cc49112ad86de394b437f3e65d4b38ec5.png]] +![[94ebc76d29274d246b1bd9bcb4b1714cc49112ad86de394b437f3e65d4b38ec5.png|800]] + ![[828b38e1763369b52b2efba15d4668326e86f70408af7ebaf2d99b9f1210a5ed.png]] \ No newline at end of file diff --git a/GGDoc/Misc/Storage/Attachments/1/b/c/1bc0c534c2ac86130f83455e9a8353c6d86158b31f75c1cb33f467de5b4c1568.png b/GGDoc/Misc/Storage/Attachments/1/b/c/1bc0c534c2ac86130f83455e9a8353c6d86158b31f75c1cb33f467de5b4c1568.png new file mode 100644 index 0000000..e352d5b Binary files /dev/null and b/GGDoc/Misc/Storage/Attachments/1/b/c/1bc0c534c2ac86130f83455e9a8353c6d86158b31f75c1cb33f467de5b4c1568.png differ diff --git a/GGDoc/Misc/Storage/Attachments/e/b/b/ebbb1dda8bfee815342b9f51b1cc6de5e0e8113be18679e7930bb2f039ba6573.png b/GGDoc/Misc/Storage/Attachments/e/b/b/ebbb1dda8bfee815342b9f51b1cc6de5e0e8113be18679e7930bb2f039ba6573.png new file mode 100644 index 0000000..6c609be Binary files /dev/null and b/GGDoc/Misc/Storage/Attachments/e/b/b/ebbb1dda8bfee815342b9f51b1cc6de5e0e8113be18679e7930bb2f039ba6573.png differ diff --git a/GGDoc/Misc/Tags.md b/GGDoc/Misc/Tags.md new file mode 100644 index 0000000..c2d8ce2 --- /dev/null +++ b/GGDoc/Misc/Tags.md @@ -0,0 +1,5 @@ +--- +tags: + - test +--- + diff --git a/GGDoc/Pasted image 20241001215011.png b/GGDoc/Pasted image 20241001215011.png new file mode 100644 index 0000000..e352d5b Binary files /dev/null and b/GGDoc/Pasted image 20241001215011.png differ diff --git a/GGDoc/Test/Untitled.md b/GGDoc/Test/Untitled.md deleted file mode 100644 index e69de29..0000000