@arpproject/recrate 0.1.52 → 0.1.53

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;
@@ -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,16 +94096,19 @@ 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
94109
  const querySearch = async (queryString) => {
94013
94110
  var _a2;
94111
+ const version2 = ++searchVersion.current;
94014
94112
  setLoading(true);
94015
94113
  const lookup = new Lookup({
94016
94114
  config: (_a2 = crateManager == null ? void 0 : crateManager.profile) == null ? void 0 : _a2.lookup,
@@ -94022,6 +94120,15 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94022
94120
  if (crateManager == null ? void 0 : crateManager.getEntities) {
94023
94121
  lookups.push(wrapPromise(lookup.getEntities(type4, queryString), promiseTimeout));
94024
94122
  }
94123
+ if (lookupHandler == null ? void 0 : lookupHandler.globalEntities) {
94124
+ lookups.push(wrapPromise(
94125
+ lookup.globalEntities(type4, queryString).catch((error2) => {
94126
+ console.error("Global entity lookup failed:", error2);
94127
+ return { endpoint: "global", documents: [] };
94128
+ }),
94129
+ promiseTimeout
94130
+ ));
94131
+ }
94025
94132
  if (lookupHandler == null ? void 0 : lookupHandler.dataPacks) {
94026
94133
  lookups.push(
94027
94134
  wrapPromise(lookup.dataPacks(type4, queryString), promiseTimeout, {
@@ -94053,13 +94160,18 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94053
94160
  const responses = await Promise.all(lookups);
94054
94161
  const newMatches = [];
94055
94162
  responses.forEach((response) => {
94056
- var _a3, _b, _c, _d, _e2;
94163
+ var _a3, _b, _c, _d, _e2, _f;
94057
94164
  if (response.endpoint === "internal" && ((_a3 = response.documents) == null ? void 0 : _a3.length)) {
94058
94165
  newMatches.push({
94059
94166
  label: t2("associate_existing_entity"),
94060
94167
  entities: response.documents.map((e3) => ({ ...e3, type: "internal" })).slice(0, 5)
94061
94168
  });
94062
- } else if (response.endpoint === "templates" && ((_b = response.documents) == null ? void 0 : _b.length)) {
94169
+ } else if (response.endpoint === "global" && ((_b = response.documents) == null ? void 0 : _b.length)) {
94170
+ newMatches.push({
94171
+ label: t2("associate_global_entity"),
94172
+ entities: response.documents.map((entity) => ({ ...entity, type: "global" }))
94173
+ });
94174
+ } else if (response.endpoint === "templates" && ((_c = response.documents) == null ? void 0 : _c.length)) {
94063
94175
  newMatches.push({
94064
94176
  label: t2("associate_entity_from_template"),
94065
94177
  entities: response.documents.map((entity) => ({
@@ -94067,17 +94179,17 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94067
94179
  type: "template"
94068
94180
  }))
94069
94181
  });
94070
- } else if (response.endpoint === "ror" && ((_c = response.documents) == null ? void 0 : _c.length)) {
94182
+ } else if (response.endpoint === "ror" && ((_d = response.documents) == null ? void 0 : _d.length)) {
94071
94183
  newMatches.push({
94072
94184
  label: t2("associate_organization_from_ror"),
94073
94185
  entities: response.documents.map((entity) => ({ ...entity, type: "ror" }))
94074
94186
  });
94075
- } else if (response.endpoint === "entities" && ((_d = response.documents) == null ? void 0 : _d.length)) {
94187
+ } else if (response.endpoint === "entities" && ((_e2 = response.documents) == null ? void 0 : _e2.length)) {
94076
94188
  newMatches.push({
94077
94189
  label: t2("associate_user_created_entity"),
94078
94190
  entities: response.documents.map((entity) => ({ ...entity, type: "datapack" }))
94079
94191
  });
94080
- } else if (response.endpoint === "datapacks" && ((_e2 = response.documents) == null ? void 0 : _e2.length)) {
94192
+ } else if (response.endpoint === "datapacks" && ((_f = response.documents) == null ? void 0 : _f.length)) {
94081
94193
  newMatches.push({
94082
94194
  label: t2("associate_from_datapack"),
94083
94195
  entities: response.documents.map((entity) => ({ ...entity, type: "datapack" }))
@@ -94090,21 +94202,63 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94090
94202
  entities: newEntity
94091
94203
  });
94092
94204
  }
94205
+ if (version2 !== searchVersion.current) return;
94093
94206
  setMatches(newMatches);
94094
94207
  setLoading(false);
94095
94208
  };
94096
- const debouncedQuerySearch = debounce(querySearch, 1e3, { leading: true });
94209
+ const debouncedQuerySearch = useMemo$1(
94210
+ () => debounce(querySearch, 1e3, { leading: true }),
94211
+ [type4, crateManager, lookupHandler, t2]
94212
+ );
94097
94213
  useEffect(() => {
94098
94214
  querySearch("");
94099
- }, [type4]);
94215
+ return () => {
94216
+ debouncedQuerySearch.cancel();
94217
+ searchVersion.current += 1;
94218
+ };
94219
+ }, [debouncedQuerySearch]);
94220
+ const mapGlobalEntity = (recordId, entityId) => {
94221
+ if (entityId && (lookupHandler == null ? void 0 : lookupHandler.onGlobalEntityAdded)) {
94222
+ void lookupHandler.onGlobalEntityAdded({ recordId, entityId }).catch((error2) => console.error("Failed to map global entity:", error2));
94223
+ }
94224
+ };
94225
+ const reuseGlobalEntity = (global2, local, useGlobalValues, explainReuse = false) => {
94226
+ const entityId = onLinkEntity({
94227
+ json: local,
94228
+ ...useGlobalValues ? { globalEntityValues: global2 } : {}
94229
+ });
94230
+ if (entityId !== null) {
94231
+ mapGlobalEntity(global2.globalRecordId, entityId ?? local["@id"]);
94232
+ if (explainReuse) {
94233
+ modal.info({
94234
+ title: t2("global_entity_already_exists_title"),
94235
+ content: t2("global_entity_reused_notice", { name: local.name || local["@id"] }),
94236
+ okText: t2("global_entity_reused_ok")
94237
+ });
94238
+ }
94239
+ }
94240
+ setConflict(null);
94241
+ };
94100
94242
  const handleSelect = (value, option) => {
94101
94243
  const entity = option.entity;
94102
94244
  if (entity) {
94245
+ const { globalRecordId, type: source, ...json } = entity;
94103
94246
  const updatedEntity = {
94104
- ...entity,
94247
+ ...json,
94248
+ ...source === "global" ? {} : { type: source },
94105
94249
  "@type": entity["@type"].split(", ").map((t22) => t22.trim())
94106
94250
  };
94107
- if ((entity == null ? void 0 : entity.type) === "internal") {
94251
+ if (source === "global") {
94252
+ const existing = findGlobalEntityMatches(crateManager, updatedEntity);
94253
+ if (existing.length === 1 && globalEntityValuesMatch(existing[0], updatedEntity)) {
94254
+ reuseGlobalEntity(entity, existing[0], false, true);
94255
+ } else if (existing.length) {
94256
+ setConflict({ global: entity, matches: existing });
94257
+ } else {
94258
+ const entityId = onCreateEntity({ json: updatedEntity, fromGlobalEntity: true });
94259
+ mapGlobalEntity(globalRecordId, entityId);
94260
+ }
94261
+ } else if (source === "internal") {
94108
94262
  onLinkEntity({ json: updatedEntity });
94109
94263
  } else {
94110
94264
  onCreateEntity({ json: updatedEntity });
@@ -94169,27 +94323,38 @@ const AutoComplete = ({ type: type4, onLinkEntity, onCreateEntity }) => {
94169
94323
  ] });
94170
94324
  }
94171
94325
  };
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
- ) });
94326
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: loading ? "opacity-50" : "", children: [
94327
+ conflict && /* @__PURE__ */ jsxRuntimeExports.jsx(
94328
+ GlobalEntityConflictDialog,
94329
+ {
94330
+ global: conflict.global,
94331
+ matches: conflict.matches,
94332
+ onChoose: (local, useGlobalValues) => reuseGlobalEntity(conflict.global, local, useGlobalValues),
94333
+ onCancel: () => setConflict(null)
94334
+ }
94335
+ ),
94336
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
94337
+ Select,
94338
+ {
94339
+ showSearch: true,
94340
+ size: "middle",
94341
+ value: selection2,
94342
+ placeholder: t2("select_existing_or_create_new") || "select an existing entity or create a new one",
94343
+ defaultActiveFirstOption: false,
94344
+ filterOption: false,
94345
+ onSearch: handleSearch,
94346
+ onInputKeyDown: handleInputKeyDown,
94347
+ onChange: handleSelect,
94348
+ notFoundContent: loading ? "Loading..." : "No results",
94349
+ options: matches2.flatMap((group) => [
94350
+ { label: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography.Text, { strong: true, children: group.label }), options: group.entities.map((entity) => ({ label: renderOption({ entity }), value: entity["@id"], entity })) }
94351
+ ]).flatMap((group) => [
94352
+ { label: group.label, options: group.options }
94353
+ ]),
94354
+ optionRender: (option) => option.label
94355
+ }
94356
+ )
94357
+ ] });
94193
94358
  };
94194
94359
  const BulkAdd = ({ types: types2, primitives, onCreateEntity }) => {
94195
94360
  const { t: t2 } = useTranslation();
@@ -94371,12 +94536,14 @@ const Add = ({
94371
94536
  close();
94372
94537
  };
94373
94538
  const createEntity = (data) => {
94374
- onCreateEntity({ ...data, property, propertyId: definition.id });
94539
+ const entityId = onCreateEntity({ ...data, property, propertyId: definition.id });
94375
94540
  close();
94541
+ return entityId;
94376
94542
  };
94377
94543
  const linkEntity = (data) => {
94378
- onLinkEntity({ ...data, property, propertyId: definition.id });
94544
+ const entityId = onLinkEntity({ ...data, property, propertyId: definition.id });
94379
94545
  close();
94546
+ return entityId;
94380
94547
  };
94381
94548
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
94382
94549
  "div",
@@ -121519,7 +121686,7 @@ const DialogBrowseEntities = ({
121519
121686
  query: "",
121520
121687
  selectedEntityType: void 0
121521
121688
  });
121522
- const entityTypes = useMemo$1(() => crateManager.getEntityTypes(), [crateManager]);
121689
+ const entityTypes2 = useMemo$1(() => crateManager.getEntityTypes(), [crateManager]);
121523
121690
  const entities = useMemo$1(() => {
121524
121691
  const offset2 = (data.currentPage - 1) * data.pageSize;
121525
121692
  let entities2;
@@ -121573,7 +121740,7 @@ const DialogBrowseEntities = ({
121573
121740
  size: "middle",
121574
121741
  children: [
121575
121742
  /* @__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))
121743
+ entityTypes2.map((t22) => /* @__PURE__ */ jsxRuntimeExports.jsx(Select.Option, { value: t22, children: t22 }, t22))
121577
121744
  ]
121578
121745
  }
121579
121746
  ),
@@ -124003,19 +124170,37 @@ const useEntityMutationHandlers = ({
124003
124170
  var _a2;
124004
124171
  try {
124005
124172
  (_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
- });
124173
+ let createdEntityId = data.json["@id"];
124174
+ if (data.fromGlobalEntity) {
124175
+ const existed = crateManager.getEntity({ id: createdEntityId, materialise: false, link: false });
124176
+ const added = crateManager.addEntity(data.json);
124177
+ createdEntityId = added["@id"];
124178
+ try {
124179
+ crateManager.linkEntity({
124180
+ id: entity["@id"],
124181
+ property: data.property,
124182
+ propertyId: data.propertyId,
124183
+ value: { "@id": createdEntityId }
124184
+ });
124185
+ } catch (error2) {
124186
+ if (!existed) crateManager.deleteEntity({ id: createdEntityId });
124187
+ throw error2;
124188
+ }
124189
+ } else {
124190
+ crateManager.ingestAndLink({
124191
+ id: entity["@id"],
124192
+ property: data.property,
124193
+ propertyId: data.propertyId,
124194
+ json: data.json
124195
+ });
124196
+ }
124012
124197
  let warnings = crateManager.getWarnings();
124013
124198
  if (warnings.hasWarning) {
124014
124199
  onWarning();
124015
124200
  }
124016
124201
  refresh();
124017
124202
  saveCratePreservingView();
124018
- return data.json["@id"];
124203
+ return createdEntityId;
124019
124204
  } catch (error2) {
124020
124205
  onError();
124021
124206
  return null;
@@ -124049,6 +124234,20 @@ const useEntityMutationHandlers = ({
124049
124234
  };
124050
124235
  const handleLinkEntity = (data) => {
124051
124236
  try {
124237
+ if (data.globalEntityValues) {
124238
+ const local = crateManager.getEntity({ id: data.json["@id"], link: false, materialise: false });
124239
+ if (!local) return null;
124240
+ for (const [property, value] of Object.entries(globalEntityValues(data.globalEntityValues))) {
124241
+ const values = Array.isArray(value) ? value : [value];
124242
+ if (property === "name") {
124243
+ crateManager.updateProperty({ id: local["@id"], property, value });
124244
+ } else {
124245
+ const localValues = Array.isArray(local[property]) ? local[property] : [local[property]];
124246
+ const references = localValues.filter((item) => item && typeof item === "object" && typeof item["@id"] === "string");
124247
+ crateManager.updateProperty({ id: local["@id"], property, value: [...references, ...values] });
124248
+ }
124249
+ }
124250
+ }
124052
124251
  crateManager.linkEntity({
124053
124252
  id: entity["@id"],
124054
124253
  property: data.property,
@@ -124057,8 +124256,10 @@ const useEntityMutationHandlers = ({
124057
124256
  });
124058
124257
  refresh();
124059
124258
  saveCratePreservingView();
124259
+ return data.json["@id"];
124060
124260
  } catch (error2) {
124061
124261
  onError();
124262
+ return null;
124062
124263
  }
124063
124264
  };
124064
124265
  const handleDeleteProperty = (data) => {
@@ -130935,9 +131136,9 @@ class ProfileManager {
130935
131136
  var _a2;
130936
131137
  if (!((_a2 = this.profile) == null ? void 0 : _a2.layouts) || !this.profile.layouts.length) return null;
130937
131138
  let layouts = this.profile.layouts;
130938
- const entityTypes = this.normaliseEntityTypes(entity);
131139
+ const entityTypes2 = this.normaliseEntityTypes(entity);
130939
131140
  let layout = layouts.filter((layout2) => {
130940
- return intersection(layout2.appliesTo, entityTypes).length;
131141
+ return intersection(layout2.appliesTo, entityTypes2).length;
130941
131142
  });
130942
131143
  if (!layout.length) return null;
130943
131144
  let firstMatchingLayout = layout[0];
@@ -134113,6 +134314,19 @@ const en = {
134113
134314
  external_lookup_timeout_error: "External Lookup Timeout",
134114
134315
  ror_lookup_timeout_error: "ROR Lookup Timeout",
134115
134316
  associate_existing_entity: "Associate an entity already defined in this crate",
134317
+ associate_global_entity: "Global entities",
134318
+ global_entity_already_exists_title: "Entity already exists in this crate",
134319
+ 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.",
134320
+ global_entity_reused_ok: "OK",
134321
+ global_entity_conflict_title: "This entity may already be in the crate",
134322
+ global_entity_conflict_description: "An entity with the same type and name, or the same values, already exists. Choose which values to keep.",
134323
+ global_entity_conflict_preserve_links: "The existing crate ID, links, and fields absent from the global version will be preserved.",
134324
+ global_entity_conflict_cancel: "Cancel",
134325
+ global_entity_conflict_property: "Field",
134326
+ global_entity_conflict_crate_values: "In this crate",
134327
+ global_entity_conflict_global_values: "Global version",
134328
+ global_entity_conflict_keep_crate: "Keep crate values",
134329
+ global_entity_conflict_use_global: "Use global values",
134116
134330
  associate_entity_from_template: "Associate an entity from saved templates",
134117
134331
  associate_organization_from_ror: "Associate an Organization defined in the Research Organization Registry",
134118
134332
  associate_user_created_entity: "Associate a user created entity",
@@ -134452,6 +134666,19 @@ const hu = {
134452
134666
  external_lookup_timeout_error: "Külső lekérdezési időtúllépés",
134453
134667
  ror_lookup_timeout_error: "ROR lekérdezési időtúllépés",
134454
134668
  associate_existing_entity: "Kapcsolj egy már ebben a csomagban definiált entitást",
134669
+ associate_global_entity: "Globális entitások",
134670
+ global_entity_already_exists_title: "Az entitás már szerepel a csomagban",
134671
+ 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.",
134672
+ global_entity_reused_ok: "Rendben",
134673
+ global_entity_conflict_title: "Ez az entitás már szerepelhet a csomagban",
134674
+ 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.",
134675
+ global_entity_conflict_preserve_links: "A meglévő csomagbeli azonosító, kapcsolatok és a globális változatból hiányzó mezők megmaradnak.",
134676
+ global_entity_conflict_cancel: "Mégse",
134677
+ global_entity_conflict_property: "Mező",
134678
+ global_entity_conflict_crate_values: "Ebben a csomagban",
134679
+ global_entity_conflict_global_values: "Globális változat",
134680
+ global_entity_conflict_keep_crate: "Csomagbeli értékek megtartása",
134681
+ global_entity_conflict_use_global: "Globális értékek használata",
134455
134682
  associate_entity_from_template: "Kapcsolj egy mentett sablonból származó entitást",
134456
134683
  associate_organization_from_ror: "Kapcsolj egy a Research Organization Registryben definiált szervezetet",
134457
134684
  associate_user_created_entity: "Kapcsolj egy felhasználó által létrehozott entitást",
@@ -135451,7 +135678,7 @@ var EmotionCacheContext = /* @__PURE__ */ React.createContext(
135451
135678
  }) : null
135452
135679
  );
135453
135680
  var CacheProvider = EmotionCacheContext.Provider;
135454
- const version = "0.1.52";
135681
+ const version = "0.1.53";
135455
135682
  const pkg = {
135456
135683
  version
135457
135684
  };
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.53",
4
4
  "type": "module",
5
5
  "main": "./dist/recrate.es.js",
6
6
  "module": "./dist/recrate.es.js",