vue3-calculator
Version:
A Vue 3 calculator component with scientific and standard modes
2 lines (1 loc) • 14.8 kB
CSS
.calculator[data-v-d83a4ce9]{width:100%;height:100%;max-height:100vh;background-color:var(--primary-bg);border:1px solid var(--border-light);border-radius:var(--border-radius-lg);box-shadow:var(--shadow-medium);display:flex;flex-direction:column;overflow:hidden;position:relative;box-sizing:border-box}.toolbar-area[data-v-d83a4ce9]{background-color:var(--display-bg);border-bottom:1px solid var(--border-light);padding:var(--spacing-sm) var(--spacing-lg);display:flex;align-items:center;justify-content:space-between;min-height:40px;flex-shrink:0}.toolbar-left[data-v-d83a4ce9]{display:flex;align-items:center;gap:var(--spacing-sm)}.toolbar-right[data-v-d83a4ce9]{display:flex;align-items:center}.mode-display[data-v-d83a4ce9]{font-size:var(--font-size-small);color:var(--text-secondary);font-weight:500}.btn-menu[data-v-d83a4ce9],.toolbar-area .btn-memory[data-v-d83a4ce9]{background-color:transparent;border:none;border-radius:var(--border-radius-sm);padding:var(--spacing-xs);cursor:pointer;display:flex;align-items:center;justify-content:center;width:32px;height:32px;color:var(--text-primary);transition:all .2s ease}.btn-menu[data-v-d83a4ce9]:hover,.toolbar-area .btn-memory[data-v-d83a4ce9]:hover{background-color:var(--button-hover)}.display-area[data-v-d83a4ce9]{background-color:var(--display-bg);padding:var(--spacing-lg);border-bottom:1px solid var(--border-light);min-height:90px;display:flex;flex-direction:column;justify-content:flex-end;text-align:right;gap:var(--spacing-xs);flex-shrink:0}.expression[data-v-d83a4ce9]{font-size:var(--font-size-small);color:var(--text-secondary);min-height:20px;word-break:break-all;display:flex;align-items:flex-end;opacity:1;transition:opacity .2s ease;flex-shrink:0}.expression[data-v-d83a4ce9]:empty{opacity:0}.display[data-v-d83a4ce9]{font-weight:300;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.2;min-height:40px;display:flex;align-items:flex-end;justify-content:flex-end;flex-shrink:0;width:100%;box-sizing:border-box;transition:font-size .2s ease}.memory-section[data-v-d83a4ce9]{display:grid;grid-template-columns:repeat(6,1fr);background-color:var(--border-light);flex-shrink:0}.btn-memory[data-v-d83a4ce9]{height:36px;font-size:var(--font-size-small);background-color:var(--secondary-bg);border:none;border-radius:0}.btn-memory[data-v-d83a4ce9]:disabled{opacity:.5;cursor:not-allowed}.btn-memory[data-v-d83a4ce9]:not(:disabled):hover{background-color:var(--button-hover)}.buttons-area[data-v-d83a4ce9]{flex:1;display:flex;flex-direction:column;gap:2px;background-color:var(--secondary-bg);padding:4px}.button-row[data-v-d83a4ce9]{display:grid;grid-template-columns:repeat(4,1fr);gap:2px;flex:1;min-height:0}.calculator:has(.scientific-row) .button-row[data-v-d83a4ce9]{flex:.8}.calculator:has(.scientific-row) .scientific-row[data-v-d83a4ce9]{flex:.6}.button-row .btn[data-v-d83a4ce9]{border-radius:var(--border-radius-md);font-size:var(--font-size-button);font-weight:400;height:100%;min-height:40px}.calculator:has(.scientific-row) .button-row .btn[data-v-d83a4ce9]{min-height:35px;font-size:var(--font-size-small)}.calculator:has(.scientific-row) .scientific-row .btn[data-v-d83a4ce9]{min-height:30px;font-size:12px}.btn-number[data-v-d83a4ce9]{background-color:var(--button-bg);font-weight:500}.btn-number[data-v-d83a4ce9]:hover{background-color:var(--button-hover)}.btn-function[data-v-d83a4ce9]{background-color:var(--button-bg);font-size:var(--font-size-small)}.btn-function[data-v-d83a4ce9]:hover{background-color:var(--operator-hover)}.btn-operator[data-v-d83a4ce9]{background-color:var(--button-bg);font-size:18px;font-weight:500}.btn-operator[data-v-d83a4ce9]:hover{background-color:var(--operator-hover)}.btn-equals[data-v-d83a4ce9]{background-color:var(--equals-bg);color:var(--text-white);font-size:18px;font-weight:600}.btn-equals[data-v-d83a4ce9]:hover{background-color:var(--equals-hover)}.btn-clear[data-v-d83a4ce9]{background-color:var(--clear-bg)}.btn-clear[data-v-d83a4ce9]:hover{background-color:var(--clear-hover)}.drawer-overlay[data-v-d83a4ce9]{position:absolute;inset:0;background-color:#0000004d;z-index:15;transition:opacity .3s ease}.drawer-menu[data-v-d83a4ce9]{position:absolute;top:0;left:-280px;width:280px;height:100%;background-color:var(--display-bg);border-right:1px solid var(--border-light);box-shadow:var(--shadow-medium);display:flex;flex-direction:column;z-index:20;transition:left .3s ease}.drawer-menu.drawer-open[data-v-d83a4ce9]{left:0}.drawer-header[data-v-d83a4ce9]{padding:var(--spacing-xs) var(--spacing-sm);border-bottom:1px solid var(--border-light);display:flex;justify-content:space-between;align-items:center;min-height:44px}.drawer-header h3[data-v-d83a4ce9]{margin:0;font-size:var(--font-size-button);font-weight:600;color:var(--text-primary)}.drawer-content[data-v-d83a4ce9]{flex:1;padding:var(--spacing-md);overflow-y:auto}.mode-option[data-v-d83a4ce9]{display:flex;align-items:center;padding:var(--spacing-md);border-radius:var(--border-radius-md);cursor:pointer;transition:all .2s ease;margin-bottom:var(--spacing-sm);gap:var(--spacing-md);border:1px solid transparent}.mode-option[data-v-d83a4ce9]:hover{background-color:var(--button-hover)}.mode-option.active[data-v-d83a4ce9]{background-color:var(--button-active);border-color:var(--equals-bg)}.mode-icon[data-v-d83a4ce9]{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:var(--secondary-bg);border-radius:var(--border-radius-md);color:var(--text-primary)}.mode-option.active .mode-icon[data-v-d83a4ce9]{background-color:var(--equals-bg);color:var(--text-white)}.mode-info[data-v-d83a4ce9]{flex:1}.mode-title[data-v-d83a4ce9]{font-size:var(--font-size-button);font-weight:500;color:var(--text-primary);margin-bottom:2px}.mode-desc[data-v-d83a4ce9]{font-size:var(--font-size-small);color:var(--text-secondary)}.mode-check[data-v-d83a4ce9]{display:flex;align-items:center;justify-content:center;width:20px;height:20px;color:var(--equals-bg)}.history-overlay[data-v-d83a4ce9]{position:absolute;inset:0;background-color:#00000080;z-index:10;display:flex;align-items:flex-end}.history-panel[data-v-d83a4ce9]{width:100%;height:calc(100% - 188px);background-color:var(--display-bg);border-top:1px solid var(--border-light);box-shadow:0 -2px 8px #0000001a;display:flex;flex-direction:column;transition:transform .3s ease}.history-slide-enter-active[data-v-d83a4ce9],.history-slide-leave-active[data-v-d83a4ce9]{transition:all .3s ease}.history-slide-enter-from[data-v-d83a4ce9]{opacity:0}.history-slide-enter-from .history-panel[data-v-d83a4ce9]{transform:translateY(100%)}.history-slide-enter-to[data-v-d83a4ce9]{opacity:1}.history-slide-enter-to .history-panel[data-v-d83a4ce9]{transform:translateY(0)}.history-slide-leave-from[data-v-d83a4ce9]{opacity:1}.history-slide-leave-from .history-panel[data-v-d83a4ce9]{transform:translateY(0)}.history-slide-leave-to[data-v-d83a4ce9]{opacity:0}.history-slide-leave-to .history-panel[data-v-d83a4ce9]{transform:translateY(100%)}.history-header[data-v-d83a4ce9]{padding:var(--spacing-xs) var(--spacing-sm);border-bottom:1px solid var(--border-light);display:flex;justify-content:space-between;align-items:center}.history-header h3[data-v-d83a4ce9]{margin:0;font-size:var(--font-size-button);font-weight:600;color:var(--text-primary)}.history-actions[data-v-d83a4ce9]{display:flex;gap:var(--spacing-xs);align-items:center}.history-actions .btn[data-v-d83a4ce9]{border:none;border-radius:var(--border-radius-sm);padding:var(--spacing-xs);cursor:pointer;display:flex;align-items:center;justify-content:center;width:32px;height:32px}.btn-close[data-v-d83a4ce9]{background-color:var(--clear-bg)}.btn-close[data-v-d83a4ce9]:hover{background-color:var(--clear-hover)}.history-actions .btn-clear[data-v-d83a4ce9]{background-color:var(--clear-bg)}.history-actions .btn-clear[data-v-d83a4ce9]:hover{background-color:var(--clear-hover)}.history-list[data-v-d83a4ce9]{flex:1;overflow-y:auto;padding:var(--spacing-sm)}.history-item[data-v-d83a4ce9]{display:flex;align-items:center;padding:var(--spacing-md);border-radius:var(--border-radius-sm);font-size:var(--font-size-small);color:var(--text-secondary);margin-bottom:var(--spacing-xs);gap:var(--spacing-sm)}.history-item[data-v-d83a4ce9]:hover{background-color:var(--button-hover)}.history-content[data-v-d83a4ce9]{flex:1;cursor:pointer;word-break:break-all;padding:var(--spacing-xs) 0}.btn-delete[data-v-d83a4ce9]{background-color:transparent;border:none;border-radius:var(--border-radius-sm);padding:var(--spacing-xs);cursor:pointer;display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:var(--text-secondary);opacity:.6;transition:all .2s ease}.btn-delete[data-v-d83a4ce9]:hover{background-color:var(--clear-bg);color:var(--text-primary);opacity:1}.history-empty[data-v-d83a4ce9]{text-align:center;color:var(--text-secondary);font-size:var(--font-size-small);padding:var(--spacing-xl)}.memory-overlay[data-v-d83a4ce9]{position:absolute;inset:0;background-color:#00000080;z-index:10;display:flex;align-items:flex-end}.memory-panel[data-v-d83a4ce9]{width:100%;height:calc(100% - 188px);background-color:var(--display-bg);border-top:1px solid var(--border-light);box-shadow:0 -2px 8px #0000001a;display:flex;flex-direction:column;transition:transform .3s ease}.memory-slide-enter-active[data-v-d83a4ce9],.memory-slide-leave-active[data-v-d83a4ce9]{transition:all .3s ease}.memory-slide-enter-from[data-v-d83a4ce9]{opacity:0}.memory-slide-enter-from .memory-panel[data-v-d83a4ce9]{transform:translateY(100%)}.memory-slide-enter-to[data-v-d83a4ce9]{opacity:1}.memory-slide-enter-to .memory-panel[data-v-d83a4ce9]{transform:translateY(0)}.memory-slide-leave-from[data-v-d83a4ce9]{opacity:1}.memory-slide-leave-from .memory-panel[data-v-d83a4ce9]{transform:translateY(0)}.memory-slide-leave-to[data-v-d83a4ce9]{opacity:0}.memory-slide-leave-to .memory-panel[data-v-d83a4ce9]{transform:translateY(100%)}.memory-header[data-v-d83a4ce9]{padding:var(--spacing-xs) var(--spacing-sm);border-bottom:1px solid var(--border-light);display:flex;justify-content:space-between;align-items:center}.memory-header h3[data-v-d83a4ce9]{margin:0;font-size:var(--font-size-button);font-weight:600;color:var(--text-primary)}.memory-actions[data-v-d83a4ce9]{display:flex;gap:var(--spacing-xs);align-items:center}.memory-actions .btn[data-v-d83a4ce9]{border:none;border-radius:var(--border-radius-sm);padding:var(--spacing-xs);cursor:pointer;display:flex;align-items:center;justify-content:center;width:28px;height:20px}.memory-list[data-v-d83a4ce9]{flex:1;overflow-y:auto;padding:var(--spacing-xs)}.memory-item[data-v-d83a4ce9]{display:flex;flex-direction:column;padding:var(--spacing-sm);border-radius:var(--border-radius-sm);font-size:var(--font-size-small);color:var(--text-secondary);margin-bottom:2px;transition:all .2s ease;position:relative}.memory-item[data-v-d83a4ce9]:hover{background-color:var(--button-hover)}.memory-value[data-v-d83a4ce9]{cursor:pointer;word-break:break-all;padding:2px 0;font-weight:500;color:var(--text-primary)}.memory-actions[data-v-d83a4ce9]{display:flex;gap:var(--spacing-xs);opacity:0;transition:opacity .2s ease;margin-top:2px}.memory-item:hover .memory-actions[data-v-d83a4ce9]{opacity:1}.btn-mini[data-v-d83a4ce9]{background-color:var(--button-bg);border:1px solid var(--border-light);border-radius:var(--border-radius-sm);padding:2px 6px;font-size:10px;cursor:pointer;color:var(--text-primary);transition:all .2s ease;min-width:24px;height:20px;display:flex;align-items:center;justify-content:center}.btn-mini[data-v-d83a4ce9]:hover{background-color:var(--clear-bg);border-color:var(--border-medium);transform:scale(1.05)}.memory-empty[data-v-d83a4ce9]{text-align:center;color:var(--text-secondary);font-size:var(--font-size-small);padding:var(--spacing-xl)}.memory-footer[data-v-d83a4ce9]{padding:var(--spacing-xs) var(--spacing-sm);border-top:1px solid var(--border-light);display:flex;justify-content:flex-end}.btn-clear-memory[data-v-d83a4ce9]{background-color:var(--clear-bg);color:var(--text-primary);border:1px solid var(--border-light);border-radius:var(--border-radius-md);padding:var(--spacing-xs) var(--spacing-sm);font-size:var(--font-size-small);cursor:pointer;transition:all .2s ease}.btn-clear-memory[data-v-d83a4ce9]:hover{background-color:var(--clear-hover)}svg[data-v-d83a4ce9]{display:block}@media (max-width: 320px){.calculator[data-v-d83a4ce9]{width:100%;height:100%;border-radius:0}}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;background-color:#f3f3f3;overflow:hidden;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#app{width:100vw;height:100vh;display:flex;flex-direction:column}:root{--primary-bg: #f3f3f3;--secondary-bg: rgba(243, 243, 243, .9);--display-bg: #ffffff;--button-bg: #f9f9f9;--button-hover: #e5f3ff;--button-active: #cce8ff;--operator-bg: #f0f0f0;--operator-hover: #e5e5e5;--equals-bg: #0078d4;--equals-hover: #106ebe;--clear-bg: #f9f9f9;--clear-hover: #e5e5e5;--text-primary: #323130;--text-secondary: #605e5c;--text-white: #ffffff;--text-operator: #323130;--border-light: #e1dfdd;--border-medium: #d2d0ce;--shadow-light: 0 1px 3px rgba(0, 0, 0, .1);--shadow-medium: 0 2px 6px rgba(0, 0, 0, .15);--font-size-display: 32px;--font-size-button: 16px;--font-size-small: 14px;--font-size-mini: 12px;--spacing-xs: 4px;--spacing-sm: 8px;--spacing-md: 12px;--spacing-lg: 16px;--spacing-xl: 20px;--border-radius-sm: 2px;--border-radius-md: 4px;--border-radius-lg: 6px}.btn{border:1px solid var(--border-light);background-color:var(--button-bg);color:var(--text-primary);font-size:var(--font-size-button);font-weight:400;cursor:pointer;transition:all .1s ease;outline:none;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius-sm)}.btn:hover{background-color:var(--button-hover);border-color:var(--border-medium)}.btn:active{background-color:var(--button-active);transform:scale(.98)}.btn-operator{background-color:var(--operator-bg);font-weight:500}.btn-operator:hover{background-color:var(--operator-hover)}.btn-equals{background-color:var(--equals-bg);color:var(--text-white);font-weight:600;border-color:var(--equals-bg)}.btn-equals:hover{background-color:var(--equals-hover);border-color:var(--equals-hover)}.btn-clear{background-color:var(--clear-bg);color:var(--text-primary)}.btn-clear:hover{background-color:var(--clear-hover)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--secondary-bg)}::-webkit-scrollbar-thumb{background:var(--border-medium);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--text-secondary)}