@qoretechnologies/reqraft 0.10.25 → 0.10.26
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/.claude/CLAUDE.md +52 -23
- package/design/COMPACT_ENGINE_REDESIGN.md +156 -0
- package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +353 -0
- package/dist/components/FocusedEditing/index.d.ts +9 -1
- package/dist/components/FocusedEditing/index.d.ts.map +1 -1
- package/dist/components/FocusedEditing/index.js +2 -2
- package/dist/components/FocusedEditing/index.js.map +1 -1
- package/dist/components/composer/Composer.d.ts +108 -0
- package/dist/components/composer/Composer.d.ts.map +1 -0
- package/dist/components/composer/Composer.js +238 -0
- package/dist/components/composer/Composer.js.map +1 -0
- package/dist/components/composer/helpers.d.ts +21 -0
- package/dist/components/composer/helpers.d.ts.map +1 -0
- package/dist/components/composer/helpers.js +75 -0
- package/dist/components/composer/helpers.js.map +1 -0
- package/dist/components/composer/index.d.ts +3 -0
- package/dist/components/composer/index.d.ts.map +1 -0
- package/dist/components/composer/index.js +19 -0
- package/dist/components/composer/index.js.map +1 -0
- package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
- package/dist/components/form/engine/CompactRow.js +307 -110
- package/dist/components/form/engine/CompactRow.js.map +1 -1
- package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
- package/dist/components/form/engine/CompactToolbar.js +123 -106
- package/dist/components/form/engine/CompactToolbar.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +107 -11
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +618 -179
- package/dist/components/form/engine/FormEngine.js.map +1 -1
- package/dist/components/form/engine/compactRowContext.d.ts +9 -0
- package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowContext.js.map +1 -1
- package/dist/components/form/engine/compactRowStyles.d.ts +7 -3
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +88 -51
- package/dist/components/form/engine/compactRowStyles.js.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
- package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.js.map +1 -1
- package/dist/components/form/engine/optionActions.d.ts +28 -0
- package/dist/components/form/engine/optionActions.d.ts.map +1 -0
- package/dist/components/form/engine/optionActions.js +18 -0
- package/dist/components/form/engine/optionActions.js.map +1 -0
- package/dist/components/form/engine/readFirst.d.ts +63 -2
- package/dist/components/form/engine/readFirst.d.ts.map +1 -1
- package/dist/components/form/engine/readFirst.js +121 -6
- package/dist/components/form/engine/readFirst.js.map +1 -1
- package/dist/components/form/engine/rendererTypes.d.ts +35 -0
- package/dist/components/form/engine/rendererTypes.d.ts.map +1 -0
- package/dist/components/form/engine/rendererTypes.js +63 -0
- package/dist/components/form/engine/rendererTypes.js.map +1 -0
- package/dist/components/form/engine/variants/VariantCalmTable.d.ts +6 -0
- package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -0
- package/dist/components/form/engine/variants/VariantCalmTable.js +94 -0
- package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -0
- package/dist/components/form/engine/variants/VariantCards.d.ts +6 -0
- package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -0
- package/dist/components/form/engine/variants/VariantCards.js +80 -0
- package/dist/components/form/engine/variants/VariantCards.js.map +1 -0
- package/dist/components/form/engine/variants/VariantFocus.d.ts +7 -0
- package/dist/components/form/engine/variants/VariantFocus.d.ts.map +1 -0
- package/dist/components/form/engine/variants/VariantFocus.js +138 -0
- package/dist/components/form/engine/variants/VariantFocus.js.map +1 -0
- package/dist/components/form/engine/variants/VariantMinimal.d.ts +6 -0
- package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -0
- package/dist/components/form/engine/variants/VariantMinimal.js +73 -0
- package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -0
- package/dist/components/form/engine/variants/focusDemo.d.ts +13 -0
- package/dist/components/form/engine/variants/focusDemo.d.ts.map +1 -0
- package/dist/components/form/engine/variants/focusDemo.js +139 -0
- package/dist/components/form/engine/variants/focusDemo.js.map +1 -0
- package/dist/components/form/engine/variants/variantModel.d.ts +70 -0
- package/dist/components/form/engine/variants/variantModel.d.ts.map +1 -0
- package/dist/components/form/engine/variants/variantModel.js +133 -0
- package/dist/components/form/engine/variants/variantModel.js.map +1 -0
- package/dist/components/form/engine/variants/variantParts.d.ts +79 -0
- package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -0
- package/dist/components/form/engine/variants/variantParts.js +191 -0
- package/dist/components/form/engine/variants/variantParts.js.map +1 -0
- package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/index.js +13 -2
- package/dist/components/form/expressions/builder/index.js.map +1 -1
- package/dist/components/form/expressions/useExpressions.d.ts.map +1 -1
- package/dist/components/form/expressions/useExpressions.js +4 -1
- package/dist/components/form/expressions/useExpressions.js.map +1 -1
- package/dist/components/form/fields/Field.d.ts.map +1 -1
- package/dist/components/form/fields/Field.js +5 -3
- package/dist/components/form/fields/Field.js.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +2 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.js +8 -26
- package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts +3 -0
- package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.js +42 -8
- package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
- package/dist/components/form/fields/binary/Binary.d.ts +15 -0
- package/dist/components/form/fields/binary/Binary.d.ts.map +1 -0
- package/dist/components/form/fields/binary/Binary.js +74 -0
- package/dist/components/form/fields/binary/Binary.js.map +1 -0
- package/dist/components/form/fields/boolean/Boolean.js +1 -1
- package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js +5 -4
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
- package/dist/components/form/fields/select/Select.d.ts.map +1 -1
- package/dist/components/form/fields/select/Select.js +29 -12
- package/dist/components/form/fields/select/Select.js.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.d.ts +8 -2
- package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.js +52 -16
- package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
- package/dist/components/form/index.d.ts +2 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +2 -0
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/imageLightbox/ImageLightbox.d.ts +21 -0
- package/dist/components/imageLightbox/ImageLightbox.d.ts.map +1 -0
- package/dist/components/imageLightbox/ImageLightbox.js +169 -0
- package/dist/components/imageLightbox/ImageLightbox.js.map +1 -0
- package/dist/components/imageLightbox/index.d.ts +2 -0
- package/dist/components/imageLightbox/index.d.ts.map +1 -0
- package/dist/components/imageLightbox/index.js +18 -0
- package/dist/components/imageLightbox/index.js.map +1 -0
- package/dist/components/searchFilterBar/SearchFilterBar.d.ts +33 -0
- package/dist/components/searchFilterBar/SearchFilterBar.d.ts.map +1 -0
- package/dist/components/searchFilterBar/SearchFilterBar.js +76 -0
- package/dist/components/searchFilterBar/SearchFilterBar.js.map +1 -0
- package/dist/components/searchFilterBar/index.d.ts +2 -0
- package/dist/components/searchFilterBar/index.d.ts.map +1 -0
- package/dist/components/searchFilterBar/index.js +18 -0
- package/dist/components/searchFilterBar/index.js.map +1 -0
- package/dist/components/supportTicket/AttachmentChips.d.ts +10 -0
- package/dist/components/supportTicket/AttachmentChips.d.ts.map +1 -0
- package/dist/components/supportTicket/AttachmentChips.js +122 -0
- package/dist/components/supportTicket/AttachmentChips.js.map +1 -0
- package/dist/components/supportTicket/InterfaceReferenceTags.d.ts +43 -0
- package/dist/components/supportTicket/InterfaceReferenceTags.d.ts.map +1 -0
- package/dist/components/supportTicket/InterfaceReferenceTags.js +31 -0
- package/dist/components/supportTicket/InterfaceReferenceTags.js.map +1 -0
- package/dist/components/supportTicket/ReferencePicker.d.ts +87 -0
- package/dist/components/supportTicket/ReferencePicker.d.ts.map +1 -0
- package/dist/components/supportTicket/ReferencePicker.js +295 -0
- package/dist/components/supportTicket/ReferencePicker.js.map +1 -0
- package/dist/components/supportTicket/TicketHeader.d.ts +86 -0
- package/dist/components/supportTicket/TicketHeader.d.ts.map +1 -0
- package/dist/components/supportTicket/TicketHeader.js +149 -0
- package/dist/components/supportTicket/TicketHeader.js.map +1 -0
- package/dist/components/supportTicket/TicketMetaTags.d.ts +32 -0
- package/dist/components/supportTicket/TicketMetaTags.d.ts.map +1 -0
- package/dist/components/supportTicket/TicketMetaTags.js +21 -0
- package/dist/components/supportTicket/TicketMetaTags.js.map +1 -0
- package/dist/components/supportTicket/TicketReplyBox.d.ts +63 -0
- package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -0
- package/dist/components/supportTicket/TicketReplyBox.js +115 -0
- package/dist/components/supportTicket/TicketReplyBox.js.map +1 -0
- package/dist/components/supportTicket/attachmentAccess.d.ts +37 -0
- package/dist/components/supportTicket/attachmentAccess.d.ts.map +1 -0
- package/dist/components/supportTicket/attachmentAccess.js +132 -0
- package/dist/components/supportTicket/attachmentAccess.js.map +1 -0
- package/dist/components/supportTicket/fileToAttachment.d.ts +9 -0
- package/dist/components/supportTicket/fileToAttachment.d.ts.map +1 -0
- package/dist/components/supportTicket/fileToAttachment.js +28 -0
- package/dist/components/supportTicket/fileToAttachment.js.map +1 -0
- package/dist/components/supportTicket/index.d.ts +11 -0
- package/dist/components/supportTicket/index.d.ts.map +1 -0
- package/dist/components/supportTicket/index.js +27 -0
- package/dist/components/supportTicket/index.js.map +1 -0
- package/dist/components/supportTicket/meta.d.ts +71 -0
- package/dist/components/supportTicket/meta.d.ts.map +1 -0
- package/dist/components/supportTicket/meta.js +115 -0
- package/dist/components/supportTicket/meta.js.map +1 -0
- package/dist/components/supportTicket/ticketModel.d.ts +102 -0
- package/dist/components/supportTicket/ticketModel.d.ts.map +1 -0
- package/dist/components/supportTicket/ticketModel.js +3 -0
- package/dist/components/supportTicket/ticketModel.js.map +1 -0
- package/dist/components/ticketReferences/TicketReferences.d.ts +52 -0
- package/dist/components/ticketReferences/TicketReferences.d.ts.map +1 -0
- package/dist/components/ticketReferences/TicketReferences.js +492 -0
- package/dist/components/ticketReferences/TicketReferences.js.map +1 -0
- package/dist/components/ticketReferences/index.d.ts +3 -0
- package/dist/components/ticketReferences/index.d.ts.map +1 -0
- package/dist/components/ticketReferences/index.js +6 -0
- package/dist/components/ticketReferences/index.js.map +1 -0
- package/dist/components/ticketThread/TicketThread.d.ts +57 -0
- package/dist/components/ticketThread/TicketThread.d.ts.map +1 -0
- package/dist/components/ticketThread/TicketThread.js +299 -0
- package/dist/components/ticketThread/TicketThread.js.map +1 -0
- package/dist/components/ticketThread/index.d.ts +3 -0
- package/dist/components/ticketThread/index.d.ts.map +1 -0
- package/dist/components/ticketThread/index.js +7 -0
- package/dist/components/ticketThread/index.js.map +1 -0
- package/dist/helpers/common.d.ts +5 -0
- package/dist/helpers/common.d.ts.map +1 -1
- package/dist/helpers/common.js +20 -1
- package/dist/helpers/common.js.map +1 -1
- package/dist/helpers/scrollbar.d.ts +2 -0
- package/dist/helpers/scrollbar.d.ts.map +1 -0
- package/dist/helpers/scrollbar.js +25 -0
- package/dist/helpers/scrollbar.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/StorageProvider.d.ts +13 -0
- package/dist/providers/StorageProvider.d.ts.map +1 -1
- package/dist/providers/StorageProvider.js +29 -5
- package/dist/providers/StorageProvider.js.map +1 -1
- package/package.json +6 -5
- package/src/components/FocusedEditing/index.tsx +17 -2
- package/src/components/composer/Composer.stories.tsx +238 -0
- package/src/components/composer/Composer.tsx +545 -0
- package/src/components/composer/helpers.ts +74 -0
- package/src/components/composer/index.ts +2 -0
- package/src/components/dpqlEditor/DpqlEditor.stories.tsx +74 -2
- package/src/components/form/engine/CompactRow.tsx +561 -283
- package/src/components/form/engine/CompactToolbar.tsx +216 -182
- package/src/components/form/engine/FormEngine.stories.tsx +1736 -162
- package/src/components/form/engine/FormEngine.tsx +886 -170
- package/src/components/form/engine/FormEngineRemote.stories.tsx +377 -0
- package/src/components/form/engine/_structuredData/StructuredDataView.stories.tsx +8 -0
- package/src/components/form/engine/compactRowContext.ts +14 -0
- package/src/components/form/engine/compactRowStyles.ts +273 -146
- package/src/components/form/engine/compactToolbarContext.ts +1 -0
- package/src/components/form/engine/optionActions.ts +40 -0
- package/src/components/form/engine/readFirst.ts +169 -10
- package/src/components/form/engine/rendererTypes.ts +55 -0
- package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +159 -0
- package/src/components/form/engine/variants/VariantCalmTable.tsx +242 -0
- package/src/components/form/engine/variants/VariantCards.tsx +212 -0
- package/src/components/form/engine/variants/VariantFocus.tsx +382 -0
- package/src/components/form/engine/variants/VariantMinimal.tsx +170 -0
- package/src/components/form/engine/variants/focusDemo.ts +145 -0
- package/src/components/form/engine/variants/variantModel.ts +216 -0
- package/src/components/form/engine/variants/variantParts.tsx +313 -0
- package/src/components/form/expressions/ExpressionField.stories.tsx +84 -2
- package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +213 -19
- package/src/components/form/expressions/builder/index.tsx +12 -1
- package/src/components/form/expressions/useExpressions.ts +4 -1
- package/src/components/form/fields/Field.stories.tsx +40 -0
- package/src/components/form/fields/Field.tsx +10 -1
- package/src/components/form/fields/allowed-values/AllowedValues.tsx +13 -36
- package/src/components/form/fields/array/ArrayAutoField.stories.tsx +64 -0
- package/src/components/form/fields/auto/AutoFormField.stories.tsx +146 -2
- package/src/components/form/fields/auto/AutoFormField.tsx +42 -1
- package/src/components/form/fields/binary/Binary.stories.tsx +122 -0
- package/src/components/form/fields/binary/Binary.tsx +81 -0
- package/src/components/form/fields/boolean/Boolean.stories.tsx +58 -0
- package/src/components/form/fields/boolean/Boolean.tsx +1 -1
- package/src/components/form/fields/byte-size/ByteSize.stories.tsx +24 -0
- package/src/components/form/fields/color/Color.stories.tsx +30 -0
- package/src/components/form/fields/cron/Cron.stories.tsx +8 -0
- package/src/components/form/fields/date/Date.stories.tsx +22 -0
- package/src/components/form/fields/file/File.stories.tsx +48 -0
- package/src/components/form/fields/long-string/LongString.stories.tsx +24 -0
- package/src/components/form/fields/markdown/Markdown.stories.tsx +8 -0
- package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +14 -10
- package/src/components/form/fields/number/Number.stories.tsx +31 -0
- package/src/components/form/fields/object/Object.stories.tsx +88 -0
- package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +24 -0
- package/src/components/form/fields/rich-text/RichText.stories.tsx +23 -0
- package/src/components/form/fields/schema-definition/SchemaDefinitionField.stories.tsx +72 -0
- package/src/components/form/fields/select/Select.stories.tsx +108 -0
- package/src/components/form/fields/select/Select.tsx +38 -12
- package/src/components/form/fields/select/SelectCollection.tsx +78 -17
- package/src/components/form/fields/string/String.stories.tsx +16 -0
- package/src/components/form/fields/template/TemplateField.stories.tsx +160 -0
- package/src/components/form/fields/url/Url.stories.tsx +24 -0
- package/src/components/form/index.tsx +2 -0
- package/src/components/imageLightbox/ImageLightbox.stories.tsx +238 -0
- package/src/components/imageLightbox/ImageLightbox.tsx +236 -0
- package/src/components/imageLightbox/index.ts +1 -0
- package/src/components/log/Log.stories.tsx +96 -0
- package/src/components/menu/Menu.stories.tsx +54 -0
- package/src/components/qonsoleSmartInput/QonsoleSmartInput.stories.tsx +83 -37
- package/src/components/searchFilterBar/SearchFilterBar.tsx +131 -0
- package/src/components/searchFilterBar/index.ts +1 -0
- package/src/components/smartEditor/SmartEditor.stories.tsx +32 -0
- package/src/components/supportTicket/AttachmentChips.stories.tsx +171 -0
- package/src/components/supportTicket/AttachmentChips.tsx +147 -0
- package/src/components/supportTicket/InterfaceReferenceTags.stories.tsx +171 -0
- package/src/components/supportTicket/InterfaceReferenceTags.tsx +96 -0
- package/src/components/supportTicket/ReferencePicker.stories.tsx +519 -0
- package/src/components/supportTicket/ReferencePicker.tsx +563 -0
- package/src/components/supportTicket/TicketConversation.stories.tsx +121 -0
- package/src/components/supportTicket/TicketHeader.stories.tsx +183 -0
- package/src/components/supportTicket/TicketHeader.tsx +247 -0
- package/src/components/supportTicket/TicketMetaTags.stories.tsx +103 -0
- package/src/components/supportTicket/TicketMetaTags.tsx +85 -0
- package/src/components/supportTicket/TicketReplyBox.stories.tsx +351 -0
- package/src/components/supportTicket/TicketReplyBox.tsx +146 -0
- package/src/components/supportTicket/attachmentAccess.ts +97 -0
- package/src/components/supportTicket/fileToAttachment.ts +24 -0
- package/src/components/supportTicket/index.ts +10 -0
- package/src/components/supportTicket/meta.ts +185 -0
- package/src/components/supportTicket/ticketModel.ts +131 -0
- package/src/components/ticketReferences/TicketReferences.stories.tsx +315 -0
- package/src/components/ticketReferences/TicketReferences.tsx +886 -0
- package/src/components/ticketReferences/index.ts +2 -0
- package/src/components/ticketThread/TicketThread.stories.tsx +828 -0
- package/src/components/ticketThread/TicketThread.tsx +704 -0
- package/src/components/ticketThread/index.ts +6 -0
- package/src/helpers/common.ts +19 -0
- package/src/helpers/scrollbar.ts +32 -0
- package/src/hooks/useFetch/useFetch.stories.tsx +30 -0
- package/src/hooks/useStorage/useStorage.stories.tsx +82 -0
- package/src/hooks/useWebSocket/useWebsocket.stories.tsx +127 -1
- package/src/index.tsx +8 -1
- package/src/providers/StorageProvider.tsx +30 -4
- package/src/stores/currentUser/currentUser.stories.tsx +49 -0
|
@@ -18,11 +18,10 @@ export const COMPACT_ROW_GAP = 14; // grid column gap
|
|
|
18
18
|
export const COMPACT_VALUE_LEFT = COMPACT_ROW_PAD_X + COMPACT_LABEL_COL + COMPACT_ROW_GAP;
|
|
19
19
|
// The surface starts a touch left of the value text, for inner left padding.
|
|
20
20
|
export const COMPACT_PANEL_LEFT = COMPACT_VALUE_LEFT - 10;
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
export const GROUP_INDENT = 'clamp(8px, 3%, 32px)';
|
|
21
|
+
// Left offset for the group sub-labels / cluster header, kept equal to the row's
|
|
22
|
+
// own horizontal padding so the labels line up flush with the field labels below
|
|
23
|
+
// them (no extra gutter — the spine/rail that used a fluid indent are gone).
|
|
24
|
+
export const GROUP_INDENT = `${COMPACT_ROW_PAD_X}px`;
|
|
26
25
|
|
|
27
26
|
// Measured label column (GLOBAL). The label column sizes to the WIDEST field
|
|
28
27
|
// label across the whole form, clamped to [MIN, MAX]. FormEngine measures the
|
|
@@ -35,7 +34,6 @@ export const LABEL_COL_MIN = 120;
|
|
|
35
34
|
export const LABEL_COL_MAX = COMPACT_LABEL_COL; // 220
|
|
36
35
|
export const LABEL_COL_VAR = '--readfirst-label-col';
|
|
37
36
|
export const LABEL_COL = `var(${LABEL_COL_VAR}, ${COMPACT_LABEL_COL}px)`;
|
|
38
|
-
export const VALUE_LEFT_CSS = `calc(${LABEL_COL} + ${COMPACT_ROW_PAD_X + COMPACT_ROW_GAP}px)`;
|
|
39
37
|
export const PANEL_LEFT_CSS = `calc(${LABEL_COL} + ${COMPACT_ROW_PAD_X + COMPACT_ROW_GAP - 10}px)`;
|
|
40
38
|
|
|
41
39
|
// Glass sticky header: override `.reqore-panel-title` (the surface ReqorePanel
|
|
@@ -46,12 +44,16 @@ export const PANEL_LEFT_CSS = `calc(${LABEL_COL} + ${COMPACT_ROW_PAD_X + COMPACT
|
|
|
46
44
|
// content blurs softly through.
|
|
47
45
|
export const StyledCompactPanel = styled(ReqorePanel)<{
|
|
48
46
|
$headerBg: string;
|
|
47
|
+
$nested?: boolean;
|
|
49
48
|
}>`
|
|
50
49
|
> .reqore-panel-title {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
/* The blur + translateZ exist only to make the STICKY top-level toolbar ghost
|
|
51
|
+
content beneath it; a nested sub-form's header isn't sticky, so skip them
|
|
52
|
+
(and the stacking context translateZ creates). */
|
|
53
|
+
${({ $nested }) =>
|
|
54
|
+
$nested ? '' : (
|
|
55
|
+
'backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); transform: translateZ(0);'
|
|
56
|
+
)}
|
|
55
57
|
padding-top: ${GAP_FROM_SIZE[HEADER_GAP]}px;
|
|
56
58
|
padding-bottom: ${GAP_FROM_SIZE[HEADER_GAP]}px;
|
|
57
59
|
}
|
|
@@ -71,6 +73,36 @@ export const StyledCompactPanel = styled(ReqorePanel)<{
|
|
|
71
73
|
flex: 1 1 auto;
|
|
72
74
|
min-width: 0;
|
|
73
75
|
}
|
|
76
|
+
|
|
77
|
+
/* An injected option action declared \`show: 'hover'\` — the shape ReqorePanel
|
|
78
|
+
honours on the classic path — is revealed only while its row or card is
|
|
79
|
+
hovered or holds focus. The compact slots render plain buttons, so the gate
|
|
80
|
+
has to be CSS here. Kept focus-visible too, so the action stays reachable by
|
|
81
|
+
keyboard. Opacity rather than display keeps the slot's width stable, so rows
|
|
82
|
+
don't reflow on hover. */
|
|
83
|
+
.options-injected-action-hover {
|
|
84
|
+
opacity: 0;
|
|
85
|
+
/* Not hit-testable while invisible — an opacity:0 button still takes taps
|
|
86
|
+
and clicks, which reads as a mystery control firing out of nowhere. */
|
|
87
|
+
pointer-events: none;
|
|
88
|
+
transition: opacity 0.15s ease;
|
|
89
|
+
}
|
|
90
|
+
.readfirst-row:hover .options-injected-action-hover,
|
|
91
|
+
.readfirst-row:focus-within .options-injected-action-hover,
|
|
92
|
+
.options-readfirst-card:hover .options-injected-action-hover,
|
|
93
|
+
.options-readfirst-card:focus-within .options-injected-action-hover {
|
|
94
|
+
opacity: 1;
|
|
95
|
+
pointer-events: auto;
|
|
96
|
+
}
|
|
97
|
+
/* Touch and other hover-less pointers never fire :hover, so a hover-gated
|
|
98
|
+
action would be permanently unreachable there. Show it unconditionally
|
|
99
|
+
instead — losing the tidiness beats losing the functionality. */
|
|
100
|
+
@media (hover: none), (pointer: coarse) {
|
|
101
|
+
.options-injected-action-hover {
|
|
102
|
+
opacity: 1;
|
|
103
|
+
pointer-events: auto;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
74
106
|
`;
|
|
75
107
|
|
|
76
108
|
// Compact group header laid out as the panel's `label`: the group name, a
|
|
@@ -89,6 +121,62 @@ export const StyledGroupHeaderLine = styled.span<{ $color: string }>`
|
|
|
89
121
|
background: linear-gradient(to right, ${({ $color }) => $color}, transparent);
|
|
90
122
|
`;
|
|
91
123
|
|
|
124
|
+
// A status box (Needs attention / Set / Optional). Matches the "Focus" prototype:
|
|
125
|
+
// a barely-there accent border + a ~5%-opacity tint, NOT the loud intent border a
|
|
126
|
+
// stock ReqorePanel draws. `$accent` is the box's theme colour (warning/success/
|
|
127
|
+
// muted).
|
|
128
|
+
export const StyledStatusBox = styled(ReqorePanel)<{ $accent: string; $bg?: string }>`
|
|
129
|
+
&&& {
|
|
130
|
+
border: 1px solid ${({ $accent }) => `${$accent}33`};
|
|
131
|
+
/* $bg lets the muted "Optional" box opt into a darker, recessed surface
|
|
132
|
+
instead of the faint accent tint the coloured boxes use. */
|
|
133
|
+
background: ${({ $accent, $bg }) => $bg || `${$accent}1f`};
|
|
134
|
+
border-radius: 10px;
|
|
135
|
+
}
|
|
136
|
+
`;
|
|
137
|
+
|
|
138
|
+
// "One of the below is required" cluster box — wraps the members of an unmet
|
|
139
|
+
// one-of required group (in the Needs-attention box) so the constraint reads as
|
|
140
|
+
// one unit. The connection rail + status nodes still render inside (they convey
|
|
141
|
+
// which member satisfies the group); this box adds the explicit heading.
|
|
142
|
+
export const StyledRequiredClusterBox = styled.div<{ $border: string; $tint: string }>`
|
|
143
|
+
border: 1px solid ${({ $border }) => $border};
|
|
144
|
+
border-radius: 8px;
|
|
145
|
+
background: ${({ $tint }) => $tint};
|
|
146
|
+
padding: 2px 6px 6px;
|
|
147
|
+
margin: 4px 0;
|
|
148
|
+
/* The members render directly here (not via the gapped group body), so give
|
|
149
|
+
them the same modest gap the rest of the rows have. Pin the divider-centring
|
|
150
|
+
var to that gap (it doesn't widen in narrow like the group body's does). */
|
|
151
|
+
display: flex;
|
|
152
|
+
flex-flow: column;
|
|
153
|
+
--readfirst-row-gap: 4px;
|
|
154
|
+
gap: 4px;
|
|
155
|
+
`;
|
|
156
|
+
export const StyledRequiredClusterHeader = styled.div<{ $color: string }>`
|
|
157
|
+
display: flex;
|
|
158
|
+
align-items: center;
|
|
159
|
+
gap: 6px;
|
|
160
|
+
padding: 8px 0 4px ${GROUP_INDENT};
|
|
161
|
+
font-size: 10px;
|
|
162
|
+
font-weight: 600;
|
|
163
|
+
letter-spacing: 1px;
|
|
164
|
+
text-transform: uppercase;
|
|
165
|
+
color: ${({ $color }) => $color};
|
|
166
|
+
`;
|
|
167
|
+
|
|
168
|
+
// Thin schema-group sub-label inside a status box (CONNECTION / AUTHENTICATION /
|
|
169
|
+
// …). Quiet by design — the box header is the loud heading; this just keeps each
|
|
170
|
+
// field's group context as you scan. Indented to the rows' content line.
|
|
171
|
+
export const StyledStatusBoxGroupLabel = styled.div`
|
|
172
|
+
font-size: 10px;
|
|
173
|
+
font-weight: 500;
|
|
174
|
+
letter-spacing: 1px;
|
|
175
|
+
text-transform: uppercase;
|
|
176
|
+
opacity: 0.5;
|
|
177
|
+
padding: 8px 0 2px ${GROUP_INDENT};
|
|
178
|
+
`;
|
|
179
|
+
|
|
92
180
|
// Required-group "connection" rail: contiguous members are linked by a continuous
|
|
93
181
|
// vertical rail (StyledGroupBody draws it; the line bridges the row gaps and is
|
|
94
182
|
// trimmed to the first/last node). Each member carries a status node — absolutely
|
|
@@ -132,7 +220,8 @@ export const StyledEditCard = styled.div<{ $bg: string; $border: string }>`
|
|
|
132
220
|
|
|
133
221
|
/* Single-value editors (operators, long-string, markdown, richtext, byte-size)
|
|
134
222
|
carry the card's own "Clear value" action, so suppress the value input's
|
|
135
|
-
built-in ReqoreInput clear — ReqoreInput has no prop to hide it, and
|
|
223
|
+
built-in ReqoreInput clear — ReqoreInput has no prop to hide it, and a
|
|
224
|
+
separate input ✕ plus the row-level trash action
|
|
136
225
|
read as a duplicate. Multi-input cards (hash/list/…) are not marked single,
|
|
137
226
|
so their per-sub-field clears stay. */
|
|
138
227
|
&.options-readfirst-card-single .reqore-clear-input-button {
|
|
@@ -180,10 +269,11 @@ export const StyledCardHeading = styled.div`
|
|
|
180
269
|
min-width: 0;
|
|
181
270
|
`;
|
|
182
271
|
|
|
272
|
+
/* The card (expanded) label matches the read-row label exactly — same size /
|
|
273
|
+
weight / case — so a field's name doesn't switch styles when you open it. */
|
|
183
274
|
export const StyledCardLabel = styled.div<{ $color: string }>`
|
|
184
|
-
font-size:
|
|
185
|
-
|
|
186
|
-
letter-spacing: 0.07em;
|
|
275
|
+
font-size: 13px;
|
|
276
|
+
font-weight: 600;
|
|
187
277
|
color: ${({ $color }) => $color};
|
|
188
278
|
display: flex;
|
|
189
279
|
align-items: center;
|
|
@@ -194,20 +284,66 @@ export const StyledCardLabel = styled.div<{ $color: string }>`
|
|
|
194
284
|
so the ellipsis engages instead of overflowing. */
|
|
195
285
|
export const StyledRowValue = styled.div<{ $color: string; $empty?: boolean }>`
|
|
196
286
|
min-width: 0;
|
|
197
|
-
color: ${({ $color }) => $color};
|
|
198
|
-
font-style: ${({ $empty }) => ($empty ? 'italic' : 'normal')};
|
|
199
287
|
font-size: 13px;
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
288
|
+
/* Value + inline reason(s) share the line, wrapping the reason below only when
|
|
289
|
+
it doesn't fit (the Focus prototype's layout). */
|
|
290
|
+
display: flex;
|
|
291
|
+
flex-wrap: wrap;
|
|
292
|
+
align-items: baseline;
|
|
293
|
+
column-gap: 10px;
|
|
294
|
+
row-gap: 2px;
|
|
295
|
+
/* The muted/translucent colour applies to the VALUE TEXT only — not the whole
|
|
296
|
+
cell — so the message panels and the structured preview below render at full
|
|
297
|
+
opacity instead of inheriting the dimmed value colour. */
|
|
298
|
+
.options-readfirst-valuetext {
|
|
299
|
+
min-width: 0;
|
|
300
|
+
max-width: 100%;
|
|
301
|
+
color: ${({ $color }) => $color};
|
|
302
|
+
font-style: ${({ $empty }) => ($empty ? 'italic' : 'normal')};
|
|
303
|
+
overflow: hidden;
|
|
304
|
+
text-overflow: ellipsis;
|
|
305
|
+
white-space: nowrap;
|
|
306
|
+
}
|
|
307
|
+
.options-readfirst-reason {
|
|
308
|
+
font-style: italic;
|
|
309
|
+
font-size: 12px;
|
|
310
|
+
line-height: 1.3;
|
|
311
|
+
}
|
|
312
|
+
/* Schema message panels: full width of the value column, on their own line
|
|
313
|
+
directly beneath the value. */
|
|
314
|
+
.options-readfirst-info-panel {
|
|
315
|
+
flex-basis: 100%;
|
|
316
|
+
width: 100%;
|
|
317
|
+
display: flex;
|
|
318
|
+
flex-flow: column;
|
|
319
|
+
gap: 4px;
|
|
320
|
+
margin-top: 4px;
|
|
321
|
+
}
|
|
203
322
|
`;
|
|
204
323
|
|
|
205
324
|
export const StyledRowActions = styled.div`
|
|
206
325
|
display: flex;
|
|
207
326
|
align-items: center;
|
|
327
|
+
/* No align-self override: the actions (incl. the status dot) follow the row's
|
|
328
|
+
own vertical alignment — CENTRED on the common single-line row, TOP-aligned
|
|
329
|
+
(first line) on the tall rows that opt into align-items:start (descriptions /
|
|
330
|
+
message panels / hash previews). */
|
|
208
331
|
gap: 6px;
|
|
209
332
|
`;
|
|
210
333
|
|
|
334
|
+
// A single status mark pinned at the row's trailing edge: one dot, colour =
|
|
335
|
+
// severity (danger/warning/success). This is the "Focus" read-first signal that
|
|
336
|
+
// replaces the recessed value surface's intent stripe — attention dots carry a
|
|
337
|
+
// faint ring, a plain "set" dot does not. `unset` rows render no dot.
|
|
338
|
+
export const StyledStatusDot = styled.span<{ $color: string; $ring?: boolean }>`
|
|
339
|
+
width: 7px;
|
|
340
|
+
height: 7px;
|
|
341
|
+
border-radius: 50%;
|
|
342
|
+
flex: 0 0 auto;
|
|
343
|
+
background: ${({ $color }) => $color};
|
|
344
|
+
box-shadow: ${({ $color, $ring }) => ($ring ? `0 0 0 3px ${$color}22` : 'none')};
|
|
345
|
+
`;
|
|
346
|
+
|
|
211
347
|
export const StyledActionSlot = styled.span<{ $width: number }>`
|
|
212
348
|
display: inline-flex;
|
|
213
349
|
justify-content: center;
|
|
@@ -220,18 +356,34 @@ export const StyledColumn = styled.div`
|
|
|
220
356
|
flex-flow: column;
|
|
221
357
|
`;
|
|
222
358
|
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
export const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
padding: 0 10px 8px 24px;
|
|
359
|
+
// The structured hash/list preview, rendered inside the value cell directly
|
|
360
|
+
// under the value summary. Full-width of the value column (it's a flex child of
|
|
361
|
+
// the wrapping value cell) so it lines up with the value, not the label gutter.
|
|
362
|
+
export const StyledRowInset = styled.div`
|
|
363
|
+
flex-basis: 100%;
|
|
364
|
+
width: 100%;
|
|
365
|
+
margin-top: 4px;
|
|
231
366
|
`;
|
|
232
367
|
|
|
233
|
-
|
|
234
|
-
|
|
368
|
+
// A collapsed code-block preview shown under the value summary for a
|
|
369
|
+
// `code-editor` field. Multi-line, monospace, subtle background — matches
|
|
370
|
+
// the aesthetic of the classic code-view surface but small enough to sit
|
|
371
|
+
// inside a read-row. Height is capped by the wrapping `ReqoreCollapsibleContent`
|
|
372
|
+
// so the "Show more" affordance stays useful.
|
|
373
|
+
export const StyledCodePreview = styled.pre<{ $bg: string; $border: string; $fg: string }>`
|
|
374
|
+
margin: 0;
|
|
375
|
+
padding: 8px 10px;
|
|
376
|
+
border-radius: 4px;
|
|
377
|
+
background: ${({ $bg }) => $bg};
|
|
378
|
+
border: 1px solid ${({ $border }) => $border};
|
|
379
|
+
color: ${({ $fg }) => $fg};
|
|
380
|
+
font-family:
|
|
381
|
+
ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
|
|
382
|
+
font-size: 11.5px;
|
|
383
|
+
line-height: 1.5;
|
|
384
|
+
white-space: pre;
|
|
385
|
+
overflow: auto;
|
|
386
|
+
max-width: 100%;
|
|
235
387
|
`;
|
|
236
388
|
|
|
237
389
|
// A small inline colour swatch shown before an rgbcolor value's hex string.
|
|
@@ -255,32 +407,21 @@ export const StyledGroupBody = styled.div<{
|
|
|
255
407
|
display: flex;
|
|
256
408
|
flex-flow: column;
|
|
257
409
|
position: relative;
|
|
258
|
-
gap
|
|
410
|
+
/* Exposed as a var so the inter-field divider can centre itself in the gap
|
|
411
|
+
(the gap differs wide vs narrow). */
|
|
412
|
+
--readfirst-row-gap: 4px;
|
|
413
|
+
gap: var(--readfirst-row-gap);
|
|
259
414
|
|
|
260
415
|
/* Indent each field block under the group header by a FLUID step. The %
|
|
261
416
|
resolves against this container's width (not the screen), so it tracks the
|
|
262
|
-
|
|
263
|
-
|
|
417
|
+
(Field blocks no longer get a left gutter — the spine/rail that needed it are
|
|
418
|
+
gone, so rows sit flush against the box, like the Focus prototype.) */
|
|
264
419
|
> * {
|
|
265
|
-
margin-left:
|
|
420
|
+
margin-left: 0;
|
|
266
421
|
}
|
|
267
422
|
|
|
268
|
-
/*
|
|
269
|
-
|
|
270
|
-
rail and lands on the exact same x — GROUP_INDENT minus 9px matches the rail's
|
|
271
|
-
left: -9px on each (indented) block. The rail is a descendant ::after, so it
|
|
272
|
-
paints over this spine and wins where a required cluster overlaps it. */
|
|
273
|
-
&::before {
|
|
274
|
-
content: '';
|
|
275
|
-
position: absolute;
|
|
276
|
-
left: calc(${GROUP_INDENT} - 9px);
|
|
277
|
-
top: 0;
|
|
278
|
-
bottom: 8px;
|
|
279
|
-
width: 2px;
|
|
280
|
-
background: linear-gradient(to bottom, ${({ $lineColor }) => $lineColor}, transparent);
|
|
281
|
-
pointer-events: none;
|
|
282
|
-
z-index: 0;
|
|
283
|
-
}
|
|
423
|
+
/* No group spine: the "Focus" look keeps the rows flat against the box. (The
|
|
424
|
+
required-group rail is a separate descendant ::after and still renders.) */
|
|
284
425
|
|
|
285
426
|
.readfirst-row {
|
|
286
427
|
display: grid;
|
|
@@ -291,19 +432,44 @@ export const StyledGroupBody = styled.div<{
|
|
|
291
432
|
grid wider than its container and produce a horizontal scrollbar. The 0
|
|
292
433
|
minimum lets it shrink and the value cell's ellipsis take over instead. */
|
|
293
434
|
grid-template-columns: ${LABEL_COL} minmax(0, 1fr) auto;
|
|
435
|
+
/* CENTRE the cells vertically: on the common single-line read row the label,
|
|
436
|
+
value and status dot all sit on one centred line. Tall rows (a shown
|
|
437
|
+
description, message panels or a hash preview) opt back into top-alignment
|
|
438
|
+
(.readfirst-row-info-open / .readfirst-row-tall below) so the label + dot
|
|
439
|
+
stay on the value's FIRST line instead of floating to the middle. */
|
|
294
440
|
align-items: center;
|
|
295
441
|
gap: 14px;
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
min-height keeps the click target for rows with shorter content. */
|
|
302
|
-
padding: 3px 10px;
|
|
442
|
+
/* Generous, SYMMETRIC vertical padding so a single-line row isn't cramped
|
|
443
|
+
(content sits with even breathing room top + bottom); a min-height floor
|
|
444
|
+
keeps the rare shorter row a comfortable tap target. */
|
|
445
|
+
min-height: 40px;
|
|
446
|
+
padding: 9px 10px;
|
|
303
447
|
border-radius: 6px;
|
|
304
448
|
cursor: pointer;
|
|
305
449
|
transition: background 0.12s ease;
|
|
306
450
|
}
|
|
451
|
+
/* A dim hairline in the gap below each field so its start/end reads clearly.
|
|
452
|
+
Absolutely positioned (not a border) so it stays straight + full-width and
|
|
453
|
+
the row's rounded hover highlight is unaffected; sits in the inter-row gap. */
|
|
454
|
+
.readfirst-row::after {
|
|
455
|
+
content: '';
|
|
456
|
+
position: absolute;
|
|
457
|
+
/* Inset to the row's horizontal padding so the line spans the content, not
|
|
458
|
+
the full box edge-to-edge. */
|
|
459
|
+
left: ${COMPACT_ROW_PAD_X}px;
|
|
460
|
+
right: ${COMPACT_ROW_PAD_X}px;
|
|
461
|
+
/* Centred in the inter-field gap (which differs wide vs narrow) so the space
|
|
462
|
+
above and below each line is equal. */
|
|
463
|
+
bottom: calc(var(--readfirst-row-gap, 4px) / -2);
|
|
464
|
+
height: 1px;
|
|
465
|
+
background: ${({ $divider }) => $divider};
|
|
466
|
+
opacity: 0.5;
|
|
467
|
+
pointer-events: none;
|
|
468
|
+
z-index: 0;
|
|
469
|
+
}
|
|
470
|
+
.readfirst-row:last-child::after {
|
|
471
|
+
display: none;
|
|
472
|
+
}
|
|
307
473
|
.readfirst-row:hover {
|
|
308
474
|
background: ${({ $hover }) => $hover};
|
|
309
475
|
}
|
|
@@ -319,8 +485,10 @@ export const StyledGroupBody = styled.div<{
|
|
|
319
485
|
/* A disabled field (schema disabled flag or unmet dependencies) is not a
|
|
320
486
|
click target — no hover invite, not-allowed cursor; a lock replaces the
|
|
321
487
|
pencil. */
|
|
488
|
+
/* A disabled field reads dimmed (its name + value at 0.6) — clearly inactive. */
|
|
322
489
|
.readfirst-row-disabled {
|
|
323
490
|
cursor: not-allowed;
|
|
491
|
+
opacity: 0.6;
|
|
324
492
|
}
|
|
325
493
|
.readfirst-row-disabled:hover {
|
|
326
494
|
background: transparent;
|
|
@@ -341,15 +509,6 @@ export const StyledGroupBody = styled.div<{
|
|
|
341
509
|
background: transparent;
|
|
342
510
|
}
|
|
343
511
|
}
|
|
344
|
-
.readfirst-action {
|
|
345
|
-
opacity: 0;
|
|
346
|
-
transition: opacity 0.12s ease;
|
|
347
|
-
}
|
|
348
|
-
.readfirst-row:hover .readfirst-action,
|
|
349
|
-
.readfirst-row:focus-visible .readfirst-action {
|
|
350
|
-
opacity: 0.85;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
512
|
/* A scalar row being edited in place: the real editor replaces the value
|
|
354
513
|
cell. The row stops being a click target (the editor owns the clicks) and
|
|
355
514
|
keeps a constant active background. Vertical padding is tightened so the
|
|
@@ -363,10 +522,11 @@ export const StyledGroupBody = styled.div<{
|
|
|
363
522
|
the ✓/↺ cluster get small offsets to sit optically centred on it. */
|
|
364
523
|
align-items: start;
|
|
365
524
|
background: ${({ $hover }) => $hover};
|
|
366
|
-
/*
|
|
367
|
-
|
|
525
|
+
/* No top padding (the per-cell nudges below anchor the editor to the first
|
|
526
|
+
line), but a real BOTTOM padding so the editor never sits flush against
|
|
527
|
+
the row's bottom edge — a tall input used to look clipped/unfinished. */
|
|
368
528
|
padding-top: 0;
|
|
369
|
-
padding-bottom:
|
|
529
|
+
padding-bottom: 9px;
|
|
370
530
|
/* Tighter column gap: the editor's trailing template ⋮ and our ✓ should
|
|
371
531
|
read as one control cluster, not two separated groups. */
|
|
372
532
|
column-gap: 6px;
|
|
@@ -396,9 +556,15 @@ export const StyledGroupBody = styled.div<{
|
|
|
396
556
|
rather than a viewport media query, so a slim desktop drawer stacks too.
|
|
397
557
|
The 3 row children are placed explicitly:
|
|
398
558
|
label (1,1) · actions (1,2) · value (2, span both). */
|
|
559
|
+
/* Generous breathing room BETWEEN fields when stacked — far easier to scan and
|
|
560
|
+
less overwhelming on a phone. */
|
|
561
|
+
&.readfirst-narrow {
|
|
562
|
+
--readfirst-row-gap: 18px;
|
|
563
|
+
}
|
|
399
564
|
&.readfirst-narrow .readfirst-row {
|
|
400
565
|
grid-template-columns: minmax(0, 1fr) auto;
|
|
401
|
-
gap:
|
|
566
|
+
gap: 2px 14px;
|
|
567
|
+
position: relative;
|
|
402
568
|
}
|
|
403
569
|
&.readfirst-narrow .readfirst-row > :nth-child(1) {
|
|
404
570
|
grid-column: 1;
|
|
@@ -412,8 +578,26 @@ export const StyledGroupBody = styled.div<{
|
|
|
412
578
|
grid-column: 1 / -1;
|
|
413
579
|
grid-row: 2;
|
|
414
580
|
}
|
|
581
|
+
/* Read (non-editing) rows: float the trailing actions (status dot + the
|
|
582
|
+
hover-revealed delete/revert) out of the grid flow so a delete button can't
|
|
583
|
+
inflate the first row and push the value down. They're pinned to a band the
|
|
584
|
+
height of the LABEL line and vertically centred in it — so the dot always
|
|
585
|
+
sits at the same place (centred on the field name), never the bare corner. */
|
|
586
|
+
&.readfirst-narrow .readfirst-row:not(.readfirst-row-editing) > :nth-child(3) {
|
|
587
|
+
position: absolute;
|
|
588
|
+
top: 2px;
|
|
589
|
+
right: 10px;
|
|
590
|
+
height: 22px;
|
|
591
|
+
}
|
|
592
|
+
&.readfirst-narrow .readfirst-row:not(.readfirst-row-editing) > :nth-child(1) {
|
|
593
|
+
padding-right: 46px;
|
|
594
|
+
}
|
|
415
595
|
|
|
416
|
-
/*
|
|
596
|
+
/* Focus calm rows: NO recessed value surface and NO intent stripe. Row status
|
|
597
|
+
is carried by the trailing status dot; message/preview panels keep their own
|
|
598
|
+
intent backgrounds. The (now invisible) pseudo is retained only to preserve
|
|
599
|
+
the block's positioning/stacking context that the required-group rail and its
|
|
600
|
+
cluster nodes resolve against — removing it would unmoor them. */
|
|
417
601
|
> *:not(.options-readfirst-card) {
|
|
418
602
|
position: relative;
|
|
419
603
|
}
|
|
@@ -422,9 +606,7 @@ export const StyledGroupBody = styled.div<{
|
|
|
422
606
|
position: absolute;
|
|
423
607
|
inset: 0;
|
|
424
608
|
left: ${PANEL_LEFT_CSS};
|
|
425
|
-
background:
|
|
426
|
-
border-radius: 6px;
|
|
427
|
-
border-left: 3px solid var(--readfirst-stripe, transparent);
|
|
609
|
+
background: transparent;
|
|
428
610
|
pointer-events: none;
|
|
429
611
|
z-index: 0;
|
|
430
612
|
}
|
|
@@ -435,64 +617,25 @@ export const StyledGroupBody = styled.div<{
|
|
|
435
617
|
z-index: 1;
|
|
436
618
|
}
|
|
437
619
|
|
|
438
|
-
/*
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
.readfirst-
|
|
447
|
-
content: '';
|
|
448
|
-
position: absolute;
|
|
449
|
-
left: -9px;
|
|
450
|
-
top: 0;
|
|
451
|
-
bottom: -8px;
|
|
452
|
-
width: 2px;
|
|
453
|
-
/* muted info — the connection is a quiet structural hint, not a loud accent */
|
|
454
|
-
background: ${({ $focus }) => `${$focus}99`};
|
|
455
|
-
box-shadow: 0 0 4px ${({ $focus }) => `${$focus}99`};
|
|
456
|
-
pointer-events: none;
|
|
457
|
-
z-index: 0;
|
|
458
|
-
}
|
|
459
|
-
.readfirst-cluster-rail.readfirst-cluster-first::after {
|
|
460
|
-
top: 19px;
|
|
461
|
-
}
|
|
462
|
-
.readfirst-cluster-rail.readfirst-cluster-last::after {
|
|
463
|
-
bottom: calc(100% - 19px);
|
|
464
|
-
}
|
|
465
|
-
/* Group fulfilled (any member set): the whole rail reads success, not just the
|
|
466
|
-
satisfying node. */
|
|
467
|
-
.readfirst-cluster-rail.readfirst-cluster-satisfied::after {
|
|
468
|
-
background: ${({ $success }) => `${$success}99`};
|
|
469
|
-
box-shadow: 0 0 4px ${({ $success }) => `${$success}99`};
|
|
470
|
-
}
|
|
471
|
-
/* Sub-panels (messages, hash preview) indent to the value column so they sit on
|
|
472
|
-
the surface, not in the bare label gutter. */
|
|
473
|
-
.options-readfirst-info-panel,
|
|
474
|
-
.options-readfirst-inset {
|
|
475
|
-
padding-left: ${VALUE_LEFT_CSS};
|
|
476
|
-
}
|
|
477
|
-
/* A field's short_desc renders under its NAME (revealed by the ⓘ toggle),
|
|
478
|
-
growing the label block to multiple lines. Top-anchor those open rows so the
|
|
479
|
-
value lines up with the name rather than the middle of the taller label;
|
|
480
|
-
closed (single-line) rows keep the centred read-row rhythm. */
|
|
481
|
-
.readfirst-row-info-open {
|
|
620
|
+
/* (The required-group connection rail was removed — the "One of the below is
|
|
621
|
+
required" box now carries the grouping.) */
|
|
622
|
+
|
|
623
|
+
/* Tall rows top-anchor (overriding the row's centred default) so the label and
|
|
624
|
+
dot stay on the value's FIRST line rather than floating to the vertical
|
|
625
|
+
middle: .readfirst-row-info-open = a shown short_desc grows the LABEL;
|
|
626
|
+
.readfirst-row-tall = message panels / a hash preview grow the VALUE cell. */
|
|
627
|
+
.readfirst-row-info-open,
|
|
628
|
+
.readfirst-row-tall {
|
|
482
629
|
align-items: start;
|
|
483
630
|
}
|
|
484
|
-
/* Narrow stacks label-over-value
|
|
485
|
-
|
|
631
|
+
/* Narrow stacks label-over-value: the value aligns flush UNDER the label (no
|
|
632
|
+
indent), like the Focus prototype. */
|
|
486
633
|
&.readfirst-narrow .readfirst-row > :nth-child(2) {
|
|
487
|
-
padding-left:
|
|
634
|
+
padding-left: 0;
|
|
488
635
|
}
|
|
489
636
|
&.readfirst-narrow > *:not(.options-readfirst-card)::before {
|
|
490
637
|
left: 0;
|
|
491
638
|
}
|
|
492
|
-
&.readfirst-narrow .options-readfirst-info-panel,
|
|
493
|
-
&.readfirst-narrow .options-readfirst-inset {
|
|
494
|
-
padding-left: 12px;
|
|
495
|
-
}
|
|
496
639
|
/* Touch layouts have no hover: a slot reserved for the hover-revealed edit
|
|
497
640
|
pencil is permanent dead space that insets every chip from the edge —
|
|
498
641
|
drop it (rows are tap-to-edit; the lock/add slots stay, they're static). */
|
|
@@ -500,32 +643,16 @@ export const StyledGroupBody = styled.div<{
|
|
|
500
643
|
/* !important: the slot carries an inline display for the desktop layout. */
|
|
501
644
|
display: none !important;
|
|
502
645
|
}
|
|
503
|
-
/*
|
|
504
|
-
|
|
646
|
+
/* Stacked rows: keep them tight (match the Focus prototype). The min-height is
|
|
647
|
+
dropped so a 2-line label+value row sizes to its content instead of being
|
|
648
|
+
padded out to 38px. The in-place editor keeps zero padding (below). */
|
|
505
649
|
&.readfirst-narrow .readfirst-row {
|
|
506
|
-
padding-top:
|
|
507
|
-
padding-bottom:
|
|
650
|
+
padding-top: 2px;
|
|
651
|
+
padding-bottom: 2px;
|
|
652
|
+
min-height: 0;
|
|
508
653
|
}
|
|
509
654
|
&.readfirst-narrow .readfirst-row-editing {
|
|
510
655
|
padding-top: 0;
|
|
511
656
|
padding-bottom: 0;
|
|
512
657
|
}
|
|
513
|
-
|
|
514
|
-
/* A hash block = its parent row + the revealed sub-rows. Highlight the whole
|
|
515
|
-
block as one unit on hover (rather than only the parent row), and neutralise
|
|
516
|
-
the parent row's own hover so the two don't stack into a darker band. The
|
|
517
|
-
parent row's hover actions still surface whenever the block is hovered. */
|
|
518
|
-
.options-readfirst-hash-row {
|
|
519
|
-
border-radius: 6px;
|
|
520
|
-
transition: background 0.12s ease;
|
|
521
|
-
}
|
|
522
|
-
.options-readfirst-hash-row:hover {
|
|
523
|
-
background: ${({ $hover }) => $hover};
|
|
524
|
-
}
|
|
525
|
-
.options-readfirst-hash-row:hover .readfirst-row {
|
|
526
|
-
background: transparent;
|
|
527
|
-
}
|
|
528
|
-
.options-readfirst-hash-row:hover .readfirst-action {
|
|
529
|
-
opacity: 0.85;
|
|
530
|
-
}
|
|
531
658
|
`;
|
|
@@ -26,6 +26,7 @@ export interface ICompactToolbarContext {
|
|
|
26
26
|
readOnly?: boolean;
|
|
27
27
|
// Completion meter
|
|
28
28
|
invalidCount: number;
|
|
29
|
+
attentionCount: number;
|
|
29
30
|
completion: { set: number; total: number; pct: number };
|
|
30
31
|
// Invalid-fields banner (pinned in the sticky header)
|
|
31
32
|
showInvalidOnly: boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { IReqorePanelAction } from '@qoretechnologies/reqore/dist/components/Panel';
|
|
2
|
+
import { IQorusFormField, IQorusFormSchema } from '@qoretechnologies/ts-toolkit';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The context an `optionActions` factory receives for a single option — the
|
|
6
|
+
* option's name, its schema entry, and its current field value. This is the
|
|
7
|
+
* IDE's `AiAssistanceAction` context (it injects its `allowAi` button here).
|
|
8
|
+
*/
|
|
9
|
+
export interface IOptionActionsContext {
|
|
10
|
+
name: string;
|
|
11
|
+
schema: IQorusFormSchema[string];
|
|
12
|
+
value?: IQorusFormField;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* SEAM (reqraft): per-option injected actions. Either a static list applied to
|
|
17
|
+
* every option, or a factory invoked once per option with that option's context.
|
|
18
|
+
*/
|
|
19
|
+
export type TOptionActions =
|
|
20
|
+
| IReqorePanelAction[]
|
|
21
|
+
| ((context: IOptionActionsContext) => IReqorePanelAction[]);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the `optionActions` seam for one option.
|
|
25
|
+
*
|
|
26
|
+
* Both render paths go through this so a consumer's factory is called with the
|
|
27
|
+
* same context and its result shaped the same way: the classic path feeds the
|
|
28
|
+
* result to `ReqorePanel`'s `actions`, the compact path renders the buttons
|
|
29
|
+
* itself. Falsy entries are dropped so a factory can return conditional actions
|
|
30
|
+
* inline (`cond && {...}`) without each caller re-filtering.
|
|
31
|
+
*/
|
|
32
|
+
export const resolveOptionActions = (
|
|
33
|
+
optionActions: TOptionActions | undefined,
|
|
34
|
+
context: IOptionActionsContext
|
|
35
|
+
): IReqorePanelAction[] => {
|
|
36
|
+
const actions =
|
|
37
|
+
typeof optionActions === 'function' ? optionActions(context) : (optionActions ?? []);
|
|
38
|
+
|
|
39
|
+
return (actions ?? []).filter((action): action is IReqorePanelAction => !!action);
|
|
40
|
+
};
|