item.astro 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. ---
  2. const { title, projectName, layout = {} } = Astro.props;
  3. const defaultLayout = {
  4. mobile: { left: '2%', top: '5%', width: '96%', height: 'auto' },
  5. tablet: { left: '10%', top: '10%', width: '80%', height: 'auto' },
  6. desktop: { left: '10%', top: '10%', width: '60%', height: '70%' }
  7. };
  8. const mergedLayout = {
  9. mobile: { ...defaultLayout.mobile, ...(layout.mobile || {}) },
  10. tablet: { ...defaultLayout.tablet, ...(layout.tablet || {}) },
  11. desktop: { ...defaultLayout.desktop, ...(layout.desktop || {}) }
  12. };
  13. ---
  14. <div
  15. id={title}
  16. class=`window projectwindow ${projectName}`
  17. style="display: none;"
  18. >
  19. <div id={`${title}header`} class="title-bar">
  20. <div class="title-bar-text">{title}</div>
  21. <div class="title-bar-controls">
  22. <button class="close" aria-label="Minimize"></button>
  23. <button class="close" aria-label="Close"></button>
  24. </div>
  25. </div>
  26. <div class="window-body" style="height: 100%;">
  27. <slot/>
  28. </div>
  29. </div>
  30. <style define:vars={{
  31. mobileLeft: mergedLayout.mobile.left,
  32. mobileTop: mergedLayout.mobile.top,
  33. mobileWidth: mergedLayout.mobile.width,
  34. mobileHeight: mergedLayout.mobile.height,
  35. tabletLeft: mergedLayout.tablet.left,
  36. tabletTop: mergedLayout.tablet.top,
  37. tabletWidth: mergedLayout.tablet.width,
  38. tabletHeight: mergedLayout.tablet.height,
  39. desktopLeft: mergedLayout.desktop.left,
  40. desktopTop: mergedLayout.desktop.top,
  41. desktopWidth: mergedLayout.desktop.width,
  42. desktopHeight: mergedLayout.desktop.height
  43. }}>
  44. .window {
  45. animation: createBox 0.2s;
  46. position: absolute;
  47. }
  48. @keyframes createBox {
  49. from {
  50. transform: scale(0);
  51. }
  52. to {
  53. transform: scale(1);
  54. }
  55. }
  56. /* Mobile */
  57. @media (max-width: 510px) {
  58. .window {
  59. left: var(--mobileLeft);
  60. top: var(--mobileTop);
  61. max-width: var(--mobileWidth);
  62. max-height: var(--mobileHeight);
  63. }
  64. }
  65. /* Tablet */
  66. @media (min-width: 541px) and (max-width: 1080px) {
  67. .window {
  68. left: var(--tabletLeft);
  69. top: var(--tabletTop);
  70. max-width: var(--tabletWidth);
  71. max-height: var(--tabletHeight);
  72. }
  73. }
  74. /* Desktop */
  75. @media (min-width: 1081px) {
  76. .window {
  77. left: var(--desktopLeft);
  78. top: var(--desktopTop);
  79. max-width: var(--desktopWidth);
  80. max-height: var(--desktopHeight);
  81. width: var(--desktopWidth);
  82. height: var(--desktopHeight);
  83. }
  84. }
  85. </style>