@arpproject/recrate 0.1.52 → 0.1.54

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.
@@ -19,8 +19,8 @@ interface AddProps {
19
19
  placeholder?: string;
20
20
  crateManager: any;
21
21
  onCreateProperty: (data: any) => void;
22
- onCreateEntity: (data: any) => void;
23
- onLinkEntity: (data: any) => void;
22
+ onCreateEntity: (data: any) => string | null | void;
23
+ onLinkEntity: (data: any) => string | null | void;
24
24
  }
25
25
  declare const Add: React.FC<AddProps>;
26
26
  export default Add;
@@ -3,10 +3,12 @@ interface AutoCompleteProps {
3
3
  type: string;
4
4
  onLinkEntity: (data: {
5
5
  json: any;
6
- }) => void;
6
+ globalEntityValues?: any;
7
+ }) => string | null | void;
7
8
  onCreateEntity: (data: {
8
9
  json: any;
9
- }) => void;
10
+ fromGlobalEntity?: boolean;
11
+ }) => string | null | void;
10
12
  }
11
13
  declare const AutoComplete: React.FC<AutoCompleteProps>;
12
14
  export default AutoComplete;
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ interface GlobalEntityConflictDialogProps {
3
+ global: any;
4
+ matches: any[];
5
+ onChoose: (local: any, useGlobalValues: boolean) => void;
6
+ onCancel: () => void;
7
+ }
8
+ declare const GlobalEntityConflictDialog: React.FC<GlobalEntityConflictDialogProps>;
9
+ export default GlobalEntityConflictDialog;
@@ -13,6 +13,7 @@ export declare class Lookup {
13
13
  private crateManager;
14
14
  constructor({ config, lookup, crateManager }: LookupConfig);
15
15
  getEntities(type: string, queryString: string): Promise<LookupResult>;
16
+ globalEntities(type: string, queryString: string): Promise<LookupResult>;
16
17
  dataPacks(type: string, queryString: string): Promise<LookupResult>;
17
18
  entities(type: string, queryString: string): Promise<LookupResult>;
18
19
  entityTemplates(type: string, queryString: string): Promise<LookupResult>;
@@ -0,0 +1,3 @@
1
+ export declare const globalEntityValues: (entity: any) => Record<string, any>;
2
+ export declare const globalEntityValuesMatch: (local: any, global: any) => boolean;
3
+ export declare const findGlobalEntityMatches: (crateManager: any, global: any) => any[];
@@ -33,7 +33,7 @@ declare const useEntityMutationHandlers: ({ entity, contextEntity, crateManager,
33
33
  property: string;
34
34
  idx: number;
35
35
  }) => void;
36
- handleLinkEntity: (data: any) => void;
36
+ handleLinkEntity: (data: any) => any;
37
37
  handleRejectAiEntityUnlink: (data: {
38
38
  sourceEntityId: string;
39
39
  property: string;
@@ -11,12 +11,11 @@ interface UseEntityNavigationStateOptions {
11
11
  iconView: boolean;
12
12
  tabPaneWidth: number;
13
13
  onSaveCrate: (activeEntityId?: string) => void;
14
- debugScroll?: (...args: any[]) => void;
15
14
  }
16
15
  interface CaptureViewContextOptions {
17
16
  updateActiveTab?: boolean;
18
17
  }
19
- declare const useEntityNavigationState: ({ activeTab, activeContentRef, contextEntity, state, restoreInProgressRef, showAddPanel, reverseSidebarVisible, highlightRequiredProperties, iconView, tabPaneWidth, onSaveCrate, debugScroll, }: UseEntityNavigationStateOptions) => {
18
+ declare const useEntityNavigationState: ({ activeTab, activeContentRef, contextEntity, state, restoreInProgressRef, showAddPanel, reverseSidebarVisible, highlightRequiredProperties, iconView, tabPaneWidth, onSaveCrate, }: UseEntityNavigationStateOptions) => {
20
19
  captureCurrentViewContext: (tabName?: string) => void;
21
20
  captureViewContext: (tabName?: string, explicitScrollTop?: number, options?: CaptureViewContextOptions) => void;
22
21
  saveCratePreservingView: (activeEntityId?: string) => void;
@@ -28,7 +28,6 @@ interface UseEntityScrollRestorationOptions {
28
28
  updateActiveTab?: boolean;
29
29
  }) => void;
30
30
  disabled?: boolean;
31
- debugScroll?: (...args: any[]) => void;
32
31
  }
33
- declare const useEntityScrollRestoration: ({ activeTab, activeContentRef, contextEntity, renderTabs, tabsLength, extraPropertiesLength, scrollRestoreNonce, setScrollRestoreNonce, navigationRestoreReadyRef, pendingRestoredTabRef, restoreInProgressRef, pendingAddedPropertyRef, showAddPanel, reverseSidebarVisible, highlightRequiredProperties, iconView, tabPaneWidth, state, isAiScrollRestoreSuppressed, captureViewContext, disabled, debugScroll, }: UseEntityScrollRestorationOptions) => void;
32
+ declare const useEntityScrollRestoration: ({ activeTab, activeContentRef, contextEntity, renderTabs, tabsLength, extraPropertiesLength, scrollRestoreNonce, setScrollRestoreNonce, navigationRestoreReadyRef, pendingRestoredTabRef, restoreInProgressRef, pendingAddedPropertyRef, showAddPanel, reverseSidebarVisible, highlightRequiredProperties, iconView, tabPaneWidth, state, isAiScrollRestoreSuppressed, captureViewContext, disabled, }: UseEntityScrollRestorationOptions) => void;
34
33
  export default useEntityScrollRestoration;
@@ -176,6 +176,19 @@ declare namespace en {
176
176
  let external_lookup_timeout_error: string;
177
177
  let ror_lookup_timeout_error: string;
178
178
  let associate_existing_entity: string;
179
+ let associate_global_entity: string;
180
+ let global_entity_already_exists_title: string;
181
+ let global_entity_reused_notice: string;
182
+ let global_entity_reused_ok: string;
183
+ let global_entity_conflict_title: string;
184
+ let global_entity_conflict_description: string;
185
+ let global_entity_conflict_preserve_links: string;
186
+ let global_entity_conflict_cancel: string;
187
+ let global_entity_conflict_property: string;
188
+ let global_entity_conflict_crate_values: string;
189
+ let global_entity_conflict_global_values: string;
190
+ let global_entity_conflict_keep_crate: string;
191
+ let global_entity_conflict_use_global: string;
179
192
  let associate_entity_from_template: string;
180
193
  let associate_organization_from_ror: string;
181
194
  let associate_user_created_entity: string;
@@ -176,6 +176,19 @@ declare namespace hu {
176
176
  let external_lookup_timeout_error: string;
177
177
  let ror_lookup_timeout_error: string;
178
178
  let associate_existing_entity: string;
179
+ let associate_global_entity: string;
180
+ let global_entity_already_exists_title: string;
181
+ let global_entity_reused_notice: string;
182
+ let global_entity_reused_ok: string;
183
+ let global_entity_conflict_title: string;
184
+ let global_entity_conflict_description: string;
185
+ let global_entity_conflict_preserve_links: string;
186
+ let global_entity_conflict_cancel: string;
187
+ let global_entity_conflict_property: string;
188
+ let global_entity_conflict_crate_values: string;
189
+ let global_entity_conflict_global_values: string;
190
+ let global_entity_conflict_keep_crate: string;
191
+ let global_entity_conflict_use_global: string;
179
192
  let associate_entity_from_template: string;
180
193
  let associate_organization_from_ror: string;
181
194
  let associate_user_created_entity: string;
package/dist/recrate.css CHANGED
@@ -1,3 +1,3 @@
1
1
  .el-tabs__item{height:unset}.el-select-dropdown__wrap{max-height:500px!important}.el-select-group__title{font-size:14px!important}.scrollbar{overflow:overlay}.scrollbar::-webkit-scrollbar{background-color:#0000;height:16px;width:16px;z-index:999999}.scrollbar::-webkit-scrollbar-track{background-color:#0000}.scrollbar::-webkit-scrollbar-thumb{background-color:#0000;border:0 solid #fff;border-radius:16px}.scrollbar::-webkit-scrollbar-button{display:none}.scrollbar:hover::-webkit-scrollbar-thumb{background-color:#a0a0a5;border:4px solid #fff}.scrollbar::-webkit-scrollbar-thumb:hover{background-color:#a0a0a5;border:4px solid #f4f4f4}.cm-editor{font-size:12px;height:auto;max-height:none}.recrate-tab-icon{align-items:center;display:flex;font-size:14px;font-weight:600;height:100%;justify-content:center;width:100%}.recrate-add-only-tabs .ant-tabs-nav,.recrate-add-only-tabs .ant-tabs-nav-wrap{height:100%}.recrate-add-only-tabs .ant-tabs-nav-list{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center}.recrate-add-only-tabs .ant-tabs-tab{justify-content:center}.recrate-tab-rail{background:#fff;display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden;position:relative}.recrate-tab-rail-actions{border-bottom:1px solid #e5e7eb;display:flex;flex:0 0 auto;gap:8px;justify-content:center;padding:10px 8px 8px}.recrate-tab-rail-actions-only .recrate-tab-rail-actions{border-bottom:0}.recrate-tab-rail-list{flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto;padding:8px 6px 16px;scrollbar-width:none}.recrate-tab-rail-list::-webkit-scrollbar{display:none}.recrate-tab-rail-item{border-radius:6px;color:#334155;cursor:pointer;display:block;margin:2px 0;outline:none;padding:12px 10px;position:relative;transition:background-color .12s ease,color .12s ease;width:100%}.recrate-tab-rail-item:focus-visible,.recrate-tab-rail-item:hover{background:#f1f5f9}.recrate-tab-rail-item-active{background:#eaf2ff;color:#1d4ed8}.recrate-tab-rail-item-active:before{background:#2563eb;border-radius:999px;bottom:10px;content:"";left:0;position:absolute;top:10px;width:3px}.recrate-tab-rail-item-icon{align-items:center;display:flex;justify-content:center;min-height:42px;padding:8px}.recrate-tab-rail-row{align-items:center;display:flex;gap:8px;justify-content:space-between}.recrate-tab-rail-title{font-size:15px;font-weight:600;line-height:1.35;min-width:0;overflow-wrap:anywhere}.recrate-tab-rail-status{align-items:center;display:inline-flex;flex:0 0 auto;gap:4px}.recrate-tab-rail-remove-button{flex:0 0 auto;transition:opacity .12s ease}.recrate-tab-rail-description{color:#64748b;font-size:12px;line-height:1.35;margin-top:4px;overflow-wrap:anywhere}.recrate-tab-rail:after,.recrate-tab-rail:before{content:"";height:34px;left:0;opacity:0;pointer-events:none;position:absolute;right:0;transition:opacity .12s ease;z-index:2}.recrate-tab-rail:before{background:linear-gradient(#fff,#fff0);top:53px}.recrate-tab-rail:after{background:linear-gradient(#fff0,#fff);bottom:0}.recrate-tab-rail-can-scroll-down:after,.recrate-tab-rail-can-scroll-up:before{opacity:1}.recrate-tab-rail-scroll-button{box-shadow:0 2px 8px #0f172a24;left:50%;position:absolute;transform:translateX(-50%);z-index:3}.recrate-tab-rail-scroll-button-up{top:58px}.recrate-tab-rail-scroll-button-down{bottom:8px}.recrate-add-property-drawer{z-index:6000}.recrate-matching-properties-tooltip,.recrate-schema-filter-dropdown{z-index:6100!important}.recrate-add-property-title.ant-typography{font-size:22px;line-height:1.25;margin:0}.recrate-add-property-results{flex:1 1 auto;min-height:0;position:relative}.recrate-add-property-results-updating .recrate-add-property-list{opacity:.55}.recrate-add-property-results-mask{align-items:center;backdrop-filter:blur(1px);background:#ffffffb8;display:flex;gap:8px;inset:0;justify-content:center;min-height:96px;position:absolute;z-index:2}.recrate-add-property-list{height:100%;min-height:0}.recrate-schema-settings-body{max-height:min(60vh,640px);min-height:0;overflow:hidden}.recrate-schema-settings-scroll{min-height:0;overflow-y:auto;padding-right:4px}.recrate-add-property-row{border:1px solid #0000;border-radius:6px;color:#111827;cursor:pointer;outline:none;padding:10px 12px 10px 14px;position:relative;transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease,transform .12s ease}.recrate-add-property-row:before{background:#0000;border-radius:999px;bottom:10px;content:"";left:0;position:absolute;top:10px;transition:background-color .12s ease;width:3px}.recrate-add-property-row:focus-visible,.recrate-add-property-row:hover{background:#f8fafc;border-color:#dbeafe;box-shadow:0 1px 4px #0f172a14}.recrate-add-property-row:active{transform:translateY(1px)}.recrate-add-property-row-selected{background:#eff6ff;border-color:#93c5fd;box-shadow:0 0 0 1px #2563eb1f}.recrate-add-property-row-selected:before{background:#2563eb}.recrate-add-property-row-header{color:#111827;min-width:0}.recrate-add-property-row-name{color:inherit;flex:0 1 auto;font-weight:600;min-width:0;overflow-wrap:anywhere}.recrate-add-property-row-type{color:#475569;overflow-wrap:anywhere}.recrate-add-property-row-help{color:#6b7280;display:block;line-height:1.45;margin-top:4px}.recrate-add-property-row-check{color:#2563eb;margin-left:auto}.recrate-quick-settings-header{align-items:center;backdrop-filter:blur(8px);background:#fffffff5;border-bottom:1px solid #dbe3ef;box-shadow:0 6px 14px #0f172a14;display:flex;gap:14px;margin:0 -12px 12px;padding:2px 12px 5px 18px;position:sticky;top:0;z-index:4}.recrate-quick-settings-actions{align-items:center;display:inline-flex;flex:0 0 auto;gap:6px}.recrate-quick-settings-filter{flex:1 1 260px;max-width:420px;min-width:160px}.recrate-property-compact .recrate-add-control{margin-bottom:0;margin-top:0;padding-bottom:0;padding-top:0}.recrate-property-name-with-ai{align-items:center;display:inline-flex;gap:6px;min-width:0}.recrate-ai-edited-icon{align-items:center;background:#effbf5;border-radius:50%;color:#087446;display:inline-flex;flex:0 0 auto;font-size:12px;font-weight:800;height:18px;justify-content:center;line-height:1;width:18px}.recrate-ai-edited-filter-button.ant-btn{color:#087446;font-weight:800;min-width:32px;padding-inline:0}.recrate-ai-edited-filter-button.ant-btn-primary{background:#12a76c;border-color:#12a76c;color:#fff}.recrate-ai-entity-review-card{box-shadow:inset 0 0 0 1px #38c88a47,0 2px 8px #186f4a14}.recrate-ai-entity-delete-card{box-shadow:0 2px 8px #b91c1c14}.recrate-ai-entity-delete-card:hover{box-shadow:0 6px 18px #b91c1c24}.recrate-ai-entity-unlink-card{box-shadow:0 2px 8px #c2610014}.recrate-ai-entity-unlink-card:hover{box-shadow:0 6px 18px #c2610024}.recrate-ai-deleted-linked-entity-id{border-bottom:1px solid #0003;color:#00000073;display:block;font-size:.75rem;line-height:1.35;margin-bottom:4px;overflow-wrap:anywhere;padding-bottom:4px}.recrate-ai-deleted-linked-entity-name{color:#000000e0;font-weight:700;overflow-wrap:anywhere}.recrate-ai-entity-reviewed-card{position:relative}.recrate-ai-entity-edited-badge{bottom:14px;position:absolute;right:14px;z-index:1}.recrate-ai-entity-review-card .recrate-ai-entity-edited-badge{right:130px}.recrate-ai-entity-review-summary{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-top:10px}.recrate-ai-entity-review-meta{align-items:center;display:inline-flex;gap:8px;min-width:0}.recrate-ai-entity-review-count{color:#087446;font-size:13px;font-weight:800;white-space:nowrap}.recrate-ai-entity-inline-actions{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-top:18px}.recrate-ai-entity-inline-actions .recrate-ai-actions{gap:12px}.recrate-ai-entity-review-button.ant-btn{background:#57d8a3;border:0;border-radius:6px;box-shadow:0 1px 2px #00000024;color:#0d2d23;font-size:13px;font-weight:800;height:28px;padding:0 10px}.recrate-ai-entity-review-button.ant-btn:focus-visible,.recrate-ai-entity-review-button.ant-btn:hover{background:#45c991!important;color:#0d2d23!important}.recrate-ai-entity-diff-toggle.ant-btn{background:#ffffffd1;border-color:#1486553d;color:#047857;min-width:28px;padding:0;width:28px}.recrate-ai-entity-diff-toggle.ant-btn:focus-visible,.recrate-ai-entity-diff-toggle.ant-btn:hover{background:#ecfdf5!important;border-color:#14865573;color:#047857!important}.recrate-ai-entity-delete-card .recrate-ai-entity-review-count{color:#b91c1c}.recrate-ai-entity-delete-card .recrate-ai-entity-review-button.ant-btn{background:#ff5b63}.recrate-ai-entity-delete-card .recrate-ai-entity-review-button.ant-btn:focus-visible,.recrate-ai-entity-delete-card .recrate-ai-entity-review-button.ant-btn:hover{background:#f0444f!important;color:#111827!important}.recrate-ai-entity-delete-card .recrate-ai-action-approve.ant-btn{background:#ff5b63;border-color:#ff5b63}.recrate-ai-entity-delete-card .recrate-ai-action-approve.ant-btn:focus-visible,.recrate-ai-entity-delete-card .recrate-ai-action-approve.ant-btn:hover{background:#f0444f!important;border-color:#f0444f!important;color:#111827!important}.recrate-ai-entity-delete-card .recrate-ai-action-reject.ant-btn{background:#57d8a3;border-color:#57d8a3}.recrate-ai-entity-delete-card .recrate-ai-action-reject.ant-btn:focus-visible,.recrate-ai-entity-delete-card .recrate-ai-action-reject.ant-btn:hover{background:#45c991!important;border-color:#45c991!important;color:#111827!important}.recrate-ai-entity-unlink-card .recrate-ai-action-approve.ant-btn{background:#fb923c;border-color:#fb923c}.recrate-ai-entity-unlink-card .recrate-ai-action-approve.ant-btn:focus-visible,.recrate-ai-entity-unlink-card .recrate-ai-action-approve.ant-btn:hover{background:#f97316!important;border-color:#f97316!important;color:#111827!important}.recrate-ai-entity-unlink-card .recrate-ai-action-reject.ant-btn{background:#57d8a3;border-color:#57d8a3}.recrate-ai-entity-unlink-card .recrate-ai-action-reject.ant-btn:focus-visible,.recrate-ai-entity-unlink-card .recrate-ai-action-reject.ant-btn:hover{background:#45c991!important;border-color:#45c991!important;color:#111827!important}.recrate-ai-confirm-bar{align-items:center;background:linear-gradient(90deg,#f5fff9,#f9fbfd);border-bottom:1px solid #c8ded4;border-top:1px solid #e7eee9;box-shadow:inset 4px 0 0 #54d69d;color:#2d3b35;display:grid;gap:10px;grid-template-columns:minmax(220px,1fr) auto;min-height:40px;padding:5px 10px 5px 14px}.recrate-ai-confirm-message{align-items:center;display:flex;font-size:13px;font-weight:700;gap:10px;line-height:1.2;min-width:0;overflow:hidden}.recrate-ai-confirm-spark{color:#12a76c;font-size:17px;line-height:1}.recrate-ai-confirm-controls{align-items:center;display:flex;gap:6px;white-space:nowrap}.recrate-ai-confirm-bar-remaining{background:linear-gradient(90deg,#fff9eb,#f9fbfd);box-shadow:inset 4px 0 0 #f59e0b}.recrate-ai-confirm-bar-remaining .recrate-ai-confirm-spark{color:#b45309}.recrate-ai-review-next-entity.ant-btn{background:#fbbf24;border:0;border-radius:5px;box-shadow:0 1px 2px #0000001f;color:#1f1710;font-size:12px;font-weight:800;height:26px;padding:0 10px}.recrate-ai-review-next-entity.ant-btn:focus-visible,.recrate-ai-review-next-entity.ant-btn:hover{background:#f59e0b!important;color:#1f1710!important}.recrate-ai-bulk-action.ant-btn{align-items:center;border:0;border-radius:5px;box-shadow:0 1px 2px #0000001f;color:#14201b;display:inline-flex;font-size:12px;font-weight:800;gap:6px;height:26px;padding:0 9px}.recrate-ai-bulk-action-icon{font-size:10px}.recrate-ai-bulk-action-menu-trigger{align-items:center;align-self:stretch;cursor:pointer;display:inline-flex;margin:0 -5px 0 0;padding:0 5px}.recrate-ai-bulk-accept.ant-btn{background:#57d8a3}.recrate-ai-bulk-accept.ant-btn:focus-visible,.recrate-ai-bulk-accept.ant-btn:hover{background:#45c991!important;color:#14201b!important}.recrate-ai-bulk-reject.ant-btn{background:#ff6a71;color:#1f1717}.recrate-ai-bulk-reject.ant-btn:focus-visible,.recrate-ai-bulk-reject.ant-btn:hover{background:#f0444f!important;color:#1f1717!important}.recrate-ai-stepper{align-items:center;border-left:1px solid #cad7d1;color:#53625c;display:inline-flex;font-weight:800;gap:4px;margin-left:2px;padding-left:8px}.recrate-ai-stepper .ant-btn{border-radius:5px;color:#4a5a54;height:24px;width:24px}.recrate-ai-stepper .ant-btn:not(:disabled):focus-visible,.recrate-ai-stepper .ant-btn:not(:disabled):hover{background:#e6f4ec!important;color:#33443d!important}.recrate-ai-step-count{color:#34443d;font-size:13px;min-width:32px;text-align:center}.recrate-ai-review{border-radius:8px;margin-top:18px;padding-top:20px!important;position:relative}.recrate-ai-review-current .recrate-ai-suggestion,.recrate-ai-review-current.recrate-property,.recrate-ai-suggestion.recrate-ai-review-current{border-color:#12a76ce6!important;box-shadow:inset 4px 0 0 #12a76c,0 0 0 3px #12a76c1f,0 6px 18px #1969461f!important}.recrate-ai-delete.recrate-ai-review-current,.recrate-ai-review-current .recrate-ai-delete{border-color:#dc2626e0!important;box-shadow:inset 4px 0 0 #ef4444,0 0 0 3px #ef44441f,0 6px 18px #b91c1c1f!important}.recrate-ai-suggestion{background:linear-gradient(90deg,#22c55e1c,#22c55e0a 55%,#fff0);border:1px solid #22c55e6b;box-shadow:inset 4px 0 0 #22c55e,0 4px 14px #15803d14}.recrate-ai-delete{background:linear-gradient(90deg,#ef44441c,#ef44440a 55%,#fff0);border:1px solid #ef44446b;box-shadow:inset 4px 0 0 #ef4444,0 4px 14px #b91c1c14}.recrate-ai-suggestion:hover{background:linear-gradient(90deg,#22c55e26,#22c55e0d 55%,#fff0)}.recrate-ai-delete:hover{background:linear-gradient(90deg,#ef444426,#ef44440d 55%,#fff0)}.recrate-ai-deleted-entity-card{border-radius:8px;margin:18px;padding:26px 18px 18px;position:relative}.recrate-ai-deleted-entity-header{align-items:flex-start;display:flex;gap:18px;justify-content:space-between}.recrate-ai-deleted-entity-title{color:#7f1d1d;font-size:18px;font-weight:800;line-height:1.25;overflow-wrap:anywhere}.recrate-ai-deleted-entity-id{color:#991b1b;font-size:13px;font-weight:600;margin-top:4px;overflow-wrap:anywhere}.recrate-ai-deleted-entity-controls{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-top:14px}.recrate-ai-deleted-entity-controls .recrate-ai-actions{gap:8px}.recrate-ai-deleted-entity-controls .recrate-ai-actions .ant-btn{border-radius:6px;font-size:13px;height:28px;min-width:66px}.recrate-ai-deleted-entity-summary{align-items:center;color:#7f1d1d;display:inline-flex;font-size:14px;font-weight:700;gap:10px;min-width:0}.recrate-ai-deleted-entity-summary span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recrate-ai-entity-delete-details-toggle.ant-btn{background:#ffffffb8;border-color:#f8717175;color:#b91c1c;flex:0 0 auto;min-width:30px;padding:0;width:30px}.recrate-ai-entity-delete-details-toggle.ant-btn:focus-visible,.recrate-ai-entity-delete-details-toggle.ant-btn:hover,.recrate-ai-entity-delete-details-toggle.ant-btn[aria-pressed=true]{background:#ffe8e8!important;border-color:#f87171bd;color:#b91c1c!important}.recrate-ai-deleted-entity-fields{background:#f8717152;border:1px solid #f8717152;border-radius:8px;display:grid;gap:1px;grid-template-columns:minmax(120px,220px) minmax(0,1fr);margin-top:14px;overflow:hidden}.recrate-ai-deleted-entity-fields-inline{grid-template-columns:minmax(100px,170px) minmax(0,1fr);margin-top:10px}.recrate-ai-deleted-entity-field{display:contents}.recrate-ai-deleted-entity-field-name,.recrate-ai-deleted-entity-field-value{background:#ffffffb8;font-size:13px;min-width:0;overflow-wrap:anywhere;padding:8px 10px}.recrate-ai-deleted-entity-field-name{color:#7f1d1d;font-weight:800}.recrate-ai-deleted-entity-field-value{color:#450a0a}.recrate-ai-entity-diff-card{background:#f0fbf5;border:1px solid #38c88a8c;border-left:4px solid #38c88a;border-radius:8px;box-shadow:0 2px 8px #186f4a14;min-height:226px;overflow:hidden;position:relative}.recrate-ai-entity-diff-card-delete{background:#fff5f5;border-color:#dd505c7a #dd505c7a #dd505c7a #e24d5c;box-shadow:0 2px 8px #85242f14}.recrate-ai-entity-diff-card-unlink{background:#fff7ed;border-color:#f973167a #f973167a #f973167a #f97316;box-shadow:0 2px 8px #c2610014}.recrate-ai-entity-diff-head{align-items:center;background:#e4f7ed;border-bottom:1px solid #38c88a40;color:#087446;display:flex;font-size:13px;font-weight:900;gap:10px;justify-content:space-between;min-height:36px;padding:0 14px}.recrate-ai-entity-diff-card-delete .recrate-ai-entity-diff-head{background:#ffe8e8;border-bottom-color:#dd505c40;color:#9a1f29}.recrate-ai-entity-diff-card-unlink .recrate-ai-entity-diff-head{background:#ffedd5;border-bottom-color:#f9731640;color:#9a3412}.recrate-ai-entity-diff-close.ant-btn{color:currentColor;flex:0 0 auto}.recrate-ai-entity-diff-close.ant-btn:focus-visible,.recrate-ai-entity-diff-close.ant-btn:hover{background:#ffffff9e!important;color:currentColor!important}.recrate-ai-entity-diff-body{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:14px;padding:10px 0 52px}.recrate-ai-entity-diff-line{align-items:center;border-bottom:1px solid #0000000a;display:grid;grid-template-columns:28px minmax(74px,96px) minmax(0,1fr);min-height:29px}.recrate-ai-entity-diff-line-context{background:#f7faf8}.recrate-ai-entity-diff-line-removed{background:#fff1f1}.recrate-ai-entity-diff-line-added{background:#effbf5}.recrate-ai-entity-diff-marker{align-self:stretch;display:grid;font-weight:900;place-items:center}.recrate-ai-entity-diff-line-context .recrate-ai-entity-diff-marker{background:#eef2f0;color:#738078}.recrate-ai-entity-diff-line-removed .recrate-ai-entity-diff-marker{background:#ffdede;color:#9a1f29}.recrate-ai-entity-diff-line-added .recrate-ai-entity-diff-marker{background:#d8f5e7;color:#087446}.recrate-ai-entity-diff-key{color:#5b7167;padding:0 8px}.recrate-ai-entity-diff-key,.recrate-ai-entity-diff-value{font-weight:800;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recrate-ai-entity-diff-value{color:#1e2732;padding-right:10px}.recrate-ai-entity-diff-actions{bottom:14px;display:flex;gap:7px;position:absolute;right:14px}.recrate-ai-entity-diff-button.ant-btn{background:#57d8a3;border:0;border-radius:6px;box-shadow:0 1px 2px #00000024;color:#0d2d23;font-size:13px;font-weight:900;height:31px;min-width:100px;padding:0 10px}.recrate-ai-entity-diff-button.ant-btn:focus-visible,.recrate-ai-entity-diff-button.ant-btn:hover{background:#45c991!important;color:#0d2d23!important}.recrate-ai-entity-diff-button-reject.ant-btn{background:#ff6a71;color:#171717}.recrate-ai-entity-diff-button-reject.ant-btn:focus-visible,.recrate-ai-entity-diff-button-reject.ant-btn:hover{background:#f0444f!important;color:#171717!important}.recrate-ai-suggestion-badge{align-items:center;background:#ecfdf5;border:1px solid #10b98161;border-radius:7px;box-shadow:0 1px 2px #0f764a14;color:#047857;display:inline-flex;font-size:13px;font-weight:700;gap:6px;height:30px;left:18px;line-height:1;padding:0 11px;position:absolute;top:-15px;z-index:1}.recrate-ai-delete .recrate-ai-suggestion-badge{background:#fef2f2;border-color:#f871716b;box-shadow:0 1px 2px #b91c1c14;color:#b91c1c}.recrate-ai-suggestion-badge-icon{color:#047857;font-size:14px;line-height:1}.recrate-ai-delete .recrate-ai-suggestion-badge-icon{color:#b91c1c}.recrate-ai-entity-status-badge{left:14px;top:-15px}.recrate-ai-entity-delete-card .recrate-ai-entity-status-badge{background:#fef2f2;border-color:#f871716b;box-shadow:0 1px 2px #b91c1c14;color:#b91c1c}.recrate-ai-entity-delete-card .recrate-ai-entity-status-badge .recrate-ai-suggestion-badge-icon{color:#b91c1c}.recrate-ai-entity-unlink-card .recrate-ai-entity-status-badge{background:#fff7ed;border-color:#fb923c73;box-shadow:0 1px 2px #c2610014;color:#9a3412}.recrate-ai-entity-unlink-card .recrate-ai-entity-status-badge .recrate-ai-suggestion-badge-icon{color:#c2410c}.recrate-ai-field-row{align-items:flex-start}.recrate-ai-type-field-row{flex-wrap:wrap}.recrate-ai-type-field-row .recrate-ai-field-control{flex:1 1 250px}.recrate-ai-field-control .ant-space-compact{width:100%}.recrate-ai-field-control .ant-input,.recrate-ai-field-control .ant-input-affix-wrapper,.recrate-ai-field-control .ant-input-number,.recrate-ai-field-control .ant-picker,.recrate-ai-field-control .ant-select-selector,.recrate-ai-field-control textarea.ant-input{background:#f0fdf4!important;border-color:#22c55e!important;box-shadow:inset 0 0 0 1px #22c55e2e,0 0 0 3px #22c55e1a!important}.recrate-ai-delete .recrate-ai-field-control .ant-input,.recrate-ai-delete .recrate-ai-field-control .ant-input-affix-wrapper,.recrate-ai-delete .recrate-ai-field-control .ant-input-number,.recrate-ai-delete .recrate-ai-field-control .ant-picker,.recrate-ai-delete .recrate-ai-field-control .ant-select-selector,.recrate-ai-delete .recrate-ai-field-control textarea.ant-input{background:#fef2f2!important;border-color:#ef4444!important;box-shadow:inset 0 0 0 1px #ef44442e,0 0 0 3px #ef44441a!important}.recrate-ai-field-control .ant-space-compact>.ant-input,.recrate-ai-field-control .ant-space-compact>.ant-input-affix-wrapper,.recrate-ai-field-control .ant-space-compact>textarea.ant-input{border-end-end-radius:8px!important;border-start-end-radius:8px!important}.recrate-ai-field-control .ant-space-compact>.ant-btn{display:none}.recrate-context-review-drawer .ant-drawer-content{overflow:hidden}.recrate-context-review-drawer .ant-drawer-body{display:flex;flex-direction:column;min-height:0}.recrate-context-review{display:flex;flex:1 1 auto;flex-direction:column;gap:14px;min-height:0;overflow:hidden;padding:18px 20px 0}.recrate-context-review-summary{align-items:flex-start;background:linear-gradient(90deg,#f0fbf5,#f8fbfd);border:1px solid #38c88a4d;border-radius:8px;box-shadow:inset 4px 0 0 #38c88a,0 2px 8px #186f4a14;display:flex;gap:12px;padding:12px 14px}.recrate-context-review-spark{background:#57d8a3;border-radius:999px;box-shadow:0 1px 2px #0f172a2e;color:#063f2a;display:grid;flex:0 0 auto;font-size:12px;font-weight:900;height:32px;line-height:1;place-items:center;width:32px}.recrate-context-review-description.ant-typography{color:#2d3b35;font-size:14px;font-weight:650;line-height:1.45;margin:0;min-width:0}.recrate-ai-context-diff{background:#f0fbf5;border:1px solid #38c88a8c;border-left:4px solid #38c88a;border-radius:8px;box-shadow:0 2px 8px #186f4a14;display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:hidden}.recrate-ai-context-diff-head{align-items:center;background:#e4f7ed;border-bottom:1px solid #38c88a40;color:#087446;display:flex;font-size:13px;font-weight:900;gap:10px;justify-content:space-between;min-height:38px;padding:0 14px}.recrate-ai-context-diff-body{background:#fff;flex:1 1 auto;min-height:0;overflow:auto}.recrate-ai-context-diff-line{align-items:stretch;border-bottom:1px solid #0000000f;display:grid;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;grid-template-columns:32px 48px 48px minmax(0,1fr);line-height:1.45;min-width:0}.recrate-ai-context-diff-line:last-child{border-bottom:0}.recrate-ai-context-diff-marker{align-self:stretch;display:grid;font-size:16px;font-weight:900;place-items:center}.recrate-ai-context-diff-gutter{align-items:flex-start;background:#ffffff8a;border-right:1px solid #0000000d;color:#7b8781;display:flex;justify-content:flex-end;min-width:0;padding:7px 8px 7px 0;-webkit-user-select:none;user-select:none}.recrate-ai-context-diff-value{color:#1e2732;margin:0;min-width:0;overflow:visible;overflow-wrap:anywhere;padding:7px 12px;white-space:pre-wrap;word-break:break-word}.recrate-ai-context-diff-line-context{background:#fbfcfd}.recrate-ai-context-diff-line-removed{background:#fff1f1}.recrate-ai-context-diff-line-removed .recrate-ai-context-diff-marker{background:#ffdede;color:#9a1f29}.recrate-ai-context-diff-line-added{background:#effbf5}.recrate-ai-context-diff-line-added .recrate-ai-context-diff-marker{background:#d8f5e7;color:#087446}.recrate-ai-context-diff-line-omitted{background:#f7faf8;border:0;border-bottom:1px solid #0000000f;min-height:30px;text-align:left;width:100%}.recrate-ai-context-diff-line-omitted .recrate-ai-context-diff-marker{background:#eef2f0;color:#738078;font-size:12px}.recrate-ai-context-diff-line-omitted .recrate-ai-context-diff-gutter{background:#f7faf8}.recrate-ai-context-diff-omitted-button{cursor:pointer;outline:none}.recrate-ai-context-diff-omitted-button:hover{background:#eef8f2}.recrate-ai-context-diff-omitted-button:hover .recrate-ai-context-diff-gutter,.recrate-ai-context-diff-omitted-button:hover .recrate-ai-context-diff-marker{background:#e1f2e8}.recrate-ai-context-diff-omitted-button:focus-visible{box-shadow:inset 0 0 0 2px #12a76c8c}.recrate-ai-context-diff-omitted-label{align-items:center;color:#5b7167;display:flex;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:12px;font-weight:800;min-width:0;padding:6px 12px}.recrate-context-review-actions{background:#fff;border-top:1px solid #dce5e0;box-shadow:0 -6px 14px #0f172a0d;display:flex;flex:0 0 auto;gap:8px;justify-content:flex-end;padding:14px 20px 18px}.recrate-ai-field-diff{background:#fbfcfd;border:1px solid #d4ddd8;border-radius:7px;box-shadow:0 1px 2px #0000000d;font-size:15px;overflow:hidden;width:100%}.recrate-ai-field-diff-head{align-items:center;background:#f5f8f6;border-bottom:1px solid #dce5e0;color:#506158;display:flex;font-size:13px;font-weight:800;gap:10px;justify-content:space-between;min-height:31px;padding:0 10px}.recrate-ai-field-diff-chip{color:#087446;flex:0 0 auto;font-size:12px}.recrate-ai-field-diff-line{border-bottom:1px solid #0000000a;display:grid;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;grid-template-columns:28px minmax(0,1fr);min-height:36px}.recrate-ai-field-diff-line:last-child{border-bottom:0}.recrate-ai-field-diff-marker{align-self:stretch;display:grid;font-weight:900;place-items:center}.recrate-ai-field-diff-value{color:#27322d;margin:0;min-width:0;overflow:auto;overflow-wrap:anywhere;padding:7px 11px;white-space:pre-wrap}.recrate-ai-field-diff-line-removed{background:#fff1f1}.recrate-ai-field-diff-line-removed .recrate-ai-field-diff-marker{background:#ffdede;color:#9a1f29}.recrate-ai-field-diff-line-added{background:#effbf5}.recrate-ai-field-diff-line-added .recrate-ai-field-diff-marker{background:#d8f5e7;color:#087446}.recrate-ai-field-diff-empty{color:#7b8781;font-style:italic}.recrate-ai-actions{align-items:flex-start;display:flex;flex:0 0 auto;gap:18px}.recrate-ai-type-actions{flex:1 1 260px;flex-wrap:wrap;justify-content:flex-end;max-width:100%;min-width:0}.recrate-ai-actions .ant-btn{border:0;border-radius:8px;box-shadow:0 2px 5px #0f172a2e;color:#111827;font-size:14px;font-weight:700;height:34px;min-width:82px}.recrate-ai-action-diff.ant-btn{background:#fff;border:1px solid #d4ddd8;color:#0f172a;min-width:36px;padding:0;width:36px}.recrate-ai-action-diff.ant-btn:focus-visible,.recrate-ai-action-diff.ant-btn:hover{background:#f5f8f6!important;border-color:#9bc7b3!important;color:#087446!important}.recrate-ai-action-diff.ant-btn[aria-pressed=true]{background:#d8f5e7;border-color:#9bc7b3;color:#087446}.recrate-ai-action-approve.ant-btn{background:#57d8a3;border-color:#57d8a3}.recrate-ai-action-approve.ant-btn:focus-visible,.recrate-ai-action-approve.ant-btn:hover{background:#45c991!important;border-color:#45c991!important;color:#111827!important}.recrate-ai-action-reject.ant-btn,.recrate-ai-delete .recrate-ai-action-approve.ant-btn{background:#ff5b63;border-color:#ff5b63}.recrate-ai-delete .recrate-ai-action-approve.ant-btn:focus-visible,.recrate-ai-delete .recrate-ai-action-approve.ant-btn:hover{background:#f0444f!important;border-color:#f0444f!important;color:#111827!important}.recrate-ai-delete .recrate-ai-action-reject.ant-btn{background:#57d8a3;border-color:#57d8a3}.recrate-ai-delete .recrate-ai-action-reject.ant-btn:focus-visible,.recrate-ai-delete .recrate-ai-action-reject.ant-btn:hover{background:#45c991!important;border-color:#45c991!important;color:#111827!important}.recrate-ai-action-reject.ant-btn:focus-visible,.recrate-ai-action-reject.ant-btn:hover{background:#f0444f!important;border-color:#f0444f!important;color:#111827!important}@media (max-width:900px){.recrate-ai-confirm-bar{grid-template-columns:1fr}.recrate-ai-confirm-controls{flex-wrap:wrap}.recrate-ai-stepper{border-left:0;margin-left:0;padding-left:0}.recrate-ai-field-row{flex-wrap:wrap}.recrate-ai-actions{justify-content:flex-start;width:100%}}@media (max-width:640px){.recrate-quick-settings-header{flex-wrap:wrap}.recrate-quick-settings-filter{flex-basis:100%;max-width:none}}.recrate,.recrate .recrate-ant{display:flex;flex-direction:column;height:100vh;min-height:100vh}.recrate .ant-tabs-left .ant-tabs-nav,.recrate .ant-tabs-right .ant-tabs-nav,.recrate-editor-scroll{height:100%}.recrate .ant-tabs-bottom .ant-tabs-nav-wrap,.recrate .ant-tabs-top .ant-tabs-nav-wrap{overflow-x:auto}
2
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-200:oklch(88.5% 0.062 18.334);--color-red-500:oklch(63.7% 0.237 25.331);--color-red-600:oklch(57.7% 0.245 27.325);--color-red-700:oklch(50.5% 0.213 27.518);--color-green-100:oklch(96.2% 0.044 156.743);--color-green-200:oklch(92.5% 0.084 155.995);--color-green-600:oklch(62.7% 0.194 149.214);--color-cyan-200:oklch(91.7% 0.08 205.041);--color-sky-100:oklch(95.1% 0.026 236.824);--color-sky-500:oklch(68.5% 0.169 237.323);--color-blue-200:oklch(88.2% 0.059 254.128);--color-blue-300:oklch(80.9% 0.105 251.813);--color-blue-500:oklch(62.3% 0.214 259.815);--color-blue-600:oklch(54.6% 0.245 262.881);--color-blue-700:oklch(48.8% 0.243 264.376);--color-indigo-200:oklch(87% 0.065 274.039);--color-purple-200:oklch(90.2% 0.063 306.703);--color-slate-200:oklch(92.9% 0.013 255.508);--color-slate-300:oklch(86.9% 0.022 252.894);--color-slate-700:oklch(37.2% 0.044 257.287);--color-gray-50:oklch(98.5% 0.002 247.839);--color-gray-200:oklch(92.8% 0.006 264.531);--color-gray-300:oklch(87.2% 0.01 258.338);--color-gray-400:oklch(70.7% 0.022 261.325);--color-gray-600:oklch(44.6% 0.03 256.802);--color-gray-700:oklch(37.3% 0.034 259.733);--color-gray-800:oklch(27.8% 0.033 256.848);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--text-xs:0.75rem;--text-xs--line-height:1.33333;--text-sm:0.875rem;--text-sm--line-height:1.42857;--text-base:1rem;--text-base--line-height:1.5;--text-lg:1.125rem;--text-lg--line-height:1.55556;--font-weight-light:300;--font-weight-bold:700;--radius-lg:0.5rem;--animate-pulse:pulse 2s cubic-bezier(0.4,0,0.6,1) infinite;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:initial}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{background-color:initial;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,#0000)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}::file-selector-button,button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:0}.right-0{right:0}.right-2{right:calc(var(--spacing)*2)}.bottom-0{bottom:0}.bottom-2{bottom:calc(var(--spacing)*2)}.left-0{left:0}.isolate{isolation:isolate}.z-50{z-index:50}.float-right{float:right}.container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing)*2)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing)*2)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-1{height:var(--spacing)}.h-3{height:calc(var(--spacing)*3)}.h-8{height:calc(var(--spacing)*8)}.h-\[520px\]{height:520px}.h-full{height:100%}.min-h-0{min-height:0}.w-1{width:var(--spacing)}.w-1\/2{width:50%}.w-1\/3{width:33.33333%}.w-2\/3{width:66.66667%}.w-2\/6{width:33.33333%}.w-3{width:calc(var(--spacing)*3)}.w-4\/6{width:66.66667%}.w-6{width:calc(var(--spacing)*6)}.w-12{width:calc(var(--spacing)*12)}.w-\[600px\]{width:600px}.w-full{width:100%}.w-screen{width:100vw}.max-w-\[715px\]{max-width:715px}.min-w-0{min-width:0}.min-w-32{min-width:calc(var(--spacing)*32)}.min-w-72{min-width:calc(var(--spacing)*72)}.flex-1{flex:1}.flex-\[1_1_360px\]{flex:1 1 360px}.flex-grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-between{place-content:space-between}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing)*2)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*var(--tw-space-y-reverse))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing)*2)}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*var(--tw-space-x-reverse))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*2*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*2*var(--tw-space-x-reverse))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*4*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*4*var(--tw-space-x-reverse))}.gap-y-2{row-gap:calc(var(--spacing)*2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}:where(.divide-gray-300>:not(:last-child)){border-color:var(--color-gray-300)}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-solid{--tw-border-style:solid;border-style:solid}.border-black{border-color:var(--color-black)}.border-black\/20{border-color:color-mix(in srgb,#000 20%,#0000);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-black) 20%,#0000)}}.border-gray-400{border-color:var(--color-gray-400)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-700{border-color:var(--color-slate-700)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-200{background-color:var(--color-green-200)}.bg-indigo-200{background-color:var(--color-indigo-200)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-500{background-color:var(--color-red-500)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-700{background-color:var(--color-slate-700)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-0{padding-top:0}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-1{padding-right:var(--spacing)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-1{padding-left:var(--spacing)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-600{color:var(--color-blue-600)}.text-gray-400{color:var(--color-gray-400)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-green-600{color:var(--color-green-600)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-50{opacity:50%}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.\!filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-transform{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.duration-1000{--tw-duration:1000ms;transition-duration:1s}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:100%}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:rounded-r-none:hover{border-bottom-right-radius:0;border-top-right-radius:0}.hover\:bg-blue-300:hover{background-color:var(--color-blue-300)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-cyan-200:hover{background-color:var(--color-cyan-200)}.hover\:bg-green-200:hover{background-color:var(--color-green-200)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-sky-100:hover{background-color:var(--color-sky-100)}.hover\:text-black:hover{color:var(--color-black)}}.focus\:border-2:focus{border-style:var(--tw-border-style);border-width:2px}.focus\:border-green-600:focus{border-color:var(--color-green-600)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-sky-500:focus-visible{--tw-ring-color:var(--color-sky-500)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}@media (width >= 80rem){.xl\:w-1\/5{width:20%}.xl\:w-4\/5{width:80%}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}
2
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer theme, base, components, utilities;@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-200:oklch(88.5% 0.062 18.334);--color-red-500:oklch(63.7% 0.237 25.331);--color-red-600:oklch(57.7% 0.245 27.325);--color-red-700:oklch(50.5% 0.213 27.518);--color-green-100:oklch(96.2% 0.044 156.743);--color-green-200:oklch(92.5% 0.084 155.995);--color-green-600:oklch(62.7% 0.194 149.214);--color-cyan-200:oklch(91.7% 0.08 205.041);--color-sky-100:oklch(95.1% 0.026 236.824);--color-sky-500:oklch(68.5% 0.169 237.323);--color-blue-200:oklch(88.2% 0.059 254.128);--color-blue-300:oklch(80.9% 0.105 251.813);--color-blue-500:oklch(62.3% 0.214 259.815);--color-blue-600:oklch(54.6% 0.245 262.881);--color-blue-700:oklch(48.8% 0.243 264.376);--color-indigo-200:oklch(87% 0.065 274.039);--color-purple-200:oklch(90.2% 0.063 306.703);--color-slate-200:oklch(92.9% 0.013 255.508);--color-slate-300:oklch(86.9% 0.022 252.894);--color-slate-700:oklch(37.2% 0.044 257.287);--color-gray-50:oklch(98.5% 0.002 247.839);--color-gray-200:oklch(92.8% 0.006 264.531);--color-gray-300:oklch(87.2% 0.01 258.338);--color-gray-400:oklch(70.7% 0.022 261.325);--color-gray-600:oklch(44.6% 0.03 256.802);--color-gray-700:oklch(37.3% 0.034 259.733);--color-gray-800:oklch(27.8% 0.033 256.848);--color-black:#000;--color-white:#fff;--spacing:0.25rem;--text-xs:0.75rem;--text-xs--line-height:1.33333;--text-sm:0.875rem;--text-sm--line-height:1.42857;--text-base:1rem;--text-base--line-height:1.5;--text-lg:1.125rem;--text-lg--line-height:1.55556;--font-weight-light:300;--font-weight-bold:700;--radius-lg:0.5rem;--animate-pulse:pulse 2s cubic-bezier(0.4,0,0.6,1) infinite;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4,0,0.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,::file-selector-button,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:initial}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}::file-selector-button,button,input,optgroup,select,textarea{background-color:initial;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:currentcolor;@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,#0000)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}::file-selector-button,button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:0}.right-0{right:0}.right-2{right:calc(var(--spacing)*2)}.bottom-0{bottom:0}.bottom-2{bottom:calc(var(--spacing)*2)}.left-0{left:0}.isolate{isolation:isolate}.z-50{z-index:50}.float-right{float:right}.container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.m-1{margin:var(--spacing)}.m-2{margin:calc(var(--spacing)*2)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing)*2)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-1{height:var(--spacing)}.h-3{height:calc(var(--spacing)*3)}.h-8{height:calc(var(--spacing)*8)}.h-\[520px\]{height:520px}.h-full{height:100%}.min-h-0{min-height:0}.w-1{width:var(--spacing)}.w-1\/2{width:50%}.w-1\/3{width:33.33333%}.w-2\/3{width:66.66667%}.w-2\/6{width:33.33333%}.w-3{width:calc(var(--spacing)*3)}.w-4\/6{width:66.66667%}.w-6{width:calc(var(--spacing)*6)}.w-12{width:calc(var(--spacing)*12)}.w-\[600px\]{width:600px}.w-full{width:100%}.w-screen{width:100vw}.max-w-\[715px\]{max-width:715px}.min-w-0{min-width:0}.min-w-32{min-width:calc(var(--spacing)*32)}.min-w-72{min-width:calc(var(--spacing)*72)}.flex-1{flex:1}.flex-\[1_1_360px\]{flex:1 1 360px}.flex-grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-between{place-content:space-between}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing)*2)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*var(--tw-space-y-reverse))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*2*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*2*var(--tw-space-y-reverse))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*3*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*3*var(--tw-space-y-reverse))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*4*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*4*var(--tw-space-y-reverse))}.gap-x-1{column-gap:var(--spacing)}.gap-x-2{column-gap:calc(var(--spacing)*2)}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*var(--tw-space-x-reverse))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*2*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*2*var(--tw-space-x-reverse))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*4*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*4*var(--tw-space-x-reverse))}.gap-y-2{row-gap:calc(var(--spacing)*2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-bottom-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse))}:where(.divide-gray-300>:not(:last-child)){border-color:var(--color-gray-300)}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-solid{--tw-border-style:solid;border-style:solid}.border-black{border-color:var(--color-black)}.border-black\/20{border-color:color-mix(in srgb,#000 20%,#0000);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--color-black) 20%,#0000)}}.border-gray-400{border-color:var(--color-gray-400)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-700{border-color:var(--color-slate-700)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-200{background-color:var(--color-green-200)}.bg-indigo-200{background-color:var(--color-indigo-200)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-500{background-color:var(--color-red-500)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-700{background-color:var(--color-slate-700)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-0{padding-top:0}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-1{padding-right:var(--spacing)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-1{padding-left:var(--spacing)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-600{color:var(--color-blue-600)}.text-gray-400{color:var(--color-gray-400)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-green-600{color:var(--color-green-600)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-50{opacity:50%}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.\!filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-colors{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.transition-transform{transition-duration:var(--tw-duration,var(--default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))}.duration-1000{--tw-duration:1000ms;transition-duration:1s}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:100%}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:rounded-r-none:hover{border-bottom-right-radius:0;border-top-right-radius:0}.hover\:bg-blue-300:hover{background-color:var(--color-blue-300)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-cyan-200:hover{background-color:var(--color-cyan-200)}.hover\:bg-green-200:hover{background-color:var(--color-green-200)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-sky-100:hover{background-color:var(--color-sky-100)}.hover\:text-black:hover{color:var(--color-black)}}.focus\:border-2:focus{border-style:var(--tw-border-style);border-width:2px}.focus\:border-green-600:focus{border-color:var(--color-green-600)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-sky-500:focus-visible{--tw-ring-color:var(--color-sky-500)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}@media (width >= 80rem){.xl\:w-1\/5{width:20%}.xl\:w-4\/5{width:80%}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}
3
3
  .recrate{all:revert-layer}
@@ -66720,7 +66720,7 @@ const Text$2 = ({
66720
66720
  onSaveProperty
66721
66721
  }) => {
66722
66722
  const { t: t2 } = useTranslation();
66723
- const [displayValue, setDisplayValue] = useState(decodeValue(value));
66723
+ const [displayValue2, setDisplayValue] = useState(decodeValue(value));
66724
66724
  const [isValidTextValue, setIsValidTextValue] = useState(true);
66725
66725
  const textareaRef = useRef(null);
66726
66726
  const saveButtonRef = useRef(null);
@@ -66729,7 +66729,7 @@ const Text$2 = ({
66729
66729
  validateTextConstraints(decodeValue(value));
66730
66730
  }, [value]);
66731
66731
  useEffect(() => {
66732
- validateTextConstraints(displayValue);
66732
+ validateTextConstraints(displayValue2);
66733
66733
  }, []);
66734
66734
  const constraints = {
66735
66735
  minLength: definition == null ? void 0 : definition.minLength,
@@ -66738,7 +66738,7 @@ const Text$2 = ({
66738
66738
  dateFormat: definition == null ? void 0 : definition.dateFormat
66739
66739
  };
66740
66740
  function validateTextConstraints(valueToCheck) {
66741
- const valueToValidate = valueToCheck ?? displayValue ?? "";
66741
+ const valueToValidate = valueToCheck ?? displayValue2 ?? "";
66742
66742
  if (constraints.minLength !== void 0 && constraints.minLength > valueToValidate.length) {
66743
66743
  setIsValidTextValue(false);
66744
66744
  } else if (constraints.maxLength !== void 0 && constraints.maxLength < valueToValidate.length) {
@@ -66762,7 +66762,7 @@ const Text$2 = ({
66762
66762
  if (isValidTextValue) {
66763
66763
  onSaveProperty({
66764
66764
  property,
66765
- value: displayValue.trim()
66765
+ value: displayValue2.trim()
66766
66766
  });
66767
66767
  }
66768
66768
  }
@@ -66809,7 +66809,7 @@ const Text$2 = ({
66809
66809
  {
66810
66810
  size: "middle",
66811
66811
  type: type4,
66812
- value: displayValue,
66812
+ value: displayValue2,
66813
66813
  onChange: handleTextChange,
66814
66814
  onBlur: handleBlur,
66815
66815
  onKeyDown: (e3) => {
@@ -66822,7 +66822,7 @@ const Text$2 = ({
66822
66822
  Input2.TextArea,
66823
66823
  {
66824
66824
  ref: textareaRef,
66825
- value: displayValue,
66825
+ value: displayValue2,
66826
66826
  onChange: handleTextareaChange,
66827
66827
  onBlur: handleBlur,
66828
66828
  onKeyDown: (e3) => {
@@ -93874,6 +93874,10 @@ class Lookup {
93874
93874
  documents
93875
93875
  };
93876
93876
  }
93877
+ async globalEntities(type4, queryString) {
93878
+ const results = await this.lookup.globalEntities({ type: type4, queryString });
93879
+ return { endpoint: "global", documents: stringifyDocumentType(results.documents) };
93880
+ }
93877
93881
  async dataPacks(type4, queryString) {
93878
93882
  var _a2, _b;
93879
93883
  if (!queryString) return { endpoint: "datapacks", documents: [] };
@@ -93993,6 +93997,97 @@ function stringifyDocumentType(documents) {
93993
93997
  "@type": lodashExports.isArray(d2["@type"]) ? d2["@type"].join(", ") : d2["@type"]
93994
93998
  }));
93995
93999
  }
94000
+ const entityTypes = (entity) => (Array.isArray(entity["@type"]) ? entity["@type"] : [entity["@type"]]).filter((type4) => typeof type4 === "string");
94001
+ const entityName = (entity) => (Array.isArray(entity.name) ? entity.name.join(" ") : String(entity.name ?? "")).normalize("NFKC").trim().replace(/\s+/g, " ").toLocaleLowerCase();
94002
+ const literalValue = (value) => {
94003
+ if (Array.isArray(value)) {
94004
+ const values = value.map(literalValue).filter((item) => item !== void 0);
94005
+ return values.length ? values : void 0;
94006
+ }
94007
+ if (value && typeof value === "object") {
94008
+ if (typeof value["@id"] === "string") return void 0;
94009
+ const entries = Object.keys(value).sort().flatMap((key) => {
94010
+ const child = literalValue(value[key]);
94011
+ return child === void 0 ? [] : [[key, child]];
94012
+ });
94013
+ return entries.length ? Object.fromEntries(entries) : void 0;
94014
+ }
94015
+ return value;
94016
+ };
94017
+ const globalEntityValues = (entity) => {
94018
+ const values = {};
94019
+ for (const key of Object.keys(entity).sort()) {
94020
+ if (["@id", "@type", "@reverse", "type", "globalRecordId"].includes(key)) continue;
94021
+ const value = literalValue(entity[key]);
94022
+ if (value !== void 0) values[key] = value;
94023
+ }
94024
+ return values;
94025
+ };
94026
+ const comparableValues = (entity) => Object.fromEntries(
94027
+ Object.entries(globalEntityValues(entity)).map(([key, value]) => [
94028
+ key,
94029
+ key === "name" && Array.isArray(value) ? value.join(" ") : Array.isArray(value) && value.length === 1 ? value[0] : value
94030
+ ])
94031
+ );
94032
+ const globalEntityValuesMatch = (local, global2) => JSON.stringify(comparableValues(local)) === JSON.stringify(comparableValues(global2));
94033
+ const findGlobalEntityMatches = (crateManager, global2) => {
94034
+ const types2 = entityTypes(global2);
94035
+ const name2 = entityName(global2);
94036
+ return Object.keys((crateManager == null ? void 0 : crateManager.entityIdIndex) ?? {}).flatMap((id2) => {
94037
+ const local = crateManager.getEntity({ id: id2, link: false, materialise: false });
94038
+ if (!local || !entityTypes(local).some((type4) => types2.includes(type4))) return [];
94039
+ if (id2 === global2["@id"] || name2 && entityName(local) === name2 || Object.keys(globalEntityValues(global2)).length > 0 && globalEntityValuesMatch(local, global2)) {
94040
+ return [local];
94041
+ }
94042
+ return [];
94043
+ });
94044
+ };
94045
+ const displayValue = (value) => {
94046
+ if (Array.isArray(value) && value.length === 1) value = value[0];
94047
+ return value === void 0 ? "—" : typeof value === "string" ? value : JSON.stringify(value);
94048
+ };
94049
+ const GlobalEntityConflictDialog = ({ global: global2, matches: matches2, onChoose, onCancel }) => {
94050
+ const { t: t2 } = useTranslation();
94051
+ const globalValues = globalEntityValues(global2);
94052
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
94053
+ Modal,
94054
+ {
94055
+ open: true,
94056
+ title: t2("global_entity_conflict_title"),
94057
+ onCancel,
94058
+ footer: /* @__PURE__ */ jsxRuntimeExports.jsx(Button$1, { onClick: onCancel, children: t2("global_entity_conflict_cancel") }),
94059
+ width: 760,
94060
+ children: [
94061
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: t2("global_entity_conflict_description") }),
94062
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: t2("global_entity_conflict_preserve_links") }),
94063
+ matches2.map((local) => {
94064
+ const localValues = globalEntityValues(local);
94065
+ const properties = [.../* @__PURE__ */ new Set([...Object.keys(localValues), ...Object.keys(globalValues)])].sort();
94066
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { marginTop: 20 }, children: [
94067
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: local.name }),
94068
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { overflowWrap: "anywhere", marginBottom: 8 }, children: local["@id"] }),
94069
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { style: { width: "100%", tableLayout: "fixed", borderCollapse: "collapse" }, children: [
94070
+ /* @__PURE__ */ jsxRuntimeExports.jsx("thead", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { children: [
94071
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { scope: "col", children: t2("global_entity_conflict_property") }),
94072
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { scope: "col", children: t2("global_entity_conflict_crate_values") }),
94073
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { scope: "col", children: t2("global_entity_conflict_global_values") })
94074
+ ] }) }),
94075
+ /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: properties.map((property) => /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { children: [
94076
+ /* @__PURE__ */ jsxRuntimeExports.jsx("th", { scope: "row", style: { textAlign: "left", padding: 6, overflowWrap: "anywhere" }, children: property }),
94077
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { style: { padding: 6, overflowWrap: "anywhere" }, children: displayValue(localValues[property]) }),
94078
+ /* @__PURE__ */ jsxRuntimeExports.jsx("td", { style: { padding: 6, overflowWrap: "anywhere" }, children: displayValue(globalValues[property]) })
94079
+ ] }, property)) })
94080
+ ] }),
94081
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", flexWrap: "wrap", gap: 8, marginTop: 12 }, children: [
94082
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button$1, { type: "primary", onClick: () => onChoose(local, false), children: t2("global_entity_conflict_keep_crate") }),
94083
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button$1, { onClick: () => onChoose(local, true), children: t2("global_entity_conflict_use_global") })
94084
+ ] })
94085
+ ] }, local["@id"]);
94086
+ })
94087
+ ]
94088
+ }
94089
+ );
94090
+ };
93996
94091
  const newEntityFromName = (type4, name2) => ({
93997
94092
  type: "new",
93998
94093
  "@id": name2,
@@ -94001,15 +94096,17 @@ const newEntityFromName = (type4, name2) => ({
94001
94096
  });
94002
94097
  const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94003
94098
  const { t: t2 } = useTranslation();
94099
+ const { modal } = App.useApp();
94004
94100
  const crateManager = useContext(CrateManagerContext);
94005
94101
  const lookupHandler = useContext(LookupsContext);
94006
- useStateStore();
94007
94102
  const [loading, setLoading] = useState(false);
94008
94103
  const [selection2, setSelection] = useState(null);
94009
94104
  const [matches2, setMatches] = useState([]);
94105
+ const [conflict, setConflict] = useState(null);
94010
94106
  const inputValue = useRef("");
94107
+ const searchVersion = useRef(0);
94011
94108
  const promiseTimeout = 2500;
94012
- const querySearch = async (queryString) => {
94109
+ const querySearch = async (queryString, version2 = ++searchVersion.current) => {
94013
94110
  var _a2;
94014
94111
  setLoading(true);
94015
94112
  const lookup = new Lookup({
@@ -94022,6 +94119,15 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94022
94119
  if (crateManager == null ? void 0 : crateManager.getEntities) {
94023
94120
  lookups.push(wrapPromise(lookup.getEntities(type4, queryString), promiseTimeout));
94024
94121
  }
94122
+ if (lookupHandler == null ? void 0 : lookupHandler.globalEntities) {
94123
+ lookups.push(wrapPromise(
94124
+ lookup.globalEntities(type4, queryString).catch((error2) => {
94125
+ console.error("Global entity lookup failed:", error2);
94126
+ return { endpoint: "global", documents: [] };
94127
+ }),
94128
+ promiseTimeout
94129
+ ));
94130
+ }
94025
94131
  if (lookupHandler == null ? void 0 : lookupHandler.dataPacks) {
94026
94132
  lookups.push(
94027
94133
  wrapPromise(lookup.dataPacks(type4, queryString), promiseTimeout, {
@@ -94052,59 +94158,122 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94052
94158
  }
94053
94159
  const responses = await Promise.all(lookups);
94054
94160
  const newMatches = [];
94161
+ const seenEntityIds = /* @__PURE__ */ new Set();
94162
+ const globalEntityIds = new Set(
94163
+ responses.filter((response) => response.endpoint === "global").flatMap((response) => response.documents ?? []).map((entity) => entity["@id"]).filter((id2) => id2 != null).map(String)
94164
+ );
94165
+ const uniqueEntities = (entities, source, limit) => {
94166
+ const unique = [];
94167
+ for (const entity of entities) {
94168
+ const id2 = entity["@id"] == null ? null : String(entity["@id"]);
94169
+ if (source === "internal" && id2 && globalEntityIds.has(id2)) continue;
94170
+ if (id2 && seenEntityIds.has(id2)) continue;
94171
+ if (id2) seenEntityIds.add(id2);
94172
+ unique.push({ ...entity, type: source });
94173
+ if (limit && unique.length === limit) break;
94174
+ }
94175
+ return unique;
94176
+ };
94177
+ const addMatchGroup = (label, entities) => {
94178
+ if (entities.length) newMatches.push({ label, entities });
94179
+ };
94055
94180
  responses.forEach((response) => {
94056
- var _a3, _b, _c, _d, _e2;
94181
+ var _a3, _b, _c, _d, _e2, _f;
94057
94182
  if (response.endpoint === "internal" && ((_a3 = response.documents) == null ? void 0 : _a3.length)) {
94058
- newMatches.push({
94059
- label: t2("associate_existing_entity"),
94060
- entities: response.documents.map((e3) => ({ ...e3, type: "internal" })).slice(0, 5)
94061
- });
94062
- } else if (response.endpoint === "templates" && ((_b = response.documents) == null ? void 0 : _b.length)) {
94063
- newMatches.push({
94064
- label: t2("associate_entity_from_template"),
94065
- entities: response.documents.map((entity) => ({
94066
- ...entity,
94067
- type: "template"
94068
- }))
94069
- });
94070
- } else if (response.endpoint === "ror" && ((_c = response.documents) == null ? void 0 : _c.length)) {
94071
- newMatches.push({
94072
- label: t2("associate_organization_from_ror"),
94073
- entities: response.documents.map((entity) => ({ ...entity, type: "ror" }))
94074
- });
94075
- } else if (response.endpoint === "entities" && ((_d = response.documents) == null ? void 0 : _d.length)) {
94076
- newMatches.push({
94077
- label: t2("associate_user_created_entity"),
94078
- entities: response.documents.map((entity) => ({ ...entity, type: "datapack" }))
94079
- });
94080
- } else if (response.endpoint === "datapacks" && ((_e2 = response.documents) == null ? void 0 : _e2.length)) {
94081
- newMatches.push({
94082
- label: t2("associate_from_datapack"),
94083
- entities: response.documents.map((entity) => ({ ...entity, type: "datapack" }))
94084
- });
94183
+ addMatchGroup(
94184
+ t2("associate_existing_entity"),
94185
+ uniqueEntities(response.documents, "internal", 5)
94186
+ );
94187
+ } else if (response.endpoint === "global" && ((_b = response.documents) == null ? void 0 : _b.length)) {
94188
+ addMatchGroup(
94189
+ t2("associate_global_entity"),
94190
+ uniqueEntities(response.documents, "global")
94191
+ );
94192
+ } else if (response.endpoint === "templates" && ((_c = response.documents) == null ? void 0 : _c.length)) {
94193
+ addMatchGroup(
94194
+ t2("associate_entity_from_template"),
94195
+ uniqueEntities(response.documents, "template")
94196
+ );
94197
+ } else if (response.endpoint === "ror" && ((_d = response.documents) == null ? void 0 : _d.length)) {
94198
+ addMatchGroup(
94199
+ t2("associate_organization_from_ror"),
94200
+ uniqueEntities(response.documents, "ror")
94201
+ );
94202
+ } else if (response.endpoint === "entities" && ((_e2 = response.documents) == null ? void 0 : _e2.length)) {
94203
+ addMatchGroup(
94204
+ t2("associate_user_created_entity"),
94205
+ uniqueEntities(response.documents, "datapack")
94206
+ );
94207
+ } else if (response.endpoint === "datapacks" && ((_f = response.documents) == null ? void 0 : _f.length)) {
94208
+ addMatchGroup(
94209
+ t2("associate_from_datapack"),
94210
+ uniqueEntities(response.documents, "datapack")
94211
+ );
94085
94212
  }
94086
94213
  });
94087
- if (type4 !== "ANY") {
94214
+ if (type4 !== "ANY" && newEntity.length) {
94088
94215
  newMatches.push({
94089
94216
  label: t2("create_new_entity"),
94090
94217
  entities: newEntity
94091
94218
  });
94092
94219
  }
94220
+ if (version2 !== searchVersion.current) return;
94093
94221
  setMatches(newMatches);
94094
94222
  setLoading(false);
94095
94223
  };
94096
- const debouncedQuerySearch = debounce(querySearch, 1e3, { leading: true });
94224
+ const debouncedQuerySearch = useMemo$1(
94225
+ () => debounce(querySearch, 1e3, { leading: true }),
94226
+ [type4, crateManager, lookupHandler, t2]
94227
+ );
94097
94228
  useEffect(() => {
94098
94229
  querySearch("");
94099
- }, [type4]);
94230
+ return () => {
94231
+ debouncedQuerySearch.cancel();
94232
+ searchVersion.current += 1;
94233
+ };
94234
+ }, [debouncedQuerySearch]);
94235
+ const mapGlobalEntity = (recordId, entityId) => {
94236
+ if (entityId && (lookupHandler == null ? void 0 : lookupHandler.onGlobalEntityAdded)) {
94237
+ void lookupHandler.onGlobalEntityAdded({ recordId, entityId }).catch((error2) => console.error("Failed to map global entity:", error2));
94238
+ }
94239
+ };
94240
+ const reuseGlobalEntity = (global2, local, useGlobalValues, explainReuse = false) => {
94241
+ const entityId = onLinkEntity({
94242
+ json: local,
94243
+ ...useGlobalValues ? { globalEntityValues: global2 } : {}
94244
+ });
94245
+ if (entityId !== null) {
94246
+ mapGlobalEntity(global2.globalRecordId, entityId ?? local["@id"]);
94247
+ if (explainReuse) {
94248
+ modal.info({
94249
+ title: t2("global_entity_already_exists_title"),
94250
+ content: t2("global_entity_reused_notice", { name: local.name || local["@id"] }),
94251
+ okText: t2("global_entity_reused_ok")
94252
+ });
94253
+ }
94254
+ }
94255
+ setConflict(null);
94256
+ };
94100
94257
  const handleSelect = (value, option) => {
94101
94258
  const entity = option.entity;
94102
94259
  if (entity) {
94260
+ const { globalRecordId, type: source, ...json } = entity;
94103
94261
  const updatedEntity = {
94104
- ...entity,
94262
+ ...json,
94263
+ ...source === "global" ? {} : { type: source },
94105
94264
  "@type": entity["@type"].split(", ").map((t22) => t22.trim())
94106
94265
  };
94107
- if ((entity == null ? void 0 : entity.type) === "internal") {
94266
+ if (source === "global") {
94267
+ const existing = findGlobalEntityMatches(crateManager, updatedEntity);
94268
+ if (existing.length === 1 && globalEntityValuesMatch(existing[0], updatedEntity)) {
94269
+ reuseGlobalEntity(entity, existing[0], false, true);
94270
+ } else if (existing.length) {
94271
+ setConflict({ global: entity, matches: existing });
94272
+ } else {
94273
+ const entityId = onCreateEntity({ json: updatedEntity, fromGlobalEntity: true });
94274
+ mapGlobalEntity(globalRecordId, entityId);
94275
+ }
94276
+ } else if (source === "internal") {
94108
94277
  onLinkEntity({ json: updatedEntity });
94109
94278
  } else {
94110
94279
  onCreateEntity({ json: updatedEntity });
@@ -94114,7 +94283,10 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94114
94283
  };
94115
94284
  const handleSearch = (value) => {
94116
94285
  inputValue.current = value;
94117
- debouncedQuerySearch(value);
94286
+ const version2 = ++searchVersion.current;
94287
+ setMatches([]);
94288
+ setLoading(true);
94289
+ debouncedQuerySearch(value, version2);
94118
94290
  };
94119
94291
  const handleInputKeyDown = (event) => {
94120
94292
  const name2 = inputValue.current;
@@ -94169,27 +94341,41 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94169
94341
  ] });
94170
94342
  }
94171
94343
  };
94172
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: loading ? "opacity-50" : "", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
94173
- Select,
94174
- {
94175
- showSearch: true,
94176
- size: "middle",
94177
- value: selection2,
94178
- placeholder: t2("select_existing_or_create_new") || "select an existing entity or create a new one",
94179
- defaultActiveFirstOption: false,
94180
- filterOption: false,
94181
- onSearch: handleSearch,
94182
- onInputKeyDown: handleInputKeyDown,
94183
- onChange: handleSelect,
94184
- notFoundContent: loading ? "Loading..." : "No results",
94185
- options: matches2.flatMap((group) => [
94186
- { label: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography.Text, { strong: true, children: group.label }), options: group.entities.map((entity) => ({ label: renderOption({ entity }), value: entity["@id"], entity })) }
94187
- ]).flatMap((group) => [
94188
- { label: group.label, options: group.options }
94189
- ]),
94190
- optionRender: (option) => option.label
94191
- }
94192
- ) });
94344
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: loading ? "opacity-50" : "", children: [
94345
+ conflict && /* @__PURE__ */ jsxRuntimeExports.jsx(
94346
+ GlobalEntityConflictDialog,
94347
+ {
94348
+ global: conflict.global,
94349
+ matches: conflict.matches,
94350
+ onChoose: (local, useGlobalValues) => reuseGlobalEntity(conflict.global, local, useGlobalValues),
94351
+ onCancel: () => setConflict(null)
94352
+ }
94353
+ ),
94354
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
94355
+ Select,
94356
+ {
94357
+ showSearch: true,
94358
+ size: "middle",
94359
+ value: selection2,
94360
+ placeholder: t2("select_existing_or_create_new") || "select an existing entity or create a new one",
94361
+ defaultActiveFirstOption: false,
94362
+ filterOption: false,
94363
+ onSearch: handleSearch,
94364
+ onInputKeyDown: handleInputKeyDown,
94365
+ onChange: handleSelect,
94366
+ notFoundContent: loading ? "Loading..." : "No results",
94367
+ options: matches2.map((group, groupIndex) => ({
94368
+ label: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography.Text, { strong: true, children: group.label }),
94369
+ options: group.entities.map((entity, entityIndex) => ({
94370
+ label: renderOption({ entity }),
94371
+ value: `${groupIndex}:${entityIndex}:${String(entity["@id"])}`,
94372
+ entity
94373
+ }))
94374
+ })),
94375
+ optionRender: (option) => option.label
94376
+ }
94377
+ )
94378
+ ] });
94193
94379
  };
94194
94380
  const BulkAdd = ({ types: types2, primitives, onCreateEntity }) => {
94195
94381
  const { t: t2 } = useTranslation();
@@ -94371,12 +94557,14 @@ const Add = ({
94371
94557
  close();
94372
94558
  };
94373
94559
  const createEntity = (data) => {
94374
- onCreateEntity({ ...data, property, propertyId: definition.id });
94560
+ const entityId = onCreateEntity({ ...data, property, propertyId: definition.id });
94375
94561
  close();
94562
+ return entityId;
94376
94563
  };
94377
94564
  const linkEntity = (data) => {
94378
- onLinkEntity({ ...data, property, propertyId: definition.id });
94565
+ const entityId = onLinkEntity({ ...data, property, propertyId: definition.id });
94379
94566
  close();
94567
+ return entityId;
94380
94568
  };
94381
94569
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
94382
94570
  "div",
@@ -121519,7 +121707,7 @@ const DialogBrowseEntities = ({
121519
121707
  query: "",
121520
121708
  selectedEntityType: void 0
121521
121709
  });
121522
- const entityTypes = useMemo$1(() => crateManager.getEntityTypes(), [crateManager]);
121710
+ const entityTypes2 = useMemo$1(() => crateManager.getEntityTypes(), [crateManager]);
121523
121711
  const entities = useMemo$1(() => {
121524
121712
  const offset2 = (data.currentPage - 1) * data.pageSize;
121525
121713
  let entities2;
@@ -121573,7 +121761,7 @@ const DialogBrowseEntities = ({
121573
121761
  size: "middle",
121574
121762
  children: [
121575
121763
  /* @__PURE__ */ jsxRuntimeExports.jsx(Select.Option, { value: "", children: t2("filter_by_type") }),
121576
- entityTypes.map((t22) => /* @__PURE__ */ jsxRuntimeExports.jsx(Select.Option, { value: t22, children: t22 }, t22))
121764
+ entityTypes2.map((t22) => /* @__PURE__ */ jsxRuntimeExports.jsx(Select.Option, { value: t22, children: t22 }, t22))
121577
121765
  ]
121578
121766
  }
121579
121767
  ),
@@ -124003,19 +124191,37 @@ const useEntityMutationHandlers = ({
124003
124191
  var _a2;
124004
124192
  try {
124005
124193
  (_a2 = data.json) == null ? true : delete _a2.type;
124006
- crateManager.ingestAndLink({
124007
- id: entity["@id"],
124008
- property: data.property,
124009
- propertyId: data.propertyId,
124010
- json: data.json
124011
- });
124194
+ let createdEntityId = data.json["@id"];
124195
+ if (data.fromGlobalEntity) {
124196
+ const existed = crateManager.getEntity({ id: createdEntityId, materialise: false, link: false });
124197
+ const added = crateManager.addEntity(data.json);
124198
+ createdEntityId = added["@id"];
124199
+ try {
124200
+ crateManager.linkEntity({
124201
+ id: entity["@id"],
124202
+ property: data.property,
124203
+ propertyId: data.propertyId,
124204
+ value: { "@id": createdEntityId }
124205
+ });
124206
+ } catch (error2) {
124207
+ if (!existed) crateManager.deleteEntity({ id: createdEntityId });
124208
+ throw error2;
124209
+ }
124210
+ } else {
124211
+ crateManager.ingestAndLink({
124212
+ id: entity["@id"],
124213
+ property: data.property,
124214
+ propertyId: data.propertyId,
124215
+ json: data.json
124216
+ });
124217
+ }
124012
124218
  let warnings = crateManager.getWarnings();
124013
124219
  if (warnings.hasWarning) {
124014
124220
  onWarning();
124015
124221
  }
124016
124222
  refresh();
124017
124223
  saveCratePreservingView();
124018
- return data.json["@id"];
124224
+ return createdEntityId;
124019
124225
  } catch (error2) {
124020
124226
  onError();
124021
124227
  return null;
@@ -124049,6 +124255,20 @@ const useEntityMutationHandlers = ({
124049
124255
  };
124050
124256
  const handleLinkEntity = (data) => {
124051
124257
  try {
124258
+ if (data.globalEntityValues) {
124259
+ const local = crateManager.getEntity({ id: data.json["@id"], link: false, materialise: false });
124260
+ if (!local) return null;
124261
+ for (const [property, value] of Object.entries(globalEntityValues(data.globalEntityValues))) {
124262
+ const values = Array.isArray(value) ? value : [value];
124263
+ if (property === "name") {
124264
+ crateManager.updateProperty({ id: local["@id"], property, value });
124265
+ } else {
124266
+ const localValues = Array.isArray(local[property]) ? local[property] : [local[property]];
124267
+ const references = localValues.filter((item) => item && typeof item === "object" && typeof item["@id"] === "string");
124268
+ crateManager.updateProperty({ id: local["@id"], property, value: [...references, ...values] });
124269
+ }
124270
+ }
124271
+ }
124052
124272
  crateManager.linkEntity({
124053
124273
  id: entity["@id"],
124054
124274
  property: data.property,
@@ -124057,8 +124277,10 @@ const useEntityMutationHandlers = ({
124057
124277
  });
124058
124278
  refresh();
124059
124279
  saveCratePreservingView();
124280
+ return data.json["@id"];
124060
124281
  } catch (error2) {
124061
124282
  onError();
124283
+ return null;
124062
124284
  }
124063
124285
  };
124064
124286
  const handleDeleteProperty = (data) => {
@@ -124181,8 +124403,7 @@ const useEntityNavigationState = ({
124181
124403
  highlightRequiredProperties,
124182
124404
  iconView,
124183
124405
  tabPaneWidth,
124184
- onSaveCrate,
124185
- debugScroll = () => void 0
124406
+ onSaveCrate
124186
124407
  }) => {
124187
124408
  const getVisibleContextMarkers = useCallback((selector, dataAttribute) => {
124188
124409
  const source = activeContentRef.current;
@@ -124190,39 +124411,20 @@ const useEntityNavigationState = ({
124190
124411
  return Array.from(source.querySelectorAll(selector)).map((node2) => node2.getAttribute(dataAttribute)).filter((value) => Boolean(value));
124191
124412
  }, [activeContentRef]);
124192
124413
  const captureViewContext = useCallback((tabName = activeTab, explicitScrollTop, options = {}) => {
124193
- var _a2, _b, _c, _d, _e2, _f, _g, _h;
124414
+ var _a2, _b, _c, _d;
124194
124415
  const entityId = contextEntity == null ? void 0 : contextEntity["@id"];
124195
124416
  if (!entityId) return;
124196
124417
  const updateActiveTab = options.updateActiveTab !== false;
124197
124418
  if (restoreInProgressRef.current && typeof explicitScrollTop !== "number") {
124198
- debugScroll("capture.skipped-during-restore", {
124199
- entityId,
124200
- tabName,
124201
- latestId: (_a2 = state.editorState.latest()) == null ? void 0 : _a2.id
124202
- });
124203
124419
  return;
124204
124420
  }
124205
124421
  const previous = state.editorState.getNavigationState(entityId) ?? {};
124206
- const scrollTop = typeof explicitScrollTop === "number" ? explicitScrollTop : ((_b = activeContentRef.current) == null ? void 0 : _b.scrollTop) ?? ((_d = (_c = previous.tabStates) == null ? void 0 : _c[tabName]) == null ? void 0 : _d.scrollTop) ?? 0;
124422
+ const scrollTop = typeof explicitScrollTop === "number" ? explicitScrollTop : ((_a2 = activeContentRef.current) == null ? void 0 : _a2.scrollTop) ?? ((_c = (_b = previous.tabStates) == null ? void 0 : _b[tabName]) == null ? void 0 : _c.scrollTop) ?? 0;
124207
124423
  const nextTabState = {
124208
124424
  scrollTop,
124209
124425
  expandedSections: getVisibleContextMarkers('[aria-expanded="true"],[data-expanded="true"]', "data-section-id"),
124210
124426
  selectedItems: getVisibleContextMarkers('[aria-selected="true"],[data-selected="true"]', "data-item-id")
124211
124427
  };
124212
- debugScroll("capture", {
124213
- entityId,
124214
- tabName,
124215
- latestId: (_e2 = state.editorState.latest()) == null ? void 0 : _e2.id,
124216
- explicitScrollTop,
124217
- scrollTop,
124218
- updateActiveTab,
124219
- previousScrollTop: ((_g = (_f = previous.tabStates) == null ? void 0 : _f[tabName]) == null ? void 0 : _g.scrollTop) ?? null,
124220
- viewport: activeContentRef.current ? {
124221
- clientHeight: activeContentRef.current.clientHeight,
124222
- scrollHeight: activeContentRef.current.scrollHeight,
124223
- currentScrollTop: activeContentRef.current.scrollTop
124224
- } : null
124225
- });
124226
124428
  const navigationState = {
124227
124429
  ...updateActiveTab ? { activeTab: tabName } : {},
124228
124430
  tabStates: { [tabName]: nextTabState },
@@ -124234,7 +124436,7 @@ const useEntityNavigationState = ({
124234
124436
  tabPaneWidth
124235
124437
  }
124236
124438
  };
124237
- if (((_h = state.editorState.latest()) == null ? void 0 : _h.id) === entityId) {
124439
+ if (((_d = state.editorState.latest()) == null ? void 0 : _d.id) === entityId) {
124238
124440
  state.editorState.updateNavigationState(navigationState);
124239
124441
  } else {
124240
124442
  state.editorState.updateNavigationStateForId(entityId, navigationState);
@@ -124299,8 +124501,7 @@ const useEntityScrollRestoration = ({
124299
124501
  state,
124300
124502
  isAiScrollRestoreSuppressed,
124301
124503
  captureViewContext,
124302
- disabled: disabled2 = false,
124303
- debugScroll = () => void 0
124504
+ disabled: disabled2 = false
124304
124505
  }) => {
124305
124506
  useEffect(() => {
124306
124507
  var _a2, _b, _c, _d;
@@ -124312,16 +124513,6 @@ const useEntityScrollRestoration = ({
124312
124513
  const viewport = activeContentRef.current;
124313
124514
  if (!viewport) return;
124314
124515
  const restoreTarget = ((_d = (_c = (_b = state.editorState.getNavigationState(contextEntity["@id"])) == null ? void 0 : _b.tabStates) == null ? void 0 : _c[activeTab]) == null ? void 0 : _d.scrollTop) ?? 0;
124315
- debugScroll("restore.start", {
124316
- entityId: contextEntity["@id"],
124317
- activeTab,
124318
- restoreTarget,
124319
- viewport: {
124320
- clientHeight: viewport.clientHeight,
124321
- scrollHeight: viewport.scrollHeight,
124322
- scrollTop: viewport.scrollTop
124323
- }
124324
- });
124325
124516
  let cancelled = false;
124326
124517
  let rafId = 0;
124327
124518
  let timerId = 0;
@@ -124343,32 +124534,9 @@ const useEntityScrollRestoration = ({
124343
124534
  viewport.scrollTo({ top: target, behavior: "auto" });
124344
124535
  const contentReady = restoreTarget <= maxScrollable || restoreTarget === 0;
124345
124536
  const done = contentReady && Math.abs(viewport.scrollTop - target) <= 1;
124346
- debugScroll("restore.attempt", {
124347
- entityId: contextEntity["@id"],
124348
- activeTab,
124349
- attempts,
124350
- restoreTarget,
124351
- maxScrollable,
124352
- target,
124353
- actualScrollTop: viewport.scrollTop,
124354
- clientHeight: viewport.clientHeight,
124355
- scrollHeight: viewport.scrollHeight,
124356
- contentReady,
124357
- done
124358
- });
124359
124537
  if (done || attempts >= maxAttempts) {
124360
124538
  restoreInProgressRef.current = false;
124361
124539
  viewport.style.scrollBehavior = previousInlineScrollBehavior;
124362
- debugScroll("restore.stop", {
124363
- entityId: contextEntity["@id"],
124364
- activeTab,
124365
- attempts,
124366
- restoreTarget,
124367
- finalScrollTop: viewport.scrollTop,
124368
- maxScrollable,
124369
- contentReady,
124370
- done
124371
- });
124372
124540
  return;
124373
124541
  }
124374
124542
  timerId = window.setTimeout(() => {
@@ -124398,11 +124566,6 @@ const useEntityScrollRestoration = ({
124398
124566
  if (((_a2 = pendingAddedPropertyRef.current) == null ? void 0 : _a2.entityId) === contextEntity["@id"]) return;
124399
124567
  if (isAiScrollRestoreSuppressed()) return;
124400
124568
  if (pendingTab) {
124401
- debugScroll("restore.pending-tab", {
124402
- entityId: contextEntity["@id"],
124403
- pendingTab,
124404
- activeTab
124405
- });
124406
124569
  if (activeTab !== pendingTab) {
124407
124570
  return;
124408
124571
  }
@@ -125239,7 +125402,6 @@ const RenderEntity = forwardRef((props, ref) => {
125239
125402
  const pendingAiScrollPropertyRef = useRef(null);
125240
125403
  const aiScrollRestoreSuppressedUntilRef = useRef(0);
125241
125404
  const lastAutoNavigatedAiApprovalRef = useRef(null);
125242
- const debugScroll = (...args) => console.log("[recrate-scroll-debug]", ...args);
125243
125405
  const {
125244
125406
  activeContentRef,
125245
125407
  contentContainerRef,
@@ -125284,8 +125446,7 @@ const RenderEntity = forwardRef((props, ref) => {
125284
125446
  highlightRequiredProperties,
125285
125447
  iconView,
125286
125448
  tabPaneWidth,
125287
- onSaveCrate,
125288
- debugScroll
125449
+ onSaveCrate
125289
125450
  });
125290
125451
  useEntityScrollRestoration({
125291
125452
  activeTab,
@@ -125308,8 +125469,7 @@ const RenderEntity = forwardRef((props, ref) => {
125308
125469
  state,
125309
125470
  isAiScrollRestoreSuppressed,
125310
125471
  captureViewContext,
125311
- disabled: readonly,
125312
- debugScroll
125472
+ disabled: readonly
125313
125473
  });
125314
125474
  const pendingAiApprovalRecords = useMemo$1(() => getPendingEntityApprovalRecords(approvalContext == null ? void 0 : approvalContext.roCrateApproval, contextEntity == null ? void 0 : contextEntity["@id"]), [approvalContext == null ? void 0 : approvalContext.roCrateApproval, contextEntity == null ? void 0 : contextEntity["@id"]]);
125315
125475
  const pendingAiApprovalProperties = useMemo$1(() => pendingAiApprovalRecords.map((approvalRecord) => approvalRecord == null ? void 0 : approvalRecord.propertyName).filter((property) => typeof property === "string" && property.length > 0), [pendingAiApprovalRecords]);
@@ -125532,20 +125692,6 @@ const RenderEntity = forwardRef((props, ref) => {
125532
125692
  willScrollToAddedProperty = true;
125533
125693
  }
125534
125694
  }
125535
- debugScroll("init", {
125536
- entityId: entity2["@id"],
125537
- latestId: latestEntry == null ? void 0 : latestEntry.id,
125538
- isCurrentHistoryEntity,
125539
- renderTabs: layout.renderTabs,
125540
- tabNames,
125541
- restorableTabNames,
125542
- savedActiveTab,
125543
- savedTabStillValid,
125544
- currentTabStillValid,
125545
- restoredTab,
125546
- nextActiveTab,
125547
- navState
125548
- });
125549
125695
  pendingRestoredTabRef.current = willScrollToAddedProperty ? null : nextActiveTab;
125550
125696
  setActiveTab(nextActiveTab);
125551
125697
  if (typeof ((_b2 = navState == null ? void 0 : navState.uiState) == null ? void 0 : _b2.showAddPanel) === "boolean") setShowAddPanel(navState.uiState.showAddPanel);
@@ -125591,11 +125737,6 @@ const RenderEntity = forwardRef((props, ref) => {
125591
125737
  }
125592
125738
  }, [readonly, entity == null ? void 0 : entity["@id"]]);
125593
125739
  const handleLoadEntityWithContext = (params) => {
125594
- debugScroll("navigate", {
125595
- fromEntityId: contextEntity == null ? void 0 : contextEntity["@id"],
125596
- activeTab,
125597
- params
125598
- });
125599
125740
  captureCurrentViewContext(activeTab);
125600
125741
  onLoadEntity(params);
125601
125742
  };
@@ -130935,9 +131076,9 @@ class ProfileManager {
130935
131076
  var _a2;
130936
131077
  if (!((_a2 = this.profile) == null ? void 0 : _a2.layouts) || !this.profile.layouts.length) return null;
130937
131078
  let layouts = this.profile.layouts;
130938
- const entityTypes = this.normaliseEntityTypes(entity);
131079
+ const entityTypes2 = this.normaliseEntityTypes(entity);
130939
131080
  let layout = layouts.filter((layout2) => {
130940
- return intersection(layout2.appliesTo, entityTypes).length;
131081
+ return intersection(layout2.appliesTo, entityTypes2).length;
130941
131082
  });
130942
131083
  if (!layout.length) return null;
130943
131084
  let firstMatchingLayout = layout[0];
@@ -134113,6 +134254,19 @@ const en = {
134113
134254
  external_lookup_timeout_error: "External Lookup Timeout",
134114
134255
  ror_lookup_timeout_error: "ROR Lookup Timeout",
134115
134256
  associate_existing_entity: "Associate an entity already defined in this crate",
134257
+ associate_global_entity: "Global entities",
134258
+ global_entity_already_exists_title: "Entity already exists in this crate",
134259
+ global_entity_reused_notice: "“{{name}}” already exists in this crate with the same values. The existing entity was reused and linked to this field. No duplicate was added.",
134260
+ global_entity_reused_ok: "OK",
134261
+ global_entity_conflict_title: "This entity may already be in the crate",
134262
+ global_entity_conflict_description: "An entity with the same type and name, or the same values, already exists. Choose which values to keep.",
134263
+ global_entity_conflict_preserve_links: "The existing crate ID, links, and fields absent from the global version will be preserved.",
134264
+ global_entity_conflict_cancel: "Cancel",
134265
+ global_entity_conflict_property: "Field",
134266
+ global_entity_conflict_crate_values: "In this crate",
134267
+ global_entity_conflict_global_values: "Global version",
134268
+ global_entity_conflict_keep_crate: "Keep crate values",
134269
+ global_entity_conflict_use_global: "Use global values",
134116
134270
  associate_entity_from_template: "Associate an entity from saved templates",
134117
134271
  associate_organization_from_ror: "Associate an Organization defined in the Research Organization Registry",
134118
134272
  associate_user_created_entity: "Associate a user created entity",
@@ -134452,6 +134606,19 @@ const hu = {
134452
134606
  external_lookup_timeout_error: "Külső lekérdezési időtúllépés",
134453
134607
  ror_lookup_timeout_error: "ROR lekérdezési időtúllépés",
134454
134608
  associate_existing_entity: "Kapcsolj egy már ebben a csomagban definiált entitást",
134609
+ associate_global_entity: "Globális entitások",
134610
+ global_entity_already_exists_title: "Az entitás már szerepel a csomagban",
134611
+ global_entity_reused_notice: "„{{name}}” már szerepel ebben a csomagban azonos értékekkel. A meglévő entitást használtuk fel és kapcsoltuk ehhez a mezőhöz. Nem adtunk hozzá másolatot.",
134612
+ global_entity_reused_ok: "Rendben",
134613
+ global_entity_conflict_title: "Ez az entitás már szerepelhet a csomagban",
134614
+ global_entity_conflict_description: "Már létezik azonos típusú és nevű, vagy azonos értékekkel rendelkező entitás. Válaszd ki, melyik értékeket tartod meg.",
134615
+ global_entity_conflict_preserve_links: "A meglévő csomagbeli azonosító, kapcsolatok és a globális változatból hiányzó mezők megmaradnak.",
134616
+ global_entity_conflict_cancel: "Mégse",
134617
+ global_entity_conflict_property: "Mező",
134618
+ global_entity_conflict_crate_values: "Ebben a csomagban",
134619
+ global_entity_conflict_global_values: "Globális változat",
134620
+ global_entity_conflict_keep_crate: "Csomagbeli értékek megtartása",
134621
+ global_entity_conflict_use_global: "Globális értékek használata",
134455
134622
  associate_entity_from_template: "Kapcsolj egy mentett sablonból származó entitást",
134456
134623
  associate_organization_from_ror: "Kapcsolj egy a Research Organization Registryben definiált szervezetet",
134457
134624
  associate_user_created_entity: "Kapcsolj egy felhasználó által létrehozott entitást",
@@ -135451,7 +135618,7 @@ var EmotionCacheContext = /* @__PURE__ */ React.createContext(
135451
135618
  }) : null
135452
135619
  );
135453
135620
  var CacheProvider = EmotionCacheContext.Provider;
135454
- const version = "0.1.52";
135621
+ const version = "0.1.54";
135455
135622
  const pkg = {
135456
135623
  version
135457
135624
  };
package/dist/types.d.ts CHANGED
@@ -18,7 +18,16 @@ export interface Lookup {
18
18
  * result limit. Most host applications should search at least `@id` and
19
19
  * `name`.
20
20
  */
21
- entityTemplates(params: EntityTemplatesParams): Promise<void>;
21
+ entityTemplates?(params: EntityTemplatesParams): Promise<void>;
22
+ /** List reusable global entities, including when the search string is empty. */
23
+ globalEntities?(params: EntityTemplatesParams): Promise<{
24
+ documents: JSONObject[];
25
+ }>;
26
+ /** Record the association after a global entity has been added or linked. */
27
+ onGlobalEntityAdded?(params: {
28
+ recordId: string;
29
+ entityId: string;
30
+ }): Promise<void>;
22
31
  }
23
32
  export interface RoCrateApprovalSaveData {
24
33
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arpproject/recrate",
3
- "version": "0.1.52",
3
+ "version": "0.1.54",
4
4
  "type": "module",
5
5
  "main": "./dist/recrate.es.js",
6
6
  "module": "./dist/recrate.es.js",