tempest-react-sdk 0.30.0 → 0.31.1

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.
Files changed (30) hide show
  1. package/dist/components/FilterBar/FilterBar.cjs +2 -0
  2. package/dist/components/FilterBar/FilterBar.cjs.map +1 -0
  3. package/dist/components/FilterBar/FilterBar.js +238 -0
  4. package/dist/components/FilterBar/FilterBar.js.map +1 -0
  5. package/dist/components/FilterBar/FilterBar.module.cjs +2 -0
  6. package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -0
  7. package/dist/components/FilterBar/FilterBar.module.js +20 -0
  8. package/dist/components/FilterBar/FilterBar.module.js.map +1 -0
  9. package/dist/components/FilterBar/filter-model.cjs +2 -0
  10. package/dist/components/FilterBar/filter-model.cjs.map +1 -0
  11. package/dist/components/FilterBar/filter-model.js +167 -0
  12. package/dist/components/FilterBar/filter-model.js.map +1 -0
  13. package/dist/components/Tour/Tour.cjs +2 -0
  14. package/dist/components/Tour/Tour.cjs.map +1 -0
  15. package/dist/components/Tour/Tour.js +186 -0
  16. package/dist/components/Tour/Tour.js.map +1 -0
  17. package/dist/components/Tour/Tour.module.cjs +2 -0
  18. package/dist/components/Tour/Tour.module.cjs.map +1 -0
  19. package/dist/components/Tour/Tour.module.js +21 -0
  20. package/dist/components/Tour/Tour.module.js.map +1 -0
  21. package/dist/components/Tour/tour-position.cjs +2 -0
  22. package/dist/components/Tour/tour-position.cjs.map +1 -0
  23. package/dist/components/Tour/tour-position.js +105 -0
  24. package/dist/components/Tour/tour-position.js.map +1 -0
  25. package/dist/styles.css +1 -1
  26. package/dist/tempest-react-sdk.cjs +1 -1
  27. package/dist/tempest-react-sdk.d.ts +181 -0
  28. package/dist/tempest-react-sdk.js +108 -105
  29. package/dist/utilities.css +133 -0
  30. package/package.json +1 -1
@@ -181,108 +181,111 @@ import { Masonry as $n } from "./components/Masonry/Masonry.js";
181
181
  import { safeLinkUrl as er } from "./components/Markdown/markdown-url.js";
182
182
  import { parseMarkdown as tr } from "./components/Markdown/markdown-parse.js";
183
183
  import { Markdown as nr } from "./components/Markdown/Markdown.js";
184
- import { formatCPF as rr, formatCurrency as ir, formatDate as ar, formatDateTime as or, formatPercent as sr, formatPhone as cr } from "./utils/format.js";
185
- import { storage as lr } from "./utils/storage.js";
186
- import { camelCase as ur, capitalize as dr, kebabCase as fr, pluralize as pr, slugify as mr, truncate as hr } from "./utils/strings.js";
187
- import { chunk as gr, groupBy as _r, range as vr, uniqueBy as yr } from "./utils/arrays.js";
188
- import { deepMerge as br, isEmpty as xr, omit as Sr, pick as Cr } from "./utils/objects.js";
189
- import { assertNever as wr, isDefined as Tr, isNumber as Er, isPlainObject as Dr, isString as Or } from "./utils/guards.js";
190
- import { debounce as kr, memoizeOne as Ar, once as jr, throttle as Mr } from "./utils/functions.js";
191
- import { sleep as Nr, withTimeout as Pr } from "./utils/promises.js";
192
- import { randomId as Fr } from "./utils/ids.js";
193
- import { writeXlsx as Ir } from "./utils/xlsx.js";
194
- import { TempestApiError as Lr, buildApiError as Rr, isApiError as zr } from "./http/errors.js";
195
- import { createApiClient as Br } from "./http/api-client.js";
196
- import { parseResponse as Vr } from "./http/parse-response.js";
197
- import { uploadWithProgress as Hr } from "./http/upload-with-progress.js";
198
- import { retry as Ur } from "./http/retry.js";
199
- import { generateIdempotencyKey as Wr } from "./http/idempotency.js";
200
- import { usePoll as Gr } from "./http/use-poll.js";
201
- import { createAuthStore as Kr } from "./auth/create-auth-store.js";
202
- import { AuthGuard as qr } from "./auth/AuthGuard.js";
203
- import { decodeJWT as Jr, isJWTExpired as Yr } from "./auth/jwt.js";
204
- import { lazyWithRetry as Xr } from "./auth/lazy-with-retry.js";
205
- import { createRefreshQueue as Zr } from "./auth/refresh-queue.js";
206
- import { createTempestAuth as Qr } from "./auth/create-tempest-auth.js";
207
- import { AccessControlProvider as $r, useAccessControl as ei } from "./access/access-control-context.js";
208
- import { useCan as ti } from "./access/use-can.js";
209
- import { Can as ni } from "./access/Can.js";
210
- import { createRoleAccessControl as ri } from "./access/create-role-access-control.js";
211
- import { permissionsFromToken as ii } from "./access/permissions-from-token.js";
212
- import { GoogleSignIn as ai } from "./oauth/GoogleSignIn.js";
213
- import { useOAuthCallback as oi } from "./oauth/use-oauth-callback.js";
214
- import { CACHE_TIME as si, REFETCH_TIME as ci, STALE_TIME as li } from "./query/constants.js";
215
- import { createQueryKeys as ui } from "./query/create-query-keys.js";
216
- import { QueryProvider as di } from "./query/QueryProvider.js";
217
- import { emptyOffsetPage as fi, isCursorPage as pi, isOffsetPage as mi } from "./query/pagination.js";
218
- import { usePaginatedQuery as hi } from "./query/use-paginated-query.js";
219
- import { useCursorQuery as gi } from "./query/use-cursor-query.js";
220
- import { useOfflineMutation as _i } from "./query/use-offline-mutation.js";
221
- import { removeById as vi, upsertById as yi } from "./query/optimistic.js";
222
- import { createOfflineStore as bi } from "./offline/create-offline-store.js";
223
- import { persistQueryClientOffline as xi } from "./query/offline-persistence.js";
224
- import { createDataProvider as Si } from "./data/create-data-provider.js";
225
- import { TempestDataProvider as Ci, useDataProvider as wi } from "./data/data-provider-context.js";
226
- import { listQueryKey as Ti, oneQueryKey as Ei, useCreate as Di, useDelete as Oi, useList as ki, useOne as Ai, useUpdate as ji } from "./data/use-resource.js";
227
- import { RouteGuard as Mi } from "./router/RouteGuard.js";
228
- import { AppRouter as Ni, defineRoutes as Pi } from "./router/AppRouter.js";
229
- import { BrowserRouter as Fi, HashRouter as Ii, Link as Li, MemoryRouter as Ri, NavLink as zi, Navigate as Bi, Outlet as Vi, Route as Hi, Routes as Ui, redirect as Wi, useLocation as Gi, useMatch as Ki, useNavigate as qi, useParams as Ji, useRouteError as Yi, useSearchParams as Xi } from "./router/index.js";
230
- import { createStore as Zi } from "./store/create-store.js";
231
- import { createSelectors as Qi } from "./store/create-selectors.js";
232
- import { ThemeProvider as $i, useTheme as ea } from "./theme/ThemeProvider.js";
233
- import { createI18n as ta } from "./i18n/create-i18n.js";
234
- import { I18nProvider as na, useI18n as ra, useTranslate as ia } from "./i18n/I18nProvider.js";
235
- import { ErrorBoundary as aa } from "./error-boundary/ErrorBoundary.js";
236
- import { AppProviders as oa } from "./app/AppProviders.js";
237
- import { createEventStream as sa } from "./sse/create-event-stream.js";
238
- import { useEventStream as ca } from "./sse/use-event-stream.js";
239
- import { isPushSupported as la, urlBase64ToUint8Array as ua } from "./push/utils.js";
240
- import { WebPushClient as da, WebPushPermissionDeniedError as fa, WebPushUnsupportedError as pa } from "./push/web-push-client.js";
241
- import { usePushSubscription as ma } from "./push/use-push-subscription.js";
242
- import { installNotificationClickHandler as ha, installPushHandler as ga, installSkipWaitingListener as _a } from "./sw/create-push-handler.js";
243
- import { createPartialResponse as va, installPrecache as ya, installRuntimeCache as ba } from "./sw/cache.js";
244
- import { installBackgroundSync as xa } from "./sw/background-sync.js";
245
- import { registerPeriodicSync as Sa } from "./sw/periodic-sync.js";
246
- import { clearCaches as Ca, inspectCaches as wa } from "./sw/cache-inspect.js";
247
- import { createAudioPlayer as Ta, playAudio as Ea, stopAudio as Da } from "./audio/audio-player.js";
248
- import { useAudio as Oa } from "./audio/use-audio.js";
249
- import { createOfflineSync as ka } from "./offline/create-offline-sync.js";
250
- import { higherVersionWins as Aa, lastWriteWins as ja } from "./offline/conflict.js";
251
- import { useErrorHandler as Ma } from "./error-boundary/use-error-handler.js";
252
- import { FormField as Na } from "./forms/FormField.js";
253
- import { validateForm as Pa } from "./forms/validate-form.js";
254
- import { zodResolver as Fa } from "./forms/zod-resolver.js";
255
- import { useZodForm as Ia } from "./forms/use-zod-form.js";
256
- import { formatCEP as La, formatCNPJ as Ra, unmask as za, validateCNPJ as Ba, validateCPF as Va } from "./forms/br-validators.js";
257
- import { CEPInput as Ha, CNPJInput as Ua, CPFInput as Wa, MoneyInput as Ga, PhoneInput as Ka } from "./forms/masked-inputs.js";
258
- import { useViaCEP as qa } from "./forms/use-viacep.js";
259
- import { Controller as Ja, FormProvider as Ya, useFieldArray as Xa, useForm as Za, useFormContext as Qa, useFormState as $a, useWatch as eo } from "./forms/index.js";
260
- import { createWebSocket as to } from "./ws/create-web-socket.js";
261
- import { useWebSocket as no } from "./ws/use-web-socket.js";
262
- import { clampLatitude as ro, isCoordinate as io, isValidLatitude as ao, isValidLongitude as oo, normalizeLongitude as so } from "./geo/types.js";
263
- import { EARTH_RADIUS_KM as co, bearingDeg as lo, haversineKm as uo, pathLengthKm as fo, toRadians as po } from "./geo/distance.js";
264
- import { DEFAULT_CAR_SPEED_KMH as mo, DEFAULT_CIRCUITY_FACTOR as ho, DEFAULT_MODE_DURATION_FACTORS as go, durationFactor as _o, estimateTravel as vo } from "./geo/estimate.js";
265
- import { boundingBox as yo, boundsCenter as bo, expandBounds as xo } from "./geo/bounds.js";
266
- import { MERCATOR_MAX_LATITUDE as So, fitProjection as Co, projectMercator as wo, unprojectMercator as To } from "./geo/projection.js";
267
- import { createOSRMBackend as Eo } from "./geo/routing.js";
268
- import { createPositionTracker as Do } from "./geo/create-position-tracker.js";
269
- import { usePositionTracker as Oo } from "./geo/use-position-tracker.js";
270
- import { TrajectoryMap as ko } from "./geo/TrajectoryMap.js";
271
- import { THEME_STYLE_ID as Ao, applyTheme as jo, readThemeToken as Mo } from "./theme/apply-theme.js";
272
- import { contrastRatio as No, createColorScale as Po, hexToOklch as Fo, hexToRgb as Io, hexToRgbaString as Lo, oklchToHex as Ro, readableForeground as zo, relativeLuminance as Bo, rgbToHex as Vo } from "./theme/color.js";
273
- import { createTheme as Ho, themeContrast as Uo } from "./theme/create-theme.js";
274
- import { getThemePreset as Wo, themePresets as Go } from "./theme/theme-presets.js";
275
- import { getInitialTheme as Ko, themeInitScript as qo } from "./theme/initial-theme.js";
276
- import { consoleSink as Jo, createLogger as Yo } from "./logger/logger.js";
277
- import { TelemetryProvider as Xo, useTelemetry as Zo } from "./telemetry/TelemetryProvider.js";
278
- import { consoleTelemetryAdapter as Qo } from "./telemetry/console-adapter.js";
279
- import { createSentryTelemetryAdapter as $o } from "./telemetry/sentry-adapter.js";
280
- import { createPostHogTelemetryAdapter as es } from "./telemetry/posthog-adapter.js";
281
- import { FeatureFlagsProvider as ts, useFeatureFlag as ns, useFlagValue as rs } from "./feature-flags/FeatureFlagsProvider.js";
282
- import { createInMemoryFlags as is } from "./feature-flags/in-memory-adapter.js";
283
- import { createGrowthBookFeatureFlagsAdapter as as } from "./feature-flags/growthbook-adapter.js";
284
- import { createLaunchDarklyFeatureFlagsAdapter as os } from "./feature-flags/launchdarkly-adapter.js";
285
- import { isShareSupported as ss, share as cs } from "./share/share.js";
286
- import { shareOrDownloadBlob as ls } from "./share/share-or-download.js";
287
- import { DIVERGING_STEP_COUNT as us, ORDINAL_START_STEP as ds, SEQUENTIAL_STEP_COUNT as fs, divergingScale as ps, scaleSteps as ms, sequentialScale as hs } from "./charts/scales.js";
288
- export { $r as AccessControlProvider, t as Accordion, n as Alert, r as AppBar, oa as AppProviders, Ni as AppRouter, o as AppShell, s as AspectRatio, qr as AuthGuard, c as Avatar, l as AvatarGroup, i as BREAKPOINTS, u as Badge, d as Banner, f as BottomNavigation, p as BottomSheet, m as Breadcrumbs, Fi as BrowserRouter, h as Button, si as CACHE_TIME, Ha as CEPInput, Ua as CNPJInput, Wa as CPFInput, Dn as Calendar, ni as Can, g as Card, Nn as Carousel, _ as Center, Yn as Chat, Jn as ChatComposer, v as Checkbox, y as ChipInput, un as ClickOutside, nn as CodeBlock, xn as Collapsible, b as Combobox, wn as Command, dn as ConditionalWrapper, S as ConfirmDialog, I as Container, Sn as ContextMenu, Ja as Controller, Qt as CopyButton, mo as DEFAULT_CAR_SPEED_KMH, ho as DEFAULT_CIRCUITY_FACTOR, go as DEFAULT_MODE_DURATION_FACTORS, us as DIVERGING_STEP_COUNT, hn as DataList, Pn as DataTable, w as DatePicker, An as DateRangePicker, gn as DescriptionList, T as Divider, E as Drawer, D as DropdownMenu, O as Dropzone, co as EARTH_RADIUS_KM, k as EmptyState, aa as ErrorBoundary, A as ErrorState, pn as ErrorText, ts as FeatureFlagsProvider, j as FileUpload, In as FloatingActionButton, fn as For, M as Form, N as FormActions, Na as FormField, Ya as FormProvider, P as FormRow, F as FormSection, ai as GoogleSignIn, L as Grid, Ii as HashRouter, pt as Hide, Cn as HoverCard, na as I18nProvider, mn as Image, Rt as ImageCropper, C as Input, B as InstallBanner, V as InstallButton, Je as Kanban, Xe as Kbd, bn as Label, Vn as Lightbox, Li as Link, Fn as ListTile, So as MERCATOR_MAX_LATITUDE, nr as Markdown, $n as Masonry, Ri as MemoryRouter, Mn as Menubar, x as Modal, Ze as ModalsProvider, an as Money, Ga as MoneyInput, kn as MultiSelect, et as NProgressBar, zi as NavLink, $e as Navbar, Bi as Navigate, jn as NavigationMenu, Ln as NavigationRail, Ht as NotificationCenter, ds as ORDINAL_START_STEP, Ue as OfflineIndicator, Vi as Outlet, nt as Page, rt as Pagination, it as PasswordInput, Ka as PhoneInput, ot as PinInput, st as Popover, ln as Portal, ct as Progress, qt as QRCapacityError, Zt as QRCode, di as QueryProvider, ci as REFETCH_TIME, lt as Radio, ut as RadioGroup, dt as RangeSlider, ft as RatingStars, zn as RefreshIndicator, rn as RelativeTime, En as Resizable, Hi as Route, Mi as RouteGuard, Ui as Routes, fs as SEQUENTIAL_STEP_COUNT, li as STALE_TIME, ht as SafeArea, Bt as Scheduler, Tn as ScrollArea, gt as SearchBar, _t as SegmentedControl, vt as Select, mt as Show, yt as Sidebar, Hn as SignaturePad, bt as Skeleton, On as Slider, xt as Spacer, zt as Sparkline, St as Spinner, R as Stack, Ct as Stat, wt as Stepper, Ot as StepperInput, kt as Switch, Ke as SyncStatusBadge, Ao as THEME_STYLE_ID, jt as Table, Mt as Tabs, At as Tag, Xo as TelemetryProvider, Lr as TempestApiError, Ci as TempestDataProvider, Nt as Textarea, $i as ThemeProvider, Rn as TimePicker, Pt as Timeline, It as ToastProvider, _n as Toggle, vn as ToggleGroup, yn as ToggleGroupItem, Ft as Tooltip, ko as TrajectoryMap, Qn as Transfer, on as TreeView, sn as TruncateText, qe as UpdatePrompt, Wt as VirtualList, Kt as VirtualTable, cn as VisuallyHidden, da as WebPushClient, fa as WebPushPermissionDeniedError, pa as WebPushUnsupportedError, Bn as Wizard, Ye as applyKanbanMove, jo as applyTheme, Xn as applyTransferMove, wr as assertNever, lo as bearingDeg, yo as boundingBox, bo as boundsCenter, Rr as buildApiError, De as buildOpenInChromeIntent, ur as camelCase, dr as capitalize, Un as chatStrings, gr as chunk, Tt as clamp, ro as clampLatitude, Ca as clearCaches, e as cn, Gt as compareValues, Jo as consoleSink, Qo as consoleTelemetryAdapter, No as contrastRatio, Br as createApiClient, Ta as createAudioPlayer, Kr as createAuthStore, Po as createColorScale, Si as createDataProvider, sa as createEventStream, as as createGrowthBookFeatureFlagsAdapter, ta as createI18n, is as createInMemoryFlags, os as createLaunchDarklyFeatureFlagsAdapter, Yo as createLogger, Eo as createOSRMBackend, bi as createOfflineStore, ka as createOfflineSync, va as createPartialResponse, Do as createPositionTracker, es as createPostHogTelemetryAdapter, ui as createQueryKeys, Zr as createRefreshQueue, ri as createRoleAccessControl, Qi as createSelectors, $o as createSentryTelemetryAdapter, Zi as createStore, Qr as createTempestAuth, Ho as createTheme, to as createWebSocket, Wn as dayLabel, kr as debounce, Jr as decodeJWT, br as deepMerge, Pi as defineRoutes, ps as divergingScale, _o as durationFactor, fi as emptyOffsetPage, Jt as encodeQR, at as estimatePasswordStrength, Le as estimateStorage, vo as estimateTravel, xo as expandBounds, Co as fitProjection, Et as formatBytes, La as formatCEP, Ra as formatCNPJ, rr as formatCPF, Dt as formatCompactNumber, ir as formatCurrency, ar as formatDate, or as formatDateTime, sr as formatPercent, cr as formatPhone, Wr as generateIdempotencyKey, Ko as getInitialTheme, Wo as getThemePreset, _r as groupBy, Gn as groupMessages, uo as haversineKm, Fo as hexToOklch, Io as hexToRgb, Lo as hexToRgbaString, Aa as higherVersionWins, wa as inspectCaches, xa as installBackgroundSync, ha as installNotificationClickHandler, ya as installPrecache, ga as installPushHandler, ba as installRuntimeCache, _a as installSkipWaitingListener, Oe as isAndroid, ke as isAndroidWithoutPromptApi, zr as isApiError, io as isCoordinate, pi as isCursorPage, Tr as isDefined, xr as isEmpty, Ae as isIOS, Yr as isJWTExpired, Er as isNumber, mi as isOffsetPage, Dr as isPlainObject, la as isPushSupported, ss as isShareSupported, je as isStandalone, Or as isString, ao as isValidLatitude, oo as isValidLongitude, fr as kebabCase, ja as lastWriteWins, Xr as lazyWithRetry, Ti as listQueryKey, Yt as matrixToPath, Ar as memoizeOne, Be as moveItem, so as normalizeLongitude, tt as nprogress, Ro as oklchToHex, Sr as omit, jr as once, Ei as oneQueryKey, tr as parseMarkdown, Vr as parseResponse, fo as pathLengthKm, ii as permissionsFromToken, xi as persistQueryClientOffline, Cr as pick, Ea as playAudio, pr as pluralize, wo as projectMercator, Fr as randomId, vr as range, Mo as readThemeToken, zo as readableForeground, Wi as redirect, Sa as registerPeriodicSync, Ne as registerServiceWorker, Bo as relativeLuminance, Vt as relativeTime, vi as removeById, Re as requestPersistentStorage, $t as resolveLanguage, Ur as retry, Vo as rgbToHex, er as safeLinkUrl, ms as scaleSteps, Xt as selectMode, hs as sequentialScale, cs as share, ls as shareOrDownloadBlob, Pe as skipWaiting, Nr as sleep, mr as slugify, Zn as splitTransferSides, Da as stopAudio, lr as storage, Uo as themeContrast, qo as themeInitScript, Go as themePresets, Mr as throttle, Kn as timeLabel, po as toRadians, en as tokenize, tn as tokenizeLines, hr as truncate, qn as typingLabel, yr as uniqueBy, za as unmask, To as unprojectMercator, Fe as unregisterAllServiceWorkers, Hr as uploadWithProgress, yi as upsertById, ua as urlBase64ToUint8Array, ei as useAccessControl, Y as useAsync, Oa as useAudio, z as useBeforeInstallPrompt, a as useBreakpoint, ti as useCan, Ce as useClickOutside, W as useClientFilter, ee as useClipboard, _e as useCounter, Di as useCreate, gi as useCursorQuery, wi as useDataProvider, H as useDebounce, se as useDeepMemo, Oi as useDelete, he as useDisclosure, ve as useDocumentTitle, Z as useDocumentVisibility, Ma as useErrorHandler, K as useEventListener, ca as useEventStream, ye as useFavicon, ns as useFeatureFlag, Xa as useFieldArray, rs as useFlagValue, ae as useFocusTrap, Za as useForm, Qa as useFormContext, $a as useFormState, re as useGeolocation, pe as useHover, ra as useI18n, ne as useIdle, Me as useInstallPrompt, Q as useIntersectionObserver, le as useInterval, we as useIsFirstRender, te as useKeyboardShortcut, ki as useList, ge as useListState, q as useLocalStorage, Gi as useLocation, me as useLongPress, Ee as useLongPressHandlers, be as useMap, Ki as useMatch, G as useMediaQuery, Qe as useModals, qi as useNavigate, Ut as useNotificationInbox, oi as useOAuthCallback, Te as useObjectUrl, _i as useOfflineMutation, We as useOfflineSync, Ai as useOne, X as useOnline, hi as usePaginatedQuery, U as usePagination, Ji as useParams, Gr as usePoll, Oo as usePositionTracker, ce as usePrevious, ma as usePushSubscription, Se as useQueue, $ as useResizeObserver, Yi as useRouteError, ie as useScrollLock, He as useScrollOverflow, Xi as useSearchParams, Ie as useServiceWorkerUpdate, xe as useSet, Ve as useSortable, oe as useStableCallback, ze as useStorageEstimate, Ge as useSyncStatus, Zo as useTelemetry, ea as useTheme, de as useThrottle, ue as useTimeout, Lt as useToast, J as useToggle, ia as useTranslate, ji as useUpdate, qa as useViaCEP, eo as useWatch, no as useWebSocket, fe as useWindowSize, Ia as useZodForm, Ba as validateCNPJ, Va as validateCPF, Pa as validateForm, Pr as withTimeout, Ir as writeXlsx, Fa as zodResolver };
184
+ import { Tour as rr } from "./components/Tour/Tour.js";
185
+ import { describeFilter as ir, filtersFromSearchParams as ar, filtersToSearchParams as or, operatorsFor as sr } from "./components/FilterBar/filter-model.js";
186
+ import { FilterBar as cr } from "./components/FilterBar/FilterBar.js";
187
+ import { formatCPF as lr, formatCurrency as ur, formatDate as dr, formatDateTime as fr, formatPercent as pr, formatPhone as mr } from "./utils/format.js";
188
+ import { storage as hr } from "./utils/storage.js";
189
+ import { camelCase as gr, capitalize as _r, kebabCase as vr, pluralize as yr, slugify as br, truncate as xr } from "./utils/strings.js";
190
+ import { chunk as Sr, groupBy as Cr, range as wr, uniqueBy as Tr } from "./utils/arrays.js";
191
+ import { deepMerge as Er, isEmpty as Dr, omit as Or, pick as kr } from "./utils/objects.js";
192
+ import { assertNever as Ar, isDefined as jr, isNumber as Mr, isPlainObject as Nr, isString as Pr } from "./utils/guards.js";
193
+ import { debounce as Fr, memoizeOne as Ir, once as Lr, throttle as Rr } from "./utils/functions.js";
194
+ import { sleep as zr, withTimeout as Br } from "./utils/promises.js";
195
+ import { randomId as Vr } from "./utils/ids.js";
196
+ import { writeXlsx as Hr } from "./utils/xlsx.js";
197
+ import { TempestApiError as Ur, buildApiError as Wr, isApiError as Gr } from "./http/errors.js";
198
+ import { createApiClient as Kr } from "./http/api-client.js";
199
+ import { parseResponse as qr } from "./http/parse-response.js";
200
+ import { uploadWithProgress as Jr } from "./http/upload-with-progress.js";
201
+ import { retry as Yr } from "./http/retry.js";
202
+ import { generateIdempotencyKey as Xr } from "./http/idempotency.js";
203
+ import { usePoll as Zr } from "./http/use-poll.js";
204
+ import { createAuthStore as Qr } from "./auth/create-auth-store.js";
205
+ import { AuthGuard as $r } from "./auth/AuthGuard.js";
206
+ import { decodeJWT as ei, isJWTExpired as ti } from "./auth/jwt.js";
207
+ import { lazyWithRetry as ni } from "./auth/lazy-with-retry.js";
208
+ import { createRefreshQueue as ri } from "./auth/refresh-queue.js";
209
+ import { createTempestAuth as ii } from "./auth/create-tempest-auth.js";
210
+ import { AccessControlProvider as ai, useAccessControl as oi } from "./access/access-control-context.js";
211
+ import { useCan as si } from "./access/use-can.js";
212
+ import { Can as ci } from "./access/Can.js";
213
+ import { createRoleAccessControl as li } from "./access/create-role-access-control.js";
214
+ import { permissionsFromToken as ui } from "./access/permissions-from-token.js";
215
+ import { GoogleSignIn as di } from "./oauth/GoogleSignIn.js";
216
+ import { useOAuthCallback as fi } from "./oauth/use-oauth-callback.js";
217
+ import { CACHE_TIME as pi, REFETCH_TIME as mi, STALE_TIME as hi } from "./query/constants.js";
218
+ import { createQueryKeys as gi } from "./query/create-query-keys.js";
219
+ import { QueryProvider as _i } from "./query/QueryProvider.js";
220
+ import { emptyOffsetPage as vi, isCursorPage as yi, isOffsetPage as bi } from "./query/pagination.js";
221
+ import { usePaginatedQuery as xi } from "./query/use-paginated-query.js";
222
+ import { useCursorQuery as Si } from "./query/use-cursor-query.js";
223
+ import { useOfflineMutation as Ci } from "./query/use-offline-mutation.js";
224
+ import { removeById as wi, upsertById as Ti } from "./query/optimistic.js";
225
+ import { createOfflineStore as Ei } from "./offline/create-offline-store.js";
226
+ import { persistQueryClientOffline as Di } from "./query/offline-persistence.js";
227
+ import { createDataProvider as Oi } from "./data/create-data-provider.js";
228
+ import { TempestDataProvider as ki, useDataProvider as Ai } from "./data/data-provider-context.js";
229
+ import { listQueryKey as ji, oneQueryKey as Mi, useCreate as Ni, useDelete as Pi, useList as Fi, useOne as Ii, useUpdate as Li } from "./data/use-resource.js";
230
+ import { RouteGuard as Ri } from "./router/RouteGuard.js";
231
+ import { AppRouter as zi, defineRoutes as Bi } from "./router/AppRouter.js";
232
+ import { BrowserRouter as Vi, HashRouter as Hi, Link as Ui, MemoryRouter as Wi, NavLink as Gi, Navigate as Ki, Outlet as qi, Route as Ji, Routes as Yi, redirect as Xi, useLocation as Zi, useMatch as Qi, useNavigate as $i, useParams as ea, useRouteError as ta, useSearchParams as na } from "./router/index.js";
233
+ import { createStore as ra } from "./store/create-store.js";
234
+ import { createSelectors as ia } from "./store/create-selectors.js";
235
+ import { ThemeProvider as aa, useTheme as oa } from "./theme/ThemeProvider.js";
236
+ import { createI18n as sa } from "./i18n/create-i18n.js";
237
+ import { I18nProvider as ca, useI18n as la, useTranslate as ua } from "./i18n/I18nProvider.js";
238
+ import { ErrorBoundary as da } from "./error-boundary/ErrorBoundary.js";
239
+ import { AppProviders as fa } from "./app/AppProviders.js";
240
+ import { createEventStream as pa } from "./sse/create-event-stream.js";
241
+ import { useEventStream as ma } from "./sse/use-event-stream.js";
242
+ import { isPushSupported as ha, urlBase64ToUint8Array as ga } from "./push/utils.js";
243
+ import { WebPushClient as _a, WebPushPermissionDeniedError as va, WebPushUnsupportedError as ya } from "./push/web-push-client.js";
244
+ import { usePushSubscription as ba } from "./push/use-push-subscription.js";
245
+ import { installNotificationClickHandler as xa, installPushHandler as Sa, installSkipWaitingListener as Ca } from "./sw/create-push-handler.js";
246
+ import { createPartialResponse as wa, installPrecache as Ta, installRuntimeCache as Ea } from "./sw/cache.js";
247
+ import { installBackgroundSync as Da } from "./sw/background-sync.js";
248
+ import { registerPeriodicSync as Oa } from "./sw/periodic-sync.js";
249
+ import { clearCaches as ka, inspectCaches as Aa } from "./sw/cache-inspect.js";
250
+ import { createAudioPlayer as ja, playAudio as Ma, stopAudio as Na } from "./audio/audio-player.js";
251
+ import { useAudio as Pa } from "./audio/use-audio.js";
252
+ import { createOfflineSync as Fa } from "./offline/create-offline-sync.js";
253
+ import { higherVersionWins as Ia, lastWriteWins as La } from "./offline/conflict.js";
254
+ import { useErrorHandler as Ra } from "./error-boundary/use-error-handler.js";
255
+ import { FormField as za } from "./forms/FormField.js";
256
+ import { validateForm as Ba } from "./forms/validate-form.js";
257
+ import { zodResolver as Va } from "./forms/zod-resolver.js";
258
+ import { useZodForm as Ha } from "./forms/use-zod-form.js";
259
+ import { formatCEP as Ua, formatCNPJ as Wa, unmask as Ga, validateCNPJ as Ka, validateCPF as qa } from "./forms/br-validators.js";
260
+ import { CEPInput as Ja, CNPJInput as Ya, CPFInput as Xa, MoneyInput as Za, PhoneInput as Qa } from "./forms/masked-inputs.js";
261
+ import { useViaCEP as $a } from "./forms/use-viacep.js";
262
+ import { Controller as eo, FormProvider as to, useFieldArray as no, useForm as ro, useFormContext as io, useFormState as ao, useWatch as oo } from "./forms/index.js";
263
+ import { createWebSocket as so } from "./ws/create-web-socket.js";
264
+ import { useWebSocket as co } from "./ws/use-web-socket.js";
265
+ import { clampLatitude as lo, isCoordinate as uo, isValidLatitude as fo, isValidLongitude as po, normalizeLongitude as mo } from "./geo/types.js";
266
+ import { EARTH_RADIUS_KM as ho, bearingDeg as go, haversineKm as _o, pathLengthKm as vo, toRadians as yo } from "./geo/distance.js";
267
+ import { DEFAULT_CAR_SPEED_KMH as bo, DEFAULT_CIRCUITY_FACTOR as xo, DEFAULT_MODE_DURATION_FACTORS as So, durationFactor as Co, estimateTravel as wo } from "./geo/estimate.js";
268
+ import { boundingBox as To, boundsCenter as Eo, expandBounds as Do } from "./geo/bounds.js";
269
+ import { MERCATOR_MAX_LATITUDE as Oo, fitProjection as ko, projectMercator as Ao, unprojectMercator as jo } from "./geo/projection.js";
270
+ import { createOSRMBackend as Mo } from "./geo/routing.js";
271
+ import { createPositionTracker as No } from "./geo/create-position-tracker.js";
272
+ import { usePositionTracker as Po } from "./geo/use-position-tracker.js";
273
+ import { TrajectoryMap as Fo } from "./geo/TrajectoryMap.js";
274
+ import { THEME_STYLE_ID as Io, applyTheme as Lo, readThemeToken as Ro } from "./theme/apply-theme.js";
275
+ import { contrastRatio as zo, createColorScale as Bo, hexToOklch as Vo, hexToRgb as Ho, hexToRgbaString as Uo, oklchToHex as Wo, readableForeground as Go, relativeLuminance as Ko, rgbToHex as qo } from "./theme/color.js";
276
+ import { createTheme as Jo, themeContrast as Yo } from "./theme/create-theme.js";
277
+ import { getThemePreset as Xo, themePresets as Zo } from "./theme/theme-presets.js";
278
+ import { getInitialTheme as Qo, themeInitScript as $o } from "./theme/initial-theme.js";
279
+ import { consoleSink as es, createLogger as ts } from "./logger/logger.js";
280
+ import { TelemetryProvider as ns, useTelemetry as rs } from "./telemetry/TelemetryProvider.js";
281
+ import { consoleTelemetryAdapter as is } from "./telemetry/console-adapter.js";
282
+ import { createSentryTelemetryAdapter as as } from "./telemetry/sentry-adapter.js";
283
+ import { createPostHogTelemetryAdapter as os } from "./telemetry/posthog-adapter.js";
284
+ import { FeatureFlagsProvider as ss, useFeatureFlag as cs, useFlagValue as ls } from "./feature-flags/FeatureFlagsProvider.js";
285
+ import { createInMemoryFlags as us } from "./feature-flags/in-memory-adapter.js";
286
+ import { createGrowthBookFeatureFlagsAdapter as ds } from "./feature-flags/growthbook-adapter.js";
287
+ import { createLaunchDarklyFeatureFlagsAdapter as fs } from "./feature-flags/launchdarkly-adapter.js";
288
+ import { isShareSupported as ps, share as ms } from "./share/share.js";
289
+ import { shareOrDownloadBlob as hs } from "./share/share-or-download.js";
290
+ import { DIVERGING_STEP_COUNT as gs, ORDINAL_START_STEP as _s, SEQUENTIAL_STEP_COUNT as vs, divergingScale as ys, scaleSteps as bs, sequentialScale as xs } from "./charts/scales.js";
291
+ export { ai as AccessControlProvider, t as Accordion, n as Alert, r as AppBar, fa as AppProviders, zi as AppRouter, o as AppShell, s as AspectRatio, $r as AuthGuard, c as Avatar, l as AvatarGroup, i as BREAKPOINTS, u as Badge, d as Banner, f as BottomNavigation, p as BottomSheet, m as Breadcrumbs, Vi as BrowserRouter, h as Button, pi as CACHE_TIME, Ja as CEPInput, Ya as CNPJInput, Xa as CPFInput, Dn as Calendar, ci as Can, g as Card, Nn as Carousel, _ as Center, Yn as Chat, Jn as ChatComposer, v as Checkbox, y as ChipInput, un as ClickOutside, nn as CodeBlock, xn as Collapsible, b as Combobox, wn as Command, dn as ConditionalWrapper, S as ConfirmDialog, I as Container, Sn as ContextMenu, eo as Controller, Qt as CopyButton, bo as DEFAULT_CAR_SPEED_KMH, xo as DEFAULT_CIRCUITY_FACTOR, So as DEFAULT_MODE_DURATION_FACTORS, gs as DIVERGING_STEP_COUNT, hn as DataList, Pn as DataTable, w as DatePicker, An as DateRangePicker, gn as DescriptionList, T as Divider, E as Drawer, D as DropdownMenu, O as Dropzone, ho as EARTH_RADIUS_KM, k as EmptyState, da as ErrorBoundary, A as ErrorState, pn as ErrorText, ss as FeatureFlagsProvider, j as FileUpload, cr as FilterBar, In as FloatingActionButton, fn as For, M as Form, N as FormActions, za as FormField, to as FormProvider, P as FormRow, F as FormSection, di as GoogleSignIn, L as Grid, Hi as HashRouter, pt as Hide, Cn as HoverCard, ca as I18nProvider, mn as Image, Rt as ImageCropper, C as Input, B as InstallBanner, V as InstallButton, Je as Kanban, Xe as Kbd, bn as Label, Vn as Lightbox, Ui as Link, Fn as ListTile, Oo as MERCATOR_MAX_LATITUDE, nr as Markdown, $n as Masonry, Wi as MemoryRouter, Mn as Menubar, x as Modal, Ze as ModalsProvider, an as Money, Za as MoneyInput, kn as MultiSelect, et as NProgressBar, Gi as NavLink, $e as Navbar, Ki as Navigate, jn as NavigationMenu, Ln as NavigationRail, Ht as NotificationCenter, _s as ORDINAL_START_STEP, Ue as OfflineIndicator, qi as Outlet, nt as Page, rt as Pagination, it as PasswordInput, Qa as PhoneInput, ot as PinInput, st as Popover, ln as Portal, ct as Progress, qt as QRCapacityError, Zt as QRCode, _i as QueryProvider, mi as REFETCH_TIME, lt as Radio, ut as RadioGroup, dt as RangeSlider, ft as RatingStars, zn as RefreshIndicator, rn as RelativeTime, En as Resizable, Ji as Route, Ri as RouteGuard, Yi as Routes, vs as SEQUENTIAL_STEP_COUNT, hi as STALE_TIME, ht as SafeArea, Bt as Scheduler, Tn as ScrollArea, gt as SearchBar, _t as SegmentedControl, vt as Select, mt as Show, yt as Sidebar, Hn as SignaturePad, bt as Skeleton, On as Slider, xt as Spacer, zt as Sparkline, St as Spinner, R as Stack, Ct as Stat, wt as Stepper, Ot as StepperInput, kt as Switch, Ke as SyncStatusBadge, Io as THEME_STYLE_ID, jt as Table, Mt as Tabs, At as Tag, ns as TelemetryProvider, Ur as TempestApiError, ki as TempestDataProvider, Nt as Textarea, aa as ThemeProvider, Rn as TimePicker, Pt as Timeline, It as ToastProvider, _n as Toggle, vn as ToggleGroup, yn as ToggleGroupItem, Ft as Tooltip, rr as Tour, Fo as TrajectoryMap, Qn as Transfer, on as TreeView, sn as TruncateText, qe as UpdatePrompt, Wt as VirtualList, Kt as VirtualTable, cn as VisuallyHidden, _a as WebPushClient, va as WebPushPermissionDeniedError, ya as WebPushUnsupportedError, Bn as Wizard, Ye as applyKanbanMove, Lo as applyTheme, Xn as applyTransferMove, Ar as assertNever, go as bearingDeg, To as boundingBox, Eo as boundsCenter, Wr as buildApiError, De as buildOpenInChromeIntent, gr as camelCase, _r as capitalize, Un as chatStrings, Sr as chunk, Tt as clamp, lo as clampLatitude, ka as clearCaches, e as cn, Gt as compareValues, es as consoleSink, is as consoleTelemetryAdapter, zo as contrastRatio, Kr as createApiClient, ja as createAudioPlayer, Qr as createAuthStore, Bo as createColorScale, Oi as createDataProvider, pa as createEventStream, ds as createGrowthBookFeatureFlagsAdapter, sa as createI18n, us as createInMemoryFlags, fs as createLaunchDarklyFeatureFlagsAdapter, ts as createLogger, Mo as createOSRMBackend, Ei as createOfflineStore, Fa as createOfflineSync, wa as createPartialResponse, No as createPositionTracker, os as createPostHogTelemetryAdapter, gi as createQueryKeys, ri as createRefreshQueue, li as createRoleAccessControl, ia as createSelectors, as as createSentryTelemetryAdapter, ra as createStore, ii as createTempestAuth, Jo as createTheme, so as createWebSocket, Wn as dayLabel, Fr as debounce, ei as decodeJWT, Er as deepMerge, Bi as defineRoutes, ir as describeFilter, ys as divergingScale, Co as durationFactor, vi as emptyOffsetPage, Jt as encodeQR, at as estimatePasswordStrength, Le as estimateStorage, wo as estimateTravel, Do as expandBounds, ar as filtersFromSearchParams, or as filtersToSearchParams, ko as fitProjection, Et as formatBytes, Ua as formatCEP, Wa as formatCNPJ, lr as formatCPF, Dt as formatCompactNumber, ur as formatCurrency, dr as formatDate, fr as formatDateTime, pr as formatPercent, mr as formatPhone, Xr as generateIdempotencyKey, Qo as getInitialTheme, Xo as getThemePreset, Cr as groupBy, Gn as groupMessages, _o as haversineKm, Vo as hexToOklch, Ho as hexToRgb, Uo as hexToRgbaString, Ia as higherVersionWins, Aa as inspectCaches, Da as installBackgroundSync, xa as installNotificationClickHandler, Ta as installPrecache, Sa as installPushHandler, Ea as installRuntimeCache, Ca as installSkipWaitingListener, Oe as isAndroid, ke as isAndroidWithoutPromptApi, Gr as isApiError, uo as isCoordinate, yi as isCursorPage, jr as isDefined, Dr as isEmpty, Ae as isIOS, ti as isJWTExpired, Mr as isNumber, bi as isOffsetPage, Nr as isPlainObject, ha as isPushSupported, ps as isShareSupported, je as isStandalone, Pr as isString, fo as isValidLatitude, po as isValidLongitude, vr as kebabCase, La as lastWriteWins, ni as lazyWithRetry, ji as listQueryKey, Yt as matrixToPath, Ir as memoizeOne, Be as moveItem, mo as normalizeLongitude, tt as nprogress, Wo as oklchToHex, Or as omit, Lr as once, Mi as oneQueryKey, sr as operatorsFor, tr as parseMarkdown, qr as parseResponse, vo as pathLengthKm, ui as permissionsFromToken, Di as persistQueryClientOffline, kr as pick, Ma as playAudio, yr as pluralize, Ao as projectMercator, Vr as randomId, wr as range, Ro as readThemeToken, Go as readableForeground, Xi as redirect, Oa as registerPeriodicSync, Ne as registerServiceWorker, Ko as relativeLuminance, Vt as relativeTime, wi as removeById, Re as requestPersistentStorage, $t as resolveLanguage, Yr as retry, qo as rgbToHex, er as safeLinkUrl, bs as scaleSteps, Xt as selectMode, xs as sequentialScale, ms as share, hs as shareOrDownloadBlob, Pe as skipWaiting, zr as sleep, br as slugify, Zn as splitTransferSides, Na as stopAudio, hr as storage, Yo as themeContrast, $o as themeInitScript, Zo as themePresets, Rr as throttle, Kn as timeLabel, yo as toRadians, en as tokenize, tn as tokenizeLines, xr as truncate, qn as typingLabel, Tr as uniqueBy, Ga as unmask, jo as unprojectMercator, Fe as unregisterAllServiceWorkers, Jr as uploadWithProgress, Ti as upsertById, ga as urlBase64ToUint8Array, oi as useAccessControl, Y as useAsync, Pa as useAudio, z as useBeforeInstallPrompt, a as useBreakpoint, si as useCan, Ce as useClickOutside, W as useClientFilter, ee as useClipboard, _e as useCounter, Ni as useCreate, Si as useCursorQuery, Ai as useDataProvider, H as useDebounce, se as useDeepMemo, Pi as useDelete, he as useDisclosure, ve as useDocumentTitle, Z as useDocumentVisibility, Ra as useErrorHandler, K as useEventListener, ma as useEventStream, ye as useFavicon, cs as useFeatureFlag, no as useFieldArray, ls as useFlagValue, ae as useFocusTrap, ro as useForm, io as useFormContext, ao as useFormState, re as useGeolocation, pe as useHover, la as useI18n, ne as useIdle, Me as useInstallPrompt, Q as useIntersectionObserver, le as useInterval, we as useIsFirstRender, te as useKeyboardShortcut, Fi as useList, ge as useListState, q as useLocalStorage, Zi as useLocation, me as useLongPress, Ee as useLongPressHandlers, be as useMap, Qi as useMatch, G as useMediaQuery, Qe as useModals, $i as useNavigate, Ut as useNotificationInbox, fi as useOAuthCallback, Te as useObjectUrl, Ci as useOfflineMutation, We as useOfflineSync, Ii as useOne, X as useOnline, xi as usePaginatedQuery, U as usePagination, ea as useParams, Zr as usePoll, Po as usePositionTracker, ce as usePrevious, ba as usePushSubscription, Se as useQueue, $ as useResizeObserver, ta as useRouteError, ie as useScrollLock, He as useScrollOverflow, na as useSearchParams, Ie as useServiceWorkerUpdate, xe as useSet, Ve as useSortable, oe as useStableCallback, ze as useStorageEstimate, Ge as useSyncStatus, rs as useTelemetry, oa as useTheme, de as useThrottle, ue as useTimeout, Lt as useToast, J as useToggle, ua as useTranslate, Li as useUpdate, $a as useViaCEP, oo as useWatch, co as useWebSocket, fe as useWindowSize, Ha as useZodForm, Ka as validateCNPJ, qa as validateCPF, Ba as validateForm, Br as withTimeout, Hr as writeXlsx, Va as zodResolver };
@@ -339,8 +339,15 @@
339
339
  * Page pattern — the shell every screen shares
340
340
  * ============================================================ */
341
341
 
342
+ /*
343
+ * `width: 100%` is not decoration: dropped inside a flex **row** — a preview pane,
344
+ * a split view — a page container is a flex item and sizes to its content, so a
345
+ * dashboard inside it collapsed to about 200px while its parent had 500. Only the
346
+ * browser shows that; in normal flow the declaration changes nothing.
347
+ */
342
348
  .tempest-page {
343
349
  display: flex;
350
+ width: 100%;
344
351
  flex-direction: column;
345
352
  gap: var(--tempest-page-gap, var(--tempest-space-6));
346
353
  padding-block: var(--tempest-space-6);
@@ -387,6 +394,132 @@
387
394
  z-index: var(--tempest-z-sticky);
388
395
  }
389
396
 
397
+ /* ============================================================
398
+ * Dashboard — a page of widgets, without a media query per widget
399
+ * ============================================================ */
400
+
401
+ /**
402
+ * Widget grid.
403
+ *
404
+ * Columns come from the **container**, not the viewport: `container-type:
405
+ * inline-size` makes the spans below react to the width the grid actually has, so
406
+ * the same dashboard works full-bleed, inside a sidebar layout, or in a drawer. A
407
+ * media query would give a 320px-wide panel the desktop span, and every widget in
408
+ * it would be one column of squashed text.
409
+ *
410
+ * Tune with `--tempest-dashboard-columns` (default 12) and
411
+ * `--tempest-dashboard-gap`.
412
+ */
413
+ .tempest-dashboard {
414
+ display: grid;
415
+ width: 100%;
416
+ grid-template-columns: repeat(var(--tempest-dashboard-columns, 12), minmax(0, 1fr));
417
+ gap: var(--tempest-dashboard-gap, var(--tempest-space-4));
418
+ container-type: inline-size;
419
+ container-name: tempest-dashboard;
420
+ }
421
+
422
+ /**
423
+ * One widget.
424
+ *
425
+ * Full width by default, because a dashboard read on a phone is a single column
426
+ * and that is the state a widget spends most of its life in. The spans below widen
427
+ * it as the container earns the room.
428
+ */
429
+ .tempest-widget {
430
+ grid-column: 1 / -1;
431
+ min-width: 0;
432
+ }
433
+
434
+ /** Two rows tall — a chart next to a stack of stat tiles. */
435
+ .tempest-widget-tall {
436
+ grid-row: span 2;
437
+ }
438
+
439
+ /*
440
+ * Spans open up in two steps, keyed on the container.
441
+ *
442
+ * 40rem is where two columns of prose stop being cramped; 64rem is where four fit.
443
+ * The `span` values assume the default 12 columns — with a custom
444
+ * `--tempest-dashboard-columns` the widget still lands inside the grid, it just
445
+ * covers a different fraction, which is the tradeoff of using one shared scale
446
+ * instead of a class per column count.
447
+ */
448
+ @container tempest-dashboard (min-width: 40rem) {
449
+ .tempest-widget-half {
450
+ grid-column: span 6;
451
+ }
452
+
453
+ .tempest-widget-third,
454
+ .tempest-widget-quarter {
455
+ grid-column: span 6;
456
+ }
457
+
458
+ .tempest-widget-two-thirds {
459
+ grid-column: span 12;
460
+ }
461
+ }
462
+
463
+ @container tempest-dashboard (min-width: 64rem) {
464
+ .tempest-widget-third {
465
+ grid-column: span 4;
466
+ }
467
+
468
+ .tempest-widget-quarter {
469
+ grid-column: span 3;
470
+ }
471
+
472
+ .tempest-widget-two-thirds {
473
+ grid-column: span 8;
474
+ }
475
+ }
476
+
477
+ /** Row of stat tiles that fits as many as it can, no spans needed. */
478
+ .tempest-stat-row {
479
+ display: grid;
480
+ width: 100%;
481
+ grid-template-columns: repeat(auto-fit, minmax(min(var(--tempest-stat-min, 11rem), 100%), 1fr));
482
+ gap: var(--tempest-dashboard-gap, var(--tempest-space-4));
483
+ }
484
+
485
+ /**
486
+ * A widget's own frame: header on top, body taking the rest.
487
+ *
488
+ * `min-height: 0` on the body is what lets a chart inside it shrink — a grid child
489
+ * defaults to `min-height: auto`, so a canvas that reports a tall intrinsic size
490
+ * pushes the row instead of fitting it, and the dashboard grows a scrollbar nobody
491
+ * asked for.
492
+ */
493
+ .tempest-widget-frame {
494
+ display: flex;
495
+ flex-direction: column;
496
+ gap: var(--tempest-space-3);
497
+ height: 100%;
498
+ padding: var(--tempest-widget-padding, var(--tempest-space-4));
499
+ border: 1px solid var(--tempest-border);
500
+ border-radius: var(--tempest-radius-lg);
501
+ background-color: var(--tempest-bg);
502
+ }
503
+
504
+ .tempest-widget-header {
505
+ display: flex;
506
+ align-items: baseline;
507
+ justify-content: space-between;
508
+ gap: var(--tempest-space-2);
509
+ }
510
+
511
+ .tempest-widget-title {
512
+ margin: 0;
513
+ color: var(--tempest-text);
514
+ font-size: var(--tempest-text-sm);
515
+ font-weight: var(--tempest-weight-semibold);
516
+ }
517
+
518
+ .tempest-widget-body {
519
+ flex: 1 1 auto;
520
+ min-height: 0;
521
+ }
522
+
390
523
  /* ============================================================
391
524
  * Media — fixed ratios without layout shift
392
525
  * ============================================================ */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tempest-react-sdk",
3
- "version": "0.30.0",
3
+ "version": "0.31.1",
4
4
  "description": "SDK público da Tempest com componentes, hooks e integrações para projetos React.",
5
5
  "type": "module",
6
6
  "license": "MIT",