From 439df867a13dc04051de4e2237a3ccb833093eac Mon Sep 17 00:00:00 2001 From: sdfsdf Date: Tue, 1 Oct 2024 21:56:17 +0200 Subject: [PATCH] vault backup: 2024-10-01 21:56:08 --- GGDoc/.obsidian/app.json | 5 +- GGDoc/.obsidian/community-plugins.json | 3 +- .../plugins/multi-properties/main.js | 3026 +++++++++++++++++ .../plugins/multi-properties/manifest.json | 10 + .../plugins/multi-properties/styles.css | 28 + .../plugins/obsidian-file-color/data.json | 4 - .../obsidian-minimal-settings/data.json | 2 +- GGDoc/.obsidian/workspace.json | 50 +- GGDoc/10 Design/Hypothèses.canvas | 77 +- .../Flow de la sauvegarde - mort.md | 26 + .../10 Design/Hypothèses/Player Abilities.md | 25 + .../Hypothèses/Player Experience.md | 28 + .../Hypothèses/Player Interaction.md | 29 + .../Hypothèses/World - Planète vaisseau.md | 14 + .../Hypothèses/World - Population.md | 21 + .../Hypothèses/World - type de biomes.md | 13 + GGDoc/Misc/How to Obsidian.md | 52 +- ...8353c6d86158b31f75c1cb33f467de5b4c1568.png | Bin 0 -> 13002 bytes ...cc6de5e0e8113be18679e7930bb2f039ba6573.png | Bin 0 -> 16537 bytes GGDoc/Misc/Tags.md | 5 + GGDoc/Pasted image 20241001215011.png | Bin 0 -> 13002 bytes GGDoc/Test/Untitled.md | 0 22 files changed, 3307 insertions(+), 111 deletions(-) create mode 100644 GGDoc/.obsidian/plugins/multi-properties/main.js create mode 100644 GGDoc/.obsidian/plugins/multi-properties/manifest.json create mode 100644 GGDoc/.obsidian/plugins/multi-properties/styles.css create mode 100644 GGDoc/10 Design/Hypothèses/Flow de la sauvegarde - mort.md create mode 100644 GGDoc/10 Design/Hypothèses/Player Abilities.md create mode 100644 GGDoc/10 Design/Hypothèses/Player Experience.md create mode 100644 GGDoc/10 Design/Hypothèses/Player Interaction.md create mode 100644 GGDoc/10 Design/Hypothèses/World - Planète vaisseau.md create mode 100644 GGDoc/10 Design/Hypothèses/World - Population.md create mode 100644 GGDoc/10 Design/Hypothèses/World - type de biomes.md create mode 100644 GGDoc/Misc/Storage/Attachments/1/b/c/1bc0c534c2ac86130f83455e9a8353c6d86158b31f75c1cb33f467de5b4c1568.png create mode 100644 GGDoc/Misc/Storage/Attachments/e/b/b/ebbb1dda8bfee815342b9f51b1cc6de5e0e8113be18679e7930bb2f039ba6573.png create mode 100644 GGDoc/Misc/Tags.md create mode 100644 GGDoc/Pasted image 20241001215011.png delete mode 100644 GGDoc/Test/Untitled.md 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 0000000000000000000000000000000000000000..e352d5b34d68b5fe6a09641b10dec53c16c2eeb6 GIT binary patch literal 13002 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 bsTn%d`)}|Qp8`KMq0qf-gm?|Nd+>h%_G4C} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6c609bee7a11a5b3cf725cef9f75fd694fba46b8 GIT binary patch literal 16537 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 bsTn%d`)}|Qp8`KMq0qf-gm?|Nd+>h%_G4C} literal 0 HcmV?d00001 diff --git a/GGDoc/Test/Untitled.md b/GGDoc/Test/Untitled.md deleted file mode 100644 index e69de29..0000000