@bagelink/vue 1.15.96 → 1.15.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Swiper.vue.d.ts +1 -0
- package/dist/components/Swiper.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/TextInput.vue.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.vue.d.ts +8 -0
- package/dist/components/layout/AppSidebar.vue.d.ts.map +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.mjs +959 -940
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/Swiper.vue +23 -10
- package/src/components/form/inputs/TextInput.vue +3 -2
- package/src/components/layout/AppSidebar.vue +42 -1
- package/src/styles/dark.css +33 -1
- package/src/styles/theme.css +1 -0
package/package.json
CHANGED
|
@@ -74,6 +74,10 @@ const props = withDefaults(
|
|
|
74
74
|
// Pagination
|
|
75
75
|
pagination?: boolean | PaginationOptions
|
|
76
76
|
|
|
77
|
+
// Pill-style pagination: the active bullet stretches into a pill
|
|
78
|
+
// (animated width) instead of staying a circle. Pairs with `pagination`.
|
|
79
|
+
pillDots?: boolean
|
|
80
|
+
|
|
77
81
|
// Autoplay
|
|
78
82
|
autoplay?: boolean | AutoplayOptions
|
|
79
83
|
|
|
@@ -105,6 +109,7 @@ const props = withDefaults(
|
|
|
105
109
|
autoHeight: false,
|
|
106
110
|
navigation: undefined,
|
|
107
111
|
pagination: undefined,
|
|
112
|
+
pillDots: false,
|
|
108
113
|
autoplay: undefined,
|
|
109
114
|
coverflowEffect: undefined,
|
|
110
115
|
breakpoints: undefined,
|
|
@@ -416,7 +421,7 @@ defineExpose({
|
|
|
416
421
|
</script>
|
|
417
422
|
|
|
418
423
|
<template>
|
|
419
|
-
<div class="swi-wrap">
|
|
424
|
+
<div class="swi-wrap" :class="{ 'pill-dots': pillDots }">
|
|
420
425
|
<Swiper
|
|
421
426
|
v-bind="swiperVueProps" class="swiper" @swiper="onSwiper" @slide-change="updateNavigationState"
|
|
422
427
|
@reach-beginning="updateNavigationState" @reach-end="updateNavigationState"
|
|
@@ -459,11 +464,6 @@ defineExpose({
|
|
|
459
464
|
width: 100%;
|
|
460
465
|
}
|
|
461
466
|
|
|
462
|
-
:root {
|
|
463
|
-
--swiper-navigation-color: white;
|
|
464
|
-
--swiper-pagination-color: white;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
467
|
/* Pagination: keep Swiper's own horizontal centering (left:50% + translateX),
|
|
468
468
|
just give the wrapper a sane bottom offset and consistent bullet sizing so
|
|
469
469
|
consumers don't need :deep() overrides to fix position. Override the bullet
|
|
@@ -471,15 +471,28 @@ width: 100%;
|
|
|
471
471
|
.swi-wrap .swiper-pagination-bullets {
|
|
472
472
|
bottom: 8px;
|
|
473
473
|
}
|
|
474
|
+
.artSwiper .swiper { padding-bottom: 3rem; }
|
|
475
|
+
|
|
474
476
|
.swi-wrap .swiper-pagination-bullet {
|
|
475
|
-
width: var(--swiper-pagination-bullet-width,
|
|
476
|
-
height: var(--swiper-pagination-bullet-height,
|
|
477
|
-
background: var(--swiper-pagination-bullet-inactive-color,
|
|
477
|
+
width: var(--swiper-pagination-bullet-width, 10px);
|
|
478
|
+
height: var(--swiper-pagination-bullet-height, 10px);
|
|
479
|
+
background: var(--swiper-pagination-bullet-inactive-color, var(--bgl-gray));
|
|
478
480
|
opacity: var(--swiper-pagination-bullet-inactive-opacity, 0.6);
|
|
479
481
|
}
|
|
480
482
|
.swi-wrap .swiper-pagination-bullet-active {
|
|
481
483
|
opacity: 1;
|
|
482
|
-
background: var(--swiper-pagination-color,
|
|
484
|
+
background: var(--swiper-pagination-color, var(--bgl-primary));
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/* Pill dots: the active bullet stretches into a pill (animated width). The
|
|
488
|
+
width it grows to is configurable via --swiper-pagination-bullet-active-width
|
|
489
|
+
(defaults to ~2.6x the bullet width). */
|
|
490
|
+
.swi-wrap.pill-dots .swiper-pagination-bullet {
|
|
491
|
+
border-radius: 50px;
|
|
492
|
+
transition: width 0.3s ease-in-out, opacity 0.3s ease-in-out, background 0.3s ease-in-out;
|
|
493
|
+
}
|
|
494
|
+
.swi-wrap.pill-dots .swiper-pagination-bullet-active {
|
|
495
|
+
width: var(--swiper-pagination-bullet-active-width, 26px);
|
|
483
496
|
}
|
|
484
497
|
|
|
485
498
|
.swi-ctrl {
|
|
@@ -239,8 +239,9 @@ align-items: center;
|
|
|
239
239
|
gap: 0.5rem;
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
-
.bagel-input input:disabled
|
|
243
|
-
|
|
242
|
+
.bagel-input input:disabled,
|
|
243
|
+
.bagel-input textarea:disabled {
|
|
244
|
+
background: var(--input-disabled-bg);
|
|
244
245
|
}
|
|
245
246
|
|
|
246
247
|
.textInputIconWrap .bgl_icon-font {
|
|
@@ -17,6 +17,13 @@ interface Props {
|
|
|
17
17
|
navLinks: LinkWithAction[]
|
|
18
18
|
footerLinks?: LinkWithAction[]
|
|
19
19
|
logo?: string
|
|
20
|
+
/** Optional dedicated logo for dark mode. When set, it replaces `logo`
|
|
21
|
+
* while `.bgl-dark-mode` is active. */
|
|
22
|
+
logoDark?: string
|
|
23
|
+
/** When no `logoDark` is provided, apply a filter that turns the logo white
|
|
24
|
+
* in dark mode. Set to `false` to keep the logo's original colors (e.g. a
|
|
25
|
+
* full-color logo that already reads on dark). Defaults to `true`. */
|
|
26
|
+
logoWhitenInDark?: boolean
|
|
20
27
|
logoAlt?: string
|
|
21
28
|
card?: boolean
|
|
22
29
|
bgColor?: string
|
|
@@ -39,6 +46,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
39
46
|
activeColor: 'var(--bgl-primary)',
|
|
40
47
|
logoAlt: 'Logo',
|
|
41
48
|
logoHeight: '2rem',
|
|
49
|
+
logoWhitenInDark: true,
|
|
42
50
|
name: 'App Name',
|
|
43
51
|
footerLinks: () => [],
|
|
44
52
|
})
|
|
@@ -160,8 +168,18 @@ const sidebarStyles = computed(() => {
|
|
|
160
168
|
:class="{ 'mx-1': isVisuallyOpen, 'mx-05': !isVisuallyOpen
|
|
161
169
|
}"
|
|
162
170
|
>
|
|
171
|
+
<!-- Light/base logo. Hidden in dark mode only when a dedicated dark
|
|
172
|
+
logo exists; otherwise it stays and (optionally) gets whitened. -->
|
|
163
173
|
<img
|
|
164
|
-
v-if="props.logo" :src="props.logo" :alt="props.logoAlt"
|
|
174
|
+
v-if="props.logo" :src="props.logo" :alt="props.logoAlt"
|
|
175
|
+
class="contain sidebar-logo sidebar-logo-light"
|
|
176
|
+
:class="{ 'sidebar-logo-whiten': props.logoWhitenInDark && !props.logoDark }"
|
|
177
|
+
:style="{ height: props.logoHeight }"
|
|
178
|
+
>
|
|
179
|
+
<!-- Dedicated dark-mode logo (shown only in dark mode). -->
|
|
180
|
+
<img
|
|
181
|
+
v-if="props.logoDark" :src="props.logoDark" :alt="props.logoAlt"
|
|
182
|
+
class="contain sidebar-logo sidebar-logo-dark"
|
|
165
183
|
:style="{ height: props.logoHeight }"
|
|
166
184
|
>
|
|
167
185
|
<slot name="brand" v-bind="{ isOpen: isVisuallyOpen }">
|
|
@@ -220,6 +238,29 @@ outline: 1px solid var(--bgl-border-color);
|
|
|
220
238
|
outline-offset: -1px;
|
|
221
239
|
}
|
|
222
240
|
|
|
241
|
+
/* ---- Logo theming (CSS-only, no JS) ---------------------------------------
|
|
242
|
+
The dark logo is hidden by default (light mode) and the light logo shown.
|
|
243
|
+
In dark mode we flip them. When there's no dedicated dark logo, the light
|
|
244
|
+
logo carries `.sidebar-logo-whiten` and gets turned white instead of hidden. */
|
|
245
|
+
.sidebar-logo-dark {
|
|
246
|
+
display: none;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.bgl-dark-mode .sidebar-logo-light:not(.sidebar-logo-whiten) {
|
|
250
|
+
display: none;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.bgl-dark-mode .sidebar-logo-dark {
|
|
254
|
+
display: block;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* Whiten the light logo in dark mode when no dedicated dark logo is supplied.
|
|
258
|
+
`brightness(0)` flattens it to solid black (regardless of original colors),
|
|
259
|
+
then `invert(1)` flips that to solid white. Opt out via `logoWhitenInDark`. */
|
|
260
|
+
.bgl-dark-mode .sidebar-logo-whiten {
|
|
261
|
+
filter: brightness(0) invert(1);
|
|
262
|
+
}
|
|
263
|
+
|
|
223
264
|
.app-sidebar {
|
|
224
265
|
transition: width 0.4s ease;
|
|
225
266
|
--bgl-input-font-size: 0.875rem;
|
package/src/styles/dark.css
CHANGED
|
@@ -76,6 +76,11 @@
|
|
|
76
76
|
--bgl-box-bg: var(--bgl-dm-surface);
|
|
77
77
|
--bgl-popup-bg: var(--bgl-dm-surface);
|
|
78
78
|
--bgl-input-bg: var(--bgl-dm-input);
|
|
79
|
+
/* disabled inputs: a flat, slightly grayed surface so the field clearly reads
|
|
80
|
+
as inert (washed-out, not a usable recessed field) without becoming a bright
|
|
81
|
+
patch. Mixing in a touch of gray lifts it off the deep input bg and gives the
|
|
82
|
+
"greyed-out / not active" look. */
|
|
83
|
+
--input-disabled-bg: color-mix(in oklab, var(--bgl-gray) 14%, var(--bgl-dm-surface));
|
|
79
84
|
--bgl-selected: var(--bgl-dm-surface-2);
|
|
80
85
|
--bgl-skeleton-bg: var(--bgl-dm-surface-2);
|
|
81
86
|
--bgl-skeleton-pulse: var(--bgl-dm-surface);
|
|
@@ -99,7 +104,8 @@
|
|
|
99
104
|
* secondary labels, flat pills) and as faint fills/borders. On a dark
|
|
100
105
|
* surface translucent black is invisible, so flip them to translucent
|
|
101
106
|
* LIGHT. One remap fixes every `var(--bgl-black-tint)` usage at once. */
|
|
102
|
-
--bgl-black-tint: rgba(219, 220, 220, 0.5);
|
|
107
|
+
--bgl-black-tint: rgba(219, 220, 220, 0.5);
|
|
108
|
+
/* muted light text */
|
|
103
109
|
--bgl-gray-tint: rgba(219, 220, 220, 0.16);
|
|
104
110
|
--bgl-gray-tint-dark: rgba(219, 220, 220, 0.32);
|
|
105
111
|
|
|
@@ -206,6 +212,10 @@
|
|
|
206
212
|
filter: invert(0.8);
|
|
207
213
|
}
|
|
208
214
|
|
|
215
|
+
.bgl-dark-mode .logoLight {
|
|
216
|
+
filter: invert(1);
|
|
217
|
+
}
|
|
218
|
+
|
|
209
219
|
/* Text selection */
|
|
210
220
|
.bgl-dark-mode ::selection {
|
|
211
221
|
color: var(--bgl-dm-text);
|
|
@@ -245,6 +255,7 @@
|
|
|
245
255
|
color: var(--bgl-dm-text);
|
|
246
256
|
border-color: var(--bgl-dm-border);
|
|
247
257
|
}
|
|
258
|
+
|
|
248
259
|
/* Hover/active on the dark secondary button: lift one step instead of the
|
|
249
260
|
default lighten-filter which would wash the light original out. */
|
|
250
261
|
.bgl-dark-mode .pair-white:not(.bgl_flatPill):not(.bgl_pill-border):hover,
|
|
@@ -326,9 +337,11 @@
|
|
|
326
337
|
background: var(--bgl-bg);
|
|
327
338
|
color: var(--bgl-text-color);
|
|
328
339
|
}
|
|
340
|
+
|
|
329
341
|
.bgl-dark-mode #bgl-app-sidebar .cardWrapSide {
|
|
330
342
|
background-color: var(--bgl-box-bg) !important;
|
|
331
343
|
}
|
|
344
|
+
|
|
332
345
|
/* Nav buttons get their bg injected inline from props.bgColor; if a project
|
|
333
346
|
still passes a physical color (e.g. "white"), force non-active buttons back
|
|
334
347
|
to the card surface so they don't stay bright in dark mode. The active one
|
|
@@ -371,4 +384,23 @@
|
|
|
371
384
|
come only from .code-editor-grandpa, not from the generic input ring. */
|
|
372
385
|
.bgl-dark-mode .bagel-input .code-input {
|
|
373
386
|
box-shadow: none;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/* Disabled inputs read as inert: greyed-out (washed) fill + muted text so it's
|
|
390
|
+
visually clear the field is not active. The --input-disabled-bg fill is set in
|
|
391
|
+
the dark palette above. */
|
|
392
|
+
.bgl-dark-mode .bagel-input input:disabled,
|
|
393
|
+
.bgl-dark-mode .bagel-input textarea:disabled,
|
|
394
|
+
.bgl-dark-mode .bagel-input select:disabled {
|
|
395
|
+
color: var(--bgl-dm-text-muted);
|
|
396
|
+
-webkit-text-fill-color: var(--bgl-dm-text-muted);
|
|
397
|
+
cursor: not-allowed;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.bgl-dark-mode .darkmodeHide {
|
|
401
|
+
display: none !important;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
.bgl-dark-mode .darkmodeShow {
|
|
405
|
+
display: initial !important;
|
|
374
406
|
}
|
package/src/styles/theme.css
CHANGED