@arpproject/recrate 0.1.32 → 0.1.34

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.
package/README.md CHANGED
@@ -11,6 +11,10 @@ The package version matches the latest version of the original Crate Builder pr
11
11
  - [Crate Builder Component](#crate-builder-component)
12
12
  - [Documentation](#documentation)
13
13
  - [API Documentation](#api-documentation)
14
+ - [ARP feature notes](#arp-feature-notes)
15
+ - [AI metadata review](#ai-metadata-review)
16
+ - [Quick filter/settings header](#quick-filtersettings-header)
17
+ - [Profile action management](#profile-action-management)
14
18
  - [Developing the plugin](#developing-the-plugin)
15
19
  - [Storybook](#storybook)
16
20
  - [Development application](#development-application)
@@ -19,7 +23,7 @@ The package version matches the latest version of the original Crate Builder pr
19
23
  - [Repository structure](#repository-structure)
20
24
 
21
25
  This is the core UI component for assembling an RO-Crate inside Describo. It is a self contained
22
- VueJS component that can be used inside your app. If you use this component, your app is responsible
26
+ React component that can be used inside your app. If you use this component, your app is responsible
23
27
  for loading the crate file from the storage layer (or minting a new one if none exists) and saving
24
28
  the updated crate back. Your app can also provide a profile to the component and a class to handle
25
29
  template lookups.
@@ -35,11 +39,85 @@ Comprehensive documentation is available @
35
39
  - [ProfileManager](https://describo.github.io/crate-builder-component/ProfileManager.html)
36
40
  - [EditorState](https://describo.github.io/crate-builder-component/EditorState.html)
37
41
 
42
+ # ARP feature notes
43
+
44
+ The ARP fork adds several host-integrated workflows on top of the upstream crate builder. Their
45
+ public integration points are documented in the generated `DescriboCrateBuilderProps` API docs.
46
+
47
+ ## AI metadata review
48
+
49
+ Pass `roCrateApproval` to display AI-generated metadata changes that still need review. The approval
50
+ payload is usually loaded from `ro-crate-approval.json` and can be an array of entity approval
51
+ objects, an object with an `items` array, or a single entity approval object with an `approval`
52
+ array.
53
+
54
+ Each approval record should include:
55
+
56
+ ```json
57
+ {
58
+ "propertyName": "title",
59
+ "previousValue": "Original title",
60
+ "operation": "update",
61
+ "approved": false,
62
+ "timestamp": "2026-05-12T08:15:00.000Z"
63
+ }
64
+ ```
65
+
66
+ When pending records exist for the current entity, the editor shows the AI review banner, field-level
67
+ diffs, edited-field badges, and next/previous review controls. Accepting a field marks its records as
68
+ approved. Rejecting a field or making a manual edit removes the pending records from the approval
69
+ state. Persist approval state changes with `onSaveRoCrateApproval`.
70
+
71
+ ```tsx
72
+ <DescriboCrateBuilder
73
+ crate={crate}
74
+ profile={profile}
75
+ roCrateApproval={roCrateApproval}
76
+ onSaveCrate={({ crate }) => saveCrate(crate)}
77
+ onSaveRoCrateApproval={({ roCrateApproval }) => saveApproval(roCrateApproval)}
78
+ />
79
+ ```
80
+
81
+ ## Quick filter/settings header
82
+
83
+ The control-bar settings button opens a quick settings header above the entity fields. It lets users
84
+ toggle field help, filter visible fields by label or value, hide empty fields, and, when approved AI
85
+ records exist, show only AI-edited fields.
86
+
87
+ Host applications can control the panel state with `quickSettingsVisible` and
88
+ `onQuickSettingsVisibleChange`.
89
+
90
+ ```tsx
91
+ <DescriboCrateBuilder
92
+ crate={crate}
93
+ profile={profile}
94
+ quickSettingsVisible={quickSettingsVisible}
95
+ onQuickSettingsVisibleChange={setQuickSettingsVisible}
96
+ />
97
+ ```
98
+
99
+ ## Profile action management
100
+
101
+ Set `enableProfileActions` or provide profile action callbacks to show add/remove profile controls in
102
+ the profile tab rail. `onAddNewProfileRequest` tells the host that the user wants to add a profile to
103
+ the current entity. `onRemoveProfile` gives the host the entity id and selected profile tab metadata,
104
+ including whether the tab has data or missing required fields.
105
+
106
+ ```tsx
107
+ <DescriboCrateBuilder
108
+ crate={crate}
109
+ profile={profile}
110
+ enableProfileActions
111
+ onAddNewProfileRequest={() => openProfilePicker()}
112
+ onRemoveProfile={({ entityId, tab }) => removeProfileFromEntity(entityId, tab)}
113
+ />
114
+ ```
115
+
38
116
  # Developing the plugin
39
117
 
40
118
  ## Storybook
41
119
 
42
- [Storybook](storybook.js.org/) is used in this application. When you are just developing the
120
+ [Storybook](https://storybook.js.org/) is used in this application. When you are just developing the
43
121
  components, storybook is what you want as you can focus just on the component in isolation. To start
44
122
  it run:
45
123
 
@@ -9,6 +9,8 @@ interface RenderEntityProps {
9
9
  onSaveEntityTemplate: () => void;
10
10
  onWarning: () => void;
11
11
  onError: () => void;
12
+ quickSettingsVisible?: boolean;
13
+ onQuickSettingsVisibleChange?: (visible: boolean) => void;
12
14
  onAddNewProfileRequest?: (requested: boolean) => void;
13
15
  onRemoveProfile?: (data: any) => void;
14
16
  }
@@ -12,6 +12,7 @@ export interface DescriboCrateBuilderProps {
12
12
  enableBrowseEntities?: boolean;
13
13
  enableTemplateSave?: boolean;
14
14
  enableBulkAdd?: boolean;
15
+ enableProfileActions?: boolean;
15
16
  enableReverseLinkBrowser?: boolean;
16
17
  enableUrlMarkup?: boolean;
17
18
  enableEntityTimestamps?: boolean;
@@ -23,6 +24,7 @@ export interface DescriboCrateBuilderProps {
23
24
  language?: string;
24
25
  resetTabOnEntityChange?: boolean;
25
26
  resetTabOnProfileChange?: boolean;
27
+ quickSettingsVisible?: boolean;
26
28
  stateScopeKey?: string;
27
29
  onReady?: () => void;
28
30
  onError?: (errors: any) => void;
@@ -45,6 +47,7 @@ export interface DescriboCrateBuilderProps {
45
47
  value?: any;
46
48
  }) => void;
47
49
  onSaveEntityTemplate?: (entity: any) => void;
50
+ onQuickSettingsVisibleChange?: (visible: boolean) => void;
48
51
  onAddNewProfileRequest?: (requested: boolean) => void;
49
52
  onRemoveProfile?: (payload: any) => void;
50
53
  }
@@ -72,6 +72,12 @@ declare namespace en {
72
72
  let create_new_entity: string;
73
73
  let select_a_type_to_add: string;
74
74
  let add_profile_button_tooltip: string;
75
+ let add_profile_button_aria: string;
76
+ let profile_actions_aria: string;
77
+ let profile_sections_aria: string;
78
+ let remove_profile_aria: string;
79
+ let scroll_profile_tabs_up: string;
80
+ let scroll_profile_tabs_down: string;
75
81
  let switch_to_icon_view: string;
76
82
  let switch_to_label_view: string;
77
83
  let select_a_class_to_add: string;
@@ -156,6 +162,7 @@ declare namespace en {
156
162
  let ai_hide_unlink_diff_aria: string;
157
163
  let ai_show_unlink_diff_aria: string;
158
164
  let ai_entity_was_added_by_ai: string;
165
+ let quick_filter_settings: string;
159
166
  let quick_filter_settings_aria: string;
160
167
  let field_display_settings_aria: string;
161
168
  let hide_field_help: string;
@@ -72,6 +72,12 @@ declare namespace hu {
72
72
  let create_new_entity: string;
73
73
  let select_a_type_to_add: string;
74
74
  let add_profile_button_tooltip: string;
75
+ let add_profile_button_aria: string;
76
+ let profile_actions_aria: string;
77
+ let profile_sections_aria: string;
78
+ let remove_profile_aria: string;
79
+ let scroll_profile_tabs_up: string;
80
+ let scroll_profile_tabs_down: string;
75
81
  let switch_to_icon_view: string;
76
82
  let switch_to_label_view: string;
77
83
  let select_a_class_to_add: string;
@@ -156,6 +162,7 @@ declare namespace hu {
156
162
  let ai_hide_unlink_diff_aria: string;
157
163
  let ai_show_unlink_diff_aria: string;
158
164
  let ai_entity_was_added_by_ai: string;
165
+ let quick_filter_settings: string;
159
166
  let quick_filter_settings_aria: string;
160
167
  let field_display_settings_aria: string;
161
168
  let hide_field_help: string;
@@ -36,6 +36,11 @@ export declare const propertyDefinitions: {
36
36
  default: boolean;
37
37
  validator: (val: boolean) => boolean;
38
38
  };
39
+ enableProfileActions: {
40
+ type: (BooleanConstructor | undefined)[];
41
+ default: undefined;
42
+ validator: (val: boolean | undefined) => boolean;
43
+ };
39
44
  enableReverseLinkBrowser: {
40
45
  type: BooleanConstructor;
41
46
  default: boolean;
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}.describo-tab-icon{align-items:center;display:flex;font-size:14px;font-weight:600;height:100%;justify-content:center;width:100%}.describo-add-only-tabs .ant-tabs-nav,.describo-add-only-tabs .ant-tabs-nav-wrap{height:100%}.describo-add-only-tabs .ant-tabs-nav-list{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center}.describo-add-only-tabs .ant-tabs-tab{justify-content:center}.describo-tab-rail{background:#fff;display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden;position:relative}.describo-tab-rail-actions{border-bottom:1px solid #e5e7eb;display:flex;flex:0 0 auto;gap:8px;justify-content:center;padding:10px 8px 8px}.describo-tab-rail-actions-only .describo-tab-rail-actions{border-bottom:0}.describo-tab-rail-list{flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto;padding:8px 6px 16px;scrollbar-width:none}.describo-tab-rail-list::-webkit-scrollbar{display:none}.describo-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%}.describo-tab-rail-item:focus-visible,.describo-tab-rail-item:hover{background:#f1f5f9}.describo-tab-rail-item-active{background:#eaf2ff;color:#1d4ed8}.describo-tab-rail-item-active:before{background:#2563eb;border-radius:999px;bottom:10px;content:"";left:0;position:absolute;top:10px;width:3px}.describo-tab-rail-item-icon{align-items:center;display:flex;justify-content:center;min-height:42px;padding:8px}.describo-tab-rail-row{align-items:center;display:flex;gap:8px;justify-content:space-between}.describo-tab-rail-title{font-size:15px;font-weight:600;line-height:1.35;min-width:0;overflow-wrap:anywhere}.describo-tab-rail-status{align-items:center;display:inline-flex;flex:0 0 auto;gap:4px}.describo-tab-rail-remove-button{flex:0 0 auto;transition:opacity .12s ease}.describo-tab-rail-description{color:#64748b;font-size:12px;line-height:1.35;margin-top:4px;overflow-wrap:anywhere}.describo-tab-rail:after,.describo-tab-rail:before{content:"";height:34px;left:0;opacity:0;pointer-events:none;position:absolute;right:0;transition:opacity .12s ease;z-index:2}.describo-tab-rail:before{background:linear-gradient(#fff,#fff0);top:53px}.describo-tab-rail:after{background:linear-gradient(#fff0,#fff);bottom:0}.describo-tab-rail-can-scroll-down:after,.describo-tab-rail-can-scroll-up:before{opacity:1}.describo-tab-rail-scroll-button{box-shadow:0 2px 8px #0f172a24;left:50%;position:absolute;transform:translateX(-50%);z-index:3}.describo-tab-rail-scroll-button-up{top:58px}.describo-tab-rail-scroll-button-down{bottom:8px}.describo-add-property-drawer{z-index:6000}.describo-add-property-title.ant-typography{font-size:22px;line-height:1.25;margin:0}.describo-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}.describo-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}.describo-add-property-row:focus-visible,.describo-add-property-row:hover{background:#f8fafc;border-color:#dbeafe;box-shadow:0 1px 4px #0f172a14}.describo-add-property-row:active{transform:translateY(1px)}.describo-add-property-row-selected{background:#eff6ff;border-color:#93c5fd;box-shadow:0 0 0 1px #2563eb1f}.describo-add-property-row-selected:before{background:#2563eb}.describo-add-property-row-header{color:#111827;min-width:0}.describo-add-property-row-name{color:inherit;flex:0 1 auto;font-weight:600;min-width:0;overflow-wrap:anywhere}.describo-add-property-row-type{color:#475569;overflow-wrap:anywhere}.describo-add-property-row-help{color:#6b7280;display:block;line-height:1.45;margin-top:4px}.describo-add-property-row-check{color:#2563eb;margin-left:auto}.describo-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}.describo-quick-settings-actions{align-items:center;display:inline-flex;flex:0 0 auto;gap:6px}.describo-quick-settings-filter{flex:1 1 260px;max-width:420px;min-width:160px}.describo-property-compact .describo-add-control{margin-bottom:0;margin-top:0;padding-bottom:0;padding-top:0}.describo-property-name-with-ai{align-items:center;display:inline-flex;gap:6px;min-width:0}.describo-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}.describo-ai-edited-filter-button.ant-btn{color:#087446;font-weight:800;min-width:32px;padding-inline:0}.describo-ai-edited-filter-button.ant-btn-primary{background:#12a76c;border-color:#12a76c;color:#fff}.describo-ai-entity-review-card{box-shadow:inset 0 0 0 1px #38c88a47,0 2px 8px #186f4a14}.describo-ai-entity-delete-card{box-shadow:0 2px 8px #b91c1c14}.describo-ai-entity-delete-card:hover{box-shadow:0 6px 18px #b91c1c24}.describo-ai-entity-unlink-card{box-shadow:0 2px 8px #c2610014}.describo-ai-entity-unlink-card:hover{box-shadow:0 6px 18px #c2610024}.describo-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}.describo-ai-deleted-linked-entity-name{color:#000000e0;font-weight:700;overflow-wrap:anywhere}.describo-ai-entity-reviewed-card{position:relative}.describo-ai-entity-edited-badge{bottom:14px;position:absolute;right:14px;z-index:1}.describo-ai-entity-review-card .describo-ai-entity-edited-badge{right:130px}.describo-ai-entity-review-summary{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-top:10px}.describo-ai-entity-review-meta{align-items:center;display:inline-flex;gap:8px;min-width:0}.describo-ai-entity-review-count{color:#087446;font-size:13px;font-weight:800;white-space:nowrap}.describo-ai-entity-inline-actions{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-top:18px}.describo-ai-entity-inline-actions .describo-ai-actions{gap:12px}.describo-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}.describo-ai-entity-review-button.ant-btn:focus-visible,.describo-ai-entity-review-button.ant-btn:hover{background:#45c991!important;color:#0d2d23!important}.describo-ai-entity-diff-toggle.ant-btn{background:#ffffffd1;border-color:#1486553d;color:#047857;min-width:28px;padding:0;width:28px}.describo-ai-entity-diff-toggle.ant-btn:focus-visible,.describo-ai-entity-diff-toggle.ant-btn:hover{background:#ecfdf5!important;border-color:#14865573;color:#047857!important}.describo-ai-entity-delete-card .describo-ai-entity-review-count{color:#b91c1c}.describo-ai-entity-delete-card .describo-ai-entity-review-button.ant-btn{background:#ff5b63}.describo-ai-entity-delete-card .describo-ai-entity-review-button.ant-btn:focus-visible,.describo-ai-entity-delete-card .describo-ai-entity-review-button.ant-btn:hover{background:#f0444f!important;color:#111827!important}.describo-ai-entity-delete-card .describo-ai-action-approve.ant-btn{background:#ff5b63;border-color:#ff5b63}.describo-ai-entity-delete-card .describo-ai-action-approve.ant-btn:focus-visible,.describo-ai-entity-delete-card .describo-ai-action-approve.ant-btn:hover{background:#f0444f!important;border-color:#f0444f!important;color:#111827!important}.describo-ai-entity-delete-card .describo-ai-action-reject.ant-btn{background:#57d8a3;border-color:#57d8a3}.describo-ai-entity-delete-card .describo-ai-action-reject.ant-btn:focus-visible,.describo-ai-entity-delete-card .describo-ai-action-reject.ant-btn:hover{background:#45c991!important;border-color:#45c991!important;color:#111827!important}.describo-ai-entity-unlink-card .describo-ai-action-approve.ant-btn{background:#fb923c;border-color:#fb923c}.describo-ai-entity-unlink-card .describo-ai-action-approve.ant-btn:focus-visible,.describo-ai-entity-unlink-card .describo-ai-action-approve.ant-btn:hover{background:#f97316!important;border-color:#f97316!important;color:#111827!important}.describo-ai-entity-unlink-card .describo-ai-action-reject.ant-btn{background:#57d8a3;border-color:#57d8a3}.describo-ai-entity-unlink-card .describo-ai-action-reject.ant-btn:focus-visible,.describo-ai-entity-unlink-card .describo-ai-action-reject.ant-btn:hover{background:#45c991!important;border-color:#45c991!important;color:#111827!important}.describo-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}.describo-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}.describo-ai-confirm-spark{color:#12a76c;font-size:17px;line-height:1}.describo-ai-confirm-controls{align-items:center;display:flex;gap:6px;white-space:nowrap}.describo-ai-confirm-bar-remaining{background:linear-gradient(90deg,#fff9eb,#f9fbfd);box-shadow:inset 4px 0 0 #f59e0b}.describo-ai-confirm-bar-remaining .describo-ai-confirm-spark{color:#b45309}.describo-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}.describo-ai-review-next-entity.ant-btn:focus-visible,.describo-ai-review-next-entity.ant-btn:hover{background:#f59e0b!important;color:#1f1710!important}.describo-ai-bulk-action.ant-btn{border:0;border-radius:5px;box-shadow:0 1px 2px #0000001f;color:#14201b;font-size:12px;font-weight:800;height:26px;padding:0 9px}.describo-ai-bulk-accept.ant-btn{background:#57d8a3}.describo-ai-bulk-accept.ant-btn:focus-visible,.describo-ai-bulk-accept.ant-btn:hover{background:#45c991!important;color:#14201b!important}.describo-ai-bulk-reject.ant-btn{background:#ff6a71;color:#1f1717}.describo-ai-bulk-reject.ant-btn:focus-visible,.describo-ai-bulk-reject.ant-btn:hover{background:#f0444f!important;color:#1f1717!important}.describo-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}.describo-ai-stepper .ant-btn{border-radius:5px;color:#4a5a54;height:24px;width:24px}.describo-ai-stepper .ant-btn:not(:disabled):focus-visible,.describo-ai-stepper .ant-btn:not(:disabled):hover{background:#e6f4ec!important;color:#33443d!important}.describo-ai-step-count{color:#34443d;font-size:13px;min-width:32px;text-align:center}.describo-ai-review{border-radius:8px;margin-top:18px;padding-top:20px!important;position:relative}.describo-ai-review-current .describo-ai-suggestion,.describo-ai-review-current.describo-property,.describo-ai-suggestion.describo-ai-review-current{border-color:#12a76ce6!important;box-shadow:inset 4px 0 0 #12a76c,0 0 0 3px #12a76c1f,0 6px 18px #1969461f!important}.describo-ai-delete.describo-ai-review-current,.describo-ai-review-current .describo-ai-delete{border-color:#dc2626e0!important;box-shadow:inset 4px 0 0 #ef4444,0 0 0 3px #ef44441f,0 6px 18px #b91c1c1f!important}.describo-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}.describo-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}.describo-ai-suggestion:hover{background:linear-gradient(90deg,#22c55e26,#22c55e0d 55%,#fff0)}.describo-ai-delete:hover{background:linear-gradient(90deg,#ef444426,#ef44440d 55%,#fff0)}.describo-ai-deleted-entity-card{border-radius:8px;margin:18px;padding:26px 18px 18px;position:relative}.describo-ai-deleted-entity-header{align-items:flex-start;display:flex;gap:18px;justify-content:space-between}.describo-ai-deleted-entity-title{color:#7f1d1d;font-size:18px;font-weight:800;line-height:1.25;overflow-wrap:anywhere}.describo-ai-deleted-entity-id{color:#991b1b;font-size:13px;font-weight:600;margin-top:4px;overflow-wrap:anywhere}.describo-ai-deleted-entity-controls{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-top:14px}.describo-ai-deleted-entity-controls .describo-ai-actions{gap:8px}.describo-ai-deleted-entity-controls .describo-ai-actions .ant-btn{border-radius:6px;font-size:13px;height:28px;min-width:66px}.describo-ai-deleted-entity-summary{align-items:center;color:#7f1d1d;display:inline-flex;font-size:14px;font-weight:700;gap:10px;min-width:0}.describo-ai-deleted-entity-summary span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.describo-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}.describo-ai-entity-delete-details-toggle.ant-btn:focus-visible,.describo-ai-entity-delete-details-toggle.ant-btn:hover,.describo-ai-entity-delete-details-toggle.ant-btn[aria-pressed=true]{background:#ffe8e8!important;border-color:#f87171bd;color:#b91c1c!important}.describo-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}.describo-ai-deleted-entity-fields-inline{grid-template-columns:minmax(100px,170px) minmax(0,1fr);margin-top:10px}.describo-ai-deleted-entity-field{display:contents}.describo-ai-deleted-entity-field-name,.describo-ai-deleted-entity-field-value{background:#ffffffb8;font-size:13px;min-width:0;overflow-wrap:anywhere;padding:8px 10px}.describo-ai-deleted-entity-field-name{color:#7f1d1d;font-weight:800}.describo-ai-deleted-entity-field-value{color:#450a0a}.describo-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}.describo-ai-entity-diff-card-delete{background:#fff5f5;border-color:#dd505c7a #dd505c7a #dd505c7a #e24d5c;box-shadow:0 2px 8px #85242f14}.describo-ai-entity-diff-card-unlink{background:#fff7ed;border-color:#f973167a #f973167a #f973167a #f97316;box-shadow:0 2px 8px #c2610014}.describo-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}.describo-ai-entity-diff-card-delete .describo-ai-entity-diff-head{background:#ffe8e8;border-bottom-color:#dd505c40;color:#9a1f29}.describo-ai-entity-diff-card-unlink .describo-ai-entity-diff-head{background:#ffedd5;border-bottom-color:#f9731640;color:#9a3412}.describo-ai-entity-diff-close.ant-btn{color:currentColor;flex:0 0 auto}.describo-ai-entity-diff-close.ant-btn:focus-visible,.describo-ai-entity-diff-close.ant-btn:hover{background:#ffffff9e!important;color:currentColor!important}.describo-ai-entity-diff-body{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:14px;padding:10px 0 52px}.describo-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}.describo-ai-entity-diff-line-context{background:#f7faf8}.describo-ai-entity-diff-line-removed{background:#fff1f1}.describo-ai-entity-diff-line-added{background:#effbf5}.describo-ai-entity-diff-marker{align-self:stretch;display:grid;font-weight:900;place-items:center}.describo-ai-entity-diff-line-context .describo-ai-entity-diff-marker{background:#eef2f0;color:#738078}.describo-ai-entity-diff-line-removed .describo-ai-entity-diff-marker{background:#ffdede;color:#9a1f29}.describo-ai-entity-diff-line-added .describo-ai-entity-diff-marker{background:#d8f5e7;color:#087446}.describo-ai-entity-diff-key{color:#5b7167;padding:0 8px}.describo-ai-entity-diff-key,.describo-ai-entity-diff-value{font-weight:800;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.describo-ai-entity-diff-value{color:#1e2732;padding-right:10px}.describo-ai-entity-diff-actions{bottom:14px;display:flex;gap:7px;position:absolute;right:14px}.describo-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}.describo-ai-entity-diff-button.ant-btn:focus-visible,.describo-ai-entity-diff-button.ant-btn:hover{background:#45c991!important;color:#0d2d23!important}.describo-ai-entity-diff-button-reject.ant-btn{background:#ff6a71;color:#171717}.describo-ai-entity-diff-button-reject.ant-btn:focus-visible,.describo-ai-entity-diff-button-reject.ant-btn:hover{background:#f0444f!important;color:#171717!important}.describo-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}.describo-ai-delete .describo-ai-suggestion-badge{background:#fef2f2;border-color:#f871716b;box-shadow:0 1px 2px #b91c1c14;color:#b91c1c}.describo-ai-suggestion-badge-icon{color:#047857;font-size:14px;line-height:1}.describo-ai-delete .describo-ai-suggestion-badge-icon{color:#b91c1c}.describo-ai-entity-status-badge{left:14px;top:-15px}.describo-ai-entity-delete-card .describo-ai-entity-status-badge{background:#fef2f2;border-color:#f871716b;box-shadow:0 1px 2px #b91c1c14;color:#b91c1c}.describo-ai-entity-delete-card .describo-ai-entity-status-badge .describo-ai-suggestion-badge-icon{color:#b91c1c}.describo-ai-entity-unlink-card .describo-ai-entity-status-badge{background:#fff7ed;border-color:#fb923c73;box-shadow:0 1px 2px #c2610014;color:#9a3412}.describo-ai-entity-unlink-card .describo-ai-entity-status-badge .describo-ai-suggestion-badge-icon{color:#c2410c}.describo-ai-field-row{align-items:flex-start}.describo-ai-field-control .ant-space-compact{width:100%}.describo-ai-field-control .ant-input,.describo-ai-field-control .ant-input-affix-wrapper,.describo-ai-field-control .ant-input-number,.describo-ai-field-control .ant-picker,.describo-ai-field-control .ant-select-selector,.describo-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}.describo-ai-delete .describo-ai-field-control .ant-input,.describo-ai-delete .describo-ai-field-control .ant-input-affix-wrapper,.describo-ai-delete .describo-ai-field-control .ant-input-number,.describo-ai-delete .describo-ai-field-control .ant-picker,.describo-ai-delete .describo-ai-field-control .ant-select-selector,.describo-ai-delete .describo-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}.describo-ai-field-control .ant-space-compact>.ant-input,.describo-ai-field-control .ant-space-compact>.ant-input-affix-wrapper,.describo-ai-field-control .ant-space-compact>textarea.ant-input{border-end-end-radius:8px!important;border-start-end-radius:8px!important}.describo-ai-field-control .ant-space-compact>.ant-btn{display:none}.describo-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%}.describo-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}.describo-ai-field-diff-chip{color:#087446;flex:0 0 auto;font-size:12px}.describo-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}.describo-ai-field-diff-line:last-child{border-bottom:0}.describo-ai-field-diff-marker{align-self:stretch;display:grid;font-weight:900;place-items:center}.describo-ai-field-diff-value{color:#27322d;margin:0;min-width:0;overflow:auto;overflow-wrap:anywhere;padding:7px 11px;white-space:pre-wrap}.describo-ai-field-diff-line-removed{background:#fff1f1}.describo-ai-field-diff-line-removed .describo-ai-field-diff-marker{background:#ffdede;color:#9a1f29}.describo-ai-field-diff-line-added{background:#effbf5}.describo-ai-field-diff-line-added .describo-ai-field-diff-marker{background:#d8f5e7;color:#087446}.describo-ai-field-diff-empty{color:#7b8781;font-style:italic}.describo-ai-actions{align-items:flex-start;display:flex;flex:0 0 auto;gap:18px}.describo-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}.describo-ai-action-diff.ant-btn{background:#fff;border:1px solid #d4ddd8;color:#0f172a;min-width:36px;padding:0;width:36px}.describo-ai-action-diff.ant-btn:focus-visible,.describo-ai-action-diff.ant-btn:hover{background:#f5f8f6!important;border-color:#9bc7b3!important;color:#087446!important}.describo-ai-action-diff.ant-btn[aria-pressed=true]{background:#d8f5e7;border-color:#9bc7b3;color:#087446}.describo-ai-action-approve.ant-btn{background:#57d8a3;border-color:#57d8a3}.describo-ai-action-approve.ant-btn:focus-visible,.describo-ai-action-approve.ant-btn:hover{background:#45c991!important;border-color:#45c991!important;color:#111827!important}.describo-ai-action-reject.ant-btn,.describo-ai-delete .describo-ai-action-approve.ant-btn{background:#ff5b63;border-color:#ff5b63}.describo-ai-delete .describo-ai-action-approve.ant-btn:focus-visible,.describo-ai-delete .describo-ai-action-approve.ant-btn:hover{background:#f0444f!important;border-color:#f0444f!important;color:#111827!important}.describo-ai-delete .describo-ai-action-reject.ant-btn{background:#57d8a3;border-color:#57d8a3}.describo-ai-delete .describo-ai-action-reject.ant-btn:focus-visible,.describo-ai-delete .describo-ai-action-reject.ant-btn:hover{background:#45c991!important;border-color:#45c991!important;color:#111827!important}.describo-ai-action-reject.ant-btn:focus-visible,.describo-ai-action-reject.ant-btn:hover{background:#f0444f!important;border-color:#f0444f!important;color:#111827!important}@media (max-width:900px){.describo-ai-confirm-bar{grid-template-columns:1fr}.describo-ai-confirm-controls{flex-wrap:wrap}.describo-ai-stepper{border-left:0;margin-left:0;padding-left:0}.describo-ai-field-row{flex-wrap:wrap}.describo-ai-actions{justify-content:flex-start;width:100%}}@media (max-width:640px){.describo-quick-settings-header{flex-wrap:wrap}.describo-quick-settings-filter{flex-basis:100%;max-width:none}}.recrate,.recrate .recrate-ant{display:flex;flex-direction:column;height:100vh;min-height:100vh}.describo-editor-scroll,.recrate .ant-tabs-left .ant-tabs-nav,.recrate .ant-tabs-right .ant-tabs-nav{height:100%}.recrate .ant-tabs-bottom .ant-tabs-nav-wrap,.recrate .ant-tabs-top .ant-tabs-nav-wrap{overflow-x:auto}
2
- /*! tailwindcss v4.2.4 | 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}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-0{left:calc(var(--spacing)*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:calc(var(--spacing)*1)}.m-2{margin:calc(var(--spacing)*2)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.my-1{margin-block:calc(var(--spacing)*1)}.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:calc(var(--spacing)*1)}.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}.table-cell{display:table-cell}.h-1{height:calc(var(--spacing)*1)}.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:calc(var(--spacing)*0)}.w-1{width:calc(var(--spacing)*1)}.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:calc(var(--spacing)*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:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.space-y-1{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*1*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*1*var(--tw-space-y-reverse))}}.space-y-2{:where(&>: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))}}.space-y-3{:where(&>: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))}}.space-y-4{:where(&>: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:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.space-x-1{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*1*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*1*var(--tw-space-x-reverse))}}.space-x-2{:where(&>: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))}}.space-x-4{:where(&>: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)}.divide-y{:where(&>: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))}}.divide-gray-300{:where(&>: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}.scroll-smooth{scroll-behavior:smooth}.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:calc(var(--spacing)*1)}.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:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-1{padding-right:calc(var(--spacing)*1)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-1{padding-left:calc(var(--spacing)*1)}.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)}.blur,.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}.group-hover\:opacity-100{&:is(:where(.group):hover *){@media (hover:hover){opacity:100%}}}.hover\:scale-105{&:hover{@media (hover: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{@media (hover:hover){border-bottom-right-radius:0;border-top-right-radius:0}}}.hover\:bg-blue-300{&:hover{@media (hover:hover){background-color:var(--color-blue-300)}}}.hover\:bg-blue-700{&:hover{@media (hover:hover){background-color:var(--color-blue-700)}}}.hover\:bg-cyan-200{&:hover{@media (hover:hover){background-color:var(--color-cyan-200)}}}.hover\:bg-green-200{&:hover{@media (hover:hover){background-color:var(--color-green-200)}}}.hover\:bg-red-700{&:hover{@media (hover:hover){background-color:var(--color-red-700)}}}.hover\:bg-sky-100{&:hover{@media (hover:hover){background-color:var(--color-sky-100)}}}.hover\:text-black{&:hover{@media (hover: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}}.xl\:w-1\/5{@media (width >= 80rem){width:20%}}.xl\:w-4\/5{@media (width >= 80rem){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.2.4 | 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}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-0{left:calc(var(--spacing)*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:calc(var(--spacing)*1)}.m-2{margin:calc(var(--spacing)*2)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.my-1{margin-block:calc(var(--spacing)*1)}.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:calc(var(--spacing)*1)}.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:calc(var(--spacing)*1)}.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:calc(var(--spacing)*0)}.w-1{width:calc(var(--spacing)*1)}.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:calc(var(--spacing)*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:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.space-y-1{:where(&>:not(:last-child)){--tw-space-y-reverse:0;margin-block-end:calc(var(--spacing)*1*(1 - var(--tw-space-y-reverse)));margin-block-start:calc(var(--spacing)*1*var(--tw-space-y-reverse))}}.space-y-2{:where(&>: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))}}.space-y-3{:where(&>: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))}}.space-y-4{:where(&>: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:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.space-x-1{:where(&>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-end:calc(var(--spacing)*1*(1 - var(--tw-space-x-reverse)));margin-inline-start:calc(var(--spacing)*1*var(--tw-space-x-reverse))}}.space-x-2{:where(&>: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))}}.space-x-4{:where(&>: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)}.divide-y{:where(&>: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))}}.divide-gray-300{:where(&>: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}.scroll-smooth{scroll-behavior:smooth}.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:calc(var(--spacing)*1)}.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:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-1{padding-right:calc(var(--spacing)*1)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-1{padding-left:calc(var(--spacing)*1)}.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)}.blur,.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}.group-hover\:opacity-100{&:is(:where(.group):hover *){@media (hover:hover){opacity:100%}}}.hover\:scale-105{&:hover{@media (hover: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{@media (hover:hover){border-bottom-right-radius:0;border-top-right-radius:0}}}.hover\:bg-blue-300{&:hover{@media (hover:hover){background-color:var(--color-blue-300)}}}.hover\:bg-blue-700{&:hover{@media (hover:hover){background-color:var(--color-blue-700)}}}.hover\:bg-cyan-200{&:hover{@media (hover:hover){background-color:var(--color-cyan-200)}}}.hover\:bg-green-200{&:hover{@media (hover:hover){background-color:var(--color-green-200)}}}.hover\:bg-red-700{&:hover{@media (hover:hover){background-color:var(--color-red-700)}}}.hover\:bg-sky-100{&:hover{@media (hover:hover){background-color:var(--color-sky-100)}}}.hover\:text-black{&:hover{@media (hover: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}}.xl\:w-1\/5{@media (width >= 80rem){width:20%}}.xl\:w-4\/5{@media (width >= 80rem){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}
@@ -80470,17 +80470,12 @@ const getPendingEntityApprovalRecords = (approvalData, entityId) => {
80470
80470
  const approvedPropertyNames = new Set(
80471
80471
  entityApproval.approval.filter(approvalIsApproved).map((approvalRecord) => approvalRecord == null ? void 0 : approvalRecord.propertyName).filter((propertyName2) => typeof propertyName2 === "string" && propertyName2.length > 0)
80472
80472
  );
80473
- return entityApproval.approval.filter((approvalRecord) => (approvalRecord == null ? void 0 : approvalRecord.propertyName) && !approvalIsApproved(approvalRecord) && !approvedPropertyNames.has(approvalRecord.propertyName));
80473
+ return entityApproval.approval.filter((approvalRecord) => (approvalRecord == null ? void 0 : approvalRecord.propertyName) && approvalRecord.propertyName !== "@context" && !approvalIsApproved(approvalRecord) && !approvedPropertyNames.has(approvalRecord.propertyName));
80474
80474
  };
80475
80475
  const getPendingEntityApprovalFieldCount = (approvalData, entityId) => new Set(
80476
80476
  getPendingEntityApprovalRecords(approvalData, entityId).map((approvalRecord) => approvalRecord == null ? void 0 : approvalRecord.propertyName).filter((propertyName2) => typeof propertyName2 === "string" && propertyName2.length > 0)
80477
80477
  ).size;
80478
80478
  const getPendingApprovalEntities = (approvalData) => getApprovalEntities(approvalData).filter((entityApproval) => getPendingEntityApprovalRecords(approvalData, entityApproval == null ? void 0 : entityApproval["@id"]).length > 0);
80479
- const getPendingApprovalFieldCount = (approvalData, excludedEntityId) => getPendingApprovalEntities(approvalData).reduce((count, entityApproval) => {
80480
- const entityId = entityApproval == null ? void 0 : entityApproval["@id"];
80481
- if (excludedEntityId && entityIdsMatch(entityId, excludedEntityId)) return count;
80482
- return count + getPendingEntityApprovalFieldCount(approvalData, entityId);
80483
- }, 0);
80484
80479
  const getApprovedEntityApprovalRecords = (approvalData, entityId) => {
80485
80480
  const entityApproval = getEntityApproval(approvalData, entityId);
80486
80481
  if (!Array.isArray(entityApproval == null ? void 0 : entityApproval.approval)) return [];
@@ -110722,14 +110717,13 @@ const QuickSettingsHeader = ({
110722
110717
  onClick: onToggleEmptyFields
110723
110718
  }
110724
110719
  ) }),
110725
- /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip2, { title: showAiEditedFields ? t2("show_all_fields") : t2("show_ai_edited_fields"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
110720
+ aiEditedFieldCount > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip2, { title: showAiEditedFields ? t2("show_all_fields") : t2("show_ai_edited_fields"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
110726
110721
  Button$1,
110727
110722
  {
110728
110723
  type: showAiEditedFields ? "primary" : "default",
110729
110724
  className: "describo-ai-edited-filter-button",
110730
110725
  "aria-label": showAiEditedFields ? String(t2("show_all_fields")) : String(t2("show_ai_edited_fields")),
110731
110726
  "aria-pressed": showAiEditedFields,
110732
- disabled: aiEditedFieldCount === 0,
110733
110727
  onClick: onToggleAiEditedFields,
110734
110728
  children: "✦"
110735
110729
  }
@@ -112537,8 +112531,19 @@ const buildAiApprovalNavigationKey = (entityId, approvalRecord) => {
112537
112531
  return `${entityId}:${propertyName2}:${operation}:${timestamp}:${previousValue}`;
112538
112532
  };
112539
112533
  const RenderEntity = forwardRef((props, ref) => {
112540
- var _a2, _b, _c, _d, _e2, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
112541
- const { entity, onLoadEntity, onSaveCrate, onSaveEntityTemplate, onWarning, onError, onAddNewProfileRequest, onRemoveProfile } = props;
112534
+ var _a2, _b, _c, _d, _e2, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
112535
+ const {
112536
+ entity,
112537
+ onLoadEntity,
112538
+ onSaveCrate,
112539
+ onSaveEntityTemplate,
112540
+ onWarning,
112541
+ onError,
112542
+ quickSettingsVisible: controlledQuickSettingsVisible,
112543
+ onQuickSettingsVisibleChange,
112544
+ onAddNewProfileRequest,
112545
+ onRemoveProfile
112546
+ } = props;
112542
112547
  const state = useStateStore();
112543
112548
  const profileManager = useContext(ProfileManagerContext);
112544
112549
  const crateManager = useContext(CrateManagerContext);
@@ -112554,7 +112559,7 @@ const RenderEntity = forwardRef((props, ref) => {
112554
112559
  const [savedProperty, setSavedProperty] = useState(void 0);
112555
112560
  const [tabs, setTabs] = useState([]);
112556
112561
  const [showAddPanel, setShowAddPanel] = useState(false);
112557
- const [quickSettingsVisible, setQuickSettingsVisible] = useState(false);
112562
+ const [internalQuickSettingsVisible, setInternalQuickSettingsVisible] = useState(false);
112558
112563
  const [showFieldHelp, setShowFieldHelp] = useState(true);
112559
112564
  const [fieldTitleFilter, setFieldTitleFilter] = useState("");
112560
112565
  const [hideEmptyFields, setHideEmptyFields] = useState(false);
@@ -112579,6 +112584,15 @@ const RenderEntity = forwardRef((props, ref) => {
112579
112584
  const [scrollRestoreNonce, setScrollRestoreNonce] = useState(0);
112580
112585
  const contentContainerRef = useRef(null);
112581
112586
  const activeContentRef = useRef(null);
112587
+ const quickSettingsVisible = controlledQuickSettingsVisible ?? internalQuickSettingsVisible;
112588
+ const updateQuickSettingsVisible = useCallback((visible) => {
112589
+ if (quickSettingsVisible === visible) return;
112590
+ setInternalQuickSettingsVisible(visible);
112591
+ onQuickSettingsVisibleChange == null ? void 0 : onQuickSettingsVisibleChange(visible);
112592
+ }, [onQuickSettingsVisibleChange, quickSettingsVisible]);
112593
+ const enableProfileActions = ((_a2 = state.configuration) == null ? void 0 : _a2.enableProfileActions) === true;
112594
+ const canAddProfile = enableProfileActions && Boolean(onAddNewProfileRequest);
112595
+ const canRemoveProfile = enableProfileActions && Boolean(onRemoveProfile);
112582
112596
  const tabRailListRef = useRef(null);
112583
112597
  const editorPanelRef = useRef(null);
112584
112598
  const navigationRestoreReadyRef = useRef(false);
@@ -112607,8 +112621,29 @@ const RenderEntity = forwardRef((props, ref) => {
112607
112621
  )), [approvedAiApprovals]);
112608
112622
  const selectedAiApproval = pendingAiApprovals[selectedAiApprovalIndex] ?? pendingAiApprovals[0];
112609
112623
  const selectedAiApprovalProperty = selectedAiApproval == null ? void 0 : selectedAiApproval.propertyName;
112610
- const pendingOtherAiApprovalEntities = useMemo$1(() => getPendingApprovalEntities(approvalContext == null ? void 0 : approvalContext.roCrateApproval).filter((entityApproval) => !entityIdsMatch(entityApproval == null ? void 0 : entityApproval["@id"], contextEntity == null ? void 0 : contextEntity["@id"])), [approvalContext == null ? void 0 : approvalContext.roCrateApproval, contextEntity == null ? void 0 : contextEntity["@id"]]);
112611
- const pendingOtherAiApprovalFieldCount = useMemo$1(() => getPendingApprovalFieldCount(approvalContext == null ? void 0 : approvalContext.roCrateApproval, contextEntity == null ? void 0 : contextEntity["@id"]), [approvalContext == null ? void 0 : approvalContext.roCrateApproval, contextEntity == null ? void 0 : contextEntity["@id"]]);
112624
+ const canReviewAiApprovalEntity = useCallback((entityApproval) => {
112625
+ const entityId = entityApproval == null ? void 0 : entityApproval["@id"];
112626
+ if (!entityId) return false;
112627
+ if (isPendingEntityDeleteApproval(entityApproval)) {
112628
+ const reviewTarget = getDeletedEntityReviewTarget(entityApproval);
112629
+ if (!(reviewTarget == null ? void 0 : reviewTarget.entityId)) return false;
112630
+ return Boolean(crateManager == null ? void 0 : crateManager.getEntity({
112631
+ id: reviewTarget.entityId,
112632
+ link: false,
112633
+ materialise: false
112634
+ }));
112635
+ }
112636
+ return Boolean(crateManager == null ? void 0 : crateManager.getEntity({
112637
+ id: entityId,
112638
+ link: false,
112639
+ materialise: false
112640
+ }));
112641
+ }, [crateManager]);
112642
+ const pendingOtherAiApprovalEntities = useMemo$1(() => getPendingApprovalEntities(approvalContext == null ? void 0 : approvalContext.roCrateApproval).filter((entityApproval) => !entityIdsMatch(entityApproval == null ? void 0 : entityApproval["@id"], contextEntity == null ? void 0 : contextEntity["@id"]) && canReviewAiApprovalEntity(entityApproval)), [approvalContext == null ? void 0 : approvalContext.roCrateApproval, canReviewAiApprovalEntity, contextEntity == null ? void 0 : contextEntity["@id"]]);
112643
+ const pendingOtherAiApprovalFieldCount = useMemo$1(() => pendingOtherAiApprovalEntities.reduce((count, entityApproval) => count + getPendingEntityApprovalFieldCount(
112644
+ approvalContext == null ? void 0 : approvalContext.roCrateApproval,
112645
+ entityApproval == null ? void 0 : entityApproval["@id"]
112646
+ ), 0), [approvalContext == null ? void 0 : approvalContext.roCrateApproval, pendingOtherAiApprovalEntities]);
112612
112647
  const handleReviewNextAiApprovalEntity = useCallback(() => {
112613
112648
  for (const entityApproval of pendingOtherAiApprovalEntities) {
112614
112649
  const nextEntityId = entityApproval == null ? void 0 : entityApproval["@id"];
@@ -113148,6 +113183,7 @@ const RenderEntity = forwardRef((props, ref) => {
113148
113183
  };
113149
113184
  const handleAddNewProfile = () => {
113150
113185
  var _a3;
113186
+ if (!canAddProfile) return;
113151
113187
  try {
113152
113188
  const next2 = !showAddPanel;
113153
113189
  const currentProfileTabKeys = tabs.filter(isProfileTab).map(getProfileTabKey).filter(Boolean);
@@ -113175,6 +113211,7 @@ const RenderEntity = forwardRef((props, ref) => {
113175
113211
  }
113176
113212
  };
113177
113213
  const handleRemoveProfile = (tab) => {
113214
+ if (!canRemoveProfile) return;
113178
113215
  try {
113179
113216
  onRemoveProfile == null ? void 0 : onRemoveProfile({
113180
113217
  entityId: entity["@id"],
@@ -113387,7 +113424,7 @@ const RenderEntity = forwardRef((props, ref) => {
113387
113424
  type: "default",
113388
113425
  shape: "circle",
113389
113426
  icon: /* @__PURE__ */ jsxRuntimeExports.jsx(RefIcon$q, {}),
113390
- "aria-label": "Add Profile",
113427
+ "aria-label": String(t2("add_profile_button_aria")),
113391
113428
  "aria-controls": "add-property-panel",
113392
113429
  "aria-expanded": showAddPanel,
113393
113430
  onClick: handleAddNewProfile
@@ -113447,25 +113484,25 @@ const RenderEntity = forwardRef((props, ref) => {
113447
113484
  }
113448
113485
  }
113449
113486
  ) }),
113450
- /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip2, { title: t2("add_profile_button_tooltip"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
113487
+ canAddProfile && /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip2, { title: t2("add_profile_button_tooltip"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
113451
113488
  Button$1,
113452
113489
  {
113453
113490
  type: "default",
113454
113491
  shape: "circle",
113455
113492
  icon: /* @__PURE__ */ jsxRuntimeExports.jsx(RefIcon$q, {}),
113456
- "aria-label": "Add Profile",
113493
+ "aria-label": String(t2("add_profile_button_aria")),
113457
113494
  "aria-controls": "add-property-panel",
113458
113495
  "aria-expanded": showAddPanel,
113459
113496
  onClick: handleAddNewProfile
113460
113497
  }
113461
113498
  ) })
113462
113499
  ] });
113463
- const renderProfileActionRail = () => /* @__PURE__ */ jsxRuntimeExports.jsx("nav", { className: "describo-tab-rail describo-tab-rail-actions-only", "aria-label": "Profile actions", children: renderProfileRailActions() });
113500
+ const renderProfileActionRail = () => /* @__PURE__ */ jsxRuntimeExports.jsx("nav", { className: "describo-tab-rail describo-tab-rail-actions-only", "aria-label": String(t2("profile_actions_aria")), children: renderProfileRailActions() });
113464
113501
  const renderProfileTabRail = () => /* @__PURE__ */ jsxRuntimeExports.jsxs(
113465
113502
  "nav",
113466
113503
  {
113467
113504
  className: `describo-tab-rail ${tabRailScrollState.canScrollUp ? "describo-tab-rail-can-scroll-up" : ""} ${tabRailScrollState.canScrollDown ? "describo-tab-rail-can-scroll-down" : ""}`,
113468
- "aria-label": "Profile sections",
113505
+ "aria-label": String(t2("profile_sections_aria")),
113469
113506
  children: [
113470
113507
  renderProfileRailActions(),
113471
113508
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -113478,7 +113515,7 @@ const RenderEntity = forwardRef((props, ref) => {
113478
113515
  onScroll: updateTabRailScrollState,
113479
113516
  children: tabs.map((tab, idx) => {
113480
113517
  const isActive2 = tab.name === activeTab;
113481
- const canRemove = !(["about", "overflow", "other"].includes((tab.name || "").toLowerCase()) || ["about", "other"].includes((tab.label || tab.name || "").toLowerCase()));
113518
+ const canRemove = canRemoveProfile && !(["about", "overflow", "other"].includes((tab.name || "").toLowerCase()) || ["about", "other"].includes((tab.label || tab.name || "").toLowerCase()));
113482
113519
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
113483
113520
  "div",
113484
113521
  {
@@ -113504,7 +113541,7 @@ const RenderEntity = forwardRef((props, ref) => {
113504
113541
  canRemove && /* @__PURE__ */ jsxRuntimeExports.jsx(
113505
113542
  Button$1,
113506
113543
  {
113507
- "aria-label": "Remove profile",
113544
+ "aria-label": String(t2("remove_profile_aria")),
113508
113545
  type: "text",
113509
113546
  size: "small",
113510
113547
  className: "describo-tab-rail-remove-button",
@@ -113538,7 +113575,7 @@ const RenderEntity = forwardRef((props, ref) => {
113538
113575
  size: "small",
113539
113576
  className: "describo-tab-rail-scroll-button describo-tab-rail-scroll-button-up",
113540
113577
  icon: /* @__PURE__ */ jsxRuntimeExports.jsx(RefIcon$p, {}),
113541
- "aria-label": "Scroll profile tabs up",
113578
+ "aria-label": String(t2("scroll_profile_tabs_up")),
113542
113579
  onClick: () => scrollTabRail("up")
113543
113580
  }
113544
113581
  ),
@@ -113550,7 +113587,7 @@ const RenderEntity = forwardRef((props, ref) => {
113550
113587
  size: "small",
113551
113588
  className: "describo-tab-rail-scroll-button describo-tab-rail-scroll-button-down",
113552
113589
  icon: /* @__PURE__ */ jsxRuntimeExports.jsx(RefIcon$u, {}),
113553
- "aria-label": "Scroll profile tabs down",
113590
+ "aria-label": String(t2("scroll_profile_tabs_down")),
113554
113591
  onClick: () => scrollTabRail("down")
113555
113592
  }
113556
113593
  )
@@ -114039,7 +114076,7 @@ const RenderEntity = forwardRef((props, ref) => {
114039
114076
  }
114040
114077
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row", children: [
114041
114078
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col w-full", children: [
114042
- ((_a2 = state.configuration) == null ? void 0 : _a2.showControls) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row place-content-between pb-1 border-b border-slate-700", children: [
114079
+ ((_b = state.configuration) == null ? void 0 : _b.showControls) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row place-content-between pb-1 border-b border-slate-700", children: [
114043
114080
  /* @__PURE__ */ jsxRuntimeExports.jsx(
114044
114081
  RenderControls,
114045
114082
  {
@@ -114054,18 +114091,18 @@ const RenderEntity = forwardRef((props, ref) => {
114054
114091
  }
114055
114092
  ),
114056
114093
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-grow" }),
114057
- /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip2, { title: "Quick filter settings", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
114094
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip2, { title: t2("quick_filter_settings"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
114058
114095
  Button$1,
114059
114096
  {
114060
114097
  style: { marginRight: 8 },
114061
- onClick: () => setQuickSettingsVisible((visible) => !visible),
114098
+ onClick: () => updateQuickSettingsVisible(!quickSettingsVisible),
114062
114099
  type: quickSettingsVisible ? "primary" : "default",
114063
114100
  icon: /* @__PURE__ */ jsxRuntimeExports.jsx(RefIcon$8, {}),
114064
- "aria-label": "Quick filter settings",
114101
+ "aria-label": String(t2("quick_filter_settings")),
114065
114102
  "aria-pressed": quickSettingsVisible
114066
114103
  }
114067
114104
  ) }),
114068
- ((_b = state.configuration) == null ? void 0 : _b.enableReverseLinkBrowser) && /* @__PURE__ */ jsxRuntimeExports.jsx(
114105
+ ((_c = state.configuration) == null ? void 0 : _c.enableReverseLinkBrowser) && /* @__PURE__ */ jsxRuntimeExports.jsx(
114069
114106
  "button",
114070
114107
  {
114071
114108
  className: "bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-2 rounded text-sm",
@@ -114088,7 +114125,7 @@ const RenderEntity = forwardRef((props, ref) => {
114088
114125
  activePropertyLabel: selectedAiApprovalProperty ? getFieldTitle(selectedAiApprovalProperty) : void 0,
114089
114126
  remainingEntityCount: pendingOtherAiApprovalEntities.length,
114090
114127
  remainingFieldCount: pendingOtherAiApprovalFieldCount,
114091
- readonly: (_c = state.configuration) == null ? void 0 : _c.readonly,
114128
+ readonly: (_d = state.configuration) == null ? void 0 : _d.readonly,
114092
114129
  canGoPrevious: selectedAiApprovalIndex > 0,
114093
114130
  canGoNext: selectedAiApprovalIndex < pendingAiApprovals.length - 1,
114094
114131
  onPrevious: () => navigateToAiApproval(selectedAiApprovalIndex - 1),
@@ -114098,13 +114135,13 @@ const RenderEntity = forwardRef((props, ref) => {
114098
114135
  onReviewNextEntity: handleReviewNextAiApprovalEntity
114099
114136
  }
114100
114137
  ),
114101
- !renderTabs && (((_d = state.configuration) == null ? void 0 : _d.tabLocation) === "left" || ((_e2 = state.configuration) == null ? void 0 : _e2.tabLocation) === "right" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: contentContainerRef, className: "min-h-0 overflow-hidden", style: { height: scrollViewportHeight ? `${scrollViewportHeight}px` : "calc(100vh - 200px)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Ve, { vertical: false, proportionalLayout: false, separator: !iconView, onChange: (sizes2) => {
114138
+ !renderTabs && (((_e2 = state.configuration) == null ? void 0 : _e2.tabLocation) === "left" || ((_f = state.configuration) == null ? void 0 : _f.tabLocation) === "right" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: contentContainerRef, className: "min-h-0 overflow-hidden", style: { height: scrollViewportHeight ? `${scrollViewportHeight}px` : "calc(100vh - 200px)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Ve, { vertical: false, proportionalLayout: false, separator: !iconView, onChange: (sizes2) => {
114102
114139
  var _a3;
114103
114140
  const w2 = ((_a3 = state.configuration) == null ? void 0 : _a3.tabLocation) === "left" ? sizes2[0] : sizes2[1];
114104
114141
  setTabPaneWidth(w2);
114105
114142
  persistTabWidth(w2);
114106
114143
  }, children: [
114107
- ((_f = state.configuration) == null ? void 0 : _f.tabLocation) === "left" && /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { minSize: iconView ? ICON_TAB_PANE_WIDTH : MIN_LABEL_TAB_PANE_WIDTH, maxSize: iconView ? ICON_TAB_PANE_WIDTH : MAX_LABEL_TAB_PANE_WIDTH, preferredSize: iconView ? ICON_TAB_PANE_WIDTH : tabPaneWidth, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative group h-full border-r border-slate-200", children: [
114144
+ ((_g = state.configuration) == null ? void 0 : _g.tabLocation) === "left" && /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { minSize: iconView ? ICON_TAB_PANE_WIDTH : MIN_LABEL_TAB_PANE_WIDTH, maxSize: iconView ? ICON_TAB_PANE_WIDTH : MAX_LABEL_TAB_PANE_WIDTH, preferredSize: iconView ? ICON_TAB_PANE_WIDTH : tabPaneWidth, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative group h-full border-r border-slate-200", children: [
114108
114145
  renderProfileActionRail(),
114109
114146
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute right-0 top-0 bottom-0 w-1 bg-slate-300 opacity-0 group-hover:opacity-100" })
114110
114147
  ] }) }),
@@ -114127,7 +114164,7 @@ const RenderEntity = forwardRef((props, ref) => {
114127
114164
  )
114128
114165
  }
114129
114166
  ),
114130
- !((_g = state.configuration) == null ? void 0 : _g.readonly) && missingRequiredData && /* @__PURE__ */ jsxRuntimeExports.jsx(
114167
+ !((_h = state.configuration) == null ? void 0 : _h.readonly) && missingRequiredData && /* @__PURE__ */ jsxRuntimeExports.jsx(
114131
114168
  "button",
114132
114169
  {
114133
114170
  className: "bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded",
@@ -114136,7 +114173,7 @@ const RenderEntity = forwardRef((props, ref) => {
114136
114173
  }
114137
114174
  )
114138
114175
  ] }),
114139
- !shouldRenderCoreField("@id") && !((_h = state.configuration) == null ? void 0 : _h.readonly) && missingRequiredData && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row place-content-between my-2 p-2", children: [
114176
+ !shouldRenderCoreField("@id") && !((_i = state.configuration) == null ? void 0 : _i.readonly) && missingRequiredData && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row place-content-between my-2 p-2", children: [
114140
114177
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-grow" }),
114141
114178
  /* @__PURE__ */ jsxRuntimeExports.jsx(
114142
114179
  "button",
@@ -114214,11 +114251,11 @@ const RenderEntity = forwardRef((props, ref) => {
114214
114251
  return null;
114215
114252
  })
114216
114253
  ] }) }),
114217
- ((_i = state.configuration) == null ? void 0 : _i.tabLocation) === "right" && /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { minSize: iconView ? ICON_TAB_PANE_WIDTH : MIN_LABEL_TAB_PANE_WIDTH, maxSize: iconView ? ICON_TAB_PANE_WIDTH : MAX_LABEL_TAB_PANE_WIDTH, preferredSize: iconView ? ICON_TAB_PANE_WIDTH : tabPaneWidth, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative group h-full border-l border-slate-200", children: [
114254
+ ((_j = state.configuration) == null ? void 0 : _j.tabLocation) === "right" && /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { minSize: iconView ? ICON_TAB_PANE_WIDTH : MIN_LABEL_TAB_PANE_WIDTH, maxSize: iconView ? ICON_TAB_PANE_WIDTH : MAX_LABEL_TAB_PANE_WIDTH, preferredSize: iconView ? ICON_TAB_PANE_WIDTH : tabPaneWidth, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative group h-full border-l border-slate-200", children: [
114218
114255
  renderProfileActionRail(),
114219
114256
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute left-0 top-0 bottom-0 w-1 bg-slate-300 opacity-0 group-hover:opacity-100" })
114220
114257
  ] }) })
114221
- ] }, `untabbed-${(_j = state.configuration) == null ? void 0 : _j.tabLocation}-${iconView ? "icon" : "label"}`) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: contentContainerRef, className: "flex min-h-0 overflow-hidden", style: {
114258
+ ] }, `untabbed-${(_k = state.configuration) == null ? void 0 : _k.tabLocation}-${iconView ? "icon" : "label"}`) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: contentContainerRef, className: "flex min-h-0 overflow-hidden", style: {
114222
114259
  flexDirection: "column",
114223
114260
  height: scrollViewportHeight ? `${scrollViewportHeight}px` : "calc(100vh - 200px)"
114224
114261
  }, children: [
@@ -114228,7 +114265,7 @@ const RenderEntity = forwardRef((props, ref) => {
114228
114265
  tabPosition: "top",
114229
114266
  items: [
114230
114267
  toggleViewTabItem,
114231
- addProfileTabItem
114268
+ ...canAddProfile ? [addProfileTabItem] : []
114232
114269
  ],
114233
114270
  style: { width: "100%" },
114234
114271
  tabBarStyle: { width: "100%" }
@@ -114253,7 +114290,7 @@ const RenderEntity = forwardRef((props, ref) => {
114253
114290
  )
114254
114291
  }
114255
114292
  ),
114256
- !((_k = state.configuration) == null ? void 0 : _k.readonly) && missingRequiredData && /* @__PURE__ */ jsxRuntimeExports.jsx(
114293
+ !((_l = state.configuration) == null ? void 0 : _l.readonly) && missingRequiredData && /* @__PURE__ */ jsxRuntimeExports.jsx(
114257
114294
  "button",
114258
114295
  {
114259
114296
  className: "bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded",
@@ -114262,7 +114299,7 @@ const RenderEntity = forwardRef((props, ref) => {
114262
114299
  }
114263
114300
  )
114264
114301
  ] }),
114265
- !shouldRenderCoreField("@id") && !((_l = state.configuration) == null ? void 0 : _l.readonly) && missingRequiredData && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row place-content-between my-2 p-2", children: [
114302
+ !shouldRenderCoreField("@id") && !((_m = state.configuration) == null ? void 0 : _m.readonly) && missingRequiredData && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-row place-content-between my-2 p-2", children: [
114266
114303
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-grow" }),
114267
114304
  /* @__PURE__ */ jsxRuntimeExports.jsx(
114268
114305
  "button",
@@ -114353,7 +114390,7 @@ const RenderEntity = forwardRef((props, ref) => {
114353
114390
  ] }) }),
114354
114391
  /* @__PURE__ */ jsxRuntimeExports.jsx(Ve.Pane, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { ref: activeContentRef, className: `${editorScrollClassName} h-full overflow-y-auto scroll-smooth min-h-0`, children: [
114355
114392
  renderQuickSettingsHeader(),
114356
- !((_m = state.configuration) == null ? void 0 : _m.readonly) && ((_n = tabs.find((t22) => t22.name === activeTab)) == null ? void 0 : _n.missingRequiredData) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-red-600 float-right mb-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
114393
+ !((_n = state.configuration) == null ? void 0 : _n.readonly) && ((_o = tabs.find((t22) => t22.name === activeTab)) == null ? void 0 : _o.missingRequiredData) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-red-600 float-right mb-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
114357
114394
  "button",
114358
114395
  {
114359
114396
  className: "bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded text-sm",
@@ -114405,7 +114442,7 @@ const RenderEntity = forwardRef((props, ref) => {
114405
114442
  )
114406
114443
  }
114407
114444
  ),
114408
- (_o = tabs.find((tab) => tab.name === "about")) == null ? void 0 : _o.inputs.map((input) => {
114445
+ (_p = tabs.find((tab) => tab.name === "about")) == null ? void 0 : _p.inputs.map((input) => {
114409
114446
  if (!["@id", "@type", "name", "@reverse"].includes(input.name) && shouldRenderField(input.name, input.label)) {
114410
114447
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
114411
114448
  "div",
@@ -114490,7 +114527,7 @@ const RenderEntity = forwardRef((props, ref) => {
114490
114527
  return null;
114491
114528
  })
114492
114529
  ] }) })
114493
- ] }, `tabbed-${(_p = state.configuration) == null ? void 0 : _p.tabLocation}-${iconView ? "icon" : "label"}`) })
114530
+ ] }, `tabbed-${(_q = state.configuration) == null ? void 0 : _q.tabLocation}-${iconView ? "icon" : "label"}`) })
114494
114531
  ] }),
114495
114532
  /* @__PURE__ */ jsxRuntimeExports.jsx(
114496
114533
  Drawer2,
@@ -121857,6 +121894,12 @@ const en = {
121857
121894
  select_a_type_to_add: "Select a type to add",
121858
121895
  // Shell2.tsx
121859
121896
  add_profile_button_tooltip: "Add a new profile",
121897
+ add_profile_button_aria: "Add profile",
121898
+ profile_actions_aria: "Profile actions",
121899
+ profile_sections_aria: "Profile sections",
121900
+ remove_profile_aria: "Remove profile",
121901
+ scroll_profile_tabs_up: "Scroll profile tabs up",
121902
+ scroll_profile_tabs_down: "Scroll profile tabs down",
121860
121903
  switch_to_icon_view: "Switch to icon view",
121861
121904
  switch_to_label_view: "Switch to default view",
121862
121905
  // EntityType.tsx
@@ -121956,6 +121999,7 @@ const en = {
121956
121999
  // LinkedEntityCard.tsx / DialogBrowseEntities.tsx
121957
122000
  ai_entity_was_added_by_ai: "Entity was added by AI",
121958
122001
  // QuickSettingsHeader.tsx
122002
+ quick_filter_settings: "Quick filter settings",
121959
122003
  quick_filter_settings_aria: "Quick filter settings",
121960
122004
  field_display_settings_aria: "Field display settings",
121961
122005
  hide_field_help: "Hide field help",
@@ -122068,6 +122112,12 @@ const hu = {
122068
122112
  select_a_type_to_add: "Válassz hozzáadandó típust",
122069
122113
  // Shell2.tsx
122070
122114
  add_profile_button_tooltip: "Új profil hozzáadása",
122115
+ add_profile_button_aria: "Profil hozzáadása",
122116
+ profile_actions_aria: "Profilműveletek",
122117
+ profile_sections_aria: "Profilszakaszok",
122118
+ remove_profile_aria: "Profil eltávolítása",
122119
+ scroll_profile_tabs_up: "Profilfülek görgetése felfelé",
122120
+ scroll_profile_tabs_down: "Profilfülek görgetése lefelé",
122071
122121
  switch_to_icon_view: "Ikon nézetre váltás",
122072
122122
  switch_to_label_view: "Alap nézetre váltás",
122073
122123
  // EntityType.tsx
@@ -122167,6 +122217,7 @@ const hu = {
122167
122217
  // LinkedEntityCard.tsx / DialogBrowseEntities.tsx
122168
122218
  ai_entity_was_added_by_ai: "Az entitást AI adta hozzá",
122169
122219
  // QuickSettingsHeader.tsx
122220
+ quick_filter_settings: "Gyors szűrési beállítások",
122170
122221
  quick_filter_settings_aria: "Gyors szűrési beállítások",
122171
122222
  field_display_settings_aria: "Mezőmegjelenítési beállítások",
122172
122223
  hide_field_help: "Mezősúgó elrejtése",
@@ -123040,7 +123091,7 @@ var EmotionCacheContext = /* @__PURE__ */ React.createContext(
123040
123091
  }) : null
123041
123092
  );
123042
123093
  var CacheProvider = EmotionCacheContext.Provider;
123043
- const version = "0.1.32";
123094
+ const version = "0.1.34";
123044
123095
  const pkg = {
123045
123096
  version
123046
123097
  };
@@ -123177,6 +123228,7 @@ function DescriboCrateBuilderInner(props) {
123177
123228
  enableBrowseEntities = propertyDefinitions.enableBrowseEntities.default,
123178
123229
  enableTemplateSave = propertyDefinitions.enableTemplateSave.default,
123179
123230
  enableBulkAdd = propertyDefinitions.enableBulkAdd.default,
123231
+ enableProfileActions,
123180
123232
  enableReverseLinkBrowser = propertyDefinitions.enableReverseLinkBrowser.default,
123181
123233
  enableUrlMarkup = propertyDefinitions.enableUrlMarkup.default,
123182
123234
  enableEntityTimestamps = propertyDefinitions.enableEntityTimestamps.default,
@@ -123188,6 +123240,7 @@ function DescriboCrateBuilderInner(props) {
123188
123240
  language: language2 = propertyDefinitions.language.default,
123189
123241
  resetTabOnEntityChange = false,
123190
123242
  resetTabOnProfileChange = false,
123243
+ quickSettingsVisible,
123191
123244
  stateScopeKey,
123192
123245
  onReady,
123193
123246
  onError,
@@ -123196,6 +123249,7 @@ function DescriboCrateBuilderInner(props) {
123196
123249
  onSaveCrate,
123197
123250
  onSaveRoCrateApproval,
123198
123251
  onSaveEntityTemplate,
123252
+ onQuickSettingsVisibleChange,
123199
123253
  onAddNewProfileRequest,
123200
123254
  onRemoveProfile
123201
123255
  } = props;
@@ -123210,6 +123264,7 @@ function DescriboCrateBuilderInner(props) {
123210
123264
  const renderEntityRef = useRef(null);
123211
123265
  const keys2 = useRef({ cm: 0, pm: 0, lookups: 0 });
123212
123266
  const lastHandledEntityIdRef = useRef(void 0);
123267
+ const hasProfileActionHandler = Boolean(onAddNewProfileRequest || onRemoveProfile);
123213
123268
  useEffect(() => {
123214
123269
  setApprovalState(roCrateApproval);
123215
123270
  }, [roCrateApproval]);
@@ -123258,12 +123313,14 @@ function DescriboCrateBuilderInner(props) {
123258
123313
  markApprovalEntityApproved
123259
123314
  }), [approvalState, markApprovalEntityApproved, markApprovalPropertyApproved]);
123260
123315
  const configuration = useMemo$1(() => {
123316
+ const profileActionsEnabled = enableProfileActions ?? hasProfileActionHandler;
123261
123317
  const config2 = {
123262
123318
  enableContextEditor,
123263
123319
  enableCratePreview,
123264
123320
  enableBrowseEntities,
123265
123321
  enableTemplateSave,
123266
123322
  enableBulkAdd,
123323
+ enableProfileActions: profileActionsEnabled,
123267
123324
  enableReverseLinkBrowser,
123268
123325
  enableUrlMarkup,
123269
123326
  enableEntityTimestamps,
@@ -123291,6 +123348,7 @@ function DescriboCrateBuilderInner(props) {
123291
123348
  enableBrowseEntities,
123292
123349
  enableTemplateSave,
123293
123350
  enableBulkAdd,
123351
+ enableProfileActions,
123294
123352
  enableReverseLinkBrowser,
123295
123353
  enableUrlMarkup,
123296
123354
  enableEntityTimestamps,
@@ -123300,7 +123358,8 @@ function DescriboCrateBuilderInner(props) {
123300
123358
  tabLocation,
123301
123359
  showControls,
123302
123360
  language2,
123303
- lookup
123361
+ lookup,
123362
+ hasProfileActionHandler
123304
123363
  ]);
123305
123364
  const init2 = useCallback(async () => {
123306
123365
  var _a2, _b;
@@ -123458,8 +123517,10 @@ function DescriboCrateBuilderInner(props) {
123458
123517
  onSaveEntityTemplate: saveEntityAsTemplate,
123459
123518
  onWarning: handleWarning,
123460
123519
  onError: handleError,
123461
- onAddNewProfileRequest: handleAddProfileRequest,
123462
- onRemoveProfile
123520
+ quickSettingsVisible,
123521
+ onQuickSettingsVisibleChange,
123522
+ onAddNewProfileRequest: configuration.enableProfileActions ? handleAddProfileRequest : void 0,
123523
+ onRemoveProfile: configuration.enableProfileActions ? onRemoveProfile : void 0
123463
123524
  }
123464
123525
  ) }) }) }) }) }) }) }),
123465
123526
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "pointer-events-none fixed bottom-2 right-2 z-50 text-xs text-gray-400", children: [
package/dist/types.d.ts CHANGED
@@ -1,55 +1,268 @@
1
1
  export interface JSONObject {
2
2
  [key: string]: any;
3
3
  }
4
- export type RoCrateApprovalDecision = 'accept' | 'reject' | 'manual-edit';
4
+ /**
5
+ * Decision emitted when a user resolves AI-generated metadata approval records.
6
+ */
7
+ export type RoCrateApprovalDecision = "accept" | "reject" | "manual-edit";
5
8
  export interface EntityTemplatesParams {
6
9
  type?: Array<any> | string;
7
10
  queryString?: string;
8
11
  limit?: number;
9
12
  }
10
13
  export interface Lookup {
14
+ /**
15
+ * Look up entity templates in the host application.
16
+ *
17
+ * The component passes the requested `@type`, the user's search string, and a
18
+ * result limit. Most host applications should search at least `@id` and
19
+ * `name`.
20
+ */
11
21
  entityTemplates(params: EntityTemplatesParams): Promise<void>;
12
22
  }
23
+ export interface RoCrateApprovalSaveData {
24
+ /**
25
+ * Updated approval data after the decision has been applied.
26
+ */
27
+ roCrateApproval: JSONObject | JSONObject[] | undefined;
28
+ /**
29
+ * Entity whose approval records were changed.
30
+ */
31
+ entityId: string;
32
+ /**
33
+ * Property whose approval records were changed. Entity-level bulk decisions
34
+ * use `"*"`.
35
+ */
36
+ propertyName: string;
37
+ /**
38
+ * User decision that caused the approval data update.
39
+ */
40
+ decision: RoCrateApprovalDecision;
41
+ /**
42
+ * Approval records affected by the decision.
43
+ */
44
+ approvalRecords: JSONObject[];
45
+ /**
46
+ * Optional edited value associated with a manual decision.
47
+ */
48
+ value?: any;
49
+ }
50
+ export interface RemoveProfilePayload {
51
+ /**
52
+ * Entity currently being edited.
53
+ */
54
+ entityId: string;
55
+ /**
56
+ * Profile tab selected for removal.
57
+ */
58
+ tab: {
59
+ name?: string;
60
+ label?: string;
61
+ hasData?: boolean;
62
+ missingRequiredData?: boolean;
63
+ description?: string;
64
+ inputs?: JSONObject[];
65
+ profileUrl?: string;
66
+ };
67
+ }
13
68
  export type DescriboCrateBuilderProps = {
69
+ /**
70
+ * RO-Crate JSON to display and edit.
71
+ */
14
72
  crate?: JSONObject;
73
+ /**
74
+ * Optional AI metadata approval records, usually loaded from
75
+ * `ro-crate-approval.json`.
76
+ *
77
+ * Records may be supplied as an array, as `{ items: [...] }`, or as a single
78
+ * entity approval object with an `approval` array. Pending records drive the
79
+ * AI review banner, field-level diffs, edited-field badges, deleted entity
80
+ * review cards, and the AI-edited quick filter.
81
+ */
15
82
  roCrateApproval?: JSONObject | JSONObject[];
83
+ /**
84
+ * Profile to use when editing the crate.
85
+ */
16
86
  profile?: JSONObject;
87
+ /**
88
+ * Initially selected entity id.
89
+ */
17
90
  entityId?: string;
91
+ /**
92
+ * Host-provided lookup callbacks for template and data-pack searches.
93
+ */
18
94
  lookup?: Lookup;
95
+ /**
96
+ * Enable context editor functionality. Only used at component initialization
97
+ * time.
98
+ */
19
99
  enableContextEditor?: boolean;
100
+ /**
101
+ * Enable crate preview functionality. Only used at component initialization
102
+ * time.
103
+ */
20
104
  enableCratePreview?: boolean;
105
+ /**
106
+ * Enable entity browser functionality. Only used at component initialization
107
+ * time.
108
+ */
21
109
  enableBrowseEntities?: boolean;
110
+ /**
111
+ * Enable entity template save functionality. Only used at component
112
+ * initialization time.
113
+ */
22
114
  enableTemplateSave?: boolean;
115
+ /**
116
+ * Enable bulk-add functionality. Only used at component initialization time.
117
+ */
23
118
  enableBulkAdd?: boolean;
119
+ /**
120
+ * Show add/remove profile controls in the profile tab rail.
121
+ *
122
+ * When omitted, the component enables these controls automatically if
123
+ * `onAddNewProfileRequest` or `onRemoveProfile` is supplied.
124
+ */
125
+ enableProfileActions?: boolean;
126
+ /**
127
+ * If true, the component does not allow edits and does not call save
128
+ * callbacks.
129
+ */
24
130
  readonly?: boolean;
131
+ /**
132
+ * Enable the reverse link browser sidebar.
133
+ */
25
134
  enableReverseLinkBrowser?: boolean;
135
+ /**
136
+ * Whether the component is hosted as a web component.
137
+ */
138
+ webComponent?: boolean;
139
+ /**
140
+ * Let the component manage browser history internally.
141
+ */
26
142
  enableInternalRouting?: boolean;
143
+ /**
144
+ * Purge unlinked entities from the crate before emitting it for saving.
145
+ */
27
146
  purgeUnlinkedEntities?: boolean;
147
+ /**
148
+ * Localization language. Supported values are `en` and `hu`; defaults to
149
+ * `en`.
150
+ */
28
151
  language?: string;
152
+ /**
153
+ * Called when the component is ready.
154
+ */
29
155
  onReady?: () => void;
30
- onError?: (message: string) => void;
156
+ /**
157
+ * Called when the component reports an error.
158
+ */
159
+ onError?: (message: any) => void;
160
+ /**
161
+ * Called when the component reports a warning.
162
+ */
163
+ onWarning?: (warnings: any) => void;
164
+ /**
165
+ * Called when the crate has changed.
166
+ */
31
167
  onSaveCrate?: (saveData: {
32
168
  crate: JSONObject;
33
169
  entityId?: string;
34
170
  }) => void;
35
- onSaveRoCrateApproval?: (saveData: {
36
- roCrateApproval: JSONObject | JSONObject[];
37
- entityId: string;
38
- propertyName: string;
39
- decision: RoCrateApprovalDecision;
40
- approvalRecords: JSONObject[];
41
- value?: any;
42
- }) => void;
171
+ /**
172
+ * Called when AI approval records change.
173
+ *
174
+ * Accepting a field marks its matching approval records as approved.
175
+ * Rejecting a field or choosing manual edit removes those pending approval
176
+ * records from the approval state. The host application is responsible for
177
+ * persisting the returned `roCrateApproval` payload.
178
+ */
179
+ onSaveRoCrateApproval?: (saveData: RoCrateApprovalSaveData) => void;
180
+ /**
181
+ * Called when the crate is to be saved as a template.
182
+ *
183
+ * If implemented, also pass a `Lookup` object with `entityTemplates` so saved
184
+ * templates can be looked up and reused in the component.
185
+ */
43
186
  onSaveCrateAsTemplate?: (name: string, crate: JSONObject) => void;
187
+ /**
188
+ * Called when the entity is to be saved as a template.
189
+ *
190
+ * This is the current React component prop.
191
+ */
192
+ onSaveEntityTemplate?: (entity: JSONObject) => void;
193
+ /**
194
+ * Legacy entity-template callback name kept for consumers that still import
195
+ * the public type.
196
+ */
44
197
  onSaveEntityAsTemplate?: (name: string, entity: JSONObject) => void;
198
+ /**
199
+ * Called when the quick filter/settings panel visibility changes.
200
+ */
201
+ onQuickSettingsVisibleChange?: (visible: boolean) => void;
202
+ /**
203
+ * Called when the editor requests that the host add a profile to the current
204
+ * entity.
205
+ *
206
+ * The host should update `profile` and/or `crate` as needed; the component
207
+ * remembers existing profile tabs and selects the newly added tab after the
208
+ * update.
209
+ */
210
+ onAddNewProfileRequest?: (requested: boolean) => void;
211
+ /**
212
+ * Called when the editor requests removal of a profile tab from the current
213
+ * entity.
214
+ *
215
+ * The payload includes the entity id and the tab metadata, including whether
216
+ * the tab currently has data or missing required fields.
217
+ */
218
+ onRemoveProfile?: (payload: RemoveProfilePayload) => void;
219
+ /**
220
+ * Called when the crate builder navigates to a context entity.
221
+ */
45
222
  onNavigation?: (entity: {
46
223
  "@id": string;
224
+ "@type"?: string[];
225
+ name?: string;
47
226
  }) => void;
48
- tabLocation?: 'left' | 'right' | 'top' | 'bottom';
227
+ /**
228
+ * Location of layout tabs.
229
+ */
230
+ tabLocation?: "left" | "right" | "top" | "bottom";
231
+ /**
232
+ * Show or hide the main control bar.
233
+ */
49
234
  showControls?: boolean;
235
+ /**
236
+ * When the crate/entity is updated, stay on the selected tab instead of
237
+ * jumping back to About.
238
+ */
50
239
  resetTabOnEntityChange?: boolean;
240
+ /**
241
+ * When the profile is updated, stay on the selected tab instead of jumping
242
+ * back to About.
243
+ */
51
244
  resetTabOnProfileChange?: boolean;
245
+ /**
246
+ * Optionally control quick filter/settings panel visibility from a custom
247
+ * header.
248
+ *
249
+ * When visible, the panel lets users toggle field help, filter fields by name
250
+ * or value, hide empty fields, and, when AI approval data exists, show only
251
+ * AI-edited fields.
252
+ */
253
+ quickSettingsVisible?: boolean;
254
+ /**
255
+ * Optional scope identifier used to isolate editor state between multiple
256
+ * concurrent component instances.
257
+ */
52
258
  stateScopeKey?: string;
259
+ /**
260
+ * If true, text fields containing a URL are marked up with an entity link. If
261
+ * false, the URL is shown as plain text.
262
+ */
53
263
  enableUrlMarkup?: boolean;
264
+ /**
265
+ * If true, add timestamps reflecting the last time an entity was updated.
266
+ */
54
267
  enableEntityTimestamps?: boolean;
55
268
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arpproject/recrate",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "type": "module",
5
5
  "main": "./dist/recrate.es.js",
6
6
  "module": "./dist/recrate.es.js",