Adjust ui styling

This commit is contained in:
KadisonM 2025-06-08 23:42:37 +09:30
parent a7bb8cb98a
commit 0f9cf9536a
8 changed files with 247 additions and 198 deletions

0
TODO.md Normal file
View file

View file

@ -1,9 +1,9 @@
{
"id": "tickaway",
"name": "Tickaway",
"version": "2.0.0",
"id": "homework-manager",
"name": "Homework Manager",
"version": "1.1.1",
"minAppVersion": "0.15.0",
"description": "Adds a simple task modal so you can tick away your to-dos with ease.",
"description": "Keeps track of homework through a to-do list.",
"author": "Kadison McLellan",
"authorUrl": "https://github.com/KadisonM",
"fundingUrl": "https://www.buymeacoffee.com/kadisonm",

55
src/creation-modal.ts Normal file
View file

@ -0,0 +1,55 @@
import TickawayPlugin from './main';
import { App, ButtonComponent, Modal, setIcon, Setting } from 'obsidian';
import { render } from "preact";
import { StringTypes } from './data-manager';
import { Section } from './data-manager';
export default class CreationModal extends Modal {
plugin: TickawayPlugin
type: StringTypes
parent: string
finished: () => void;
constructor(app: App, plugin: TickawayPlugin, type: StringTypes, parent: string, finished: () => void) {
super(app);
this.plugin = plugin;
this.type = type;
this.parent = parent;
this.finished = finished;
}
async createSection() {
const {contentEl} = this;
const title = contentEl.createEl("h1", { text: "Add new section" });
const inputText = contentEl.createEl("input", {type: "text", placeholder: "Enter section name"});
inputText.focus();
const buttonDiv = contentEl.createEl("div");
buttonDiv.addClass("creation-modal-footer");
new Setting(contentEl)
.addButton((btn) =>
btn
.setButtonText("Done")
.setCta()
.onClick(() => {
this.plugin.data.addItem(new Section(inputText.value.trim(), this.parent, ""));
this.finished();
this.close();
}));
}
async onOpen() {
const {contentEl} = this;
if (this.type === "Section") {
this.createSection();
}
}
async onClose() {
this.contentEl.empty();
}
}

View file

@ -2,7 +2,7 @@ import TickawayPlugin from './main';
import { v1 as uuidv1 } from 'uuid';
type AllTypes = Project | Section | Task | SubTask;
type StringTypes = "Item" | "Project" | "Section" | "Task" | "SubTask"
export type StringTypes = "Project" | "Section" | "Task" | "SubTask"
abstract class Item {
id: string;
@ -14,7 +14,7 @@ abstract class Item {
}
}
class Project extends Item {
export class Project extends Item {
type: "Project" = "Project";
children: string[] = [];
@ -23,19 +23,19 @@ class Project extends Item {
}
}
class Section extends Item {
export class Section extends Item {
type: "Section" = "Section";
children: string[] = [];
constructor(
name: string,
public parent: string,
public sort: string
public sort?: string
) {
super(name);
}
}
class Task extends Item {
export class Task extends Item {
type: "Task" = "Task";
children: string[] = [];
constructor(
@ -49,7 +49,7 @@ class Task extends Item {
}
}
class SubTask extends Item {
export class SubTask extends Item {
type: "SubTask" = "SubTask";
constructor(
id: string,
@ -163,6 +163,14 @@ export class DataManager {
addItem(item: AllTypes) {
this.data.items.push(item);
if (item.type !== "Project") {
const parent = this.getItem(item.parent);
if (parent && parent.type !== "SubTask") {
parent.children.push(item.id);
}
}
return item.id;
}

View file

@ -11,7 +11,6 @@ interface Props {
};
export function MenuItem({ title, icon, onClick, checked, attributeMessage, attributePosition }: Props) {
console.log(checked)
const element = useRef(null);
useLayoutEffect(() => {
@ -21,7 +20,7 @@ export function MenuItem({ title, icon, onClick, checked, attributeMessage, attr
});
return (
<div onClick={onClick} class={checked ? "menu-item tappable mod-checked" : "menu-item tappable"} aria-label={attributeMessage} data-tooltip-position={attributePosition}>
<div onClick={onClick} class={checked === true ? "menu-item tappable mod-checked" : "menu-item tappable"} aria-label={attributeMessage} data-tooltip-position={attributePosition}>
<div ref = {element} class="menu-item-icon"/>
<div class="menu-item-title"> {title} </div>
</div>

View file

@ -1,4 +1,4 @@
import { useContext } from 'preact/hooks';
import { useContext, useLayoutEffect } from 'preact/hooks';
import { Project } from 'src/data-manager';
import { DataContext, ProjectContext } from "src/ui/modal";
@ -14,8 +14,6 @@ export default function Body() {
const project = data.getItem(projectId) as Project;
console.log(project);
if (!project)
return (<></>)
@ -29,9 +27,12 @@ export default function Body() {
}
useLayoutEffect(() => {
console.log("refreshed")
});
return (
<div class={"body"}>
<Section text="Test Section" onDropdownClick={onDropdownClick} onNewTaskClick={onNewTaskClick}/>
<div class={"body"}>
{
sections.map((sectionId: string) => (
<Section

View file

@ -1,9 +1,24 @@
import { ActionButton } from "src/ui/components/action-button";
import CreationModal from "src/creation-modal";
import { ModalContext, ProjectContext, DataContext } from "..";
import { useContext } from "preact/hooks";
export default function Footer() {
const {projectId, setProjectId} = useContext(ProjectContext);
const modal = useContext(ModalContext);
console.log(modal);
console.log(projectId);
const newSection = () => {
if (modal) {
console.log(projectId);
new CreationModal(modal.app, modal.plugin, "Section", projectId, () => {
print("Set id")
setProjectId(projectId);
}).open();
}
};
const newTask = () => {

View file

@ -1,182 +1,153 @@
.tickaway .tickaway-modal {
.icon-button {
width: 12px;
height: 12px;
}
.header {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
gap: 20px;
}
.section {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
gap: 20px;
.section-dropdown {
background-color: none;
border-radius: var(--radius-s);
padding: var(--size-4-1) var(--size-4-2);
overflow: hidden;
display: flex;
flex-grow: 1;
justify-content: left;
align-items: center;
gap: 10px;
.section-name {
font-size: var(--h3-size);
font-weight: var(--font-normal);
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
color: var(--text-normal);
}
.section-icon {
color: var(--icon-color);
opacity: var(--icon-opacity);
}
& * {
display: flex;
justify-content: center;
align-items: center;
}
&:hover {
.section-name {
color: var(--text-normal);
}
background-color: var(--background-modifier-hover);
opacity: 100;
}
}
}
.footer {
display: flex;
flex-direction: row;
justify-content: left;
align-items: center;
gap: 10px;
border-top: var(--divider-width) solid var(--divider-color);
padding: var(--size-4-4) 0 0 0;
}
.action-button {
width: fit-content;
height: fit-content;
border-radius: var(--button-radius);
border-style: solid;
border-width: 1px;
border-color: var(--background-modifier-border-hover);
background-color: var(--background-secondary);
box-shadow: none;
font-size: var(--font-ui-small);
justify-content: flex-end;
min-height: 18px;
padding: var(--size-4-1) var(--size-4-2) var(--size-4-1) var(--size-4-2);
user-select: none;
display: flex;
align-items: center;
justify-content: center;
flex-direction: row;
cursor: var(--cursor);
margin: none;
gap: var(--size-4-2);
& * {
color: var(--icon-color);
transition: opacity 0.15s ease-in-out;
opacity: var(--icon-opacity);
display: flex;
align-items: center;
justify-content: center;
}
&:hover &:hover {
background-color: var(--background-modifier-hover);
}
&:hover * {
color: var(--icon-color-hover);
opacity: var(--icon-opacity-hover);
}
&:active * {
opacity: var(--icon-opacity-hover);
color: var(--icon-color-focused);
}
.action-button-icon {
stroke: var(--icon-m-stroke-width);
}
}
.project-switcher {
color: var(--vault-profile-color);
border-radius: var(--radius-s);
display: flex;
flex-grow: 1;
align-items: center;
gap: var(--size-4-2);
overflow: hidden;
padding: var(--size-4-1) var(--size-4-2);
&:hover {
color: var(--vault-profile-color-hover);
background-color: var(--background-modifier-hover);
.project-switcher-icon {
color: var(--icon-color-hover);
opacity: var(--icon-opacity-hover);
}
}
&.is-active {
color: var(--vault-profile-color-hover);
background-color: var(--background-modifier-hover);
.project-switcher-icon {
color: var(--text-muted);
}
}
.project-switcher-icon {
height: var(--icon-m);
width: var(--icon-m);
stroke: var(--icon-m-stroke-width);
display: flex;
align-items: center;
justify-content: center;
color: var(--icon-color);
transition: opacity 0.15s ease-in-out;
opacity: var(--icon-opacity);
}
.project-switcher-name {
font-size: var(--inline-title-size);;
font-weight: var(--font-bold);
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
}
.subject-box {
font-size: x-large !important;
padding-left: 0px !important;
background-color: tomato !important;
font-weight: 600 !important;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.hidden-textbox {
background-color: transparent !important;
border: none !important;
outline: none !important;
box-shadow: none !important;
}
.homework-manager h1 {
font-size: xx-large;
margin-top: 0;
margin-bottom: 0;
}
.homework-manager h2 {
font-size: x-large;
margin-top: 0;
margin-bottom: 0;
}
.homework-manager h3 {
font-size: large;
margin-top: 0;
margin-bottom: 0;
}
.homework-manager .clickable-icon {
width: 32px;
height: 32px;
}
.homework-manager #remove-subject {
display: flex;
align-items: center;
justify-content: center;
width: 25px;
height: 25px;
border-radius: 50%;
background-color: var(--interactive-hover);
}
.homework-manager #remove-subject:hover {
background-color: red;
}
.homework-manager #header {
display: flex;
justify-content: space-between;
margin-right: 20px;
}
.homework-manager #header #left-column {
display: flex;
align-items: center;
}
.homework-manager #header *:not(svg) {
margin-right: 10px;
}
.homework-manager #body {
margin-top: 30px;
}
.homework-manager #body *:not(svg) {
margin-right: 10px;
}
.homework-manager #body #subject {
margin-bottom: 30px;
}
.homework-manager #body #title {
display: flex;
align-items: center;
justify-content: flex-start;
}
.homework-manager #body #task {
display: flex;
align-items: center;
margin-top: 15px;
}
.homework-manager #body #task div {
display: flex;
flex-direction: column;
align-items: left;
}
.homework-manager #body #task #check {
background-color: transparent;
width: 25px;
height: 25px;
flex-shrink: 0;
border-style: solid;
border-width: 2px;
border-radius: 50%;
border-color: var(--icon-color);
opacity: var(--icon-opacity);
transition: opacity 0.15s ease-in-out;
}
.homework-manager #body #task #check:hover {
opacity: var(--icon-opacity-hover);
border-color: var(--icon-color-hover);
}
.homework-manager #body #task #check:active {
opacity: var(--icon-opacity-hover);
border-color: var(--icon-color-focused);
}
.homework-manager #body #task p {
font-size: large;
margin: 0;
}
.homework-manager #body #task #date {
color: var(--text-muted);
font-size: small;
}
.homework-manager #menu {
display: flex;
flex-direction: column;
}
.homework-manager #menu .menu-item:hover {
background-color: var(--background-modifier-hover);
}
.homework-manager #subject-prompt {
display: flex;
align-items: center;
margin-top: 30px;
gap: 10px;
}
.homework-manager #subject-prompt input {
width: 50%;
}
.homework-manager #task-prompt {
margin-top: 15px;
}
.homework-manager #task-prompt #top {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
}
.homework-manager #task-prompt #top input {
width: 50%;
}
.homework-manager #task-prompt #bottom {
display: flex;
align-items: center;
gap: 10px;
}
.homework-manager-hidden {
display: none !important;
}
.homework-manager-link:hover {
cursor: var(--cursor-link);
text-decoration-line: var(--link-decoration-hover);
}
/*# sourceMappingURL=styles.css.map */