You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.2 KiB

  1. <script lang="ts">
  2. import type { IconName, iconNames } from "../external/icons";
  3. import DaysLeft from "./DaysLeft.svelte";
  4. import Icon from "./Icon.svelte";
  5. import LinkHook from "./LinkHook.svelte";
  6. import Markdown from "./Markdown.svelte";
  7. interface EntryCommon {
  8. id: string
  9. name?: string
  10. description: string
  11. icon?: IconName
  12. startTime?: string
  13. endTime?: string
  14. createdTime?: string
  15. active?: boolean
  16. completedAmount?: number
  17. itemAmount?: number
  18. task?: EntryCommonSub
  19. }
  20. interface EntryCommonSub {
  21. name: string
  22. icon: IconName
  23. }
  24. export let entry: EntryCommon = null;
  25. let iconName: IconName;
  26. let displayName: string;
  27. $: iconName = entry.task?.icon || entry.icon;
  28. $: displayName = entry.name || entry.task?.name || "";
  29. </script>
  30. <div class="child-entry">
  31. <LinkHook id={entry.id} />
  32. <div class="body">
  33. <div class="header">
  34. <slot name="icon">
  35. <div class="icon">
  36. <Icon name={iconName} />
  37. </div>
  38. </slot>
  39. <div class="name">{displayName}</div>
  40. {#if (entry.endTime != null)}
  41. <div class="times">
  42. <DaysLeft startTime={entry.startTime || entry.createdTime} endTime={entry.endTime} />
  43. </div>
  44. {/if}
  45. </div>
  46. <div class="entry-body">
  47. <Markdown source={entry.description} />
  48. <slot></slot>
  49. </div>
  50. </div>
  51. </div>
  52. <style>
  53. div.child-entry {
  54. display: flex;
  55. flex-direction: row;
  56. margin: 0.25em 0 0.75em 0;
  57. }
  58. div.icon {
  59. display: flex;
  60. flex-direction: column;
  61. font-size: 1em;
  62. padding: 0.2em .5ch;
  63. margin-right: 0.5em;
  64. background: #444;
  65. color: #CCC;
  66. }
  67. div.body {
  68. display: flex;
  69. flex-direction: column;
  70. width: 100%;
  71. }
  72. div.header {
  73. display: flex;
  74. flex-direction: row;
  75. background: #333;
  76. }
  77. div.name {
  78. font-size: 1em;
  79. font-weight: 100;
  80. margin: auto 0;
  81. vertical-align: middle;
  82. padding: 0.125em .5ch;
  83. }
  84. div.times {
  85. margin-left: auto;
  86. margin-right: 0.25ch;
  87. padding: 0.125em 0;
  88. }
  89. div.entry-body {
  90. padding: 0.25em 1ch;
  91. background: #222;
  92. color: #aaa;
  93. border-bottom-right-radius: 0.5em;
  94. }
  95. </style>