@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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/vue",
3
3
  "type": "module",
4
- "version": "1.15.51",
4
+ "version": "1.15.53",
5
5
  "description": "Bagel core sdk packages",
6
6
  "author": {
7
7
  "name": "Bagel Studio",
@@ -24,7 +24,7 @@ const computedBorder = computed(() => {
24
24
  })
25
25
 
26
26
  const computedColor = computed(() => {
27
- if (!color) return 'var(--bgl-black)'
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
- const removeExistingThemeLinks = () => {
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.includes('highlight.js')) { link.parentElement?.removeChild(link) }
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 setTheme = async (theme: HighlightTheme) => {
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
- console.log('setTheme', url)
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
- await setTheme(currentTheme.value)
57
-
58
- if (window.hljs) {
59
- hljs.value = window.hljs
60
- loaded.value = true
61
- } else {
62
- console.error('Failed to load highlight.js')
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 #ddd',
79
- backgroundColor: cell.isActive ? 'var(--bgl-primary)' : '#fff',
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-white)',
34
- textColor: 'var(--bgl-black)',
35
- activeColor: 'var(--bgl-black)',
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: rgba(255, 255, 255, .1);
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);
@@ -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-mode1 {
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, inputs */
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-surface);
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
  }
@@ -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;