@contractspec/lib.design-system 4.1.0 → 4.3.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 (157) hide show
  1. package/README.md +117 -1
  2. package/dist/browser/components/atoms/Input.js +1 -1
  3. package/dist/browser/components/data-view/DataViewGrid.js +1 -0
  4. package/dist/browser/components/data-view/DataViewList.js +1 -1
  5. package/dist/browser/components/data-view/DataViewRenderer.js +1 -1
  6. package/dist/browser/components/data-view/DataViewTable.js +1 -1
  7. package/dist/browser/components/data-view/collection.js +1 -0
  8. package/dist/browser/components/data-view/utils.js +1 -1
  9. package/dist/browser/components/forms/controls/Autocomplete.js +1 -1
  10. package/dist/browser/components/forms/controls/Select.js +1 -1
  11. package/dist/browser/components/forms/controls/select-options.js +1 -0
  12. package/dist/browser/components/molecules/Tabs.js +1 -1
  13. package/dist/browser/components/object-reference/DefaultObjectReferenceParts.js +1 -0
  14. package/dist/browser/components/object-reference/ObjectReferenceHandler.js +1 -0
  15. package/dist/browser/components/object-reference/ReferenceIcon.js +1 -0
  16. package/dist/browser/components/object-reference/actions.js +1 -0
  17. package/dist/browser/components/object-reference/index.js +1 -0
  18. package/dist/browser/components/object-reference/maps.js +1 -0
  19. package/dist/browser/components/object-reference/runtime.js +1 -0
  20. package/dist/browser/components/object-reference/types.js +0 -0
  21. package/dist/browser/components/object-reference/useObjectReferenceController.js +1 -0
  22. package/dist/browser/components/shell/AppShell.js +1 -0
  23. package/dist/browser/components/shell/AppShell.types.js +0 -0
  24. package/dist/browser/components/shell/PageOutline.js +1 -0
  25. package/dist/browser/components/shell/ShellSidebar.js +1 -0
  26. package/dist/browser/components/shell/index.js +1 -0
  27. package/dist/browser/components/shell/outline.js +1 -0
  28. package/dist/browser/components/shell/types.js +0 -0
  29. package/dist/browser/design-system.feature.js +1 -1
  30. package/dist/browser/index.js +1 -1
  31. package/dist/browser/renderers/form-contract/renderer.js +1 -1
  32. package/dist/browser/renderers/form-contract/shell.js +1 -1
  33. package/dist/browser/shell.js +1 -0
  34. package/dist/browser/theme/tailwind-css.js +5 -5
  35. package/dist/components/atoms/Input.js +1 -1
  36. package/dist/components/data-view/DataViewGrid.d.ts +12 -0
  37. package/dist/components/data-view/DataViewGrid.js +1 -0
  38. package/dist/components/data-view/DataViewGrid.native.d.ts +12 -0
  39. package/dist/components/data-view/DataViewList.d.ts +3 -2
  40. package/dist/components/data-view/DataViewList.js +1 -1
  41. package/dist/components/data-view/DataViewList.native.d.ts +12 -0
  42. package/dist/components/data-view/DataViewRenderer.d.ts +8 -2
  43. package/dist/components/data-view/DataViewRenderer.js +1 -1
  44. package/dist/components/data-view/DataViewRenderer.native.d.ts +8 -2
  45. package/dist/components/data-view/DataViewTable.d.ts +3 -2
  46. package/dist/components/data-view/DataViewTable.js +1 -1
  47. package/dist/components/data-view/DataViewTable.native.d.ts +3 -2
  48. package/dist/components/data-view/collection.d.ts +16 -0
  49. package/dist/components/data-view/collection.js +1 -0
  50. package/dist/components/data-view/utils.js +1 -1
  51. package/dist/components/forms/controls/Autocomplete.d.ts +9 -1
  52. package/dist/components/forms/controls/Autocomplete.js +1 -1
  53. package/dist/components/forms/controls/Autocomplete.native.d.ts +5 -1
  54. package/dist/components/forms/controls/Select.d.ts +7 -5
  55. package/dist/components/forms/controls/Select.js +1 -1
  56. package/dist/components/forms/controls/Select.native.d.ts +7 -5
  57. package/dist/components/forms/controls/index.d.ts +1 -1
  58. package/dist/components/forms/controls/select-options.d.ts +17 -0
  59. package/dist/components/forms/controls/select-options.js +1 -0
  60. package/dist/components/molecules/Tabs.js +1 -1
  61. package/dist/components/object-reference/DefaultObjectReferenceParts.d.ts +18 -0
  62. package/dist/components/object-reference/DefaultObjectReferenceParts.js +1 -0
  63. package/dist/components/object-reference/DefaultObjectReferenceParts.native.d.ts +13 -0
  64. package/dist/components/object-reference/ObjectReferenceHandler.d.ts +2 -0
  65. package/dist/components/object-reference/ObjectReferenceHandler.js +1 -0
  66. package/dist/components/object-reference/ObjectReferenceHandler.native.d.ts +2 -0
  67. package/dist/components/object-reference/ReferenceIcon.d.ts +7 -0
  68. package/dist/components/object-reference/ReferenceIcon.js +1 -0
  69. package/dist/components/object-reference/actions.d.ts +7 -0
  70. package/dist/components/object-reference/actions.js +1 -0
  71. package/dist/components/object-reference/index.d.ts +4 -0
  72. package/dist/components/object-reference/index.js +1 -0
  73. package/dist/components/object-reference/index.native.d.ts +4 -0
  74. package/dist/components/object-reference/maps.d.ts +8 -0
  75. package/dist/components/object-reference/maps.js +1 -0
  76. package/dist/components/object-reference/runtime.d.ts +12 -0
  77. package/dist/components/object-reference/runtime.js +1 -0
  78. package/dist/components/object-reference/types.d.ts +73 -0
  79. package/dist/components/object-reference/types.js +0 -0
  80. package/dist/components/object-reference/useObjectReferenceController.d.ts +13 -0
  81. package/dist/components/object-reference/useObjectReferenceController.js +1 -0
  82. package/dist/components/shell/AppShell.d.ts +2 -0
  83. package/dist/components/shell/AppShell.js +1 -0
  84. package/dist/components/shell/AppShell.native.d.ts +2 -0
  85. package/dist/components/shell/AppShell.types.d.ts +21 -0
  86. package/dist/components/shell/AppShell.types.js +0 -0
  87. package/dist/components/shell/PageOutline.d.ts +12 -0
  88. package/dist/components/shell/PageOutline.js +1 -0
  89. package/dist/components/shell/PageOutline.native.d.ts +11 -0
  90. package/dist/components/shell/ShellSidebar.d.ts +11 -0
  91. package/dist/components/shell/ShellSidebar.js +1 -0
  92. package/dist/components/shell/index.d.ts +5 -0
  93. package/dist/components/shell/index.js +1 -0
  94. package/dist/components/shell/index.native.d.ts +4 -0
  95. package/dist/components/shell/outline.d.ts +5 -0
  96. package/dist/components/shell/outline.js +1 -0
  97. package/dist/components/shell/types.d.ts +66 -0
  98. package/dist/components/shell/types.js +0 -0
  99. package/dist/design-system.feature.js +1 -1
  100. package/dist/index.d.ts +4 -0
  101. package/dist/index.js +1 -1
  102. package/dist/native/components/atoms/Input.js +1 -1
  103. package/dist/native/components/atoms/Input.native.js +1 -1
  104. package/dist/native/components/data-view/DataViewGrid.js +1 -0
  105. package/dist/native/components/data-view/DataViewGrid.native.js +1 -0
  106. package/dist/native/components/data-view/DataViewList.js +1 -1
  107. package/dist/native/components/data-view/DataViewList.native.js +1 -0
  108. package/dist/native/components/data-view/DataViewRenderer.js +1 -1
  109. package/dist/native/components/data-view/DataViewRenderer.native.js +1 -1
  110. package/dist/native/components/data-view/DataViewTable.js +1 -1
  111. package/dist/native/components/data-view/DataViewTable.native.js +1 -1
  112. package/dist/native/components/data-view/collection.js +1 -0
  113. package/dist/native/components/data-view/utils.js +1 -1
  114. package/dist/native/components/forms/controls/Autocomplete.js +1 -1
  115. package/dist/native/components/forms/controls/Autocomplete.native.js +1 -1
  116. package/dist/native/components/forms/controls/Select.js +1 -1
  117. package/dist/native/components/forms/controls/Select.native.js +1 -1
  118. package/dist/native/components/forms/controls/select-options.js +1 -0
  119. package/dist/native/components/molecules/Tabs.js +1 -1
  120. package/dist/native/components/molecules/Tabs.native.js +1 -1
  121. package/dist/native/components/object-reference/DefaultObjectReferenceParts.js +1 -0
  122. package/dist/native/components/object-reference/DefaultObjectReferenceParts.native.js +1 -0
  123. package/dist/native/components/object-reference/ObjectReferenceHandler.js +1 -0
  124. package/dist/native/components/object-reference/ObjectReferenceHandler.native.js +1 -0
  125. package/dist/native/components/object-reference/ReferenceIcon.js +1 -0
  126. package/dist/native/components/object-reference/actions.js +1 -0
  127. package/dist/native/components/object-reference/index.js +1 -0
  128. package/dist/native/components/object-reference/index.native.js +1 -0
  129. package/dist/native/components/object-reference/maps.js +1 -0
  130. package/dist/native/components/object-reference/runtime.js +1 -0
  131. package/dist/native/components/object-reference/types.js +0 -0
  132. package/dist/native/components/object-reference/useObjectReferenceController.js +1 -0
  133. package/dist/native/components/shell/AppShell.js +1 -0
  134. package/dist/native/components/shell/AppShell.native.js +1 -0
  135. package/dist/native/components/shell/AppShell.types.js +0 -0
  136. package/dist/native/components/shell/PageOutline.js +1 -0
  137. package/dist/native/components/shell/PageOutline.native.js +1 -0
  138. package/dist/native/components/shell/ShellSidebar.js +1 -0
  139. package/dist/native/components/shell/index.js +1 -0
  140. package/dist/native/components/shell/index.native.js +1 -0
  141. package/dist/native/components/shell/outline.js +1 -0
  142. package/dist/native/components/shell/types.js +0 -0
  143. package/dist/native/design-system.feature.js +1 -1
  144. package/dist/native/index.js +1 -1
  145. package/dist/native/renderers/form-contract/renderer.js +1 -1
  146. package/dist/native/renderers/form-contract/shell.js +1 -1
  147. package/dist/native/shell.js +1 -0
  148. package/dist/native/shell.native.js +1 -0
  149. package/dist/native/theme/tailwind-css.js +5 -5
  150. package/dist/renderers/form-contract/renderer.js +1 -1
  151. package/dist/renderers/form-contract/shell.d.ts +9 -0
  152. package/dist/renderers/form-contract/shell.js +1 -1
  153. package/dist/shell.d.ts +1 -0
  154. package/dist/shell.js +1 -0
  155. package/dist/shell.native.d.ts +1 -0
  156. package/dist/theme/tailwind-css.js +5 -5
  157. package/package.json +355 -7
@@ -0,0 +1,12 @@
1
+ import type { DataViewDensity, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
2
+ import * as React from 'react';
3
+ export interface DataViewListProps<TItem = Record<string, unknown>> {
4
+ spec: DataViewSpec;
5
+ items: readonly TItem[];
6
+ className?: string;
7
+ renderActions?: (item: TItem) => React.ReactNode;
8
+ onSelect?: (item: TItem) => void;
9
+ emptyState?: React.ReactNode;
10
+ density?: DataViewDensity;
11
+ }
12
+ export declare function DataViewList<TItem = Record<string, unknown>>({ spec, items, className, renderActions, onSelect, emptyState, density, }: DataViewListProps<TItem>): import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,4 @@
1
- import type { DataViewFilterSet, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
1
+ import type { DataViewCollectionMode, DataViewDensity, DataViewFilterSet, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
2
2
  import * as React from 'react';
3
3
  export interface DataViewRendererProps {
4
4
  spec: DataViewSpec;
@@ -13,6 +13,12 @@ export interface DataViewRendererProps {
13
13
  headerActions?: React.ReactNode;
14
14
  emptyState?: React.ReactNode;
15
15
  footer?: React.ReactNode;
16
+ viewMode?: DataViewCollectionMode;
17
+ defaultViewMode?: DataViewCollectionMode;
18
+ onViewModeChange?: (mode: DataViewCollectionMode) => void;
19
+ density?: DataViewDensity;
20
+ defaultDensity?: DataViewDensity;
21
+ onDensityChange?: (density: DataViewDensity) => void;
16
22
  search?: string;
17
23
  onSearchChange?: (value: string) => void;
18
24
  filters?: Record<string, unknown> | DataViewFilterSet;
@@ -24,4 +30,4 @@ export interface DataViewRendererProps {
24
30
  };
25
31
  onPageChange?: (page: number) => void;
26
32
  }
27
- export declare function DataViewRenderer({ spec, items, item, className, renderActions, onSelect, onRowClick, toolbar, loading, headerActions, emptyState, footer, search, onSearchChange, filters, onFilterChange, pagination, onPageChange, }: DataViewRendererProps): import("react/jsx-runtime").JSX.Element;
33
+ export declare function DataViewRenderer({ spec, items, item, className, renderActions, onSelect, onRowClick, toolbar, loading, headerActions, emptyState, footer, viewMode, defaultViewMode, onViewModeChange, density, defaultDensity, onDensityChange, search, onSearchChange, filters, onFilterChange, pagination, onPageChange, }: DataViewRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- import{jsx as J,jsxs as c,Fragment as p}from"react/jsx-runtime";import{resolveDataViewFilters as S}from"@contractspec/lib.contracts-spec/data-views";import{Pagination as d}from"@contractspec/lib.ui-kit-web/ui/atoms/Pagination";import{VStack as h}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as f}from"@contractspec/lib.ui-kit-web/ui/text";import*as L from"react";import{resolveTranslationString as V,useDesignSystemTranslation as u}from"../../i18n/translation";import{FiltersToolbar as m}from"../molecules/FiltersToolbar";import{DataViewDetail as v}from"./DataViewDetail";import{DataViewList as b}from"./DataViewList";import{DataViewTable as y}from"./DataViewTable";export function DataViewRenderer({spec:B,items:G=[],item:X=null,className:M,renderActions:$,onSelect:q,onRowClick:P,toolbar:R,loading:T,headerActions:Y,emptyState:Q,footer:j,search:w,onSearchChange:_,filters:I,onFilterChange:Z,pagination:K,onPageChange:D}){const z=u(),O=L.useMemo(()=>S({filters:B.view.filters,scope:B.view.filterScope,user:g(I)}),[I,B.view.filterScope,B.view.filters]),N=L.useMemo(()=>{if(B.view.filterScope){const E=Object.entries(O.user).map(([H,W])=>({key:H,label:`${A(B,H)}: ${F(W)}`,onRemove:()=>{const{[H]:r,...C}=O.user;Z?.(C)}})),U=O.lockedChips==="hidden"?[]:Object.entries(O.locked).map(([H,W])=>({key:`locked-${H}`,label:`${A(B,H)}: ${F(W)}`,disabled:!0}));return[...E,...U]}return I?Object.entries(I).map(([E,U])=>({key:E,label:`${E}: ${String(U)}`,onRemove:()=>{const{[E]:H,...W}=I;Z?.(W)}})):[]},[I,Z,O,B]),k=B.view.filterScope?Object.keys(O.user).length>0:Boolean(I&&Object.keys(I).length>0),x=L.useMemo(()=>{switch(B.view.kind){case"list":return J(b,{spec:B,items:G,className:M,renderActions:$,onSelect:q,emptyState:Q});case"table":return J(y,{spec:B,items:G,className:M,onRowClick:P,toolbar:R,loading:T,emptyState:Q,headerActions:Y,footer:j});case"detail":return J(v,{spec:B,item:X,className:M,emptyState:Q,headerActions:Y});case"grid":{const E=B.view,U={kind:"list",layout:"card",fields:E.fields,filters:E.filters,actions:E.actions,primaryField:E.primaryField,secondaryFields:E.secondaryFields,filterScope:E.filterScope},H={...B,view:U};return J(b,{spec:H,items:G,className:M,renderActions:$,onSelect:q,emptyState:Q})}default:return J(f,{className:M,children:V("Unsupported data view kind",z)})}},[B,G,X,M,$,q,P,R,T,Y,Q,j,z]);if(!(B.view.kind==="list"||B.view.kind==="table"||B.view.kind==="grid"))return J(p,{children:x});return c(h,{gap:"lg",children:[(B.view.filters?.length||_||N.length)&&J(m,{searchValue:w,onSearchChange:_,searchPlaceholder:V("Search...",z)??"Search...",activeChips:N,onClearAll:k?()=>Z?.({}):void 0,right:B.view.kind==="table"?void 0:Y}),x,K&&K.total>0&&J(d,{currentPage:K.page,totalPages:Math.ceil(K.total/K.pageSize),totalItems:K.total,itemsPerPage:K.pageSize,onPageChange:(E)=>D?.(E),onItemsPerPageChange:(E)=>{D?.(1)},showItemsPerPage:!1})]})}function g(B){if(!B)return;return Object.fromEntries(Object.entries(B??{}).filter((G)=>Boolean(G[1]&&typeof G[1]==="object"&&"kind"in G[1]&&typeof G[1].kind==="string")))}function A(B,G){return B.view.filters?.find((X)=>X.key===G)?.label??G}function F(B){if(!B)return"";if(B.kind==="single")return String(B.value);if(B.kind==="multi")return B.values.map(String).join(", ");if(B.kind==="range")return[B.from==null?"":String(B.from),B.to==null?"":String(B.to)].filter(Boolean).join(" - ");return`${B.mode}(${B.clauses.length})`}
1
+ import{jsx as W,jsxs as T,Fragment as hB}from"react/jsx-runtime";import{resolveDataViewFilters as GB}from"@contractspec/lib.contracts-spec/data-views";import{Pagination as qB}from"@contractspec/lib.ui-kit-web/ui/atoms/Pagination";import{VStack as KB}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as LB}from"@contractspec/lib.ui-kit-web/ui/text";import{Grid3X3 as IB,List as PB,Table2 as EB}from"lucide-react";import*as I from"react";import{resolveTranslationString as n,useDesignSystemTranslation as NB}from"../../i18n/translation";import{Button as V}from"../atoms/Button";import{Input as b}from"../atoms/Input";import{FiltersToolbar as RB}from"../molecules/FiltersToolbar";import{getDataViewCollectionConfig as TB,getDataViewCollectionViewModesConfig as AB,isDataViewCollectionKind as i,resolveAllowedCollectionModes as _B,resolveCollectionDensity as jB,resolveCollectionView as MB}from"./collection";import{DataViewDetail as VB}from"./DataViewDetail";import{DataViewGrid as kB}from"./DataViewGrid";import{DataViewList as SB}from"./DataViewList";import{DataViewTable as DB}from"./DataViewTable";export function DataViewRenderer({spec:B,items:H=[],item:O=null,className:U,renderActions:J,onSelect:Y,onRowClick:Z,toolbar:A,loading:q,headerActions:X,emptyState:E,footer:w,viewMode:F,defaultViewMode:C,onViewModeChange:HB,density:h,defaultDensity:g,onDensityChange:JB,search:OB,onSearchChange:y,filters:z,onFilterChange:N,pagination:K,onPageChange:p}){const k=NB(),S=I.useMemo(()=>_B(B.view),[B.view]),[QB,UB]=I.useState(C),u=F??QB??C,_=I.useMemo(()=>MB(B,u),[u,B]),[WB,YB]=I.useState(g),P=jB(B,{density:h??WB,defaultDensity:g}),ZB=TB(B.view),$B=AB(B.view),$=ZB?.toolbar,j=$?.enabled!==!1,v=$?.filters!==!1,M=$?.actions??"end",d=M==="start"||M==="both"?X:void 0,f=M==="end"||M==="both"?X:void 0,c=typeof $?.search==="object"?$.search:void 0,r=Boolean(j&&$?.search!==!1&&y),G=I.useMemo(()=>GB({filters:B.view.filters,scope:B.view.filterScope,user:bB(z)}),[z,B.view.filterScope,B.view.filters]),o=I.useMemo(()=>{if(B.view.filterScope){const Q=Object.entries(G.user).map(([L,R])=>({key:L,label:`${a(B,L)}: ${l(R)}`,onRemove:()=>{const{[L]:yB,...zB}=G.user;N?.(zB)}})),D=G.lockedChips==="hidden"?[]:Object.entries(G.locked).map(([L,R])=>({key:`locked-${L}`,label:`${a(B,L)}: ${l(R)}`,disabled:!0}));return[...Q,...D]}return z?Object.entries(z).map(([Q,D])=>({key:Q,label:`${Q}: ${String(D)}`,onRemove:()=>{const{[Q]:L,...R}=z;N?.(R)}})):[]},[z,N,G,B]),XB=B.view.filterScope?Object.keys(G.user).length>0:Boolean(z&&Object.keys(z).length>0),s=I.useMemo(()=>{const Q=i(B.view.kind)?_.spec:B;switch(Q.view.kind){case"list":return W(SB,{spec:Q,items:H,className:U,renderActions:J,onSelect:Y,emptyState:E,density:P});case"table":return W(DB,{spec:Q,items:H,className:U,onRowClick:Z,toolbar:A,loading:q,emptyState:E,headerActions:j?void 0:X,footer:w,density:P});case"detail":return W(VB,{spec:B,item:O,className:U,emptyState:E,headerActions:X});case"grid":return W(kB,{spec:Q,items:H,className:U,renderActions:J,onSelect:Y,emptyState:E,density:P});default:return W(LB,{className:U,children:n("Unsupported data view kind",k)})}},[B,_.spec,H,O,U,J,Y,Z,A,q,X,E,w,P,j,k]);if(!(B.view.kind==="list"||B.view.kind==="table"||B.view.kind==="grid"))return W(hB,{children:s});return T(KB,{gap:"lg",children:[j&&(v&&B.view.filters?.length||r||o.length||S.length>1||$?.density||d||f)?T(RB,{searchValue:OB,onSearchChange:r?y:void 0,searchPlaceholder:c?.placeholder??n("Search...",k)??"Search...",debounceMs:c?.debounceMs,activeChips:o,onClearAll:XB?()=>N?.({}):void 0,right:f,children:[d,S.length>1&&$?.viewMode!==!1?W(wB,{mode:_.mode,allowedModes:S,labels:i(B.view.kind)?$B?.labels:void 0,onChange:(Q)=>{if(Q===_.mode)return;if(F===void 0)UB(Q);HB?.(Q)}}):null,$?.density?W(FB,{density:P,onChange:(Q)=>{if(Q===P)return;if(h===void 0)YB(Q);JB?.(Q)}}):null,v?W(xB,{filters:B.view.filters,values:G.user,lockedKeys:Object.keys(G.locked),onFilterChange:N}):null]}):null,s,K&&K.total>0&&W(qB,{currentPage:K.page,totalPages:Math.ceil(K.total/K.pageSize),totalItems:K.total,itemsPerPage:K.pageSize,onPageChange:(Q)=>p?.(Q),onItemsPerPageChange:(Q)=>{p?.(1)},showItemsPerPage:!1})]})}function bB(B){if(!B)return;return Object.fromEntries(Object.entries(B??{}).filter((H)=>Boolean(H[1]&&typeof H[1]==="object"&&"kind"in H[1]&&typeof H[1].kind==="string")))}function a(B,H){return B.view.filters?.find((O)=>O.key===H)?.label??H}function l(B){if(!B)return"";if(B.kind==="single")return String(B.value);if(B.kind==="multi")return B.values.map(String).join(", ");if(B.kind==="range")return[B.from==null?"":String(B.from),B.to==null?"":String(B.to)].filter(Boolean).join(" - ");return`${B.mode}(${B.clauses.length})`}function xB({filters:B,values:H,lockedKeys:O,onFilterChange:U}){if(!B?.length||!U)return null;const J=new Set(O),Y=B.filter((Z)=>Z.type!=="search"&&!J.has(Z.key));if(Y.length===0)return null;return W("div",{className:"flex flex-wrap items-center gap-2",children:Y.map((Z)=>W(mB,{filter:Z,value:H[Z.key],values:H,onFilterChange:U},Z.key))})}function mB({filter:B,value:H,values:O,onFilterChange:U}){if(B.type==="boolean"){const J=H?.kind==="single"?H.value===!0:void 0;return T(V,{size:"sm",variant:"outline",onPress:()=>t(O,B.key,J===void 0?!0:!J,U),children:[B.label,": ",J?"Oui":"Non"]})}if(B.valueMode==="range"){const J=H?.kind==="range"?H:void 0;return T("div",{className:"flex min-w-0 items-center gap-2",children:[W(b,{type:x(B),inputMode:m(B),value:J?.from==null?"":String(J.from),onChange:(Y)=>e(O,B,"from",Y.currentTarget.value,U),placeholder:`${B.label} min`,className:"h-9 w-28"}),W(b,{type:x(B),inputMode:m(B),value:J?.to==null?"":String(J.to),onChange:(Y)=>e(O,B,"to",Y.currentTarget.value,U),placeholder:`${B.label} max`,className:"h-9 w-28"})]})}return W(b,{type:x(B),inputMode:m(B),value:H?.kind==="single"?String(H.value):"",onChange:(J)=>t(O,B.key,BB(B,J.currentTarget.value),U),placeholder:B.label,className:"h-9 w-36"})}function t(B,H,O,U){const J={...B};if(O===void 0||O==="")delete J[H];else J[H]={kind:"single",value:O};U(J)}function e(B,H,O,U,J){const Y=B[H.key],Z=Y?.kind==="range"?Y:{},A=BB(H,U),q={...Z,[O]:A};if(q.from==null&&q.to==null){const X={...B};delete X[H.key];J(X);return}J({...B,[H.key]:{kind:"range",from:q.from,to:q.to}})}function BB(B,H){if(H==="")return;switch(B.type){case"number":case"percent":case"currency":case"duration":{const O=Number(H);return Number.isFinite(O)?O:void 0}default:return H}}function x(B){switch(B.type){case"number":case"percent":case"currency":case"duration":return"number";case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";default:return"text"}}function m(B){switch(B.type){case"number":case"percent":case"currency":case"duration":return"decimal";default:return}}function wB({mode:B,allowedModes:H,labels:O,onChange:U}){return W("div",{className:"flex items-center gap-1 rounded-md border bg-background p-1",children:H.map((J)=>{const Y=CB(J);return W(V,{size:"sm",variant:J===B?"default":"ghost",onPress:()=>U(J),ariaLabelI18n:O?.[J]??J,children:W(Y,{className:"h-4 w-4"})},J)})})}function FB({density:B,onChange:H}){return T("div",{className:"flex items-center gap-1 rounded-md border bg-background p-1",children:[W(V,{size:"sm",variant:B==="comfortable"?"default":"ghost",onPress:()=>H("comfortable"),children:"Comfort"}),W(V,{size:"sm",variant:B==="compact"?"default":"ghost",onPress:()=>H("compact"),children:"Compact"})]})}function CB(B){if(B==="grid")return IB;if(B==="table")return EB;return PB}
@@ -1,4 +1,4 @@
1
- import type { DataViewFilterSet, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
1
+ import type { DataViewCollectionMode, DataViewDensity, DataViewFilterSet, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
2
2
  import * as React from 'react';
3
3
  export interface DataViewRendererProps {
4
4
  spec: DataViewSpec;
@@ -13,6 +13,12 @@ export interface DataViewRendererProps {
13
13
  headerActions?: React.ReactNode;
14
14
  emptyState?: React.ReactNode;
15
15
  footer?: React.ReactNode;
16
+ viewMode?: DataViewCollectionMode;
17
+ defaultViewMode?: DataViewCollectionMode;
18
+ onViewModeChange?: (mode: DataViewCollectionMode) => void;
19
+ density?: DataViewDensity;
20
+ defaultDensity?: DataViewDensity;
21
+ onDensityChange?: (density: DataViewDensity) => void;
16
22
  search?: string;
17
23
  onSearchChange?: (value: string) => void;
18
24
  filters?: Record<string, unknown> | DataViewFilterSet;
@@ -24,4 +30,4 @@ export interface DataViewRendererProps {
24
30
  };
25
31
  onPageChange?: (page: number) => void;
26
32
  }
27
- export declare function DataViewRenderer({ spec, items, item, className, renderActions, onSelect, onRowClick, toolbar, loading, headerActions, emptyState, footer, search, onSearchChange, filters, onFilterChange, pagination, onPageChange, }: DataViewRendererProps): import("react/jsx-runtime").JSX.Element;
33
+ export declare function DataViewRenderer({ spec, items, item, className, renderActions, onSelect, onRowClick, toolbar, loading, headerActions, emptyState, footer, viewMode, defaultViewMode, onViewModeChange, density, defaultDensity, onDensityChange, search, onSearchChange, filters, onFilterChange, pagination, onPageChange, }: DataViewRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,4 @@
1
- import type { DataViewField, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
1
+ import type { DataViewDensity, DataViewField, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
2
2
  import * as React from 'react';
3
3
  export interface DataViewTableProps {
4
4
  spec: DataViewSpec;
@@ -10,8 +10,9 @@ export interface DataViewTableProps {
10
10
  emptyState?: React.ReactNode;
11
11
  headerActions?: React.ReactNode;
12
12
  footer?: React.ReactNode;
13
+ density?: DataViewDensity;
13
14
  }
14
- export declare function DataViewTable({ spec, items, className, onRowClick, toolbar, loading, emptyState, headerActions, footer, }: DataViewTableProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function DataViewTable({ spec, items, className, onRowClick, toolbar, loading, emptyState, headerActions, footer, density, }: DataViewTableProps): import("react/jsx-runtime").JSX.Element;
15
16
  export declare function DisplayValue({ item, fields, fieldKey, }: {
16
17
  item: Record<string, unknown>;
17
18
  fields: DataViewField[];
@@ -1 +1 @@
1
- import{jsx as E,jsxs as V}from"react/jsx-runtime";import{useDataViewTable as A}from"@contractspec/lib.presentation-runtime-react";import{HStack as F,VStack as h}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as X}from"@contractspec/lib.ui-kit-web/ui/text";import*as C from"react";import{resolveTranslationString as W,useDesignSystemTranslation as K}from"../../i18n/translation";import{DataTable as R}from"../data-table/DataTable";import{DataViewFormattedValue as Y,getAtPath as g}from"./utils";export function DataViewTable({spec:q,items:J,className:L,onRowClick:G,toolbar:O,loading:Z,emptyState:$,headerActions:B,footer:H}){const Q=K();if(q.view.kind!=="table")throw Error(`DataViewTable received view kind "${q.view.kind}", expected "table".`);const M=q.view,P=C.useMemo(()=>(M.rowExpansion?.fields??[]).map((z)=>M.fields.find((I)=>I.key===z)).filter((z)=>Boolean(z)),[M.fields,M.rowExpansion?.fields]),N=A({spec:q,data:J,renderValue:({value:z,field:I})=>E(Y,{value:z,format:I.format}),renderExpandedContent:P.length>0?({item:z,fields:I})=>E(h,{gap:"sm",className:"py-2",children:I.map((U)=>V(F,{justify:"between",align:"start",children:[E(X,{className:"font-medium text-muted-foreground text-sm",children:W(U.label,Q)}),E(X,{className:"text-right text-sm",children:E(DisplayValue,{item:z,fields:I,fieldKey:U.key})})]},U.key))}):void 0});return E(R,{controller:N,className:L,title:W(q.meta.title,Q),description:W(q.meta.description,Q),toolbar:O,loading:Z,headerActions:B,emptyState:$,footer:H,onRowPress:G?(z)=>G(z.original):void 0})}function D(q,J){return q.find((L)=>L.key===J)}export function DisplayValue({item:q,fields:J,fieldKey:L}){const G=D(J,L);if(!G)return"";const O=g(q,G.dataPath);return E(Y,{value:O,format:G.format})}
1
+ import{jsx as E,jsxs as _}from"react/jsx-runtime";import{useDataViewTable as C}from"@contractspec/lib.presentation-runtime-react";import{HStack as K,VStack as R}from"@contractspec/lib.ui-kit-web/ui/stack";import{Text as Z}from"@contractspec/lib.ui-kit-web/ui/text";import*as $ from"react";import{resolveTranslationString as X,useDesignSystemTranslation as g}from"../../i18n/translation";import{DataTable as D}from"../data-table/DataTable";import{DataViewFormattedValue as B,getAtPath as V}from"./utils";export function DataViewTable({spec:q,items:J,className:L,onRowClick:G,toolbar:O,loading:H,emptyState:P,headerActions:N,footer:A,density:Q}){const U=g();if(q.view.kind!=="table")throw Error(`DataViewTable received view kind "${q.view.kind}", expected "table".`);const Y=$.useMemo(()=>Q&&q.view.kind==="table"?{...q,view:{...q.view,density:Q}}:q,[Q,q]),M=Y.view,F=$.useMemo(()=>(M.rowExpansion?.fields??[]).map((z)=>M.fields.find((I)=>I.key===z)).filter((z)=>Boolean(z)),[M.fields,M.rowExpansion?.fields]),h=C({spec:Y,data:J,renderValue:({value:z,field:I})=>E(B,{value:z,format:I.format}),renderExpandedContent:F.length>0?({item:z,fields:I})=>E(R,{gap:"sm",className:"py-2",children:I.map((W)=>_(K,{justify:"between",align:"start",children:[E(Z,{className:"font-medium text-muted-foreground text-sm",children:X(W.label,U)}),E(Z,{className:"text-right text-sm",children:E(DisplayValue,{item:z,fields:I,fieldKey:W.key})})]},W.key))}):void 0});return E(D,{controller:h,className:L,title:X(q.meta.title,U),description:X(q.meta.description,U),toolbar:O,loading:H,headerActions:N,emptyState:P,footer:A,onRowPress:G?(z)=>G(z.original):void 0})}function b(q,J){return q.find((L)=>L.key===J)}export function DisplayValue({item:q,fields:J,fieldKey:L}){const G=b(J,L);if(!G)return"";const O=V(q,G.dataPath);return E(B,{value:O,format:G.format})}
@@ -1,4 +1,4 @@
1
- import type { DataViewField, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
1
+ import type { DataViewDensity, DataViewField, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
2
2
  import * as React from 'react';
3
3
  export interface DataViewTableProps {
4
4
  spec: DataViewSpec;
@@ -10,8 +10,9 @@ export interface DataViewTableProps {
10
10
  emptyState?: React.ReactNode;
11
11
  headerActions?: React.ReactNode;
12
12
  footer?: React.ReactNode;
13
+ density?: DataViewDensity;
13
14
  }
14
- export declare function DataViewTable({ spec, items, className, onRowClick, toolbar, loading, emptyState, headerActions, footer, }: DataViewTableProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function DataViewTable({ spec, items, className, onRowClick, toolbar, loading, emptyState, headerActions, footer, density, }: DataViewTableProps): import("react/jsx-runtime").JSX.Element;
15
16
  export declare function DisplayValue({ item, fields, fieldKey, }: {
16
17
  item: Record<string, unknown>;
17
18
  fields: DataViewField[];
@@ -0,0 +1,16 @@
1
+ import type { DataViewCollectionConfig, DataViewCollectionMode, DataViewCollectionViewModesConfig, DataViewConfig, DataViewDensity, DataViewSpec } from '@contractspec/lib.contracts-spec/data-views';
2
+ export interface ResolvedCollectionView {
3
+ spec: DataViewSpec;
4
+ mode: DataViewCollectionMode;
5
+ allowedModes: DataViewCollectionMode[];
6
+ }
7
+ export interface ResolveCollectionDensityInput {
8
+ density?: DataViewDensity;
9
+ defaultDensity?: DataViewDensity;
10
+ }
11
+ export declare function isDataViewCollectionKind(kind: DataViewConfig['kind']): kind is DataViewCollectionMode;
12
+ export declare function resolveAllowedCollectionModes(view: DataViewConfig): DataViewCollectionMode[];
13
+ export declare function getDataViewCollectionConfig(view: DataViewConfig): DataViewCollectionConfig | undefined;
14
+ export declare function getDataViewCollectionViewModesConfig(view: DataViewConfig): DataViewCollectionViewModesConfig | undefined;
15
+ export declare function resolveCollectionView(spec: DataViewSpec, requestedMode?: DataViewCollectionMode): ResolvedCollectionView;
16
+ export declare function resolveCollectionDensity(spec: DataViewSpec, input?: ResolveCollectionDensityInput): DataViewDensity;
@@ -0,0 +1 @@
1
+ const F=["list","grid","table"];export function isDataViewCollectionKind(h){return h==="list"||h==="grid"||h==="table"}export function resolveAllowedCollectionModes(h){const x=getDataViewCollectionConfig(h);if(!x||!isDataViewCollectionKind(h.kind))return isDataViewCollectionKind(h.kind)?[h.kind]:[];const z=getDataViewCollectionViewModesConfig(h),B=z?.allowedModes?.filter(K);if(B?.length)return P(B);if(x.toolbar?.viewMode===!0)return F;return z?F:[h.kind]}export function getDataViewCollectionConfig(h){if(!isDataViewCollectionKind(h.kind))return;return h.collection}export function getDataViewCollectionViewModesConfig(h){const x=getDataViewCollectionConfig(h),z=x?.toolbar?.viewMode;if(x?.viewModes)return x.viewModes;return typeof z==="object"?z:void 0}export function resolveCollectionView(h,x){const z=resolveAllowedCollectionModes(h.view),B=H(h.view,z),G=x&&z.includes(x)?x:B;return{spec:{...h,view:J(h.view,G)},mode:G,allowedModes:z}}export function resolveCollectionDensity(h,x={}){const z=h.view.kind==="table"?h.view.density:void 0;return x.density??z??getDataViewCollectionConfig(h.view)?.density??x.defaultDensity??"comfortable"}function H(h,x){const z=isDataViewCollectionKind(h.kind)&&getDataViewCollectionViewModesConfig(h)?.defaultMode;if(z&&x.includes(z))return z;if(isDataViewCollectionKind(h.kind)&&x.includes(h.kind))return h.kind;return x[0]??"list"}function J(h,x){const z=getDataViewCollectionConfig(h),B={fields:h.fields,primaryField:h.primaryField,secondaryFields:h.secondaryFields,filters:h.filters,filterScope:h.filterScope,actions:h.actions,collection:z};if(x==="list")return{...B,kind:"list",layout:h.kind==="list"?h.layout:"compact"};if(x==="grid")return{...B,kind:"grid",columns:h.kind==="grid"?h.columns:void 0};if(h.kind==="table")return{...h,...B,kind:"table"};return{...B,kind:"table",density:z?.density}}function K(h){return h==="list"||h==="grid"||h==="table"}function P(h){return F.filter((x)=>h.includes(x))}
@@ -1 +1 @@
1
- import{jsx as m}from"react/jsx-runtime";import{MarkdownRenderer as a}from"../molecules/MarkdownRenderer";export function getAtPath(t,e){if(!t)return;if(!e)return t;const r=e.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean);let n=t;for(const o of r){if(n==null||typeof n!=="object"&&!Array.isArray(n))return;n=n[o]}return n}export function DataViewFormattedValue({value:t,format:e}){if(t==null)return"";switch(e){case"boolean":return t?"Yes":"No";case"currency":return typeof t==="number"?new Intl.NumberFormat(void 0,{style:"currency",currency:"USD"}).format(t):String(t);case"percentage":return typeof t==="number"?`${(t*100).toFixed(1)}%`:String(t);case"date":return i(t,{dateStyle:"medium"});case"dateTime":return i(t,{dateStyle:"medium",timeStyle:"short"});case"markdown":return m(a,{content:t});default:return String(t)}}function i(t,e){if(t instanceof Date)return new Intl.DateTimeFormat(void 0,e).format(t);if(typeof t==="string"||typeof t==="number"){const r=new Date(t);if(!Number.isNaN(r.getTime()))return new Intl.DateTimeFormat(void 0,e).format(r)}return String(t??"")}
1
+ import{jsx as l}from"react/jsx-runtime";import{MarkdownRenderer as u}from"../molecules/MarkdownRenderer";export function getAtPath(n,t){if(!n)return;if(!t)return n;const e=t.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean);let i=n;for(const r of e){if(i==null||typeof i!=="object"&&!Array.isArray(i))return;i=i[r]}return i}export function DataViewFormattedValue({value:n,format:t}){if(n==null)return"";switch(typeof t==="string"?t:t?.type){case"boolean":return n?"Yes":"No";case"number":return m(n,t);case"currency":return d(n,t);case"percent":case"percentage":return p(n,t);case"date":return o(n,typeof t==="object"&&t.type==="date"?t:{dateStyle:"medium"});case"time":return o(n,typeof t==="object"&&t.type==="time"?t:{timeStyle:"short"});case"datetime":case"dateTime":return o(n,typeof t==="object"&&t.type==="datetime"?t:{dateStyle:"medium",timeStyle:"short"});case"duration":return g(n,t);case"markdown":return l(u,{content:n});default:return String(n)}}function m(n,t){if(typeof n!=="number")return String(n);const e=typeof t==="object"&&t.type==="number"?t:void 0;return new Intl.NumberFormat(e?.locale,{minimumFractionDigits:e?.minimumFractionDigits,maximumFractionDigits:e?.maximumFractionDigits,useGrouping:e?.useGrouping,notation:e?.notation,signDisplay:e?.signDisplay}).format(n)}function d(n,t){if(typeof n!=="number")return String(n);const e=typeof t==="object"&&t.type==="currency"?t:void 0;return new Intl.NumberFormat(e?.locale,{style:"currency",currency:e?.currency??"USD",currencyDisplay:e?.currencyDisplay,minimumFractionDigits:e?.rounded?0:e?.minimumFractionDigits,maximumFractionDigits:e?.rounded?0:e?.maximumFractionDigits,useGrouping:e?.useGrouping,notation:e?.notation,signDisplay:e?.signDisplay}).format(n)}function p(n,t){if(typeof n!=="number")return String(n);const e=typeof t==="object"&&t.type==="percent"?t:void 0,i=e?.valueScale==="whole"?n/100:n;return new Intl.NumberFormat(e?.locale,{style:"percent",minimumFractionDigits:e?.minimumFractionDigits??1,maximumFractionDigits:e?.maximumFractionDigits??1,useGrouping:e?.useGrouping,notation:e?.notation,signDisplay:e?.signDisplay}).format(i)}function o(n,t){const{locale:e,...i}=t;if(n instanceof Date)return new Intl.DateTimeFormat(e,i).format(n);if(typeof n==="string"||typeof n==="number"){const r=new Date(n);if(!Number.isNaN(r.getTime()))return new Intl.DateTimeFormat(e,i).format(r)}return String(n??"")}function g(n,t){if(typeof n!=="number")return String(n);const e=typeof t==="object"&&t.type==="duration"?t:void 0,i=e?.unit??"second";if(e?.display==="digital")return y(f(n,i));return new Intl.NumberFormat(e?.locale,{style:"unit",unit:i,unitDisplay:e?.display==="narrow"?"narrow":e?.display,maximumFractionDigits:2}).format(n)}function y(n){const t=n<0?"-":"",e=Math.round(Math.abs(n)),i=Math.floor(e/3600),r=Math.floor(e%3600/60),c=e%60,s=[r,c].map((a)=>String(a).padStart(2,"0")).join(":");return i>0?`${t}${i}:${s}`:`${t}${s}`}function f(n,t){switch(t){case"millisecond":return n/1000;case"minute":return n*60;case"hour":return n*3600;case"day":return n*86400;case"week":return n*604800;case"month":return n*2629746;case"year":return n*31556952;case"second":default:return n}}
@@ -13,5 +13,13 @@ export interface AutocompleteProps extends ThemedPrimitiveProps {
13
13
  disabled?: boolean;
14
14
  className?: string;
15
15
  emptyText?: string;
16
+ loadingText?: string;
17
+ errorText?: string;
18
+ loading?: boolean;
19
+ error?: string | null;
20
+ id?: string;
21
+ name?: string;
22
+ 'aria-invalid'?: boolean;
23
+ 'aria-describedby'?: string;
16
24
  }
17
- export declare function Autocomplete({ query, options, selectedOptions, onQueryChange, onSelectOption, onRemoveOption, multiple, placeholder, placeholderI18n, readOnly, disabled, className, componentKey, themeVariant, emptyText, }: AutocompleteProps): import("react/jsx-runtime").JSX.Element;
25
+ export declare function Autocomplete({ query, options, selectedOptions, onQueryChange, onSelectOption, onRemoveOption, multiple, placeholder, placeholderI18n, readOnly, disabled, className, componentKey, themeVariant, emptyText, loadingText, errorText, loading, error, id, name, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, }: AutocompleteProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- import{jsx as A,jsxs as J}from"react/jsx-runtime";import{Command as k,CommandEmpty as S,CommandGroup as b,CommandInput as f,CommandItem as C,CommandList as T}from"@contractspec/lib.ui-kit-web/ui/command";import{Text as Y}from"@contractspec/lib.ui-kit-web/ui/text";import{Button as V}from"../../atoms/Button";import{HStack as w,VStack as Z}from"../../layout/Stack";import{useThemedPrimitive as v,useTranslatedText as _}from"../../primitives/themed";function M(F){return typeof F==="string"?F:String(F??"")}export function Autocomplete({query:F,options:$,selectedOptions:U,onQueryChange:E,onSelectOption:G,onRemoveOption:H,multiple:L,placeholder:P,placeholderI18n:g,readOnly:W,disabled:X,className:q,componentKey:B,themeVariant:K,emptyText:N="No results found."}){const D=_(),Q=v({defaultComponentKey:"Autocomplete",componentKey:B,themeVariant:K,className:q});return J(Z,{gap:"sm",className:Q.className,children:[J(k,{shouldFilter:!1,className:"rounded-md border border-input",children:[A(f,{value:F,onValueChange:E,placeholder:D(g??P),disabled:X||W}),J(T,{children:[A(S,{children:D(N)}),A(b,{children:$.map((z)=>{const R=U.some((I)=>M(I.value)===M(z.value));return J(C,{value:D(z.labelI18n)??z.labelI18n,onSelect:()=>G?.(z),disabled:X||z.disabled||W,children:[J(Z,{gap:"xs",children:[A(Y,{children:D(z.labelI18n)}),z.descriptionI18n?A(Y,{className:"text-muted-foreground text-xs",children:D(z.descriptionI18n)}):null]}),R?A(Y,{className:"ml-auto text-muted-foreground text-xs",children:D("Selected")}):null]},M(z.value))})})]})]}),U.length?A(w,{gap:"sm",wrap:"wrap",children:U.map((z)=>A(V,{type:"button",variant:"outline",size:"sm",onClick:()=>H?.(z),disabled:!L||W||X,children:D(z.labelI18n)},`selected-${M(z.value)}`))}):null]})}
1
+ import{jsx as v}from"react/jsx-runtime";import{Combobox as I}from"@contractspec/lib.ui-kit-web/ui/combobox";import{useThemedPrimitive as T,useTranslatedText as b}from"../../primitives/themed";function H(E){return typeof E==="string"?E:String(E??"")}function g(E,U){const F=new Set,J=[];for(const L of[...U,...E]){const M=H(L.value);if(F.has(M))continue;F.add(M);J.push(L)}return J}export function Autocomplete({query:E,options:U,selectedOptions:F,onQueryChange:J,onSelectOption:L,onRemoveOption:M,multiple:W,placeholder:X,placeholderI18n:Y,readOnly:_,disabled:j,className:q,componentKey:w,themeVariant:D,emptyText:K="No results found.",loadingText:N="Loading options...",errorText:Q="Unable to load options.",loading:R,error:Z,id:S,name:k,"aria-invalid":C,"aria-describedby":B}){const A=b(),$=T({defaultComponentKey:"Autocomplete",componentKey:w,themeVariant:D,className:q}),f=g(U,F),P=new Map(f.map((z)=>[H(z.value),z]));return v(I,{...$.props,id:S,name:k,className:$.className,options:f.map((z)=>({value:H(z.value),label:A(z.labelI18n)??z.labelI18n,description:z.descriptionI18n?A(z.descriptionI18n)??z.descriptionI18n:void 0,disabled:z.disabled})),value:W?void 0:H(F[0]?.value??""),selectedValues:W?F.map((z)=>H(z.value)):void 0,query:E,onQueryChange:J,onValueChange:(z)=>{const G=P.get(z);if(G)L?.(G)},onRemoveValue:(z)=>{const G=P.get(z);if(G)M?.(G)},multiple:W,placeholder:A(Y??X),searchPlaceholder:A(Y??X),emptyText:A(K),loadingText:A(N),errorText:A(Q),loading:R,error:Z?A(Z):null,readOnly:_,disabled:j,"aria-invalid":C,"aria-describedby":B})}
@@ -13,5 +13,9 @@ export interface AutocompleteProps extends ThemedPrimitiveProps {
13
13
  disabled?: boolean;
14
14
  className?: string;
15
15
  emptyText?: string;
16
+ loadingText?: string;
17
+ errorText?: string;
18
+ loading?: boolean;
19
+ error?: string | null;
16
20
  }
17
- export declare function Autocomplete({ query, options, selectedOptions, onQueryChange, onSelectOption, onRemoveOption, multiple, placeholder, placeholderI18n, readOnly, disabled, className, componentKey, themeVariant, emptyText, }: AutocompleteProps): import("react/jsx-runtime").JSX.Element;
21
+ export declare function Autocomplete({ query, options, selectedOptions, onQueryChange, onSelectOption, onRemoveOption, multiple, placeholder, placeholderI18n, readOnly, disabled, className, componentKey, themeVariant, emptyText, loadingText, errorText, loading, error, }: AutocompleteProps): import("react/jsx-runtime").JSX.Element;
@@ -1,8 +1,9 @@
1
- import type { FormOption } from '@contractspec/lib.contracts-spec/forms';
2
- import { SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@contractspec/lib.ui-kit-web/ui/select';
1
+ import { SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@contractspec/lib.ui-kit-web/ui/select';
3
2
  import { type ThemedPrimitiveProps } from '../../primitives/themed';
3
+ import { type FormOption, type SelectOptionGroup } from './select-options';
4
4
  export interface SelectProps extends ThemedPrimitiveProps {
5
- options?: FormOption[];
5
+ options?: readonly FormOption[];
6
+ groups?: readonly SelectOptionGroup[];
6
7
  value?: unknown;
7
8
  onChange?: (value: unknown) => void;
8
9
  placeholder?: string;
@@ -11,5 +12,6 @@ export interface SelectProps extends ThemedPrimitiveProps {
11
12
  name?: string;
12
13
  className?: string;
13
14
  }
14
- export declare function Select({ options, value, onChange, placeholder, disabled, className, componentKey, themeVariant, placeholderI18n, ...props }: SelectProps): import("react/jsx-runtime").JSX.Element;
15
- export { SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue };
15
+ export declare function Select({ options, groups, value, onChange, placeholder, disabled, className, componentKey, themeVariant, placeholderI18n, ...props }: SelectProps): import("react/jsx-runtime").JSX.Element;
16
+ export type { SelectOptionGroup };
17
+ export { SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, };
@@ -1 +1 @@
1
- import{jsx as A,jsxs as k}from"react/jsx-runtime";import{SelectContent,SelectGroup,SelectItem,SelectTrigger,SelectValue,Select as Y}from"@contractspec/lib.ui-kit-web/ui/select";import{useThemedPrimitive as Z,useTranslatedText as $}from"../../primitives/themed";function B(z){return typeof z==="string"?z:String(z??"")}export function Select({options:z,value:D,onChange:F,placeholder:H,disabled:J,className:L,componentKey:M,themeVariant:O,placeholderI18n:Q,...R}){const E=$(),U=Z({defaultComponentKey:"Select",componentKey:M,themeVariant:O,className:L});return k(Y,{value:D==null?"":B(D),onValueChange:(q)=>F?.(q),disabled:J,...R,children:[A(SelectTrigger,{className:U.className,children:A(SelectValue,{placeholder:E(Q??H)})}),A(SelectContent,{children:A(SelectGroup,{children:z?.map((q,X)=>A(SelectItem,{value:B(q.value),disabled:q.disabled,children:E(q.labelI18n)??B(q.labelI18n)},`${B(q.value)}-${X}`))})})]})}export{SelectContent,SelectGroup,SelectItem,SelectTrigger,SelectValue};
1
+ import{jsx as z,jsxs as M}from"react/jsx-runtime";import{SelectContent,SelectGroup,SelectItem,SelectLabel,SelectTrigger,SelectValue,Select as K}from"@contractspec/lib.ui-kit-web/ui/select";import{useThemedPrimitive as O,useTranslatedText as T}from"../../primitives/themed";import{selectGroupKey as v,selectGroupLabel as w,selectOptionGroups as G,selectOptionLabel as L,selectOptionValue as D}from"./select-options";export function Select({options:Q,groups:R,value:E,onChange:U,placeholder:X,disabled:Y,className:Z,componentKey:$,themeVariant:k,placeholderI18n:P,...W}){const B=T(),N=O({defaultComponentKey:"Select",componentKey:$,themeVariant:k,className:Z}),C=G({options:Q,groups:R});return M(K,{value:E==null?"":D(E),onValueChange:(q)=>U?.(q),disabled:Y,...W,children:[z(SelectTrigger,{className:N.className,children:z(SelectValue,{placeholder:B(P??X)})}),z(SelectContent,{children:C.map((q,F)=>{const H=v(q,F),J=w(q,B);return M(SelectGroup,{children:[J?z(SelectLabel,{children:J}):null,q.options.map((A,f)=>z(SelectItem,{value:D(A.value),disabled:A.disabled,children:L(A,B)},`${H}-${D(A.value)}-${f}`))]},`${H}-${F}`)})})]})}export{SelectContent,SelectGroup,SelectItem,SelectLabel,SelectTrigger,SelectValue};
@@ -1,13 +1,15 @@
1
- import type { FormOption } from '@contractspec/lib.contracts-spec/forms';
2
- import { SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@contractspec/lib.ui-kit/ui/select';
1
+ import { SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@contractspec/lib.ui-kit/ui/select';
3
2
  import { type ThemedPrimitiveProps } from '../../primitives/themed';
3
+ import { type FormOption, type SelectOptionGroup } from './select-options';
4
4
  export interface SelectProps extends ThemedPrimitiveProps {
5
- options?: FormOption[];
5
+ options?: readonly FormOption[];
6
+ groups?: readonly SelectOptionGroup[];
6
7
  value?: unknown;
7
8
  onChange?: (value: unknown) => void;
8
9
  placeholder?: string;
9
10
  disabled?: boolean;
10
11
  className?: string;
11
12
  }
12
- export declare function Select({ options, value, onChange, placeholder, disabled, className, componentKey, themeVariant, placeholderI18n, }: SelectProps): import("react/jsx-runtime").JSX.Element;
13
- export { SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue };
13
+ export declare function Select({ options, groups, value, onChange, placeholder, disabled, className, componentKey, themeVariant, placeholderI18n, }: SelectProps): import("react/jsx-runtime").JSX.Element;
14
+ export type { SelectOptionGroup };
15
+ export { SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, };
@@ -9,4 +9,4 @@ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGr
9
9
  export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, } from './InputOTP';
10
10
  export { LoadingButton, type LoadingButtonProps } from './LoadingButton';
11
11
  export { NativeSelect, NativeSelectOptGroup, NativeSelectOption, type NativeSelectProps, } from './NativeSelect';
12
- export { Select, type SelectProps } from './Select';
12
+ export { Select, type SelectOptionGroup, type SelectProps } from './Select';
@@ -0,0 +1,17 @@
1
+ import type { FormOption } from '@contractspec/lib.contracts-spec/forms';
2
+ export type { FormOption };
3
+ export interface SelectOptionGroup {
4
+ key?: string;
5
+ label?: string;
6
+ labelI18n?: string;
7
+ options: readonly FormOption[];
8
+ }
9
+ export type SelectTextTranslator = (value: string | undefined) => string | undefined;
10
+ export declare function selectOptionValue(value: unknown): string;
11
+ export declare function selectOptionLabel(option: FormOption, translate: SelectTextTranslator): string;
12
+ export declare function selectGroupLabel(group: SelectOptionGroup, translate: SelectTextTranslator): string | undefined;
13
+ export declare function selectGroupKey(group: SelectOptionGroup, index: number): string;
14
+ export declare function selectOptionGroups({ options, groups, }: {
15
+ options?: readonly FormOption[];
16
+ groups?: readonly SelectOptionGroup[];
17
+ }): readonly SelectOptionGroup[];
@@ -0,0 +1 @@
1
+ export function selectOptionValue(e){return typeof e==="string"?e:String(e??"")}export function selectOptionLabel(e,t){return t(e.labelI18n)??selectOptionValue(e.labelI18n)}export function selectGroupLabel(e,t){return t(e.labelI18n??e.label)}export function selectGroupKey(e,t){return e.key??e.labelI18n??e.label??`group-${t}`}export function selectOptionGroups({options:e,groups:t}){return t?.length?t:[{options:e??[]}]}
@@ -1 +1 @@
1
- import{jsx as H}from"react/jsx-runtime";import{Tabs as R,TabsContent as S,TabsList as U,TabsTrigger as X}from"@contractspec/lib.ui-kit-web/ui/tabs";import{useThemedPrimitive as G}from"../primitives/themed";export function Tabs({value:z,defaultValue:A,onValueChange:B,className:D,children:q,orientation:F,dir:E,activationMode:J,componentKey:O,themeVariant:Q}){console.log("tabs web");const I=G({defaultComponentKey:"Tabs",componentKey:O,themeVariant:Q,className:D});return H(R,{...I.props,value:z,defaultValue:A,onValueChange:B,className:I.className,orientation:F,dir:E,activationMode:J,children:q})}export function TabsList({className:z,children:A,componentKey:B,themeVariant:D}){const q=G({defaultComponentKey:"TabsList",componentKey:B,themeVariant:D,className:z});return H(U,{...q.props,className:q.className,children:A})}export function TabsTrigger({value:z,disabled:A,className:B,children:D,componentKey:q,themeVariant:F}){const E=G({defaultComponentKey:"TabsTrigger",componentKey:q,themeVariant:F,className:B});return H(X,{...E.props,value:z,disabled:A,className:E.className,children:D})}export function TabsContent({value:z,forceMount:A,className:B,children:D,componentKey:q,themeVariant:F}){const E=G({defaultComponentKey:"TabsContent",componentKey:q,themeVariant:F,className:B});return H(S,{...E.props,value:z,forceMount:A?!0:void 0,className:E.className,children:D})}
1
+ import{jsx as H}from"react/jsx-runtime";import{Tabs as R,TabsContent as S,TabsList as U,TabsTrigger as X}from"@contractspec/lib.ui-kit-web/ui/tabs";import{useThemedPrimitive as G}from"../primitives/themed";export function Tabs({value:z,defaultValue:A,onValueChange:B,className:D,children:q,orientation:F,dir:E,activationMode:J,componentKey:O,themeVariant:Q}){const I=G({defaultComponentKey:"Tabs",componentKey:O,themeVariant:Q,className:D});return H(R,{...I.props,value:z,defaultValue:A,onValueChange:B,className:I.className,orientation:F,dir:E,activationMode:J,children:q})}export function TabsList({className:z,children:A,componentKey:B,themeVariant:D}){const q=G({defaultComponentKey:"TabsList",componentKey:B,themeVariant:D,className:z});return H(U,{...q.props,className:q.className,children:A})}export function TabsTrigger({value:z,disabled:A,className:B,children:D,componentKey:q,themeVariant:F}){const E=G({defaultComponentKey:"TabsTrigger",componentKey:q,themeVariant:F,className:B});return H(X,{...E.props,value:z,disabled:A,className:E.className,children:D})}export function TabsContent({value:z,forceMount:A,className:B,children:D,componentKey:q,themeVariant:F}){const E=G({defaultComponentKey:"TabsContent",componentKey:q,themeVariant:F,className:B});return H(S,{...E.props,value:z,forceMount:A?!0:void 0,className:E.className,children:D})}
@@ -0,0 +1,18 @@
1
+ import type { ObjectReferenceActionDescriptor, ObjectReferenceHandlerProps, ObjectReferenceRenderContext } from './types';
2
+ export declare function DefaultObjectReferenceTrigger({ context, iconRenderer, interactivityVisibility, className, }: {
3
+ context: ObjectReferenceRenderContext;
4
+ iconRenderer?: IconRenderer;
5
+ interactivityVisibility: NonNullable<ObjectReferenceHandlerProps['interactivityVisibility']>;
6
+ className?: string;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ export declare function DefaultReferenceDetail({ reference, }: {
9
+ reference: ObjectReferenceHandlerProps['reference'];
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ export declare function DefaultActionButton({ action, reference, iconRenderer, onClick, }: {
12
+ action: ObjectReferenceActionDescriptor;
13
+ reference: ObjectReferenceHandlerProps['reference'];
14
+ iconRenderer?: IconRenderer;
15
+ onClick: () => void;
16
+ }): import("react/jsx-runtime").JSX.Element;
17
+ type IconRenderer = ObjectReferenceHandlerProps['iconRenderer'];
18
+ export {};
@@ -0,0 +1 @@
1
+ import{jsx as r,jsxs as i}from"react/jsx-runtime";import{cn as c}from"../../lib/utils";import{getObjectReferenceDisplayValue as l}from"./actions";import{ReferenceIcon as a,ReferenceSearchIcon as m}from"./ReferenceIcon";export function DefaultObjectReferenceTrigger({context:e,iconRenderer:d,interactivityVisibility:t,className:n}){const{reference:o}=e;return i("span",{className:c("inline-flex min-w-0 items-center gap-1.5 text-foreground text-sm transition-colors hover:text-primary",t==="underline"&&"underline decoration-muted-foreground/50 underline-offset-4 hover:decoration-primary",n),children:[r(a,{context:{iconKey:o.iconKey??o.kind,reference:o},iconRenderer:d}),r("span",{className:"truncate",children:o.label}),t==="icon"?r(m,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}):null]})}export function DefaultReferenceDetail({reference:e}){const d=l(e),t=Object.entries(e.metadata??{});return i("div",{className:"rounded-md border border-border bg-muted/30 p-3 text-sm",children:[r("div",{className:"font-medium text-foreground",children:d}),e.href?r("div",{className:"mt-1 break-all text-muted-foreground",children:e.href}):null,t.length>0?r("dl",{className:"mt-3 grid gap-2",children:t.map(([n,o])=>i("div",{className:"grid gap-0.5",children:[r("dt",{className:"font-medium text-muted-foreground text-xs uppercase",children:n}),r("dd",{className:"break-words text-foreground",children:String(o)})]},n))}):null]})}export function DefaultActionButton({action:e,reference:d,iconRenderer:t,onClick:n}){return i("button",{type:"button",className:c("flex min-h-11 w-full items-center gap-3 rounded-md border border-border px-3 py-2 text-left text-sm transition-colors hover:bg-muted focus:outline-none focus:ring-2 focus:ring-ring",e.variant==="primary"&&"border-primary/40 bg-primary/10",e.variant==="danger"&&"border-destructive/40 text-destructive",e.disabled&&"cursor-not-allowed opacity-50"),disabled:e.disabled,onClick:n,children:[r(a,{context:{iconKey:e.iconKey??e.id,reference:d,action:e},iconRenderer:t}),i("span",{className:"min-w-0 flex-1",children:[r("span",{className:"block font-medium",children:e.label}),e.description?r("span",{className:"block text-muted-foreground text-xs",children:e.description}):null]})]})}
@@ -0,0 +1,13 @@
1
+ import type { ObjectReferenceActionDescriptor, ObjectReferenceHandlerProps, ObjectReferenceRenderContext } from './types';
2
+ export declare function NativeObjectReferenceTrigger({ context, iconRenderer, interactivityVisibility, }: {
3
+ context: ObjectReferenceRenderContext;
4
+ iconRenderer?: ObjectReferenceHandlerProps['iconRenderer'];
5
+ interactivityVisibility: NonNullable<ObjectReferenceHandlerProps['interactivityVisibility']>;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ export declare function NativeReferenceDetail({ reference, }: {
8
+ reference: ObjectReferenceHandlerProps['reference'];
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ export declare function NativeActionButton({ action, onPress, }: {
11
+ action: ObjectReferenceActionDescriptor;
12
+ onPress: () => void;
13
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { ObjectReferenceHandlerProps } from './types';
2
+ export declare function ObjectReferenceHandler({ reference, actions, interactivityVisibility, defaultOpen, open, onOpenChange, actionHandlers, onAction, onActionError, copyText, copyHandler, openHref, renderTrigger, renderDetail, renderAction, iconRenderer, className, panelClassName, }: ObjectReferenceHandlerProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as z,jsxs as G}from"react/jsx-runtime";import{Sheet as b,SheetContent as D,SheetDescription as w,SheetHeader as O,SheetTitle as A}from"@contractspec/lib.ui-kit-web/ui/sheet";import{Tooltip as R,TooltipContent as T,TooltipTrigger as h}from"@contractspec/lib.ui-kit-web/ui/tooltip";import*as u from"react";import{cn as _}from"../../lib/utils";import{DefaultActionButton as g,DefaultObjectReferenceTrigger as y,DefaultReferenceDetail as d}from"./DefaultObjectReferenceParts";import{useObjectReferenceController as j}from"./useObjectReferenceController";export function ObjectReferenceHandler({reference:q,actions:J,interactivityVisibility:X="underline",defaultOpen:Y=!1,open:Z,onOpenChange:$,actionHandlers:k,onAction:B,onActionError:P,copyText:E,copyHandler:V,openHref:v,renderTrigger:K,renderDetail:L,renderAction:M,iconRenderer:Q,className:N,panelClassName:m}){const{context:I,resolvedActions:S,resolvedOpen:C,runAction:U,setOpen:W}=j({reference:q,actions:J,defaultOpen:Y,open:Z,onOpenChange:$,actionHandlers:k,copyText:E,copyHandler:V,openHref:v,onAction:B,onActionError:P,defaultCopy:p,defaultOpenHref:x}),H=K?K(I):z(y,{context:I,iconRenderer:Q,interactivityVisibility:X,className:N});return G(b,{open:C,onOpenChange:W,children:[G(R,{children:[z(h,{asChild:!0,children:z("button",{type:"button",className:"contents","aria-label":q.ariaLabel??`Open ${q.label}`,onClick:()=>W(!0),children:H})}),z(T,{children:q.ariaLabel??q.label})]}),G(D,{className:_("sm:max-w-md",m),children:[G(O,{children:[z(A,{children:q.label}),q.description?z(w,{children:q.description}):null]}),G("div",{className:"flex flex-col gap-4 px-4 pb-4",children:[L?L(I):z(d,{reference:q}),z("div",{className:"flex flex-col gap-2",children:S.map((F)=>M?z(u.Fragment,{children:M({...I,action:F,runAction:U})},F.id):z(g,{action:F,reference:q,iconRenderer:Q,onClick:()=>U(F)},F.id))})]})]})]})}async function p(q,J){if(typeof navigator<"u"&&navigator.clipboard){await navigator.clipboard.writeText(q);return}throw Error("Clipboard is not available.")}async function x(q,J){if(typeof window<"u")window.open(q,"_blank","noopener,noreferrer")}
@@ -0,0 +1,2 @@
1
+ import type { ObjectReferenceHandlerProps } from './types';
2
+ export declare function ObjectReferenceHandler({ reference, actions, interactivityVisibility, defaultOpen, open, onOpenChange, actionHandlers, onAction, onActionError, copyText, copyHandler, openHref, renderTrigger, renderDetail, renderAction, iconRenderer, className, panelClassName, }: ObjectReferenceHandlerProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { Search } from 'lucide-react';
2
+ import type { ObjectReferenceHandlerProps, ObjectReferenceIconRenderContext } from './types';
3
+ export declare function ReferenceIcon({ context, iconRenderer, }: {
4
+ context: ObjectReferenceIconRenderContext;
5
+ iconRenderer?: ObjectReferenceHandlerProps['iconRenderer'];
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ export { Search as ReferenceSearchIcon };
@@ -0,0 +1 @@
1
+ import{jsx as p,Fragment as f}from"react/jsx-runtime";import{Copy as a,ExternalLink as r,FileText as s,MapPin as o,Phone as t,Search,User as c}from"lucide-react";const R={address:o,phone:t,user:c,customer:c,file:s,url:r,custom:Search,copy:a,map:o,phoneAction:t,"external-link":r};export function ReferenceIcon({context:e,iconRenderer:n}){if(n)return p(f,{children:n(e)});const i=R[e.iconKey]??Search;return p(i,{className:"h-4 w-4 shrink-0 text-muted-foreground"})}export{Search as ReferenceSearchIcon};
@@ -0,0 +1,7 @@
1
+ import type { ObjectReferenceActionDescriptor, ObjectReferenceDescriptor } from './types';
2
+ export { createMapsProviderHref, createMapsReferenceActions, type ObjectReferenceMapsActionOptions, type ObjectReferenceMapsProvider, } from './maps';
3
+ export declare function getObjectReferenceDisplayValue(reference: ObjectReferenceDescriptor): string;
4
+ export declare function createCopyReferenceAction(reference: ObjectReferenceDescriptor, label?: string): ObjectReferenceActionDescriptor;
5
+ export declare function createOpenReferenceAction(reference: ObjectReferenceDescriptor, label?: string): ObjectReferenceActionDescriptor | null;
6
+ export declare function createPhoneReferenceAction(reference: ObjectReferenceDescriptor, label?: string): ObjectReferenceActionDescriptor | null;
7
+ export declare function createDefaultObjectReferenceActions(reference: ObjectReferenceDescriptor): ObjectReferenceActionDescriptor[];
@@ -0,0 +1 @@
1
+ export{createMapsProviderHref,createMapsReferenceActions}from"./maps";import{createMapsReferenceActions as c}from"./maps";function n(e){return e.trim().replace(/\s+/g," ")}export function getObjectReferenceDisplayValue(e){return e.value??e.href??e.label}export function createCopyReferenceAction(e,t="Copy"){return{id:"copy",label:t,description:"Copy this reference",iconKey:"copy",metadata:{copyText:getObjectReferenceDisplayValue(e)}}}export function createOpenReferenceAction(e,t="Open details"){if(!e.href)return null;return{id:"open",label:t,description:"Open the related page or resource",href:e.href,iconKey:"external-link"}}export function createPhoneReferenceAction(e,t="Call"){if(e.kind!=="phone")return null;const r=n(e.value??e.label);if(!r)return null;return{id:"call",label:t,description:"Call this phone number",href:`tel:${r.replace(/[^\d+]/g,"")}`,iconKey:"phone"}}export function createDefaultObjectReferenceActions(e){return[createCopyReferenceAction(e),createOpenReferenceAction(e),createPhoneReferenceAction(e),...c(e)].filter((t)=>Boolean(t))}
@@ -0,0 +1,4 @@
1
+ export { createCopyReferenceAction, createDefaultObjectReferenceActions, createMapsProviderHref, createMapsReferenceActions, createOpenReferenceAction, createPhoneReferenceAction, getObjectReferenceDisplayValue, type ObjectReferenceMapsActionOptions, type ObjectReferenceMapsProvider, } from './actions';
2
+ export { ObjectReferenceHandler } from './ObjectReferenceHandler';
3
+ export { type ExecuteObjectReferenceActionOptions, executeObjectReferenceAction, } from './runtime';
4
+ export type { JsonPrimitive, JsonValue, ObjectReferenceActionDescriptor, ObjectReferenceActionEvent, ObjectReferenceActionHandler, ObjectReferenceActionRenderContext, ObjectReferenceActionVariant, ObjectReferenceCopyHandler, ObjectReferenceDescriptor, ObjectReferenceHandlerProps, ObjectReferenceIconRenderContext, ObjectReferenceInteractivityVisibility, ObjectReferenceKind, ObjectReferenceMetadata, ObjectReferenceOpenHrefHandler, ObjectReferenceRenderContext, } from './types';
@@ -0,0 +1 @@
1
+ export{createCopyReferenceAction,createDefaultObjectReferenceActions,createMapsProviderHref,createMapsReferenceActions,createOpenReferenceAction,createPhoneReferenceAction,getObjectReferenceDisplayValue}from"./actions";export{ObjectReferenceHandler}from"./ObjectReferenceHandler";export{executeObjectReferenceAction}from"./runtime";
@@ -0,0 +1,4 @@
1
+ export { createCopyReferenceAction, createDefaultObjectReferenceActions, createMapsProviderHref, createMapsReferenceActions, createOpenReferenceAction, createPhoneReferenceAction, getObjectReferenceDisplayValue, type ObjectReferenceMapsActionOptions, type ObjectReferenceMapsProvider, } from './actions';
2
+ export { ObjectReferenceHandler } from './ObjectReferenceHandler';
3
+ export { type ExecuteObjectReferenceActionOptions, executeObjectReferenceAction, } from './runtime';
4
+ export type { JsonPrimitive, JsonValue, ObjectReferenceActionDescriptor, ObjectReferenceActionEvent, ObjectReferenceActionHandler, ObjectReferenceActionRenderContext, ObjectReferenceActionVariant, ObjectReferenceCopyHandler, ObjectReferenceDescriptor, ObjectReferenceHandlerProps, ObjectReferenceIconRenderContext, ObjectReferenceInteractivityVisibility, ObjectReferenceKind, ObjectReferenceMetadata, ObjectReferenceOpenHrefHandler, ObjectReferenceRenderContext, } from './types';
@@ -0,0 +1,8 @@
1
+ import type { ObjectReferenceActionDescriptor, ObjectReferenceDescriptor } from './types';
2
+ export type ObjectReferenceMapsProvider = 'apple' | 'google' | 'waze' | 'geo';
3
+ export interface ObjectReferenceMapsActionOptions {
4
+ providers?: ObjectReferenceMapsProvider[];
5
+ labelPrefix?: string;
6
+ }
7
+ export declare function createMapsProviderHref(provider: ObjectReferenceMapsProvider, query: string): string;
8
+ export declare function createMapsReferenceActions(reference: ObjectReferenceDescriptor, options?: ObjectReferenceMapsActionOptions): ObjectReferenceActionDescriptor[];
@@ -0,0 +1 @@
1
+ export function createMapsProviderHref(e,t){const r=encodeURIComponent(a(t));switch(e){case"apple":return`https://maps.apple.com/?q=${r}`;case"google":return`https://www.google.com/maps/search/?api=1&query=${r}`;case"waze":return`https://waze.com/ul?q=${r}&navigate=yes`;case"geo":return`geo:0,0?q=${r}`}}export function createMapsReferenceActions(e,t={}){if(e.kind!=="address")return[];const r=e.value??e.label;if(!a(r))return[];const n=t.providers??["google","apple","waze"],o=t.labelPrefix??"Open in";return n.map((c)=>({id:`maps.${c}`,label:`${o} ${s(c)}`,description:"Open navigation for this address",href:createMapsProviderHref(c,r),iconKey:"map",metadata:{provider:c}}))}function a(e){return e.trim().replace(/\s+/g," ")}function s(e){switch(e){case"apple":return"Apple Maps";case"google":return"Google Maps";case"waze":return"Waze";case"geo":return"Maps"}}
@@ -0,0 +1,12 @@
1
+ import type { ObjectReferenceActionEvent, ObjectReferenceHandlerProps } from './types';
2
+ export interface ExecuteObjectReferenceActionOptions {
3
+ actionHandlers?: ObjectReferenceHandlerProps['actionHandlers'];
4
+ copyText?: string;
5
+ copyHandler?: ObjectReferenceHandlerProps['copyHandler'];
6
+ openHref?: ObjectReferenceHandlerProps['openHref'];
7
+ onAction?: ObjectReferenceHandlerProps['onAction'];
8
+ onActionError?: ObjectReferenceHandlerProps['onActionError'];
9
+ defaultCopy?: ObjectReferenceHandlerProps['copyHandler'];
10
+ defaultOpenHref?: ObjectReferenceHandlerProps['openHref'];
11
+ }
12
+ export declare function executeObjectReferenceAction(event: ObjectReferenceActionEvent, options: ExecuteObjectReferenceActionOptions): Promise<void>;
@@ -0,0 +1 @@
1
+ import{getObjectReferenceDisplayValue as c}from"./actions";export async function executeObjectReferenceAction(e,r){try{const n=r.actionHandlers?.[e.action.id];if(n)await n(e);else if(e.action.id==="copy")await t(e,r);else if(e.action.href)await o(e.action.href,e,r);await r.onAction?.(e)}catch(n){r.onActionError?.(n,e)}}function t(e,r){const n=r.copyText??i(e.action.metadata?.copyText)??c(e.reference);if(r.copyHandler)return r.copyHandler(n,e);if(r.defaultCopy)return r.defaultCopy(n,e);throw Error("Clipboard is not available.")}function o(e,r,n){if(n.openHref)return n.openHref(e,r);return n.defaultOpenHref?.(e,r)}function i(e){return typeof e==="string"?e:void 0}
@@ -0,0 +1,73 @@
1
+ import type * as React from 'react';
2
+ export type ObjectReferenceKind = 'address' | 'phone' | 'user' | 'customer' | 'file' | 'url' | 'custom';
3
+ export type ObjectReferenceInteractivityVisibility = 'none' | 'underline' | 'icon';
4
+ export type ObjectReferenceActionVariant = 'default' | 'primary' | 'secondary' | 'danger';
5
+ export type JsonPrimitive = string | number | boolean | null;
6
+ export type JsonValue = JsonPrimitive | JsonValue[] | {
7
+ readonly [key: string]: JsonValue;
8
+ };
9
+ export type ObjectReferenceMetadata = Record<string, JsonValue>;
10
+ export interface ObjectReferenceDescriptor {
11
+ id: string;
12
+ kind: ObjectReferenceKind;
13
+ label: string;
14
+ description?: string;
15
+ value?: string;
16
+ href?: string;
17
+ metadata?: ObjectReferenceMetadata;
18
+ iconKey?: string;
19
+ ariaLabel?: string;
20
+ }
21
+ export interface ObjectReferenceActionDescriptor {
22
+ id: string;
23
+ label: string;
24
+ description?: string;
25
+ href?: string;
26
+ disabled?: boolean;
27
+ variant?: ObjectReferenceActionVariant;
28
+ iconKey?: string;
29
+ metadata?: ObjectReferenceMetadata;
30
+ }
31
+ export interface ObjectReferenceActionEvent {
32
+ reference: ObjectReferenceDescriptor;
33
+ action: ObjectReferenceActionDescriptor;
34
+ source: 'action';
35
+ }
36
+ export type ObjectReferenceActionHandler = (event: ObjectReferenceActionEvent) => void | Promise<void>;
37
+ export type ObjectReferenceCopyHandler = (text: string, event: ObjectReferenceActionEvent) => void | Promise<void>;
38
+ export type ObjectReferenceOpenHrefHandler = (href: string, event: ObjectReferenceActionEvent) => void | Promise<void>;
39
+ export interface ObjectReferenceRenderContext {
40
+ reference: ObjectReferenceDescriptor;
41
+ actions: ObjectReferenceActionDescriptor[];
42
+ open: boolean;
43
+ setOpen: (open: boolean) => void;
44
+ }
45
+ export interface ObjectReferenceActionRenderContext extends ObjectReferenceRenderContext {
46
+ action: ObjectReferenceActionDescriptor;
47
+ runAction: (action: ObjectReferenceActionDescriptor) => void;
48
+ }
49
+ export interface ObjectReferenceIconRenderContext {
50
+ iconKey: string;
51
+ reference: ObjectReferenceDescriptor;
52
+ action?: ObjectReferenceActionDescriptor;
53
+ }
54
+ export interface ObjectReferenceHandlerProps {
55
+ reference: ObjectReferenceDescriptor;
56
+ actions?: ObjectReferenceActionDescriptor[];
57
+ interactivityVisibility?: ObjectReferenceInteractivityVisibility;
58
+ defaultOpen?: boolean;
59
+ open?: boolean;
60
+ onOpenChange?: (open: boolean) => void;
61
+ actionHandlers?: Record<string, ObjectReferenceActionHandler>;
62
+ onAction?: ObjectReferenceActionHandler;
63
+ onActionError?: (error: unknown, event: ObjectReferenceActionEvent) => void;
64
+ copyText?: string;
65
+ copyHandler?: ObjectReferenceCopyHandler;
66
+ openHref?: ObjectReferenceOpenHrefHandler;
67
+ renderTrigger?: (context: ObjectReferenceRenderContext) => React.ReactNode;
68
+ renderDetail?: (context: ObjectReferenceRenderContext) => React.ReactNode;
69
+ renderAction?: (context: ObjectReferenceActionRenderContext) => React.ReactNode;
70
+ iconRenderer?: (context: ObjectReferenceIconRenderContext) => React.ReactNode;
71
+ className?: string;
72
+ panelClassName?: string;
73
+ }
File without changes
@@ -0,0 +1,13 @@
1
+ import type { ObjectReferenceActionDescriptor, ObjectReferenceHandlerProps, ObjectReferenceRenderContext } from './types';
2
+ interface ControllerOptions extends ObjectReferenceHandlerProps {
3
+ defaultCopy?: ObjectReferenceHandlerProps['copyHandler'];
4
+ defaultOpenHref?: ObjectReferenceHandlerProps['openHref'];
5
+ }
6
+ export declare function useObjectReferenceController({ reference, actions, defaultOpen, open, onOpenChange, actionHandlers, onAction, onActionError, copyText, copyHandler, openHref, defaultCopy, defaultOpenHref, }: ControllerOptions): {
7
+ context: ObjectReferenceRenderContext;
8
+ resolvedActions: ObjectReferenceActionDescriptor[];
9
+ resolvedOpen: boolean;
10
+ runAction: (action: ObjectReferenceActionDescriptor) => void;
11
+ setOpen: (nextOpen: boolean) => void;
12
+ };
13
+ export {};
@@ -0,0 +1 @@
1
+ import*as q from"react";import{createDefaultObjectReferenceActions as $}from"./actions";import{executeObjectReferenceAction as D}from"./runtime";export function useObjectReferenceController({reference:k,actions:F,defaultOpen:W=!1,open:G,onOpenChange:I,actionHandlers:J,onAction:K,onActionError:L,copyText:M,copyHandler:N,openHref:P,defaultCopy:Q,defaultOpenHref:S}){const[X,Y]=q.useState(W),V=G!==void 0,w=G??X,z=q.useMemo(()=>F??$(k),[F,k]),B=q.useCallback((m)=>{if(!V)Y(m);I?.(m)},[V,I]),Z=q.useMemo(()=>({reference:k,actions:z,open:w,setOpen:B}),[k,z,w,B]),_=q.useCallback((m)=>{if(m.disabled)return;D({reference:k,action:m,source:"action"},{actionHandlers:J,copyText:M,copyHandler:N,openHref:P,onAction:K,onActionError:L,defaultCopy:Q,defaultOpenHref:S})},[J,N,M,Q,S,K,L,P,k]);return{context:Z,resolvedActions:z,resolvedOpen:w,runAction:_,setOpen:B}}
@@ -0,0 +1,2 @@
1
+ import type { AppShellProps } from './AppShell.types';
2
+ export declare function AppShell({ brand, logo, title, homeHref, navigation, commands, breadcrumbs, pageOutline, activeHref, activeOutlineId, userMenu, topbarStart, topbarEnd, children, className, contentClassName, onNavigate: _onNavigate, }: AppShellProps): import("react/jsx-runtime").JSX.Element;