@bagelink/vue 1.15.51 → 1.15.53
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/form/inputs/CodeEditor/Index.vue.d.ts +9 -0
- package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/CodeEditor/useHighlight.d.ts.map +1 -1
- package/dist/index.cjs +89 -89
- package/dist/index.mjs +2714 -2697
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/Loading.vue +1 -1
- package/src/components/form/inputs/CodeEditor/Index.vue +18 -0
- package/src/components/form/inputs/CodeEditor/useHighlight.ts +27 -17
- package/src/components/form/inputs/RichText/components/TableGridSelector.vue +2 -2
- package/src/components/layout/AppSidebar.vue +3 -3
- package/src/components/layout/TabsNav.vue +3 -3
- package/src/styles/dark.css +183 -4
- package/src/styles/inputs.css +11 -1
package/package.json
CHANGED
|
@@ -24,7 +24,7 @@ const computedBorder = computed(() => {
|
|
|
24
24
|
})
|
|
25
25
|
|
|
26
26
|
const computedColor = computed(() => {
|
|
27
|
-
if (!color) return 'var(--bgl-
|
|
27
|
+
if (!color) return 'var(--bgl-text-color)'
|
|
28
28
|
if (color.startsWith('#') || color.startsWith('rgb') || color.startsWith('var(')) {
|
|
29
29
|
return color // Custom color string
|
|
30
30
|
}
|
|
@@ -13,6 +13,7 @@ const props = defineProps({
|
|
|
13
13
|
autodetect: { type: Boolean, default: true },
|
|
14
14
|
ignoreIllegals: { type: Boolean, default: true },
|
|
15
15
|
label: { type: String, default: '' },
|
|
16
|
+
placeholder: { type: String, default: '' },
|
|
16
17
|
height: { type: String, default: '240px' },
|
|
17
18
|
disabled: { type: Boolean, default: false },
|
|
18
19
|
theme: { type: String as PropType<HighlightTheme>, default: 'dark' },
|
|
@@ -146,6 +147,7 @@ watch(() => props.modelValue, () => {
|
|
|
146
147
|
<div v-if="loaded" ref="editorRef" class="code-editor-grandpa hljs">
|
|
147
148
|
<div class="editor-content-papa relative">
|
|
148
149
|
<pre class="code-display" wrap><code v-html="formattedCode" /></pre>
|
|
150
|
+
<pre v-if="placeholder && !hasCodeValue" class="code-placeholder" wrap>{{ placeholder }}</pre>
|
|
149
151
|
<textarea
|
|
150
152
|
v-if="!readonly && !disabled" :value="code" class="code-input" spellcheck="false"
|
|
151
153
|
autocomplete="off" autocorrect="off" autocapitalize="off" @input="handleInput"
|
|
@@ -212,6 +214,22 @@ pointer-events: none;
|
|
|
212
214
|
z-index: 1;
|
|
213
215
|
}
|
|
214
216
|
|
|
217
|
+
.code-placeholder {
|
|
218
|
+
position: absolute;
|
|
219
|
+
inset: 0;
|
|
220
|
+
margin: 0;
|
|
221
|
+
padding: 0;
|
|
222
|
+
width: 100%;
|
|
223
|
+
height: 100%;
|
|
224
|
+
font-family: monospace;
|
|
225
|
+
font-size: 1em;
|
|
226
|
+
line-height: 1.5;
|
|
227
|
+
text-align: left;
|
|
228
|
+
pointer-events: none;
|
|
229
|
+
opacity: 0.4;
|
|
230
|
+
z-index: 1;
|
|
231
|
+
}
|
|
232
|
+
|
|
215
233
|
.code-display code {
|
|
216
234
|
display: block;
|
|
217
235
|
background: transparent !important;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { HighlightJS, HighlightTheme } from './CodeTypes'
|
|
2
|
-
import { appendStyle, appendScript } from '@bagelink/vue'
|
|
2
|
+
import { appendStyle, appendScript, awaitGlobal } from '@bagelink/vue'
|
|
3
3
|
import { ref } from 'vue'
|
|
4
4
|
|
|
5
5
|
// Extend the Window interface
|
|
@@ -21,46 +21,56 @@ export function useHighlight(theme: HighlightTheme = 'dark') {
|
|
|
21
21
|
|
|
22
22
|
const getThemeCssUrl = (t: HighlightTheme) => `https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.0/styles/${t}.min.css`
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
// Remove highlight.js theme links EXCEPT the one we're about to keep.
|
|
25
|
+
// Removing a <link> that is still loading prevents its onload from ever
|
|
26
|
+
// firing, which would leave `appendStyle` hanging forever. When multiple
|
|
27
|
+
// editors mount at once this caused one editor to get stuck on `loaded=false`.
|
|
28
|
+
const removeOtherThemeLinks = (keepUrl: string) => {
|
|
25
29
|
document.querySelectorAll('link[rel="stylesheet"]').forEach((link) => {
|
|
26
|
-
if (link instanceof HTMLLinkElement && link.href.includes('/styles/')) {
|
|
27
|
-
if (link.href
|
|
30
|
+
if (link instanceof HTMLLinkElement && link.href.includes('/styles/') && link.href.includes('highlight.js')) {
|
|
31
|
+
if (link.href !== keepUrl) { link.parentElement?.removeChild(link) }
|
|
28
32
|
}
|
|
29
33
|
})
|
|
30
34
|
}
|
|
31
35
|
|
|
32
|
-
const
|
|
36
|
+
const loadTheme = async (theme: HighlightTheme) => {
|
|
33
37
|
const next = normalizeTheme(theme)
|
|
34
|
-
if (next === currentTheme.value) { return }
|
|
35
38
|
try {
|
|
36
|
-
removeExistingThemeLinks()
|
|
37
39
|
const url = getThemeCssUrl(next)
|
|
38
|
-
|
|
40
|
+
// Append first (idempotent: appendStyle resolves immediately if the
|
|
41
|
+
// link already exists), then remove only the *other* theme links.
|
|
39
42
|
await appendStyle(url)
|
|
43
|
+
removeOtherThemeLinks(url)
|
|
40
44
|
currentTheme.value = next
|
|
41
45
|
} catch (error) {
|
|
42
46
|
console.error('Failed to apply theme. Falling back to atom-one-dark:', error)
|
|
43
|
-
removeExistingThemeLinks()
|
|
44
47
|
currentTheme.value = 'atom-one-dark'
|
|
45
48
|
const url = getThemeCssUrl(currentTheme.value)
|
|
46
49
|
await appendStyle(url)
|
|
50
|
+
removeOtherThemeLinks(url)
|
|
47
51
|
}
|
|
48
52
|
}
|
|
49
53
|
|
|
54
|
+
const setTheme = async (theme: HighlightTheme) => {
|
|
55
|
+
const next = normalizeTheme(theme)
|
|
56
|
+
if (next === currentTheme.value) { return }
|
|
57
|
+
await loadTheme(next)
|
|
58
|
+
}
|
|
59
|
+
|
|
50
60
|
const loadHighlight = async () => {
|
|
51
61
|
if (loaded.value) { return }
|
|
52
62
|
|
|
53
63
|
try {
|
|
54
64
|
// Load highlight.js
|
|
55
65
|
await appendScript('https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.0/highlight.min.js', { id: 'hljs-cdn' })
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
66
|
+
// `appendScript` may resolve before the script has finished executing when
|
|
67
|
+
// multiple editors mount at once (a duplicate <script id> is detected in the
|
|
68
|
+
// DOM and resolves immediately). Wait for the actual global to appear.
|
|
69
|
+
const lib = await awaitGlobal<HighlightJS>('hljs')
|
|
70
|
+
await loadTheme(currentTheme.value)
|
|
71
|
+
|
|
72
|
+
hljs.value = lib
|
|
73
|
+
loaded.value = true
|
|
64
74
|
} catch (error) {
|
|
65
75
|
console.error('Error loading highlight.js:', error)
|
|
66
76
|
}
|
|
@@ -75,8 +75,8 @@ function handleMouseLeave() {
|
|
|
75
75
|
v-for="cell in gridCells" :key="`${cell.row}-${cell.col}`" tabindex="0" :style="{
|
|
76
76
|
width: '20px',
|
|
77
77
|
height: '20px',
|
|
78
|
-
border: '1px solid
|
|
79
|
-
backgroundColor: cell.isActive ? 'var(--bgl-primary)' : '
|
|
78
|
+
border: '1px solid var(--bgl-border-color)',
|
|
79
|
+
backgroundColor: cell.isActive ? 'var(--bgl-primary)' : 'var(--bgl-input-bg)',
|
|
80
80
|
cursor: 'pointer',
|
|
81
81
|
borderRadius: '2px',
|
|
82
82
|
transition: 'background-color 0.1s ease',
|
|
@@ -30,9 +30,9 @@ interface Props {
|
|
|
30
30
|
const props = withDefaults(defineProps<Props>(), {
|
|
31
31
|
card: true,
|
|
32
32
|
centerlinks: false,
|
|
33
|
-
bgColor: 'var(--bgl-
|
|
34
|
-
textColor: 'var(--bgl-
|
|
35
|
-
activeColor: 'var(--bgl-
|
|
33
|
+
bgColor: 'var(--bgl-box-bg)',
|
|
34
|
+
textColor: 'var(--bgl-text-color)',
|
|
35
|
+
activeColor: 'var(--bgl-primary)',
|
|
36
36
|
logoAlt: 'Logo',
|
|
37
37
|
logoHeight: '2rem',
|
|
38
38
|
name: 'App Name',
|
|
@@ -173,7 +173,7 @@ onBeforeUnmount(() => {
|
|
|
173
173
|
|
|
174
174
|
:root {
|
|
175
175
|
--bgl_tabs-background: var(--bgl-input-bg);
|
|
176
|
-
--bgl_tabs-border-radius: var(--bgl-input-border-radius);
|
|
176
|
+
--bgl_tabs-border-radius: var(--bgl-tabs-border-radius, var(--bgl-input-border-radius));
|
|
177
177
|
--bgl_tabs-inline-padding: calc(var(--bgl-btn-padding) / 8);
|
|
178
178
|
--bgl_tabs-block-padding: calc(var(--bgl-btn-padding) / 8);
|
|
179
179
|
--bgl_tabs-shadow: inset 0 0 10px #00000012;
|
|
@@ -182,7 +182,6 @@ onBeforeUnmount(() => {
|
|
|
182
182
|
--bgl_tab-inline-padding: calc(var(--bgl-btn-padding) / 2);
|
|
183
183
|
--bgl_tab-block-padding: calc(var(--bgl-btn-padding) / 8);
|
|
184
184
|
--bgl_tab-gap: 0.5rem;
|
|
185
|
-
--bgl_tabs-border-radius: var(--bgl-input-border-radius);
|
|
186
185
|
--bgl-tab-hover-bg: rgba(255, 255, 255, .4);
|
|
187
186
|
--bgl_tabs-indicator-color: var(--bgl-popup-bg);
|
|
188
187
|
--bgl-tabs-flat-indicator-color: var(--bgl-primary);
|
|
@@ -220,6 +219,7 @@ align-items: center;
|
|
|
220
219
|
|
|
221
220
|
.bgl_tab:hover {
|
|
222
221
|
background: var(--bgl-tab-hover-bg);
|
|
222
|
+
border-radius: var(--bgl_tab-border-radius, 7px);
|
|
223
223
|
}
|
|
224
224
|
|
|
225
225
|
.bgl_tabs_wrap::before {
|
|
@@ -254,7 +254,7 @@ color: var(--bgl-primary)
|
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
.bgl_flat-tabs .bgl_tab:hover {
|
|
257
|
-
background:
|
|
257
|
+
background: var(--bgl-tab-hover-bg);
|
|
258
258
|
}
|
|
259
259
|
.bgl_tab-thin {
|
|
260
260
|
padding-inline: calc(var(--bgl_tab-inline-padding) / 2);
|
package/src/styles/dark.css
CHANGED
|
@@ -15,15 +15,28 @@
|
|
|
15
15
|
* the semantic tokens reference. If you ever need explicit opt-in dark classes
|
|
16
16
|
* for components that use physical colors, build them on these same tokens.
|
|
17
17
|
* ============================================================================ */
|
|
18
|
+
/* .bgl-dark-mode {
|
|
19
|
+
filter: invert(1);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.bgl-dark-mode img,
|
|
23
|
+
.bgl-dark-mode video,
|
|
24
|
+
.bgl-dark-mode svg,
|
|
25
|
+
.bgl-dark-mode iframe {
|
|
26
|
+
filter: invert(1);
|
|
27
|
+
} */
|
|
18
28
|
|
|
19
|
-
.bgl-dark-
|
|
29
|
+
.bgl-dark-mode {
|
|
20
30
|
/* ---- Dark palette (raw values) ---------------------------------------- */
|
|
21
31
|
--bgl-dm-bg: #121317;
|
|
22
32
|
/* app background (deepest) */
|
|
23
33
|
--bgl-dm-surface: #1d2023;
|
|
24
|
-
/* cards, panels
|
|
34
|
+
/* cards, panels */
|
|
25
35
|
--bgl-dm-surface-2: #23262b;
|
|
26
36
|
/* slightly raised / hover */
|
|
37
|
+
--bgl-dm-input: #0e0f12;
|
|
38
|
+
/* inputs — sunk BELOW the surface so they read as a recessed field
|
|
39
|
+
whether they sit on the app background or inside a card */
|
|
27
40
|
--bgl-dm-text: #dbdcdc;
|
|
28
41
|
/* primary text */
|
|
29
42
|
--bgl-dm-text-muted: #9a9b9d;
|
|
@@ -32,7 +45,7 @@
|
|
|
32
45
|
/* borders / dividers */
|
|
33
46
|
|
|
34
47
|
/* ---- Brand (slightly adjusted for dark backgrounds) ------------------- */
|
|
35
|
-
--bgl-primary: #4f7cff;
|
|
48
|
+
--bgl-primary: #4f7cff !important;
|
|
36
49
|
--bgl-primary-tint: #4f7cff33;
|
|
37
50
|
--bgl-primary-light: #1a2236;
|
|
38
51
|
|
|
@@ -40,7 +53,7 @@
|
|
|
40
53
|
--bgl-bg: var(--bgl-dm-bg);
|
|
41
54
|
--bgl-box-bg: var(--bgl-dm-surface);
|
|
42
55
|
--bgl-popup-bg: var(--bgl-dm-surface);
|
|
43
|
-
--bgl-input-bg: var(--bgl-dm-
|
|
56
|
+
--bgl-input-bg: var(--bgl-dm-input);
|
|
44
57
|
--bgl-selected: var(--bgl-dm-surface-2);
|
|
45
58
|
--bgl-skeleton-bg: var(--bgl-dm-surface-2);
|
|
46
59
|
--bgl-skeleton-pulse: var(--bgl-dm-surface);
|
|
@@ -54,6 +67,16 @@
|
|
|
54
67
|
--bgl-label-color: var(--bgl-dm-text-muted);
|
|
55
68
|
--bgl-placeholder-color: var(--bgl-dm-text-muted);
|
|
56
69
|
|
|
70
|
+
/* ---- Translucent black tints ----------------------------------------- *
|
|
71
|
+
* --bgl-black-tint / --bgl-gray-tint are semi-transparent BLACK in light
|
|
72
|
+
* mode (e.g. #28292980). They are used both as muted text (drag handles,
|
|
73
|
+
* secondary labels, flat pills) and as faint fills/borders. On a dark
|
|
74
|
+
* surface translucent black is invisible, so flip them to translucent
|
|
75
|
+
* LIGHT. One remap fixes every `var(--bgl-black-tint)` usage at once. */
|
|
76
|
+
--bgl-black-tint: rgba(219, 220, 220, 0.5); /* muted light text */
|
|
77
|
+
--bgl-gray-tint: rgba(219, 220, 220, 0.16);
|
|
78
|
+
--bgl-gray-tint-dark: rgba(219, 220, 220, 0.32);
|
|
79
|
+
|
|
57
80
|
/* ---- Borders / shadows / scrollbar ----------------------------------- */
|
|
58
81
|
--bgl-border-color: var(--bgl-dm-border);
|
|
59
82
|
--bgl-shadow: rgba(0, 0, 0, 0.5);
|
|
@@ -62,6 +85,42 @@
|
|
|
62
85
|
/* ---- Hover / active filters (lighten instead of darken) -------------- */
|
|
63
86
|
--bgl-hover-filter: brightness(125%);
|
|
64
87
|
--bgl-active-filter: brightness(110%);
|
|
88
|
+
|
|
89
|
+
/* ---- Tabs ------------------------------------------------------------- *
|
|
90
|
+
* The default tab hover is rgba(255,255,255,.4) — a fine pale wash on a
|
|
91
|
+
* light bar, but a glaring bright patch on a dark one. Dial it down to a
|
|
92
|
+
* subtle light wash so hover reads as a gentle highlight. */
|
|
93
|
+
--bgl-tab-hover-bg: rgba(255, 255, 255, 0.08);
|
|
94
|
+
|
|
95
|
+
/* ---- Soft color variants (*-light / *-tint) -------------------------- *
|
|
96
|
+
* In light mode these are pale fills (e.g. #eef6ff) meant to carry dark
|
|
97
|
+
* text. On a dark UI a pale fill is a glaring bright patch, so we remap
|
|
98
|
+
* each one to a low-opacity wash of its OWN base color over the dark
|
|
99
|
+
* surface. The text color for these is fixed to --bgl-black in
|
|
100
|
+
* base-colors.css, so we also re-point the text below (see the rule after
|
|
101
|
+
* this block) — we can do that safely because base-colors.css uses no
|
|
102
|
+
* !important. */
|
|
103
|
+
--bgl-blue-light: color-mix(in oklab, var(--bgl-blue) 22%, var(--bgl-dm-surface));
|
|
104
|
+
--bgl-red-light: color-mix(in oklab, var(--bgl-red) 22%, var(--bgl-dm-surface));
|
|
105
|
+
--bgl-green-light: color-mix(in oklab, var(--bgl-green) 22%, var(--bgl-dm-surface));
|
|
106
|
+
--bgl-yellow-light: color-mix(in oklab, var(--bgl-yellow) 22%, var(--bgl-dm-surface));
|
|
107
|
+
--bgl-purple-light: color-mix(in oklab, var(--bgl-purple) 22%, var(--bgl-dm-surface));
|
|
108
|
+
--bgl-brown-light: color-mix(in oklab, var(--bgl-brown) 22%, var(--bgl-dm-surface));
|
|
109
|
+
--bgl-orange-light: color-mix(in oklab, var(--bgl-orange) 22%, var(--bgl-dm-surface));
|
|
110
|
+
--bgl-turquoise-light: color-mix(in oklab, var(--bgl-turquoise) 22%, var(--bgl-dm-surface));
|
|
111
|
+
--bgl-pink-light: color-mix(in oklab, var(--bgl-pink) 22%, var(--bgl-dm-surface));
|
|
112
|
+
--bgl-primary-light: color-mix(in oklab, var(--bgl-primary) 22%, var(--bgl-dm-surface));
|
|
113
|
+
/* --bgl-gray-light is already remapped to a dark surface above. */
|
|
114
|
+
|
|
115
|
+
/* ---- Gray tint scale (light → dark inversion) ------------------------ *
|
|
116
|
+
* --bgl-gray-10..30 are near-white tints in light mode, used everywhere as
|
|
117
|
+
* faint fills (hover states, cell grids, separators, recessed panels). On a
|
|
118
|
+
* dark UI those near-white fills glow. Remap the low end of the scale to
|
|
119
|
+
* subtle LIGHT washes over the dark surface so "low number = faint" still
|
|
120
|
+
* holds. Fixes grid-cell-btn, bg-gray-10/20/30 utilities, etc. at once. */
|
|
121
|
+
--bgl-gray-10: color-mix(in oklab, white 4%, var(--bgl-dm-surface));
|
|
122
|
+
--bgl-gray-20: color-mix(in oklab, white 8%, var(--bgl-dm-surface));
|
|
123
|
+
--bgl-gray-30: color-mix(in oklab, white 13%, var(--bgl-dm-surface));
|
|
65
124
|
}
|
|
66
125
|
|
|
67
126
|
/* Native form controls (date/time pickers) render dark glyphs that are
|
|
@@ -74,4 +133,124 @@
|
|
|
74
133
|
.bgl-dark-mode ::selection {
|
|
75
134
|
color: var(--bgl-dm-text);
|
|
76
135
|
background: var(--bgl-primary-tint);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Soft color pairs (.pair-*-light / .pair-*-tint) hard-code dark text in
|
|
139
|
+
base-colors.css. Once their fills become dark washes (see the variable
|
|
140
|
+
remaps above) that text is unreadable, so flip it to the light text token.
|
|
141
|
+
base-colors.css carries no !important, so this plain rule wins by source
|
|
142
|
+
order. */
|
|
143
|
+
.bgl-dark-mode [class*="pair-"][class*="-light"],
|
|
144
|
+
.bgl-dark-mode [class*="pair-"][class*="-tint"] {
|
|
145
|
+
color: var(--bgl-dm-text);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* .pair-black-tint / .pair-gray-tint are COLORLESS translucent fills. With the
|
|
149
|
+
--bgl-black-tint remap they'd become a translucent LIGHT patch, and the rule
|
|
150
|
+
above also makes their text light → low contrast. Give these two an explicit
|
|
151
|
+
subtle dark fill instead (the colored *-tint pairs keep their colored wash,
|
|
152
|
+
which still reads fine under light text). */
|
|
153
|
+
.bgl-dark-mode .pair-black-tint:not(.bgl_flatPill):not(.bgl_pill-border),
|
|
154
|
+
.bgl-dark-mode .pair-gray-tint:not(.bgl_flatPill):not(.bgl_pill-border) {
|
|
155
|
+
background-color: var(--bgl-dm-surface-2);
|
|
156
|
+
border-color: var(--bgl-dm-border);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* ----------------------------------------------------------------------------
|
|
160
|
+
* Absolute color utilities (bg-white / bg-black …)
|
|
161
|
+
* ----------------------------------------------------------------------------
|
|
162
|
+
* These are mostly used as a generic "surface" (e.g. cards, dropdowns) rather
|
|
163
|
+
* than a deliberate pure-white/black. In dark mode that pale fill becomes a
|
|
164
|
+
* glaring patch, so we remap them to the semantic dark surface. They carry
|
|
165
|
+
* !important in colors.css, so we must out-specify AND use !important here
|
|
166
|
+
* (`.bgl-dark-mode .bg-white` = (0,2,0) beats `.bg-white` = (0,1,0)).
|
|
167
|
+
*
|
|
168
|
+
* OPT-OUT: add `keep-white` / `keep-black` when you truly want the physical
|
|
169
|
+
* color in dark mode (logos, swatches, screenshots, on-image labels …). */
|
|
170
|
+
.bgl-dark-mode .bg-white:not(.keep-white),
|
|
171
|
+
.bgl-dark-mode .bg-black:not(.keep-black) {
|
|
172
|
+
background: var(--bgl-dm-surface) !important;
|
|
173
|
+
--alpha-color: var(--bgl-dm-surface);
|
|
174
|
+
/* The fill is now dark, so default any inherited/UA text (e.g. <button>
|
|
175
|
+
defaults to black) to the light token. A `.color-*` utility still wins
|
|
176
|
+
because it carries !important in colors.css. */
|
|
177
|
+
color: var(--bgl-dm-text);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.bgl-dark-mode .bg-input-white:not(.keep-white) input,
|
|
181
|
+
.bgl-dark-mode .bg-input-white:not(.keep-white) textarea,
|
|
182
|
+
.bgl-dark-mode .bg-input-white:not(.keep-white) .selectinput-btn,
|
|
183
|
+
.bgl-dark-mode .bg-input-black:not(.keep-black) input,
|
|
184
|
+
.bgl-dark-mode .bg-input-black:not(.keep-black) textarea,
|
|
185
|
+
.bgl-dark-mode .bg-input-black:not(.keep-black) .selectinput-btn {
|
|
186
|
+
background: var(--bgl-dm-surface) !important;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* color-white / color-black used as default text follow the same logic. */
|
|
190
|
+
.bgl-dark-mode .color-white:not(.keep-white),
|
|
191
|
+
.bgl-dark-mode .color-black:not(.keep-black) {
|
|
192
|
+
color: var(--bgl-dm-text) !important;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* Flat / outline pills built on .pair-black render the pill text in
|
|
196
|
+
var(--bgl-black) (pure black) over a transparent fill — invisible on a dark
|
|
197
|
+
surface. Re-point to the light text token (no !important needed: the
|
|
198
|
+
.bgl-dark-mode prefix already out-specifies the base rule). */
|
|
199
|
+
.bgl-dark-mode .pair-black.bgl_flatPill,
|
|
200
|
+
.bgl-dark-mode .pair-black.bgl_pill-border {
|
|
201
|
+
color: var(--bgl-dm-text);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.bgl-dark-mode .pair-black.bgl_pill-border {
|
|
205
|
+
outline-color: var(--bgl-dm-border);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* Dropdown / popover surfaces: the panel uses `bg-white shadow` as a generic
|
|
209
|
+
surface. The bg-white remap above already darkens the fill; make sure the
|
|
210
|
+
backdrop/shadow read correctly on the dark surface too. */
|
|
211
|
+
.bgl-dark-mode .bgl-dropdown__content {
|
|
212
|
+
background: var(--bgl-box-bg);
|
|
213
|
+
color: var(--bgl-text-color);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/* App sidebar: ensure the sidebar surface follows the semantic dark surface
|
|
217
|
+
rather than any inherited physical white. */
|
|
218
|
+
.bgl-dark-mode #bgl-app-sidebar,
|
|
219
|
+
.bgl-dark-mode .app-sidebar {
|
|
220
|
+
background: var(--bgl-box-bg);
|
|
221
|
+
color: var(--bgl-text-color);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/* ----------------------------------------------------------------------------
|
|
225
|
+
* Input definition on dark surfaces
|
|
226
|
+
* ----------------------------------------------------------------------------
|
|
227
|
+
* Filled inputs use --bgl-input-bg (a recessed dark tone). To stop them from
|
|
228
|
+
* melting into the page/card, give the default (filled) variant a hairline
|
|
229
|
+
* border via an inset ring. We use box-shadow (not outline/border) so we don't
|
|
230
|
+
* fight the existing focus outline or the .frame/.bgl-outline variants, which
|
|
231
|
+
* already draw their own outline. The focus state still wins because its rule
|
|
232
|
+
* comes from inputs.css with its own box-shadow + outline-color. */
|
|
233
|
+
.bgl-dark-mode .bagel-input input:not([type="radio"]):not([type="checkbox"]):not([type="color"]),
|
|
234
|
+
.bgl-dark-mode .bagel-input textarea,
|
|
235
|
+
.bgl-dark-mode .bagel-input select,
|
|
236
|
+
.bgl-dark-mode .custom-select .input,
|
|
237
|
+
.bgl-dark-mode .selectinput-btn {
|
|
238
|
+
box-shadow: inset 0 0 0 1px var(--bgl-dm-border);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* Don't double-draw the ring on variants that already have their own outline. */
|
|
242
|
+
.bgl-dark-mode .bagel-input.frame input,
|
|
243
|
+
.bgl-dark-mode .bagel-input.frame textarea,
|
|
244
|
+
.bgl-dark-mode .bagel-input.frame select,
|
|
245
|
+
.bgl-dark-mode .bagel-input.bgl-outline input,
|
|
246
|
+
.bgl-dark-mode .bagel-input.bgl-outline textarea,
|
|
247
|
+
.bgl-dark-mode .bagel-input.bgl-outline select,
|
|
248
|
+
.bgl-dark-mode .bagel-input.underlined input,
|
|
249
|
+
.bgl-dark-mode .bagel-input.underlined textarea,
|
|
250
|
+
.bgl-dark-mode .bagel-input.underlined select,
|
|
251
|
+
.bgl-dark-mode .bagel-input.frame .selectinput-btn,
|
|
252
|
+
/* CodeEditor: the inner textarea is transparent/overlaid — its frame must
|
|
253
|
+
come only from .code-editor-grandpa, not from the generic input ring. */
|
|
254
|
+
.bgl-dark-mode .bagel-input .code-input {
|
|
255
|
+
box-shadow: none;
|
|
77
256
|
}
|
package/src/styles/inputs.css
CHANGED
|
@@ -366,6 +366,7 @@ select {
|
|
|
366
366
|
.bagel-input.light-input input,
|
|
367
367
|
.bagel-input.light-input textarea,
|
|
368
368
|
.bagel-input.light-input select,
|
|
369
|
+
.bagel-input.num-input.light-input .input-icon-wrap,
|
|
369
370
|
.custom-select.light-input .input,
|
|
370
371
|
.light-input .selectinput-btn {
|
|
371
372
|
background: var(--bgl-popup-bg) !important;
|
|
@@ -378,10 +379,19 @@ select {
|
|
|
378
379
|
outline-color 0.2s ease;
|
|
379
380
|
}
|
|
380
381
|
|
|
382
|
+
/* NumberInput wraps its <input> in .input-icon-wrap which carries the background,
|
|
383
|
+
so the transparent inner input must not re-apply the light-input styles. */
|
|
384
|
+
.bagel-input.num-input.light-input .input-icon-wrap input {
|
|
385
|
+
background: transparent !important;
|
|
386
|
+
box-shadow: none !important;
|
|
387
|
+
outline: none !important;
|
|
388
|
+
}
|
|
389
|
+
|
|
381
390
|
.input.active.light-input,
|
|
382
391
|
.bagel-input.light-input input:focus-visible,
|
|
383
392
|
.bagel-input.light-input select:focus-visible,
|
|
384
|
-
.bagel-input.light-input textarea:focus-visible
|
|
393
|
+
.bagel-input.light-input textarea:focus-visible,
|
|
394
|
+
.bagel-input.num-input.light-input .input-icon-wrap:focus-within {
|
|
385
395
|
box-shadow:
|
|
386
396
|
0 2px 8px 0 rgba(0, 0, 0, 0.15),
|
|
387
397
|
0 0 0 3px color-mix(in srgb, var(--bgl-input-label-active-color, var(--bgl-primary)) 15%, transparent) !important;
|