quasarframework/quasar
 Watch   
 Star   
 Fork   
1 days ago
quasar

quasar-v2.27.0

[!IMPORTANT] Two behavior changes worth checking before you upgrade:

  • A click on the target no longer closes a hover-opened QMenu/QBtnDropdown while it is still animating into view. A single move-and-click gesture can no longer dismiss what it just opened; once the menu is fully shown, clicking toggles it closed exactly as before.
  • Three language packs now report a standards-compliant isoName: kur-CKB reports ckb, mm reports my and sr-CYR reports sr-Cyrl. The old import paths keep working as deprecated aliases for the whole of Quasar v2, but code comparing $q.lang.isoName against the old values needs updating.

New

  • feat(QFab): open on hover -> new hover, hover-delay and hover-hide-delay props, the same contract QMenu and QBtnDropdown got in v2.26. The pointer can cross the gap between the main button and the actions without closing them (150ms grace period by default), touch devices keep tap-toggling, keyboard interaction is untouched, and focus is never moved
  • feat(QTd/QTh): new col-name prop -> a QTd or QTh wrapped in your own component inside QTable's #body slot can finally say which column it belongs to. The cells used to resolve their column from the vnode key, which Vue never forwards through $attrs, so a wrapped cell rendered nothing. Existing key="..." usage keeps working; col-name takes precedence (#17830)
  • feat(ui/lang): canonical names for three language packs -> import quasar/lang/ckb, quasar/lang/my and quasar/lang/sr-Cyrl for Central Kurdish, Burmese and Serbian Cyrillic. kur-CKB, mm and sr-CYR remain available as deprecated aliases

Fixes

  • fix(QMenu): ignore a click on the target while hover is animating the menu into view -> moving the pointer onto a hover menu's target and clicking it in one gesture closed the menu the hover had just opened. Also applies to QBtnDropdown (#18524)
  • fix(QSelect): keep long selected values inside the parent -> a nowrap value made the field grow past its container instead of truncating (#18015). Based on PR #18525 by Timur Arbaev
  • fix(QTable): honor the key set on the grid item slot content -> the mapped rows reached Vue as keyless Fragments, so removing a row recreated every card after it instead of moving the surviving instances (#18045)
  • fix(QScrollArea): put the vertical thumb on the left side in RTL -> the bar moved to the left edge while the thumb stayed glued to the right one, because its inline right inset could not be flipped by the RTL stylesheet (#17943)
  • fix(ui): make overlay content clickable over .q-electron-drag regions in Electron -> menus, dialogs, notifications and tooltips overlapping a draggable title bar lost the overlapping area to window dragging. An explicit drag class on the content itself still wins, and dialogs keep letting you drag the window (#17285)
  • fix(use-mask): don't read a fill char that satisfies its own token as data -> with fill-mask="0" and reverse filling, the unmasked value grew by one fill char per keystroke ("0.01" became "00.01", "000.10", ...), which is the docs' own "Price with 2 decimals" example (#18523)
  • fix(use-mask): keep the fill padding out of the unmasked value -> with unmasked-value and forward filling, a typed "1" over ###-## with fill-mask="0" was reported as "10000"; with mask AA-AA and fill-mask="A", "X" became "XAAA" (#18523)
  • fix(use-mask): follow the data, not the render, when placing the caret -> when the fill char is itself a valid data char, "06" arrived as "60" and, on masks with a leading literal, "09" arrived as "90" (#18523)
  • fix(use-mask): unmask masks that mix token types -> under reverse-fill-mask, every mask mixing letters and digits silently rendered nothing for ordinary values ("ab12" over AA-##), including values the control had just rendered itself (#18523)
  • fix(use-mask): drop a right-aligned separator nothing filled -> "057" over AA-## rendered "-57", which unmasked back to "57", so what the field displayed was not a value it could read again (#18523)
  • fix(ui/lang): repair strings across 51 language packs -> stray quotes and characters, leading/trailing/doubled spaces, broken interpolation, Cyrillic text inside the Latin sr pack, Simplified characters inside zh-TW, untranslated English left in translated packs, and year-range plural/agreement errors in some 40 languages (#18522). Ukrainian was corrected first in PR #18522 by Ihor Diachenko

Other

  • docs(popup offset): the offset prop of the position engine does not translate the popup, it inflates the anchor box, so middle/center origins are offset-invariant by construction. That is why QTooltip's horizontal offset reads as broken on its default anchor="bottom middle". Documented on the API of QMenu, QTooltip, QBtnDropdown, QPopupEdit and QSelect, with the direction each offset component expands in, plus the note that QMenu's cover drops the offset entirely (#18212)
  • The language-pack build validator now checks string values, not only pack shape: validateStringArray was declared with four parameters and called with three, so its loop never ran. Every string, array entry and formatter result is now checked for padding, doubled spaces and control characters, and formatters are probed across the counts that select their plural branches

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

1 days ago
quasar

@quasar/app-vite-v3.8.1

Changes

  • fix(app-vite): bex -> the bridge now recovers on its own after the MV3 background script is terminated. Chrome (service worker) and Firefox (event page) shut the background down after ~30s of inactivity, taking every bridge port with it, and nothing ever came back: content script and app bridges stayed disconnected forever, while a revived background only knew about the port that woke it up. Store policies forbid keeping the background alive, so recovery happens inside the event-driven model instead: a (re)started background broadcasts a one-off message asking previously connected bridges to re-establish their ports, and a client bridge that lost its connection without an explicit disconnectFromBackground() reconnects transparently on its next send() (which also wakes the background up; concurrent calls share one connection attempt). send() also waits up to 1s for a target port that is not registered yet, covering ports that re-register right after a background restart. Cleanup after a failed connection was removing the onDisconnect handler from the wrong port event, which is fixed too (#17932)
  • fix(app-vite): ssr/ssg -> stylesheets of shared chunks are now linked in the server-rendered HTML. Vite's SSR manifest only maps a module id to the files of the chunk that module ended up in, so as soon as a dependency is used from more than one place its CSS is hoisted into a shared chunk that is unreachable from ssrContext.modules -- the typical shape of an external component library used on several pages. The stylesheet then arrived only after hydration, as a flash of unstyled content. quasar.manifest.json is now assembled from both manifests Vite generates for the client build, completing each entry with the CSS of the chunks it statically imports (dynamic imports stay out, and so does CSS the HTML shell already carries). The CSS list is rebuilt depth-first through the static import graph rather than appended, so a dependency's rules land before the importer's and a server-rendered page cascades exactly like the same page reached through client-side navigation (#18171)
  • fix(app-vite): dev server -> SSR/SSG-specific options are no longer ignored while the dev server runs. The mode flags live under ctx.mode, so both conditionals guarding those diffs were always falsy: changing ssr.pwa, ssr.middlewares, the manualStore* family, manualPostHydrationTrigger, or the SSR/SSG offline filename and service worker extenders silently did nothing (no entry regeneration, no service worker rebuild) until a full restart
  • fix(app-vite): dev server -> reworked run/queue pipeline, fixing several long-standing rough edges. Watcher-triggered rebuilds (PWA manifest and custom service worker, BEX manifest, scripts and firefox UI, SSR webserver boots) now serialize with quasar.config-change runs instead of interleaving with them, and always act on the latest config rather than the one captured when the watcher was created. Toggling ssr.pwa / ssg.pwa while dev is running now works in both directions -- off-then-on previously left a stale snapshot so nothing recompiled, and disabling left the watchers running. A failed watcher rebuild no longer deadens every subsequent rebuild, and a failure while applying quasar.config changes no longer takes the dev server down through an unhandled rejection: both are logged and the server keeps serving. Rapid successive quasar.config edits now supersede cleanly (an obsolete run aborts at the next checkpoint, the newest config always wins) and duplicate pending rebuilds coalesce. clientNeedsReload semantics are now consistent across all modes (bex and pwa included), removing a redundant full reload right after a server reboot, and the SSR webserver reboots exactly when its own inputs change
  • fix(app-vite): types -> the ssr/ssg > manualPostHydrationTrigger JSDoc now points out that it is needed when a Suspense boundary delays hydration (async setup()), and that the hook should then be called from the boundary's @resolve. Full recipe on the SSR and SSG configuring pages (#17961)

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

1 days ago
quasar

@quasar/vite-plugin-v2.0.2

Changes

  • fix(vite-plugin): client bundle alias with custom Vite modes -> production builds started with a custom mode name (vite build --mode qa, --mode staging, ...) no longer get the dev-server treatment. The plugin picked between aliasing bare quasar imports to the single-file client build and excluding quasar from dep prebundling by comparing Vite's mode against production, but the mode is only an env-file selector. The alias now follows command === 'serve', which is exactly what it was meant for: cutting the number of requests the dev server has to answer. The optimizeDeps.exclude half was dead weight and is gone, since Vite no longer prebundles deps during builds (#17942)

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

5 days ago
quasar

quasar-v2.26.0

[!IMPORTANT] A few behavior changes worth checking before you upgrade:

  • QEditor no longer emits a placeholder attribute (it was not valid on a div). Custom CSS targeting .q-editor__content[placeholder] must switch to [aria-placeholder].
  • QSelect renders its fall-through attributes only on the focus target, no longer also on the .q-field__native wrapper. Selectors or tests that matched the wrapper copy (or relied on the attribute matching two elements) need updating.
  • The touch/hover behavior of QTooltip, context menus, the touch directives and the slider family is now decided per interaction instead of by the mobile UA. Hybrid devices change the most: touchscreen laptops and tablets with a mouse gain hover tooltips and right-click context menus, mobile UAs gain keyboard support on QSlider/QRange/QKnob, and QRange stops emitting UA-dependent SSR markup.
  • QDialog dismisses its backdrop on mousedown instead of click, so a press on the backdrop with a menu open closes only the menu on desktop too, matching what touch already did.
  • QSlider/QRange/QKnob de-duplicate their emissions: change fires only when an interaction actually moved the value, and a parent that does not sync the model prop back hears each value once per interaction rather than once per press/release/click.
  • Firefox now matches QField's autofill styling: the stylesheet moved from :-webkit-autofill to the standard :autofill, so the q-autofill keyframe and $input-autofill-color apply there for the first time.

New

  • feat(QMenu): open on hover -> new hover, hover-delay and hover-hide-delay props, also forwarded by QBtnDropdown (in split mode hovering either button opens it). A hover-open never steals focus from where you are typing, ESC still dismisses, submenus keep the chain open while the pointer travels between them, and touch devices keep tap-toggling. No effect when context-menu is set (#6776)
  • feat(QRange): new min-range and max-range props -> constrain the width of the selection. Out-of-limits model values are coerced like inner-min/inner-max already do, dragging and the keyboard clamp each thumb to what the other thumb allows, and a minimum width blocks thumb crossover (#18182, #2100). Based on PR #18182 by Teodor Atroshenko (thexeos)
  • feat(QTable): new footer slot -> renders a real <tfoot> element, so a totals/summary row can be made sticky through CSS. Works in default and virtual-scroll modes (not in grid mode) (#7570)
  • feat(date): support the ISO week year -> new getISOWeekYear() util and the Moment/Day.js-compatible GGGG/GG format tokens, so masks like YYYY-[W]ww no longer render the wrong pairing at year boundaries (Jan 1st 2022 was formatted as 2022-W52 instead of 2021-W52) (#17088, credit: psevertson)
  • feat(Ripple): cancel an "early" ripple once the gesture can no longer end in a tap -> a touch that turns into a scroll/pan, or a pressed pointer dragged off the element, now fades the ripple out instead of leaving a full one behind with no click ever happening. On touch, painting waits 100ms (was 50ms) so flick-scrolls are cancelled before anything becomes visible
  • feat(ui): correct the CSS vendor prefixes across the stylesheet -> printing keeps the QCheckbox/QRadio/QToggle backgrounds in Firefox and Safari (print-color-adjust), Firefox gains the QField autofill styling (:autofill), the QFile/QUploader file button styling (::file-selector-button) and the QPagination input styling (appearance), while prefixes no engine reads any more are gone

Fixes

  • fix(ui): accept class, style, key and ref on components in JSX/TSX -> the exported component types did not carry Vue's PublicProps, so TSX rejected the universal props. Templates were never affected (#8690)
  • fix(QTooltip): decide the touch UX per interaction instead of per device -> mouse and pen hover show the tooltip on any device, so touchscreen laptops, tablets with a mouse and hovering styluses get hover tooltips the mobile-UA check denied them, while a touch press keeps the exact mobile behavior (#14763)
  • fix(QTooltip): give a pressed stylus the touch UX -> a pencil held against the anchor got hover semantics and no selection suppression, because a pen reports the same pointerType whether it hovers or touches
  • fix(QTooltip): ignore focus moving within the anchor -> QBtn shuffles focus to an internal helper after every press, so clicking a QBtn with a tooltip flash-hid it on desktop
  • fix(useAnchor): serve context menus by capability instead of by mobile UA -> tablets with a mouse gain right-click context menus, the keyboard context-menu key works on mobile UAs, and touchscreen laptops get the same 300ms long-press with selection suppression phones have instead of engine-dependent native timing
  • fix(TouchHold/TouchRepeat): suppress text selection per interaction, not per device -> a touchscreen laptop no longer shows selection artifacts during a long-press, and a mouse press on a mobile UA no longer suppresses selection it never needed
  • fix(QSlider/QRange/QKnob): wire taps, presses and the keyboard on every platform -> mobile UAs rendered a focusable track that ignored arrow keys, and desktop had no click handler so assistive-tech clicks did nothing
  • fix(QSlider/QRange/QKnob): hand each value to a non-syncing parent once -> a controlled model that rejects the update heard the same value re-emitted by the press, the release and the compatibility click
  • fix(ui/slider): emit change only when the interaction changed the value -> pressing End with the thumb already at the maximum, clicking the value the slider already had, or dragging away and back all fired a spurious change
  • fix(QKnob): emit change only when a user adjustment lands a new value -> mounting, every parent model write and range clamping used to fire it, contradicting its own API description
  • fix(QRange): don't leave a thumb's focus ring behind after a track tap -> on touch nothing ever blurs the internal focus state, so the ring stayed on the tapped thumb through scrolling and taps elsewhere
  • fix(ui/slider): keep marker tick values float-exact on fractional steps -> a fractional step drifted (0.1 + 0.1 + 0.1 = 0.30000000000000004), so marker-labels rendered the drifted number and marker-label-* slot lookups missed
  • fix(ui): act on backdrop press so an open menu is dismissed alone -> with a menu open inside a QDialog, the first press on the backdrop closes only the menu on desktop too. Non-primary buttons are ignored
  • fix(QInfiniteScroll): resume polling when a scroll lock releases with the page at the top -> a window-target QInfiniteScroll that mounted, was re-keyed or left disable while a Dialog or overlay Drawer held the scroll lock never polled again (#18520)
  • fix(QInfiniteScroll): do not auto-load a window scroll target from inside a fixed-positioned subtree -> content in a Dialog or fullscreen overlay never contributes to the document's scroll extent, so every done() triggered the next load forever (and reverse mode jumped the page behind the overlay to the bottom on mount). Such a placement now warns once, points at the scroll-target prop and revives itself if the fixed positioning goes away (#18520)
  • fix(QSelect): render fall-through attributes only on the focus target -> attributes like QTable's rows-per-page aria-label matched two elements and broke strict single-element queries (Playwright getByLabel, Testing Library getBy*); the wrapper copy was invalid ARIA as well (#18519)
  • fix(QSelect): always render the hidden form element, like QInput does -> a QSelect with name/for set but a null or empty model rendered no element at all, so querySelector('[name=x]') could not find it. Form submission and validation are unaffected (#17951)
  • fix(QEditor): clicking the placeholder focuses the field on Chrome -> the placeholder rule now reads the aria-placeholder the component already renders, and the invalid placeholder attribute is no longer emitted (#18511)
  • fix(QDrawer): hide the opposite drawer again when showing one in mobile behavior -> both drawers could end up on screen at once, stacking two backdrops
  • fix(QDrawer): apply role and aria-* attributes to the aside element -> they landed on the inner scrolling div, so naming or re-typing the landmark through QDrawer was impossible (#18059)
  • fix(QField): hide shadow-text on blur while the field has an error -> an invalid field kept showing the shadow text after blur, overlapped with the label (#17155)
  • fix(QInput): let the textarea line-height follow the font-size -> .q-textarea pinned its rows to 18px, so a bigger font gave cramped, overlapping lines that apps had to override with !important. The default layout is unchanged (#16772)
  • fix(QItem): let overline/caption labels, header labels and side sections follow the item color -> an active (.q-router-link--active) or custom-colored item kept gray secondary text. Derived from currentColor via color-mix() at the same emphasis levels, with the legacy values kept as fallbacks (#18300)
  • fix(QExpansionItem): keep the header icon/toggle colors when using switch-toggle-side (#18008)

Other

  • docs(QDate): the events and options array forms (and the String handed to their function forms) are always compared as YYYY/MM/DD -- the mask prop never applies to them. Documented on the API instead of changing it; the function form remains the customization point (#16735)
  • docs(QDrawer): behavior, breakpoint, show-if-above, persistent and no-mini-animation were documented by example only. Adds a "Desktop and mobile behavior" section and corrects show-if-above, which was described as initial-render-only when it actually re-shows the drawer every time the layout goes back above the breakpoint
  • Regression coverage for the capability-based interaction rework: six cross-engine sweep scenarios (tooltip pointer wiring and pen lifecycle, context-menu ownership arbitration, backdrop press, the slider tap/keyboard burst, per-interaction selection suppression) plus a touch-capable Chromium pass in the matrix, and hardened QSlider/QRange suites

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

5 days ago
quasar

@quasar/app-vite-v3.8.0

Changes

  • feat(app-vite): build -> new vueJsx option for writing components with JSX/TSX (.jsx/.tsx files, or <script lang="jsx|tsx"> blocks in .vue files). Vite compiles JSX itself but assumes the React runtime, so any such file previously died on an unresolved react/jsx-runtime. Setting quasar.config file > build > vueJsx to true points Vite (Oxc) at Vue's JSX runtime instead, in the Vite pipeline and in the browser scripts that Rolldown builds on its own (BEX scripts, the custom PWA service worker), and adds the matching jsx / jsxImportSource to the generated .quasar/tsconfig.json on TypeScript projects. No extra dependency is involved; pass an options object to override the defaults, or "preserve" to hand the transformation to a Vite plugin such as @vitejs/plugin-vue-jsx (which adds the Vue specific JSX sugar: v-model, v-show, v-slots). Quasar components are fully typed in JSX/TSX with Quasar UI v2.26+ (#8690)
  • fix(app-vite): bex -> bridge.send() now resolves with the payload that the responder returned. The bridge awaited the response internally but threw the result away, so every send() resolved with undefined and the only way to get data back from the other end was to send a second message in the opposite direction (#18517)

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

5 days ago
quasar

@quasar/vite-plugin-v2.0.1

Changes

  • fix(vite-plugin): treeshaking with custom Vite modes -> production builds started with a custom mode name (vite build --mode qa, --mode staging, ...) treeshake Quasar imports again. The gate compared Vite's mode against production, but the mode is only an env-file selector, so any custom name silently disabled treeshaking and left bare quasar imports in the production bundle (+22kb min with current quasar, far more on older versions). It now follows isProduction / NODE_ENV, the same way Vite and Vue decide the build flavor; dev serve and Vitest runs are unchanged (#17267)
  • fix(vite-plugin): "untransformable quasar import" warnings -> no more false positives on TypeScript and JSX sources. Those files could not be parsed and fell back to trusting a plain textual pre-filter, so a quasar import shape written inside a string (a documentation snippet, for instance) was reported as a residual import. Sources are now parsed with their actual dialect, and TS type-only imports/exports from quasar -- erased at transpile time -- are no longer flagged either. Internally this also moves off Vite 8's deprecated parseAst onto its OXC-backed parser.

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

8 days ago
quasar

quasar-v2.25.1

[!IMPORTANT] A few behavior changes worth checking before you upgrade:

  • lazy-rules now clears an error while you type: while an error is displayed, the field re-checks on each model change instead of waiting for the next blur. Rules that were only ever meant to run on blur will now also run on every keystroke for as long as the field is in error.
  • Async rules re-validate when the value changes or the field blurs mid-flight: a slow rule that settles after the user moved on no longer paints its verdict onto the newer value; a second validation run is triggered instead.
  • The field's hint/error/counter area sits in normal flow: a message taller than one line now grows the field instead of painting over the content below it. Geometry is unchanged for every one-line message, except item-aligned fields, which now reserve that one line (about 20px taller) instead of bleeding messages into the next item. Custom CSS leaning on .q-field--with-bottom's padding-bottom or on the absolutely positioned .q-field__bottom--animated needs a second look.
  • QLayout can emit one extra @scroll: a scroll update suppressed while the body scroll lock was held is now applied when the lock releases without restoring the position.

Fixes

  • fix(QField/QInput/QSelect/QFile): lazy-rules re-validates on model change while an error is displayed -> the error clears as soon as what you type becomes valid, instead of staying up until the next blur (#17456)
  • fix(QField/QInput/QSelect/QFile): re-validate when the model changes or the field blurs during a pending async validation -> a slow rule can no longer settle onto a value the user has already replaced, leaving the field showing a verdict for text that is no longer there
  • fix(QForm): report a child whose validate() throws synchronously -> that child now fails and gets focused, exactly as a rejected async rule already did, instead of the exception breaking the whole submit()
  • fix(QField): flow the hint/error/counter area in-layout -> a message longer than one line grows the field instead of painting over whatever follows it, and item-aligned fields no longer bleed their messages into the next item (#17807)
  • fix(QLayout): re-sync the scroll state when a scroll lock releases on a changed route -> navigating away from inside a Dialog or under the Loading plugin left the layout holding the pre-navigation scroll state, so a reveal QHeader never reappeared at the top of the new page (#12994)
  • fix(QMenu/QTooltip): re-anchor when the iOS visual viewport moves -> with the soft keyboard open or while pinch-zoomed, iOS scrolls only the visual viewport and no window scroll event fires, so an open popup ended up detached from its anchor by the scrolled amount (#16849)
  • fix(QSelect): keep the field width stable while loading with hide-dropdown-icon -> with no icon to swap for, the default spinner appended net-new width and the field jumped on every filter round-trip. The default spinner is now suppressed when the dropdown icon is hidden (an explicit loading slot still renders), and the clearable icon keeps its place while loading instead of vanishing (#17375)
  • fix(QTabs): show the overflow arrows when align="right" -> Blink and Gecko keep start-side overflow out of the scrollable overflow region, which collapsed the measurement and hid both arrows, leaving the overflowing tabs unreachable by pointer (#17847)
  • fix(QInfiniteScroll): stop polling while a Dialog or an overlay Drawer scroll-locks the page -> opening one over an infinite scroll fired @load in a loop until the whole list had been fetched (#13257)
  • fix(QInput): don't lose a typed char that equals a mask literal -> mask 11## swallowed a typed "1" and 04## ### ### a typed "0", because the char could not be told apart from the literal sitting at that position (#15624, #18051)
  • fix(QInput): soft-keyboard backspace over a mask literal deletes the data char before it -> on iOS the browser removed only the literal, the remask put it straight back, and the edit became a silent no-op that left the caret misplaced, so every digit typed next landed one slot early and scrambled the value (#17639)
  • fix(QInput): re-anchor the caret after a dynamic mask change -> with a mask computed from the value being typed, the caret could land inside the value after the layout shifted, so the next digits scrambled it and the last char read as never registering (#7777)
  • fix(QInput): drop a stale debounced emission when the mask restores the model's value -> cutting a whole masked value and pasting it back before the debounce fired emptied the model while the input showed the pasted text (#17568)
  • fix(ui): resolve a custom Dialog's show/hide through arbitrarily nested components -> a QDialog sitting behind two or more single-root wrapper components failed with "Incorrectly defined Dialog component" and never opened (#18159)

Other

  • Regression coverage for the two families reworked here: the validation composable (async races, the QForm submit flow, reset/unmount/disable, reactive rules) and the mask engine (chars equal to a literal, dynamic masks, backspace bursts, the multiple-masks pattern), plus cross-engine sweep scenarios that also run on the iOS Simulator, where the mask and QTabs bugs above behave differently than on any desktop engine

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

8 days ago
quasar

@quasar/app-vite-v3.7.0

Changes

  • fix(app-vite): boot files & preFetch -> behavior change: urlPath is now the router-facing URL in every mode. It is path + query (+ hash) as Vue Router sees it, without the publicPath prefix and without hash mode's # wrapper, so you can match it against your routes or feed it straight to router.resolve(). Previously its shape depended on where it was read (raw req.url on the server, window.location on the client), which made every string check mode-dependent: the documented auth-guard example (urlPath.startsWith('/login')) infinite-reload-looped in hash mode and under a non-default publicPath. On top of that, the client-side preFetch hook read window.location during beforeResolve, before vue-router commits the navigation, so every hook saw the PREVIOUS page's URL and a redirect() guarded by urlPath looped until vue-router aborted the navigation. If you need the raw browser URL, use window.location (client-side) or ssrContext.req.url (server-side). The publicPath param is also now passed to the two addPreFetchHooks() call sites that were missing it (SPA-family modes, and SSR/SSG client-side rendered pages), where hooks received undefined (#16423)
  • fix(app-vite): capacitor -> dependencies installed in /src-capacitor are now resolvable from /src code in every mode, not only when running in Capacitor mode. Capacitor plugins ship web implementations, so shared code may import them behind an import.meta.env.QUASAR_CAPACITOR_MODE guard (the guarded branch is dead-code eliminated in production builds) -- that import previously failed to resolve in SPA/PWA/SSR builds. The generated TypeScript compilerOptions.paths mirror this whenever Capacitor mode is installed (#17681)
  • fix(app-vite): ssr/ssg -> Map, Set, Date, RegExp, BigInt and undefined values now survive in the serialized store state. The state was serialized as plain JSON, so Map/Set collapsed to empty objects, Date degraded to a string and undefined values were dropped from window.__INITIAL_STATE__; it is now emitted as a live JS expression, making SSR/SSG state behave identically to SPA mode. HTML-unsafe character escaping is unchanged, and no client runtime or hydration change is needed. Measured cost is roughly 3x the serialization time, which in absolute terms is 34us vs 102us for a 12KB state (about 1ms at 120KB); apps needing full control keep ssr.manualStoreSerialization / manualStoreHydration (#11382)

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

8 days ago
quasar

@quasar/extras-v2.0.4

Changes

  • material-symbols-outlined -> v367
  • material-symbols-rounded -> v368
  • material-symbols-sharp -> v364
  • Heads up on the Material Symbols upgrade: Google removed the file_map icon upstream, so symOutlinedFileMap, symRoundedFileMap and symSharpFileMap are no longer exported. If you import any of them, switch to another icon before upgrading. The same upgrade adds *DisplayAdd, *DriveFusiontable, *GlobeClock and *TerminalAdd to all three families.

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:

9 days ago
quasar

@quasar/app-vite-v3.6.1

Changes

  • fix(app-vite): ext add/remove, mode add -> the flow no longer aborts half-way on pnpm v11+. pnpm v11 turned "Ignored build scripts" into a fatal error (v10 only warned), so any dependency with an unapproved build script anywhere in your project made the CLI's pnpm add/pnpm install exit non-zero even though the packages did install -- quasar ext add then stopped with the App Extension package installed and registered as a devDependency but its install script (prompts, rendered templates, quasar.extensions.json entry) never run, leaving the project in a half-applied state. Same for quasar mode add capacitor/electron and the Vue DevTools / store-provider installs. Nothing is silently built -- pnpm still prints its "Ignored build scripts" notice and still refuses to run those scripts, so you can approve them with pnpm approve-builds whenever you want to
  • fix(app-vite): a failing command now reports what actually went wrong when the CLI's output is piped (test harness, shell script, IDE task runner) instead of replacing the real error with a TypeError: stdin.setRawMode is not a function crash -- which also skipped the failure banner and left the terminal switched to the alternate screen buffer. As a bonus, the alternate-screen escape sequences are no longer written into piped logs

Donations

Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following: