@burojs/ui-shadcn 0.7.0 → 0.9.0

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 (122) hide show
  1. package/dist/{bulk-summary-CrEij5vq.cjs → bulk-summary-2HLgz7Il.cjs} +31 -5
  2. package/dist/bulk-summary-2HLgz7Il.cjs.map +1 -0
  3. package/dist/{bulk-summary-BWSAS7k2.js → bulk-summary-D6A0ua21.js} +32 -6
  4. package/dist/bulk-summary-D6A0ua21.js.map +1 -0
  5. package/dist/{candidates-relation-picker-CS_JZ4Fd.js → candidates-relation-picker-QvoY2bOQ.js} +3 -3
  6. package/dist/{candidates-relation-picker-CS_JZ4Fd.js.map → candidates-relation-picker-QvoY2bOQ.js.map} +1 -1
  7. package/dist/{candidates-relation-picker-y5M6_oe4.cjs → candidates-relation-picker-pEAWKQEY.cjs} +3 -3
  8. package/dist/{candidates-relation-picker-y5M6_oe4.cjs.map → candidates-relation-picker-pEAWKQEY.cjs.map} +1 -1
  9. package/dist/{check-confirm-dialog-2j0gOd7x.js → check-confirm-dialog-B-CbJTln.js} +68 -8
  10. package/dist/{check-confirm-dialog-2j0gOd7x.js.map → check-confirm-dialog-B-CbJTln.js.map} +1 -1
  11. package/dist/{check-confirm-dialog-C-NHgMST.cjs → check-confirm-dialog-W-8WOmGh.cjs} +72 -6
  12. package/dist/check-confirm-dialog-W-8WOmGh.cjs.map +1 -0
  13. package/dist/{filter-builder-DaWHUZuV.js → filter-builder-04nas3eq.js} +127 -61
  14. package/dist/filter-builder-04nas3eq.js.map +1 -0
  15. package/dist/{filter-builder-DFu0JP-1.cjs → filter-builder-DQX-TMFh.cjs} +140 -68
  16. package/dist/filter-builder-DQX-TMFh.cjs.map +1 -0
  17. package/dist/{flow-runtime-DyqTmK3H.js → flow-runtime-BEIyym7d.js} +7 -4
  18. package/dist/{flow-runtime-DyqTmK3H.js.map → flow-runtime-BEIyym7d.js.map} +1 -1
  19. package/dist/{flow-runtime-BpmrIUb6.cjs → flow-runtime-DyNIYfUP.cjs} +7 -4
  20. package/dist/{flow-runtime-BpmrIUb6.cjs.map → flow-runtime-DyNIYfUP.cjs.map} +1 -1
  21. package/dist/{flow-screen-DCdli6Ha.js → flow-screen-DY1Z9PbG.js} +56 -15
  22. package/dist/flow-screen-DY1Z9PbG.js.map +1 -0
  23. package/dist/{flow-screen-Bcz9NF2V.cjs → flow-screen-FE5Xhb3t.cjs} +54 -13
  24. package/dist/flow-screen-FE5Xhb3t.cjs.map +1 -0
  25. package/dist/index.cjs +564 -170
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +235 -95
  28. package/dist/index.d.ts +235 -95
  29. package/dist/index.js +562 -169
  30. package/dist/index.js.map +1 -1
  31. package/dist/{inline-flow-host-C0rI9B7f.js → inline-flow-host-D6u-RlsV.js} +3 -3
  32. package/dist/{inline-flow-host-C0rI9B7f.js.map → inline-flow-host-D6u-RlsV.js.map} +1 -1
  33. package/dist/{inline-flow-host-3vw7LzzD.cjs → inline-flow-host-yVLo6-sM.cjs} +3 -3
  34. package/dist/{inline-flow-host-3vw7LzzD.cjs.map → inline-flow-host-yVLo6-sM.cjs.map} +1 -1
  35. package/dist/{lazy-relation-picker-dialog-CAScLPb2.js → lazy-relation-picker-dialog-BaORufxQ.js} +2 -2
  36. package/dist/{lazy-relation-picker-dialog-CAScLPb2.js.map → lazy-relation-picker-dialog-BaORufxQ.js.map} +1 -1
  37. package/dist/{lazy-relation-picker-dialog-Bt8lrEIu.cjs → lazy-relation-picker-dialog-C_VlGlDz.cjs} +2 -2
  38. package/dist/{lazy-relation-picker-dialog-Bt8lrEIu.cjs.map → lazy-relation-picker-dialog-C_VlGlDz.cjs.map} +1 -1
  39. package/dist/{page-flow-route-BHUEpn0I.js → page-flow-route-CyMzUidK.js} +8 -9
  40. package/dist/page-flow-route-CyMzUidK.js.map +1 -0
  41. package/dist/{page-flow-route-DS8IVTVH.cjs → page-flow-route-OFx7h7Ja.cjs} +8 -9
  42. package/dist/page-flow-route-OFx7h7Ja.cjs.map +1 -0
  43. package/dist/{place-node-CNb3w-c7.cjs → place-node-BZF5Af6x.cjs} +224 -151
  44. package/dist/place-node-BZF5Af6x.cjs.map +1 -0
  45. package/dist/{place-node-CfzQvh4Y.js → place-node-DRjmJGQ_.js} +210 -125
  46. package/dist/place-node-DRjmJGQ_.js.map +1 -0
  47. package/dist/{related-list-cards-BIqqY69Y.js → related-list-cards-2hLitVkg.js} +3 -3
  48. package/dist/{related-list-cards-BIqqY69Y.js.map → related-list-cards-2hLitVkg.js.map} +1 -1
  49. package/dist/{related-list-cards-CelMxl4q.cjs → related-list-cards-xVvgSlu-.cjs} +3 -3
  50. package/dist/{related-list-cards-CelMxl4q.cjs.map → related-list-cards-xVvgSlu-.cjs.map} +1 -1
  51. package/dist/related-list-timeline-CxJqe6eK.js +167 -0
  52. package/dist/related-list-timeline-CxJqe6eK.js.map +1 -0
  53. package/dist/related-list-timeline-Dsf5WewG.cjs +167 -0
  54. package/dist/related-list-timeline-Dsf5WewG.cjs.map +1 -0
  55. package/dist/{related-rows-MPnLCmPF.cjs → related-rows-DDhp9axl.cjs} +4 -4
  56. package/dist/{related-rows-MPnLCmPF.cjs.map → related-rows-DDhp9axl.cjs.map} +1 -1
  57. package/dist/{related-rows--uP2iKQC.js → related-rows-DL6CWsrj.js} +4 -4
  58. package/dist/{related-rows--uP2iKQC.js.map → related-rows-DL6CWsrj.js.map} +1 -1
  59. package/dist/{relation-create-C43cdPQt.js → relation-create-6WicROWA.js} +33 -5
  60. package/dist/relation-create-6WicROWA.js.map +1 -0
  61. package/dist/{relation-create-DDEYcKfw.cjs → relation-create-_SFuPQGM.cjs} +37 -3
  62. package/dist/relation-create-_SFuPQGM.cjs.map +1 -0
  63. package/dist/{relation-many-picker-DzuGJpEl.cjs → relation-many-picker-BBNsmkaX.cjs} +18 -11
  64. package/dist/relation-many-picker-BBNsmkaX.cjs.map +1 -0
  65. package/dist/{relation-many-picker-BJhaEqxz.js → relation-many-picker-mGEQDWo2.js} +18 -11
  66. package/dist/relation-many-picker-mGEQDWo2.js.map +1 -0
  67. package/dist/{relation-picker-D-tBBZW_.js → relation-picker-BbO41cFV.js} +19 -11
  68. package/dist/relation-picker-BbO41cFV.js.map +1 -0
  69. package/dist/{relation-picker-dialog-DoEY8EkH.js → relation-picker-dialog-BgSG_8bU.js} +5 -5
  70. package/dist/relation-picker-dialog-BgSG_8bU.js.map +1 -0
  71. package/dist/{relation-picker-dialog-9Vg5vvR1.cjs → relation-picker-dialog-Duqy2r0n.cjs} +5 -5
  72. package/dist/relation-picker-dialog-Duqy2r0n.cjs.map +1 -0
  73. package/dist/{relation-picker-DaIMzf2H.cjs → relation-picker-jk9D_uwn.cjs} +19 -11
  74. package/dist/relation-picker-jk9D_uwn.cjs.map +1 -0
  75. package/dist/{relation-select-Cr3CfNLy.cjs → relation-select-C3aV18kT.cjs} +2 -2
  76. package/dist/{relation-select-Cr3CfNLy.cjs.map → relation-select-C3aV18kT.cjs.map} +1 -1
  77. package/dist/{relation-select-B8Fq4o-t.js → relation-select-CjQT9LpS.js} +2 -2
  78. package/dist/{relation-select-B8Fq4o-t.js.map → relation-select-CjQT9LpS.js.map} +1 -1
  79. package/dist/{resource-page-router-Diw6S6TK.js → resource-page-router-CzaNATSp.js} +209 -30
  80. package/dist/resource-page-router-CzaNATSp.js.map +1 -0
  81. package/dist/{resource-page-router-C_kGW2o_.cjs → resource-page-router-dmVIeu5s.cjs} +235 -32
  82. package/dist/resource-page-router-dmVIeu5s.cjs.map +1 -0
  83. package/dist/{success-notices-Dl3M1fZP.cjs → success-notices-Cl4b6MLQ.cjs} +3 -2
  84. package/dist/success-notices-Cl4b6MLQ.cjs.map +1 -0
  85. package/dist/{success-notices-LDEgEkc4.js → success-notices-CrcWOGSo.js} +3 -2
  86. package/dist/success-notices-CrcWOGSo.js.map +1 -0
  87. package/dist/{use-dialog-filter-state-B_MqzHaT.js → use-dialog-filter-state-CJoeY-1j.js} +2 -2
  88. package/dist/{use-dialog-filter-state-B_MqzHaT.js.map → use-dialog-filter-state-CJoeY-1j.js.map} +1 -1
  89. package/dist/{use-dialog-filter-state-tNvqAAjh.cjs → use-dialog-filter-state-lsTJxrB4.cjs} +2 -2
  90. package/dist/{use-dialog-filter-state-tNvqAAjh.cjs.map → use-dialog-filter-state-lsTJxrB4.cjs.map} +1 -1
  91. package/dist/use-record-subtitle-BJ9rnj6F.cjs +67 -0
  92. package/dist/use-record-subtitle-BJ9rnj6F.cjs.map +1 -0
  93. package/dist/use-record-subtitle-w3ZhXNlf.js +50 -0
  94. package/dist/use-record-subtitle-w3ZhXNlf.js.map +1 -0
  95. package/package.json +9 -9
  96. package/dist/bulk-summary-BWSAS7k2.js.map +0 -1
  97. package/dist/bulk-summary-CrEij5vq.cjs.map +0 -1
  98. package/dist/check-confirm-dialog-C-NHgMST.cjs.map +0 -1
  99. package/dist/filter-builder-DFu0JP-1.cjs.map +0 -1
  100. package/dist/filter-builder-DaWHUZuV.js.map +0 -1
  101. package/dist/flow-screen-Bcz9NF2V.cjs.map +0 -1
  102. package/dist/flow-screen-DCdli6Ha.js.map +0 -1
  103. package/dist/page-flow-route-BHUEpn0I.js.map +0 -1
  104. package/dist/page-flow-route-DS8IVTVH.cjs.map +0 -1
  105. package/dist/place-node-CNb3w-c7.cjs.map +0 -1
  106. package/dist/place-node-CfzQvh4Y.js.map +0 -1
  107. package/dist/related-list-timeline-CRh7xwLD.js +0 -141
  108. package/dist/related-list-timeline-CRh7xwLD.js.map +0 -1
  109. package/dist/related-list-timeline-DsLdi8sv.cjs +0 -141
  110. package/dist/related-list-timeline-DsLdi8sv.cjs.map +0 -1
  111. package/dist/relation-create-C43cdPQt.js.map +0 -1
  112. package/dist/relation-create-DDEYcKfw.cjs.map +0 -1
  113. package/dist/relation-many-picker-BJhaEqxz.js.map +0 -1
  114. package/dist/relation-many-picker-DzuGJpEl.cjs.map +0 -1
  115. package/dist/relation-picker-D-tBBZW_.js.map +0 -1
  116. package/dist/relation-picker-DaIMzf2H.cjs.map +0 -1
  117. package/dist/relation-picker-dialog-9Vg5vvR1.cjs.map +0 -1
  118. package/dist/relation-picker-dialog-DoEY8EkH.js.map +0 -1
  119. package/dist/resource-page-router-C_kGW2o_.cjs.map +0 -1
  120. package/dist/resource-page-router-Diw6S6TK.js.map +0 -1
  121. package/dist/success-notices-Dl3M1fZP.cjs.map +0 -1
  122. package/dist/success-notices-LDEgEkc4.js.map +0 -1
@@ -2,15 +2,16 @@ import { l as cn } from "./use-theme-dnE3Od3I.js";
2
2
  import { m as PopoverTrigger, p as PopoverContent, u as Popover } from "./toaster-Ct_YHGs6.js";
3
3
  import { t as Button } from "./button-MWVeZaqj.js";
4
4
  import { t as Input } from "./input-CUPStzZO.js";
5
- import { C as CommandEmpty, D as CommandList, E as CommandItem, T as CommandInput, m as useRowTitle, o as narrowSearchDecl, w as CommandGroup, x as Command } from "./relation-create-C43cdPQt.js";
5
+ import { D as CommandItem, E as CommandInput, O as CommandList, S as Command, T as CommandGroup, m as useRowTitle, o as narrowSearchDecl, w as CommandEmpty } from "./relation-create-6WicROWA.js";
6
6
  import { t as Skeleton } from "./skeleton-U2noefj5.js";
7
- import { EMPTY_FILTER_GROUP, canonicalResourceKey, convertValueForOp, declaredText, enumValueText, formatEntityRef, isCompletePredicate, isFilterGroup, opArity, resolveEnumLabel, resolveSurfaceUi } from "@burojs/core";
8
- import { DEFAULT_LANGUAGE_STORAGE_KEY, scopeValueOf, useApp, useChromeT, useEnumValues, useFieldDisplayText, useFieldImplementation, useFieldMeta, useFieldMetaSources, useI18nCaps, useImplementationTexts, useList, useListAccess, useLocale, useOptionalLocale, useOptionalT, useRelatedRecord, useResolvedFieldOptions } from "@burojs/react";
7
+ import { EMPTY_FILTER_GROUP, canonicalInstant, canonicalResourceKey, convertValueForOp, declaredText, enumValueText, formatEntityRef, formatTimeValue, instantToWall, isCalendarDate, isCompletePredicate, isFilterGroup, isWallTime, opArity, resolveEnumLabel, resolveSurfaceUi, resolveTimeZone, wallToInstant } from "@burojs/core";
8
+ import { DEFAULT_LANGUAGE_STORAGE_KEY, scopeValueOf, useApp, useChromeT, useEnumValues, useFieldDisplayText, useFieldImplementation, useFieldMeta, useFieldMetaSources, useI18nCaps, useImplementationTexts, useList, useListAccess, useLocale, useOptionalLocale, useOptionalT, useRelatedRecord, useResolvedFieldOptions, useTimeContext, useTimeZone } from "@burojs/react";
9
9
  import { IconCheck, IconChevronDown, IconChevronUp, IconCirclePlus, IconFilter, IconFolderPlus, IconLoader2, IconPlus, IconX } from "@tabler/icons-react";
10
10
  import * as React from "react";
11
11
  import { Fragment, createElement, useCallback, useEffect, useMemo, useRef, useState } from "react";
12
12
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
13
13
  import { cva } from "class-variance-authority";
14
+ import { normaliseFieldZone } from "@burojs/core/internal";
14
15
  import * as SelectPrimitive from "@radix-ui/react-select";
15
16
  //#region src/layout/language-storage.ts
16
17
  function loadLocale(storageKey = DEFAULT_LANGUAGE_STORAGE_KEY) {
@@ -99,6 +100,7 @@ const SEMANTIC_KEYS = Object.freeze([
99
100
  "empty",
100
101
  "default",
101
102
  "constraints",
103
+ "zone",
102
104
  "texts",
103
105
  "options",
104
106
  "items",
@@ -128,9 +130,11 @@ function projectUiSelection(input) {
128
130
  const selection = {};
129
131
  const inputId = ownSelection(input, "input");
130
132
  const displayId = ownSelection(input, "display");
133
+ const layout = ownData(input, "layout").value;
131
134
  if (inputId !== void 0) selection.input = inputId;
132
135
  if (displayId !== void 0) selection.display = displayId;
133
- return inputId === void 0 && displayId === void 0 ? void 0 : Object.freeze(selection);
136
+ if (Array.isArray(layout)) selection.layout = layout;
137
+ return Object.keys(selection).length === 0 ? void 0 : Object.freeze(selection);
134
138
  }
135
139
  function projectFieldDeclaration(input) {
136
140
  const type = ownString(input, "type");
@@ -149,7 +153,16 @@ function projectFieldDeclaration(input) {
149
153
  }
150
154
  if (type === "object") {
151
155
  const properties = ownData(input, "properties").value;
152
- if (properties !== null && typeof properties === "object" && !Array.isArray(properties)) {
156
+ if (Array.isArray(properties)) {
157
+ const output = {};
158
+ for (let index = 0; index < properties.length; index += 1) {
159
+ const entry = ownData(properties, index).value;
160
+ const name = ownString(entry, "name");
161
+ const child = projectFieldDeclaration(entry);
162
+ if (name !== void 0 && child !== void 0) output[name] = child;
163
+ }
164
+ projected.properties = Object.freeze(output);
165
+ } else if (properties !== null && typeof properties === "object") {
153
166
  const output = {};
154
167
  for (const key of Object.keys(properties)) {
155
168
  const child = projectFieldDeclaration(ownData(properties, key).value);
@@ -206,6 +219,7 @@ function lowerLegacyField(field) {
206
219
  const items = type === "array" ? projectFieldDeclaration(ownData(field, "items").value) ?? mapping?.items ?? STRING_ITEM : void 0;
207
220
  const meta = ownData(field, "meta");
208
221
  const texts = ownData(field, "texts");
222
+ const zone = ownData(field, "zone");
209
223
  const options = kind === "enum" ? enumValueOptions(field) : void 0;
210
224
  const required = ownData(field, "required");
211
225
  const nullable = ownData(field, "nullable");
@@ -221,6 +235,7 @@ function lowerLegacyField(field) {
221
235
  ...meta.present && meta.value !== void 0 ? { meta: meta.value } : {},
222
236
  ...options === void 0 ? {} : { options },
223
237
  ...texts.present && texts.value !== void 0 ? { texts: texts.value } : {},
238
+ ...zone.present && zone.value !== void 0 ? { zone: zone.value } : {},
224
239
  ...requiredValue === true ? { required: true } : {},
225
240
  ...nullableValue === true ? { nullable: true } : {}
226
241
  });
@@ -372,7 +387,7 @@ function useFieldImplementationDiagnostic(diagnostic) {
372
387
  console.warn("[buro/ui-shadcn] missing-field-implementation; rendering fallback.", diagnostic);
373
388
  }, [diagnostic]);
374
389
  }
375
- function ResolvedFieldDisplay({ resource, name, field: source, value, record, testId, fallback, presentation, metaSources, uiSurface = "display", columnEntry }) {
390
+ function ResolvedFieldDisplay({ resource, name, field: source, value, record, testId, fallback, presentation, metaSources, uiSurface = "display", columnEntry, absentPaths, pathStatus }) {
376
391
  const { sourceAtEdge, field, ui } = useLoweredField(source);
377
392
  const surfaceField = useMemo(() => sourceAtEdge.ui === void 0 ? field : Object.freeze({
378
393
  ...field,
@@ -397,10 +412,19 @@ function ResolvedFieldDisplay({ resource, name, field: source, value, record, te
397
412
  const text = useFieldDisplayText(textField, value, {
398
413
  surface: uiSurface,
399
414
  ...columnEntry === void 0 ? {} : { entry: columnEntry },
400
- resource: canonicalResourceKey(resource)
415
+ resource: canonicalResourceKey(resource),
416
+ ...record === void 0 ? {} : { record }
401
417
  });
402
418
  const options = useContextOptions(field, name, metaState.status === "ready" ? metaState.meta : void 0, ui, resource);
403
419
  const texts = useContextTexts(field, name, resolved, resource);
420
+ const dateDisplay = resolveSurfaceUi(surfaceField, uiSurface, columnEntry).dateDisplay;
421
+ const contextUi = useMemo(() => dateDisplay === void 0 ? ui : Object.freeze({
422
+ ...ui,
423
+ display: Object.freeze({
424
+ ...typeof ui.display === "object" && ui.display !== null ? ui.display : {},
425
+ ...dateDisplay
426
+ })
427
+ }), [ui, dateDisplay]);
404
428
  useFieldMetaDiagnostic(metaState, resource, name, surfaceField, uiSurface, columnEntry);
405
429
  useFieldImplementationDiagnostic(resolved.diagnostic);
406
430
  if (resolved.Component === void 0) return jsx(Fragment$1, { children: fallback });
@@ -411,11 +435,13 @@ function ResolvedFieldDisplay({ resource, name, field: source, value, record, te
411
435
  resource,
412
436
  field,
413
437
  path: Object.freeze([name]),
438
+ ...absentPaths === void 0 || absentPaths.length === 0 ? {} : { absentPaths },
439
+ ...pathStatus === void 0 ? {} : { pathStatus },
414
440
  surface: "display",
415
441
  presentation: presentation ?? "default",
416
442
  record,
417
443
  meta: metaState.meta,
418
- ui,
444
+ ui: contextUi,
419
445
  options,
420
446
  texts,
421
447
  ...text === void 0 ? {} : { text },
@@ -438,7 +464,7 @@ function ResolvedFieldDisplay({ resource, name, field: source, value, record, te
438
464
  value
439
465
  });
440
466
  }
441
- function ResolvedFieldInput({ resource, name, field: source, value, record, form, testId, inputId, onChange, onBlur, disabled, required, placeholder, descriptionId, labelId, errorId, errorMessage, pending = false, touched = errorMessage != null, issues: suppliedIssues, relationSeeds, fixedFilters, link, metaSources, fallback }) {
467
+ function ResolvedFieldInput({ resource, name, field: source, value, record, form, testId, inputId, onChange, onBlur, disabled, required, placeholder, descriptionId, labelId, errorId, errorMessage, pending = false, touched = errorMessage != null, issues: suppliedIssues, relationSeeds, fixedFilters, optionSubtitle, link, metaSources, baseline, fallback, absentPaths, pathStatus }) {
442
468
  const { sourceAtEdge, field: base } = useLoweredField(source);
443
469
  const field = useMemo(() => required === void 0 || required === base.required ? base : Object.freeze({
444
470
  ...base,
@@ -480,6 +506,8 @@ function ResolvedFieldInput({ resource, name, field: source, value, record, form
480
506
  resource,
481
507
  field,
482
508
  path: Object.freeze([name]),
509
+ ...absentPaths === void 0 || absentPaths.length === 0 ? {} : { absentPaths },
510
+ ...pathStatus === void 0 ? {} : { pathStatus },
483
511
  surface: "input",
484
512
  presentation: "default",
485
513
  record,
@@ -510,8 +538,10 @@ function ResolvedFieldInput({ resource, name, field: source, value, record, form
510
538
  disabled,
511
539
  relationSeeds,
512
540
  fixedFilters,
541
+ optionSubtitle,
513
542
  link,
514
- metaSources: runtimeContext.metaSources
543
+ metaSources: runtimeContext.metaSources,
544
+ ...baseline === void 0 ? {} : { baseline }
515
545
  });
516
546
  return createElement(Component, {
517
547
  ...context,
@@ -522,8 +552,10 @@ function ResolvedFieldInput({ resource, name, field: source, value, record, form
522
552
  disabled,
523
553
  relationSeeds,
524
554
  fixedFilters,
555
+ optionSubtitle,
525
556
  link,
526
- metaSources: runtimeContext.metaSources
557
+ metaSources: runtimeContext.metaSources,
558
+ ...baseline === void 0 ? {} : { baseline }
527
559
  });
528
560
  }
529
561
  //#endregion
@@ -599,7 +631,15 @@ const TableCaption = React.forwardRef(({ className, ...props }, ref) => jsx("cap
599
631
  TableCaption.displayName = "TableCaption";
600
632
  //#endregion
601
633
  //#region src/primitives/select.tsx
602
- const Select = SelectPrimitive.Root;
634
+ function Select({ onValueChange, ...props }) {
635
+ return jsx(SelectPrimitive.Root, {
636
+ ...props,
637
+ ...onValueChange === void 0 ? {} : { onValueChange: (next) => {
638
+ if (next !== "") onValueChange(next);
639
+ } }
640
+ });
641
+ }
642
+ Select.displayName = SelectPrimitive.Root.displayName;
603
643
  const SelectGroup = SelectPrimitive.Group;
604
644
  const SelectValue = SelectPrimitive.Value;
605
645
  const SelectTrigger = React.forwardRef(({ className, children, ...props }, ref) => jsxs(SelectPrimitive.Trigger, {
@@ -677,8 +717,6 @@ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
677
717
  function localeTag(locale) {
678
718
  return locale || loadLocale() || "en-US";
679
719
  }
680
- const dateCache = new Map();
681
- const dateTimeCache = new Map();
682
720
  const numberCache = new Map();
683
721
  function cached(cache, key, make) {
684
722
  const hit = cache.get(key);
@@ -692,24 +730,6 @@ function cached(cache, key, make) {
692
730
  cache.set(key, made);
693
731
  return made;
694
732
  }
695
- function formatDate(d, locale) {
696
- const tag = localeTag(locale);
697
- return cached(dateCache, tag, (t) => new Intl.DateTimeFormat(t, {
698
- year: "numeric",
699
- month: "short",
700
- day: "numeric"
701
- })).format(d);
702
- }
703
- function formatDateTime(d, locale) {
704
- const tag = localeTag(locale);
705
- return cached(dateTimeCache, tag, (t) => new Intl.DateTimeFormat(t, {
706
- year: "numeric",
707
- month: "short",
708
- day: "numeric",
709
- hour: "2-digit",
710
- minute: "2-digit"
711
- })).format(d);
712
- }
713
733
  function formatNumber(n, locale) {
714
734
  const tag = localeTag(locale);
715
735
  return cached(numberCache, tag, (t) => new Intl.NumberFormat(t)).format(n);
@@ -723,7 +743,7 @@ function describeValue(value, chromeT, spec, formatValue) {
723
743
  const optionLabel = spec?.options?.find((o) => o.value === String(value))?.label;
724
744
  if (optionLabel !== void 0) return optionLabel;
725
745
  if (spec && formatValue) {
726
- const formatted = formatValue(spec.kind, value);
746
+ const formatted = formatValue(spec.kind, value, spec.zone);
727
747
  if (formatted !== void 0) return formatted;
728
748
  }
729
749
  return String(value);
@@ -804,7 +824,7 @@ function RelationLabelResolver(props) {
804
824
  const { to, id, by, onResolve } = props;
805
825
  const targetDef = useApp().registry.get(to);
806
826
  const { record } = useRelatedRecord(to, id, by === void 0 ? void 0 : { by });
807
- const rowTitle = useRowTitle(to, targetDef?.displayField);
827
+ const rowTitle = useRowTitle(to, targetDef?.displayField, { recordTitle: true });
808
828
  useEffect(() => {
809
829
  if (!record) return;
810
830
  onResolve(relationLabelKey(to, by, id), rowTitle(record));
@@ -880,6 +900,8 @@ function FilterBadges(props) {
880
900
  const { group, setGroup, available, fixed, testIdBase, onOpenAt, onRemoved, pinnedFields = [], pinnedValue = [], setPinnedValue } = props;
881
901
  const chromeT = useChromeT();
882
902
  const locale = useOptionalLocale();
903
+ const viewer = useTimeZone();
904
+ const timeContext = useTimeContext();
883
905
  const tt = (key, params, fallback) => chromeT(key, {
884
906
  params,
885
907
  ...typeof params?.count === "number" ? { count: params.count } : {},
@@ -887,13 +909,18 @@ function FilterBadges(props) {
887
909
  });
888
910
  const removeLabel = chromeT("filters.removeRow", { defaultValue: "Remove filter" });
889
911
  const { enumLabels, relationLabels, onEnumResolved, onRelationResolved } = useFormatValueMaps();
890
- const formatValue = (kind, value) => {
912
+ const formatValue = (kind, value, fieldZone) => {
891
913
  if (kind.kind === "enum") return enumLabels[kind.enumName]?.[String(value)];
892
914
  if (kind.kind === "relation") return relationLabels[relationLabelKey(kind.to, kind.by, String(value))];
893
- if (kind.kind === "date") {
894
- const d = new Date(String(value));
895
- if (Number.isNaN(d.getTime())) return void 0;
896
- return kind.time ? formatDateTime(d, locale) : formatDate(d, locale);
915
+ if (kind.kind === "date" && viewer.status === "ready") {
916
+ const zone = resolveTimeZone(timeContext.levels, fieldZone, timeContext.sources);
917
+ if (zone.status === "pending") return void 0;
918
+ return formatTimeValue(kind.time ? "dateTime" : "date", String(value), {
919
+ zone: zone.zone,
920
+ viewerZone: viewer.zone,
921
+ locale: localeTag(locale),
922
+ params: {}
923
+ });
897
924
  }
898
925
  };
899
926
  const orphanPinned = useMemo(() => {
@@ -1330,7 +1357,7 @@ function EnumValueControl(props) {
1330
1357
  function useRelatedLabels(to, ids, by) {
1331
1358
  const targetDef = useApp().registry.get(to);
1332
1359
  const idField = (targetDef?.data)?.idField;
1333
- const rowTitle = useRowTitle(to, targetDef?.displayField);
1360
+ const rowTitle = useRowTitle(to, targetDef?.displayField, { recordTitle: true });
1334
1361
  const field = by ?? (typeof idField === "string" && idField.length > 0 ? idField : "id");
1335
1362
  const query = useList(to, {
1336
1363
  pagination: {
@@ -1374,7 +1401,7 @@ function RelationValueControl(props) {
1374
1401
  arity,
1375
1402
  onChange
1376
1403
  });
1377
- const rowTitle = useRowTitle(to, targetDef?.displayField);
1404
+ const rowTitle = useRowTitle(to, targetDef?.displayField, { recordTitle: true });
1378
1405
  const access = useListAccess(to);
1379
1406
  const searchable = useMemo(() => access.status === "ready" && narrowSearchDecl({ fields: [displayField] }, (name) => access.fieldVisible(name)) !== void 0, [access, displayField]);
1380
1407
  const listQuery = useList(to, {
@@ -1480,21 +1507,56 @@ function RelationValueControl(props) {
1480
1507
  });
1481
1508
  }
1482
1509
  //#endregion
1510
+ //#region src/fields/field-time-zone.ts
1511
+ function useFieldTimeZone(zone, row) {
1512
+ const { sources: session } = useTimeContext();
1513
+ const sources = useMemo(() => row === void 0 ? session : {
1514
+ ...session,
1515
+ record: {
1516
+ status: "ready",
1517
+ value: row,
1518
+ refreshing: false
1519
+ }
1520
+ }, [session, row]);
1521
+ const fieldZone = useMemo(() => normaliseFieldZone(zone), [zone]);
1522
+ return useTimeZone(fieldZone, sources);
1523
+ }
1524
+ const DATE_KEYS = [
1525
+ "dateStyle",
1526
+ "timeStyle",
1527
+ "zoneName"
1528
+ ];
1529
+ function dateDisplayParams(ui) {
1530
+ const display = ui?.display;
1531
+ if (display === null || typeof display !== "object") return {};
1532
+ const params = {};
1533
+ for (const key of DATE_KEYS) {
1534
+ const value = display[key];
1535
+ if (value !== void 0) params[key] = value;
1536
+ }
1537
+ return params;
1538
+ }
1539
+ //#endregion
1483
1540
  //#region src/fields/local-date-time.ts
1484
- function toLocalDateTimeText(value) {
1541
+ function toLocalDateTimeText(value, zone) {
1485
1542
  if (value === void 0 || value === null || value === "") return "";
1486
- const d = value instanceof Date ? value : new Date(String(value));
1487
- if (Number.isNaN(d.getTime())) return "";
1488
- const pad = (n) => String(n).padStart(2, "0");
1489
- return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
1543
+ const instant = canonicalInstant(value instanceof Date ? value.toISOString() : String(value));
1544
+ if (instant === void 0) return "";
1545
+ const { date, time } = instantToWall(instant, zone);
1546
+ return `${date}T${time.slice(0, 5)}`;
1490
1547
  }
1491
- function fromLocalDateTimeText(text) {
1492
- if (text === "") return void 0;
1493
- const d = new Date(text);
1494
- return Number.isNaN(d.getTime()) ? void 0 : d.toISOString();
1548
+ function fromLocalDateTimeText(text, zone) {
1549
+ const [date, time, ...rest] = text.split("T");
1550
+ if (date === void 0 || time === void 0 || rest.length > 0) return void 0;
1551
+ if (!isCalendarDate(date) || !isWallTime(time)) return void 0;
1552
+ return wallToInstant(date, time, zone);
1495
1553
  }
1496
1554
  //#endregion
1497
1555
  //#region src/list-kit/filter-builder/values/scalar-value-input.tsx
1556
+ function useFilterZone(fieldZone) {
1557
+ const zone = useFieldTimeZone(fieldZone, void 0);
1558
+ return zone.status === "ready" ? zone.zone : "UTC";
1559
+ }
1498
1560
  function isDateTime(kind) {
1499
1561
  return kind.kind === "date" && kind.time === true;
1500
1562
  }
@@ -1505,18 +1567,18 @@ function inputTypeFor(kind) {
1505
1567
  default: return "text";
1506
1568
  }
1507
1569
  }
1508
- function toText(kind, value) {
1509
- if (isDateTime(kind)) return toLocalDateTimeText(value);
1570
+ function toText(kind, value, zone) {
1571
+ if (isDateTime(kind)) return toLocalDateTimeText(value, zone);
1510
1572
  if (value === void 0 || value === null || value === "") return "";
1511
1573
  return String(value);
1512
1574
  }
1513
- function parseOne(kind, raw) {
1575
+ function parseOne(kind, raw, zone) {
1514
1576
  if (raw === "") return void 0;
1515
1577
  if (kind.kind === "number") {
1516
1578
  const n = Number(raw);
1517
1579
  return Number.isFinite(n) ? n : void 0;
1518
1580
  }
1519
- if (isDateTime(kind)) return fromLocalDateTimeText(raw);
1581
+ if (isDateTime(kind)) return fromLocalDateTimeText(raw, zone);
1520
1582
  return raw;
1521
1583
  }
1522
1584
  function ScalarValueInput(props) {
@@ -1539,7 +1601,8 @@ function ScalarValueInput(props) {
1539
1601
  }
1540
1602
  function ScalarSingleInput(props) {
1541
1603
  const { value, onChange, kind, testId, autoFocus, inputType, ariaLabel, debounceMs = 300 } = props;
1542
- const storedText = toText(kind, value);
1604
+ const zone = useFilterZone(props.zone);
1605
+ const storedText = toText(kind, value, zone);
1543
1606
  const [text, setText] = useState(storedText);
1544
1607
  const lastPushedRef = useRef(storedText);
1545
1608
  const timerRef = useRef(null);
@@ -1547,8 +1610,8 @@ function ScalarSingleInput(props) {
1547
1610
  const commitRef = useRef(() => {});
1548
1611
  useEffect(() => {
1549
1612
  commitRef.current = (raw) => {
1550
- const parsed = parseOne(kind, raw);
1551
- lastPushedRef.current = toText(kind, parsed);
1613
+ const parsed = parseOne(kind, raw, zone);
1614
+ lastPushedRef.current = toText(kind, parsed, zone);
1552
1615
  pendingRawRef.current = null;
1553
1616
  onChange(parsed);
1554
1617
  };
@@ -1597,8 +1660,9 @@ function ScalarMultiInput(props) {
1597
1660
  const { value, onChange, kind, testId, autoFocus, inputType, ariaLabel } = props;
1598
1661
  const chips = Array.isArray(value) ? value.map((v) => String(v)) : [];
1599
1662
  const [draft, setDraft] = useState("");
1663
+ const zone = useFilterZone(props.zone);
1600
1664
  const addChip = () => {
1601
- const parsed = parseOne(kind, draft.trim());
1665
+ const parsed = parseOne(kind, draft.trim(), zone);
1602
1666
  if (parsed === void 0) return;
1603
1667
  const text = String(parsed);
1604
1668
  setDraft("");
@@ -1788,6 +1852,7 @@ function FilterRow(props) {
1788
1852
  debounceMs,
1789
1853
  fieldLabel: spec.label,
1790
1854
  options: spec.options,
1855
+ ...spec.zone === void 0 ? {} : { zone: spec.zone },
1791
1856
  fill: true
1792
1857
  })
1793
1858
  }),
@@ -2089,7 +2154,8 @@ function PinnedControl(props) {
2089
2154
  testId: `${testIdBase}:pinned:${spec.field}`,
2090
2155
  fieldLabel: spec.label,
2091
2156
  placeholder: spec.label,
2092
- options: spec.options
2157
+ options: spec.options,
2158
+ ...spec.zone === void 0 ? {} : { zone: spec.zone }
2093
2159
  });
2094
2160
  }
2095
2161
  //#endregion
@@ -2347,6 +2413,6 @@ function FilterBuilder(props) {
2347
2413
  ] });
2348
2414
  }
2349
2415
  //#endregion
2350
- export { TableRow as A, loadLocale as B, SelectValue as C, TableCell as D, TableCaption as E, ResolvedFieldInput as F, useFieldMetaDiagnostic as I, fieldDescription as L, badgeVariants as M, MetaPlaceholder as N, TableHead as O, ResolvedFieldDisplay as P, lowerLegacyField as R, SelectTrigger as S, TableBody as T, saveLocale as V, SelectItem as _, PinnedFilterControls as a, SelectScrollUpButton as b, fromLocalDateTimeText as c, formatDate as d, formatDateTime as f, SelectGroup as g, SelectContent as h, FacetedFilterPicker as i, Badge as j, TableHeader as k, toLocalDateTimeText as l, Select as m, PresetFilterControls as n, FilterPanel as o, formatNumber as p, DataTableFacetedFilter as r, FilterValueControl as s, FilterBuilder as t, FilterBadges as u, SelectLabel as v, Table as w, SelectSeparator as x, SelectScrollDownButton as y, DEFAULT_LANGUAGE_STORAGE_KEY as z };
2416
+ export { TableHeader as A, DEFAULT_LANGUAGE_STORAGE_KEY as B, SelectTrigger as C, TableCaption as D, TableBody as E, ResolvedFieldDisplay as F, saveLocale as H, ResolvedFieldInput as I, useFieldMetaDiagnostic as L, Badge as M, badgeVariants as N, TableCell as O, MetaPlaceholder as P, fieldDescription as R, SelectSeparator as S, Table as T, loadLocale as V, SelectGroup as _, PinnedFilterControls as a, SelectScrollDownButton as b, fromLocalDateTimeText as c, useFieldTimeZone as d, FilterBadges as f, SelectContent as g, Select as h, FacetedFilterPicker as i, TableRow as j, TableHead as k, toLocalDateTimeText as l, localeTag as m, PresetFilterControls as n, FilterPanel as o, formatNumber as p, DataTableFacetedFilter as r, FilterValueControl as s, FilterBuilder as t, dateDisplayParams as u, SelectItem as v, SelectValue as w, SelectScrollUpButton as x, SelectLabel as y, lowerLegacyField as z };
2351
2417
 
2352
- //# sourceMappingURL=filter-builder-DaWHUZuV.js.map
2418
+ //# sourceMappingURL=filter-builder-04nas3eq.js.map