| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- <template>
- <button
- class="playful-btn"
- :class="['playful-btn--' + variant, 'playful-btn--' + size, {
- 'playful-btn--disabled': disabled,
- 'playful-btn--clay': variant === 'clay'
- }]"
- :disabled="disabled"
- @click="emitClick"
- :aria-label="ariaLabel"
- >
- <slot></slot>
- </button>
- </template>
- <script>
- export default {
- name: 'PlayfulButton',
- props: {
- variant: { type: String, default: 'primary' },
- // 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'clay' | 'outline'
- size: { type: String, default: 'md' },
- // 'xs' | 'sm' | 'md' | 'lg'
- disabled: { type: Boolean, default: false },
- ariaLabel: { type: String, default: '' },
- block: { type: Boolean, default: false }
- },
- methods: {
- emitClick(e) {
- if (!this.disabled) this.$emit('click', e)
- }
- }
- }
- </script>
- <style scoped>
- .playful-btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- border: none;
- border-radius: 999px;
- font-weight: 700;
- transition: opacity .2s ease, box-shadow .15s ease;
- line-height: 1.4;
- }
- .playful-btn--block {
- display: flex;
- width: 100%;
- }
- /* ---- Primary ---- */
- .playful-btn--primary {
- background: var(--color-primary, #5B9BD5);
- color: #fff;
- box-shadow: 0 2px 8px rgba(91, 155, 213, 0.3);
- }
- /* ---- Secondary ---- */
- .playful-btn--secondary {
- background: var(--surface, #ffffff);
- color: var(--text, #1E293B);
- border: 2rpx solid var(--border, #CBD5E1);
- box-shadow: 0 2px 6px rgba(91, 155, 213, 0.08);
- }
- /* ---- Success ---- */
- .playful-btn--success {
- background: var(--color-success, #22C55E);
- color: #fff;
- box-shadow: 0 2px 8px rgba(34, 197, 94, 0.3);
- }
- /* ---- Warning ---- */
- .playful-btn--warning {
- background: var(--color-warning, #F59E0B);
- color: #fff;
- box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);
- }
- /* ---- Error ---- */
- .playful-btn--error {
- background: var(--color-error, #EF4444);
- color: #fff;
- box-shadow: 0 2px 8px rgba(239, 68, 68, 0.3);
- }
- /* ---- Clay (孩子端玩具风) ---- */
- .playful-btn--clay {
- background: var(--color-primary, #5B9BD5);
- color: #fff;
- border: 2rpx solid var(--border, #CBD5E1);
- box-shadow: 0 2px 8px rgba(91, 155, 213, 0.15);
- }
- /* ---- Outline ---- */
- .playful-btn--outline {
- background: transparent;
- color: var(--color-primary, #5B9BD5);
- border: 2rpx solid var(--color-primary, #5B9BD5);
- }
- /* ---- Sizes ---- */
- .playful-btn--xs { font-size: 22rpx; padding: 8rpx 20rpx; }
- .playful-btn--sm { font-size: 24rpx; padding: 12rpx 28rpx; }
- .playful-btn--md { font-size: 28rpx; padding: 16rpx 36rpx; }
- .playful-btn--lg { font-size: 32rpx; padding: 20rpx 48rpx; min-height: 88rpx; }
- /* ---- States ---- */
- .playful-btn:active:not(:disabled) {
- opacity: 0.85;
- }
- .playful-btn--clay:active:not(:disabled) {
- opacity: 0.85;
- }
- .playful-btn--disabled,
- .playful-btn:disabled {
- opacity: 0.5;
- cursor: not-allowed;
- }
- .playful-btn:focus {
- outline: 2px solid rgba(91, 155, 213, 0.4);
- outline-offset: 2px;
- }
- </style>
|