├── .eslintignore ├── .github ├── FUNDING.yml └── workflows │ └── release.yml ├── src ├── shared │ ├── constants.ts │ ├── link-and-path │ │ ├── constants.ts │ │ └── link-predicates.ts │ ├── dragging │ │ ├── types.ts │ │ ├── utils.ts │ │ └── drag-context.tsx │ ├── uuid.ts │ ├── markdown │ │ └── constants.ts │ ├── logger │ │ ├── types.ts │ │ └── constants.ts │ ├── export │ │ ├── types.ts │ │ ├── export-utils.ts │ │ ├── export-to-csv.tsx │ │ └── export-to-markdown.tsx │ ├── string-utils.ts │ ├── loom-state │ │ ├── migrate │ │ │ ├── migrate-state.ts │ │ │ ├── migrate-state-11.ts │ │ │ ├── migrate-state-15.ts │ │ │ ├── migrate-state-19.ts │ │ │ ├── migrate-state-1.ts │ │ │ ├── migrate-state-0.ts │ │ │ ├── migrate-state-22.ts │ │ │ ├── migrate-state-21.ts │ │ │ ├── migrate-state-5.ts │ │ │ ├── migrate-state-16.ts │ │ │ ├── migrate-state-8.ts │ │ │ ├── migrate-state-14.ts │ │ │ ├── migrate-state-20.ts │ │ │ ├── migrate-state-10.ts │ │ │ ├── migrate-state-7.ts │ │ │ └── migrate-state-4.ts │ │ ├── commands │ │ │ ├── error │ │ │ │ ├── command-redo-error.ts │ │ │ │ ├── command-undo-error.ts │ │ │ │ ├── command-patch-error.ts │ │ │ │ └── command-arguments-error.ts │ │ │ ├── column-delete-command │ │ │ │ ├── types.ts │ │ │ │ ├── utils.ts │ │ │ │ └── index.ts │ │ │ ├── column-add-command │ │ │ │ ├── column-add-command.spec.ts │ │ │ │ ├── index.ts │ │ │ │ └── utils.ts │ │ │ ├── row-add-command.spec.ts │ │ │ ├── column-update-command.spec.ts │ │ │ ├── filter-delete-command.ts │ │ │ ├── filter-add-command.spec.ts │ │ │ ├── table-settings-update-command.ts │ │ │ ├── filter-delete-command.spec.ts │ │ │ ├── column-reorder-command.spec.ts │ │ │ ├── row-add-command.ts │ │ │ ├── row-reorder-command.spec.ts │ │ │ ├── filter-update-command.ts │ │ │ ├── source-update-command.ts │ │ │ ├── row-delete-command.spec.ts │ │ │ ├── cell-body-update-command.spec.ts │ │ │ └── tag-update-command.ts │ │ ├── utils │ │ │ └── column-utils.ts │ │ └── types │ │ │ └── index.ts │ ├── conversion.ts │ ├── error │ │ ├── row-not-found-error.ts │ │ ├── tag-not-found-error.ts │ │ ├── source-not-found-error.ts │ │ ├── column-not-found-error.ts │ │ └── cell-not-found-error.ts │ ├── spacing │ │ ├── types.ts │ │ ├── hooks.ts │ │ ├── styles.css │ │ └── index.ts │ ├── render │ │ ├── types.ts │ │ └── embed.ts │ ├── frontmatter │ │ ├── types.ts │ │ ├── utils.ts │ │ └── obsidian-utils.ts │ ├── cell-content │ │ ├── file-cell-content.ts │ │ ├── checkbox-cell-content.ts │ │ ├── time-content.ts │ │ ├── date-cell-content.ts │ │ ├── text-cell-content.spec.ts │ │ ├── source-file-content.ts │ │ ├── source-cell-content.ts │ │ ├── number-cell-content.spec.ts │ │ ├── time-content.spec.ts │ │ ├── checkbox-cell-content.spec.ts │ │ ├── date-cell-content.spec.ts │ │ ├── text-cell-content.ts │ │ └── number-cell-content.ts │ ├── match │ │ ├── index.spec.ts │ │ └── index.ts │ ├── event │ │ ├── types.ts │ │ └── utils.ts │ ├── versioning.ts │ ├── dom-utils.ts │ ├── render-embed.ts │ ├── last-saved-manager.ts │ ├── date │ │ ├── date-string-conversion.ts │ │ ├── utils.ts │ │ └── date-validation.ts │ ├── keyboard-event.ts │ └── hooks.ts ├── react │ ├── loom-app │ │ ├── tag-cell │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── header-menu │ │ │ ├── styles.css │ │ │ ├── number-format-submenu │ │ │ │ └── styles.css │ │ │ ├── types.ts │ │ │ ├── time-format-submenu.tsx │ │ │ ├── padding-submenu.tsx │ │ │ ├── aspect-ratio-submenu.tsx │ │ │ ├── date-format-submenu.tsx │ │ │ ├── date-format-separator-submenu.tsx │ │ │ ├── text-input-submenu.tsx │ │ │ ├── multitag-sort-dir-submenu.tsx │ │ │ ├── type-submenu.tsx │ │ │ └── frontmatter-key-submenu.tsx │ │ ├── option-bar │ │ │ ├── sources-menu │ │ │ │ ├── constants.ts │ │ │ │ ├── base-content │ │ │ │ │ └── styles.css │ │ │ │ ├── add-source-submenu │ │ │ │ │ ├── types.ts │ │ │ │ │ └── folder-source-options.tsx │ │ │ │ ├── source-item │ │ │ │ │ ├── styles.css │ │ │ │ │ └── index.tsx │ │ │ │ └── folder-source-item │ │ │ │ │ └── index.tsx │ │ │ ├── search-bar │ │ │ │ ├── styles.css │ │ │ │ └── index.tsx │ │ │ ├── more-menu │ │ │ │ ├── constants.ts │ │ │ │ ├── settings-submenu.tsx │ │ │ │ └── toggle-column-submenu.tsx │ │ │ ├── styles.css │ │ │ ├── filter-menu │ │ │ │ ├── filter-column-select │ │ │ │ │ ├── styles.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── filter-row │ │ │ │ │ └── styles.css │ │ │ │ ├── filter-operator │ │ │ │ │ └── index.tsx │ │ │ │ └── filter-condition-select.tsx │ │ │ ├── active-filter-bubble │ │ │ │ └── index.tsx │ │ │ ├── sort-bubble-list.tsx │ │ │ └── sort-bubble │ │ │ │ └── index.tsx │ │ ├── date-cell │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── file-cell │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── number-cell │ │ │ ├── styles.css │ │ │ ├── utils.ts │ │ │ └── index.tsx │ │ ├── date-cell-edit │ │ │ ├── styles.css │ │ │ ├── time-format.menu.tsx │ │ │ ├── date-format-menu.tsx │ │ │ └── date-format-separator-menu.tsx │ │ ├── app │ │ │ ├── hooks │ │ │ │ ├── use-row │ │ │ │ │ └── types.ts │ │ │ │ ├── use-source │ │ │ │ │ └── types.ts │ │ │ │ ├── use-cell │ │ │ │ │ ├── types.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── use-column │ │ │ │ │ └── types.ts │ │ │ │ ├── use-app-events │ │ │ │ │ └── index.tsx │ │ │ │ ├── use-tag │ │ │ │ │ └── types.ts │ │ │ │ ├── use-table-settings.ts │ │ │ │ ├── use-row-events.ts │ │ │ │ └── use-filter.ts │ │ │ └── filter-by-filters │ │ │ │ └── evaluate-with-precedence.ts │ │ ├── source-file-cell │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── multi-tag-cell │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── new-column-button │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── checkbox-cell │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── tag-color-menu │ │ │ ├── styles.css │ │ │ └── components │ │ │ │ └── color-item │ │ │ │ └── styles.css │ │ ├── text-cell-edit │ │ │ ├── constants.ts │ │ │ ├── styles.css │ │ │ └── suggest-menu.tsx │ │ ├── row-options │ │ │ ├── styles.css │ │ │ └── row-menu │ │ │ │ └── index.tsx │ │ ├── tag-cell-edit │ │ │ ├── menu-header │ │ │ │ └── styles.css │ │ │ ├── menu-body │ │ │ │ └── styles.css │ │ │ ├── selectable-tag │ │ │ │ └── styles.css │ │ │ └── create-tag │ │ │ │ └── index.tsx │ │ ├── embed-cell │ │ │ ├── styles.css │ │ │ ├── index.tsx │ │ │ └── embed │ │ │ │ └── index.tsx │ │ ├── creation-time-cell │ │ │ └── index.tsx │ │ ├── last-edited-time-cell │ │ │ └── index.tsx │ │ ├── disabled-cell │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── footer-cell-container │ │ │ ├── styles.css │ │ │ ├── utils.ts │ │ │ └── arithmetic.ts │ │ ├── bottom-bar │ │ │ └── styles.css │ │ ├── new-row-button │ │ │ └── index.tsx │ │ ├── embed-cell-edit │ │ │ ├── internal-embed-suggest.tsx │ │ │ └── external-embed-input.tsx │ │ ├── text-cell │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── body-cell-container │ │ │ └── styles.css │ │ ├── header-cell-container │ │ │ ├── styles.css │ │ │ └── column-resize │ │ │ │ └── styles.css │ │ ├── source-cell │ │ │ └── index.tsx │ │ ├── table │ │ │ ├── footer-cell.tsx │ │ │ ├── body-cell.tsx │ │ │ └── hooks.tsx │ │ ├── app-mount-provider │ │ │ └── index.tsx │ │ └── file-cell-edit │ │ │ └── index.tsx │ ├── shared │ │ ├── divider │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── stack │ │ │ └── styles.css │ │ ├── flex │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── wrap │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── suggest-list │ │ │ ├── suggest-input │ │ │ │ ├── styles.css │ │ │ │ └── index.tsx │ │ │ ├── styles.css │ │ │ ├── suggest-item │ │ │ │ └── styles.css │ │ │ ├── clear-button.tsx │ │ │ └── create-button.tsx │ │ ├── button │ │ │ └── types.ts │ │ ├── stepper │ │ │ ├── step-spacer.tsx │ │ │ ├── types.ts │ │ │ ├── step-separator.tsx │ │ │ ├── step-content.tsx │ │ │ ├── step-text.tsx │ │ │ ├── step-indicator.tsx │ │ │ ├── step-buttons.tsx │ │ │ ├── step-header.tsx │ │ │ └── styles.css │ │ ├── multi-select │ │ │ ├── types.ts │ │ │ ├── styles.css │ │ │ └── multi-select-option.tsx │ │ ├── spinner │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── base-menu │ │ │ └── styles.css │ │ ├── menu-item │ │ │ └── styles.css │ │ ├── select │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── tag │ │ │ └── styles.css │ │ ├── error-boundary │ │ │ └── styles.css │ │ ├── menu │ │ │ └── types.ts │ │ ├── error-display │ │ │ └── styles.css │ │ ├── menu-provider │ │ │ ├── utils.ts │ │ │ ├── types.ts │ │ │ └── factory.ts │ │ ├── icon │ │ │ └── styles.css │ │ ├── text │ │ │ └── styles.css │ │ ├── bubble │ │ │ ├── styles.css │ │ │ └── index.tsx │ │ ├── checkbox-filter-select │ │ │ └── index.tsx │ │ ├── date-filter-select │ │ │ └── index.tsx │ │ ├── modal-mount-provider │ │ │ └── index.tsx │ │ ├── submenu │ │ │ └── index.tsx │ │ ├── switch │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── model-menu │ │ │ └── index.tsx │ │ ├── input │ │ │ └── styles.css │ │ └── menu-button │ │ │ └── index.tsx │ ├── import-app │ │ ├── constants.ts │ │ ├── upload-data │ │ │ ├── file-input │ │ │ │ └── styles.css │ │ │ ├── upload-textarea.tsx │ │ │ └── index.tsx │ │ ├── styles.css │ │ ├── utils.ts │ │ ├── match-columns │ │ │ ├── body-cell.tsx │ │ │ ├── styles.css │ │ │ └── bulk-options-menu.tsx │ │ ├── types.ts │ │ ├── data-type-select.tsx │ │ └── data-source-select.tsx │ ├── export-app │ │ ├── content-textarea.tsx │ │ ├── styles.css │ │ └── export-type-select.tsx │ └── global.css ├── obsidian │ ├── utils.ts │ ├── modal │ │ ├── whats-new-modal │ │ │ └── styles.css │ │ ├── welcome-modal │ │ │ └── styles.css │ │ └── export-modal.tsx │ ├── shared │ │ ├── styles.css │ │ └── index.ts │ └── editing-view-plugin.tsx ├── redux │ ├── hooks.ts │ ├── store.ts │ └── global-slice.ts └── data │ ├── network.ts │ ├── constants.ts │ ├── date-utils.ts │ └── deserialization-error.ts ├── bun.lockb ├── readme ├── app.png └── cover.png ├── babel.config.js ├── .editorconfig ├── __mocks__ └── obsidian.ts ├── scripts └── sync-mobile.sh ├── manifest.json ├── .eslintrc.cjs ├── .gitignore ├── tsconfig.json └── LICENSE /.eslintignore: -------------------------------------------------------------------------------- 1 | npm node_modules 2 | dist -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: https://ko-fi.com/decaf_dev 2 | -------------------------------------------------------------------------------- /src/shared/constants.ts: -------------------------------------------------------------------------------- 1 | export const MIN_COLUMN_WIDTH = 40; 2 | -------------------------------------------------------------------------------- /src/react/loom-app/tag-cell/styles.css: -------------------------------------------------------------------------------- 1 | ._tag-cell { 2 | width: 100%; 3 | } -------------------------------------------------------------------------------- /src/react/shared/divider/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-hr { 2 | margin: 0; 3 | } -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/decaf-dev/obsidian-dataloom/HEAD/bun.lockb -------------------------------------------------------------------------------- /src/react/import-app/constants.ts: -------------------------------------------------------------------------------- 1 | export const NEW_COLUMN_ID = "new-column"; 2 | -------------------------------------------------------------------------------- /src/react/shared/stack/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-stack { 2 | display: flex; 3 | } -------------------------------------------------------------------------------- /src/shared/link-and-path/constants.ts: -------------------------------------------------------------------------------- 1 | export const MARKDOWN_EXTENSION = "md"; 2 | -------------------------------------------------------------------------------- /readme/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/decaf-dev/obsidian-dataloom/HEAD/readme/app.png -------------------------------------------------------------------------------- /readme/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/decaf-dev/obsidian-dataloom/HEAD/readme/cover.png -------------------------------------------------------------------------------- /src/react/shared/flex/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-flex { 2 | display: flex; 3 | width: 100%; 4 | } -------------------------------------------------------------------------------- /src/react/shared/wrap/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-wrap { 2 | display: flex; 3 | flex-wrap: wrap; 4 | } -------------------------------------------------------------------------------- /src/react/loom-app/header-menu/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-header-menu { 2 | color: var(--text-normal); 3 | } -------------------------------------------------------------------------------- /src/react/loom-app/option-bar/sources-menu/constants.ts: -------------------------------------------------------------------------------- 1 | export enum SourcesMenuSubmenu { 2 | ADD, 3 | } 4 | -------------------------------------------------------------------------------- /src/react/loom-app/date-cell/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-date-cell { 2 | width: 100%; 3 | text-align: left; 4 | } -------------------------------------------------------------------------------- /src/react/loom-app/file-cell/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-file-cell p { 2 | margin: 0; 3 | text-align: left; 4 | } -------------------------------------------------------------------------------- /src/react/loom-app/option-bar/search-bar/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-search-bar input { 2 | max-width: 200px; 3 | } -------------------------------------------------------------------------------- /src/shared/dragging/types.ts: -------------------------------------------------------------------------------- 1 | export interface DragData { 2 | type: "row" | "column"; 3 | id: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/shared/uuid.ts: -------------------------------------------------------------------------------- 1 | import { v4 as uuidv4 } from "uuid"; 2 | 3 | export const generateUuid = () => uuidv4(); 4 | -------------------------------------------------------------------------------- /src/react/loom-app/number-cell/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-number-cell { 2 | width: 100%; 3 | text-align: right; 4 | } -------------------------------------------------------------------------------- /src/react/loom-app/date-cell-edit/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-date-cell-edit input[type="text"] { 2 | width: 105px; 3 | } 4 | -------------------------------------------------------------------------------- /src/react/loom-app/option-bar/sources-menu/base-content/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-source-container { 2 | width: 100%; 3 | } -------------------------------------------------------------------------------- /src/react/loom-app/app/hooks/use-row/types.ts: -------------------------------------------------------------------------------- 1 | export type RowReorderHandler = (dragId: string, targetId: string) => void; 2 | -------------------------------------------------------------------------------- /src/react/loom-app/option-bar/more-menu/constants.ts: -------------------------------------------------------------------------------- 1 | export enum MoreMenuSubmenu { 2 | SETTINGS, 3 | TOGGLE_COLUMNS, 4 | } 5 | -------------------------------------------------------------------------------- /src/react/loom-app/source-file-cell/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-source-file-cell p { 2 | margin: 0; 3 | text-align: left; 4 | } -------------------------------------------------------------------------------- /src/react/loom-app/multi-tag-cell/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-multi-tag-cell { 2 | display: flex; 3 | flex-direction: column; 4 | } -------------------------------------------------------------------------------- /src/shared/markdown/constants.ts: -------------------------------------------------------------------------------- 1 | export const CHECKBOX_MARKDOWN_UNCHECKED = "[ ]"; 2 | export const CHECKBOX_MARKDOWN_CHECKED = "[x]"; 3 | -------------------------------------------------------------------------------- /src/react/shared/suggest-list/suggest-input/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-suggest-input { 2 | background-color: var(--background-secondary); 3 | } -------------------------------------------------------------------------------- /src/shared/logger/types.ts: -------------------------------------------------------------------------------- 1 | export interface FormattedLogMessage { 2 | message: string; 3 | data: Record | null; 4 | } 5 | -------------------------------------------------------------------------------- /src/react/loom-app/new-column-button/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-new-column { 2 | padding-left: var(--dataloom-spacing--md); 3 | width: 50px; 4 | } -------------------------------------------------------------------------------- /src/react/shared/button/types.ts: -------------------------------------------------------------------------------- 1 | export type ButtonVariant = "default" | "link" | "text"; 2 | 3 | export type ButtonSize = "sm" | "md" | "lg"; 4 | -------------------------------------------------------------------------------- /src/react/shared/stepper/step-spacer.tsx: -------------------------------------------------------------------------------- 1 | export default function StepSpacer() { 2 | return
; 3 | } 4 | -------------------------------------------------------------------------------- /src/shared/export/types.ts: -------------------------------------------------------------------------------- 1 | export enum ExportType { 2 | UNSELECTED = "Select an option", 3 | CSV = "CSV", 4 | MARKDOWN = "Markdown", 5 | } 6 | -------------------------------------------------------------------------------- /src/shared/string-utils.ts: -------------------------------------------------------------------------------- 1 | export const uppercaseFirst = (input: string) => { 2 | return input.charAt(0).toUpperCase() + input.slice(1); 3 | }; 4 | -------------------------------------------------------------------------------- /src/obsidian/utils.ts: -------------------------------------------------------------------------------- 1 | import { generateUuid } from "src/shared/uuid"; 2 | 3 | export const createAppId = () => { 4 | return "a" + generateUuid(); 5 | }; 6 | -------------------------------------------------------------------------------- /src/react/import-app/upload-data/file-input/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-file-input input[type='file'] { 2 | color: transparent; /* Hide the native title */ 3 | } -------------------------------------------------------------------------------- /src/react/loom-app/option-bar/sources-menu/add-source-submenu/types.ts: -------------------------------------------------------------------------------- 1 | export interface AddSourceError { 2 | message: string; 3 | inputId: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/react/loom-app/option-bar/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-option-bar { 2 | width: 100%; 3 | border-bottom: 1px solid var(--background-modifier-border); 4 | } -------------------------------------------------------------------------------- /src/react/shared/multi-select/types.ts: -------------------------------------------------------------------------------- 1 | export type MultiSelectOptionType = { 2 | id: string; 3 | name: string; 4 | component: React.ReactNode; 5 | }; 6 | -------------------------------------------------------------------------------- /src/shared/loom-state/migrate/migrate-state.ts: -------------------------------------------------------------------------------- 1 | export default abstract class MigrateState { 2 | public abstract migrate(prevState: unknown): unknown; 3 | } 4 | -------------------------------------------------------------------------------- /src/react/loom-app/checkbox-cell/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-checkbox-cell { 2 | width: 100%; 3 | } 4 | 5 | .datlaoom-checkbox-cell input { 6 | cursor: pointer; 7 | } -------------------------------------------------------------------------------- /src/react/shared/spinner/index.tsx: -------------------------------------------------------------------------------- 1 | import "./styles.css"; 2 | 3 | export default function Spinner() { 4 | return
; 5 | } 6 | -------------------------------------------------------------------------------- /src/react/loom-app/app/hooks/use-source/types.ts: -------------------------------------------------------------------------------- 1 | import { Source } from "src/shared/loom-state/types/loom-state"; 2 | 3 | export type SourceAddHandler = (source: Source) => void; 4 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | ["@babel/preset-react", { runtime: "automatic" }], 4 | "@babel/preset-env", 5 | "@babel/preset-typescript", 6 | ], 7 | }; 8 | -------------------------------------------------------------------------------- /src/react/loom-app/tag-color-menu/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-tag-color-menu__color-container { 2 | width: 100%; 3 | height: 215px; 4 | overflow-y: scroll; 5 | overflow-x: auto; 6 | } -------------------------------------------------------------------------------- /src/react/loom-app/text-cell-edit/constants.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Matches double brackets and captures the text inside 3 | */ 4 | export const DOUBLE_BRACKET_REGEX = new RegExp(/\[\[(.*?)]]/g); 5 | -------------------------------------------------------------------------------- /src/react/shared/suggest-list/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-suggest-menu { 2 | width: 100%; 3 | } 4 | 5 | .dataloom-suggest-menu__container { 6 | max-height: 175px; 7 | overflow-y: auto; 8 | } -------------------------------------------------------------------------------- /src/react/loom-app/header-menu/number-format-submenu/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-number-format-submenu { 2 | width: 100%; 3 | height: 240px; 4 | overflow-x: auto; 5 | overflow-y: scroll; 6 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | insert_final_newline = true 7 | indent_style = tab 8 | indent_size = 4 9 | tab_width = 4 10 | -------------------------------------------------------------------------------- /src/react/loom-app/row-options/styles.css: -------------------------------------------------------------------------------- 1 | .dataloom-row-options { 2 | height: 100%; 3 | width: 100%; 4 | } 5 | 6 | .dataloom-row-options__container { 7 | width: 100%; 8 | height: 100%; 9 | } -------------------------------------------------------------------------------- /src/react/export-app/content-textarea.tsx: -------------------------------------------------------------------------------- 1 | interface Props { 2 | value: string; 3 | } 4 | 5 | export default function ContentTextArea({ value }: Props) { 6 | return