@cratis/scene.components 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.ts +55 -0
- package/.storybook/preview.tsx +36 -0
- package/CratisComponents.stories.tsx +235 -0
- package/README.md +192 -0
- package/bindings/ArcRuntimeBoundary.tsx +36 -0
- package/bindings/BindingKind.ts +18 -0
- package/bindings/BoundConstructor.ts +21 -0
- package/bindings/ElementBinding.ts +19 -0
- package/bindings/MissingBinding.tsx +34 -0
- package/bindings/Placeholder.tsx +42 -0
- package/bindings/bindingRegistry.ts +105 -0
- package/bindings/for_bindingRegistry/when_a_command_is_registered.ts +30 -0
- package/bindings/for_bindingRegistry/when_a_query_is_not_registered.ts +17 -0
- package/bindings/for_bindingRegistry/when_a_query_is_registered.ts +30 -0
- package/bindings/for_bindingRegistry/when_bindings_are_cleared.ts +29 -0
- package/bindings/for_resolveElementBinding/when_resolving_a_command_binding.ts +34 -0
- package/bindings/for_resolveElementBinding/when_resolving_a_query_binding.ts +45 -0
- package/bindings/index.ts +11 -0
- package/bindings/resolveElementBinding.ts +33 -0
- package/common/SceneDropdown.tsx +31 -0
- package/common/SceneErrorBoundary.tsx +17 -0
- package/common/SceneIcon.tsx +18 -0
- package/common/SceneTooltip.tsx +28 -0
- package/common/index.ts +7 -0
- package/cratisComponents.ts +91 -0
- package/cratisComponentsPackage.ts +101 -0
- package/data/SceneDataTable.tsx +41 -0
- package/data/SceneObservableDataTable.tsx +41 -0
- package/data/for_SceneDataTable/when_the_query_binding_is_missing.tsx +48 -0
- package/data/index.ts +5 -0
- package/dialogs/SceneBusyIndicatorDialog.tsx +29 -0
- package/dialogs/SceneCommandDialog.tsx +42 -0
- package/dialogs/SceneConfirmationDialog.tsx +23 -0
- package/dialogs/SceneDialog.tsx +41 -0
- package/dialogs/SceneStepperCommandDialog.tsx +50 -0
- package/dialogs/index.ts +8 -0
- package/dist/cjs/bindings/ArcRuntimeBoundary.js +37 -0
- package/dist/cjs/bindings/ArcRuntimeBoundary.js.map +1 -0
- package/dist/cjs/bindings/BindingKind.js +19 -0
- package/dist/cjs/bindings/BindingKind.js.map +1 -0
- package/dist/cjs/bindings/MissingBinding.js +24 -0
- package/dist/cjs/bindings/MissingBinding.js.map +1 -0
- package/dist/cjs/bindings/Placeholder.js +38 -0
- package/dist/cjs/bindings/Placeholder.js.map +1 -0
- package/dist/cjs/bindings/bindingRegistry.js +101 -0
- package/dist/cjs/bindings/bindingRegistry.js.map +1 -0
- package/dist/cjs/bindings/resolveElementBinding.js +34 -0
- package/dist/cjs/bindings/resolveElementBinding.js.map +1 -0
- package/dist/cjs/common/SceneDropdown.js +30 -0
- package/dist/cjs/common/SceneDropdown.js.map +1 -0
- package/dist/cjs/common/SceneErrorBoundary.js +20 -0
- package/dist/cjs/common/SceneErrorBoundary.js.map +1 -0
- package/dist/cjs/common/SceneIcon.js +22 -0
- package/dist/cjs/common/SceneIcon.js.map +1 -0
- package/dist/cjs/common/SceneTooltip.js +29 -0
- package/dist/cjs/common/SceneTooltip.js.map +1 -0
- package/dist/cjs/cratisComponents.js +106 -0
- package/dist/cjs/cratisComponents.js.map +1 -0
- package/dist/cjs/cratisComponentsPackage.js +105 -0
- package/dist/cjs/cratisComponentsPackage.js.map +1 -0
- package/dist/cjs/data/SceneDataTable.js +46 -0
- package/dist/cjs/data/SceneDataTable.js.map +1 -0
- package/dist/cjs/data/SceneObservableDataTable.js +44 -0
- package/dist/cjs/data/SceneObservableDataTable.js.map +1 -0
- package/dist/cjs/dialogs/SceneBusyIndicatorDialog.js +30 -0
- package/dist/cjs/dialogs/SceneBusyIndicatorDialog.js.map +1 -0
- package/dist/cjs/dialogs/SceneCommandDialog.js +47 -0
- package/dist/cjs/dialogs/SceneCommandDialog.js.map +1 -0
- package/dist/cjs/dialogs/SceneConfirmationDialog.js +25 -0
- package/dist/cjs/dialogs/SceneConfirmationDialog.js.map +1 -0
- package/dist/cjs/dialogs/SceneDialog.js +41 -0
- package/dist/cjs/dialogs/SceneDialog.js.map +1 -0
- package/dist/cjs/dialogs/SceneStepperCommandDialog.js +54 -0
- package/dist/cjs/dialogs/SceneStepperCommandDialog.js.map +1 -0
- package/dist/cjs/editors/SceneFilterPanel.js +57 -0
- package/dist/cjs/editors/SceneFilterPanel.js.map +1 -0
- package/dist/cjs/editors/SceneObjectContentEditor.js +37 -0
- package/dist/cjs/editors/SceneObjectContentEditor.js.map +1 -0
- package/dist/cjs/editors/SceneObjectNavigationalBar.js +34 -0
- package/dist/cjs/editors/SceneObjectNavigationalBar.js.map +1 -0
- package/dist/cjs/editors/SceneSchemaEditor.js +33 -0
- package/dist/cjs/editors/SceneSchemaEditor.js.map +1 -0
- package/dist/cjs/editors/SceneTimeMachine.js +32 -0
- package/dist/cjs/editors/SceneTimeMachine.js.map +1 -0
- package/dist/cjs/editors/filterDefinitions.js +59 -0
- package/dist/cjs/editors/filterDefinitions.js.map +1 -0
- package/dist/cjs/editors/timeMachineVersions.js +44 -0
- package/dist/cjs/editors/timeMachineVersions.js.map +1 -0
- package/dist/cjs/editors/useEditableCopy.js +39 -0
- package/dist/cjs/editors/useEditableCopy.js.map +1 -0
- package/dist/cjs/forms/SceneCommandForm.js +46 -0
- package/dist/cjs/forms/SceneCommandForm.js.map +1 -0
- package/dist/cjs/forms/fields/CommandFormField.js +31 -0
- package/dist/cjs/forms/fields/CommandFormField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneCalendarField.js +41 -0
- package/dist/cjs/forms/fields/SceneCalendarField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneCheckboxField.js +28 -0
- package/dist/cjs/forms/fields/SceneCheckboxField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneChipsField.js +33 -0
- package/dist/cjs/forms/fields/SceneChipsField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneColorPickerField.js +30 -0
- package/dist/cjs/forms/fields/SceneColorPickerField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneDropdownField.js +35 -0
- package/dist/cjs/forms/fields/SceneDropdownField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneInputTextField.js +45 -0
- package/dist/cjs/forms/fields/SceneInputTextField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneMultiSelectField.js +40 -0
- package/dist/cjs/forms/fields/SceneMultiSelectField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneNumberField.js +32 -0
- package/dist/cjs/forms/fields/SceneNumberField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneRadioButtonField.js +35 -0
- package/dist/cjs/forms/fields/SceneRadioButtonField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneRadioGroupField.js +36 -0
- package/dist/cjs/forms/fields/SceneRadioGroupField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneSliderField.js +31 -0
- package/dist/cjs/forms/fields/SceneSliderField.js.map +1 -0
- package/dist/cjs/forms/fields/SceneTextAreaField.js +31 -0
- package/dist/cjs/forms/fields/SceneTextAreaField.js.map +1 -0
- package/dist/cjs/forms/fields/resolveFieldBinding.js +27 -0
- package/dist/cjs/forms/fields/resolveFieldBinding.js.map +1 -0
- package/dist/cjs/index.js +123 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/pages/SceneDataPage.js +45 -0
- package/dist/cjs/pages/SceneDataPage.js.map +1 -0
- package/dist/cjs/pages/SceneFormElement.js +26 -0
- package/dist/cjs/pages/SceneFormElement.js.map +1 -0
- package/dist/cjs/pages/ScenePage.js +28 -0
- package/dist/cjs/pages/ScenePage.js.map +1 -0
- package/dist/cjs/properties.js +104 -0
- package/dist/cjs/properties.js.map +1 -0
- package/dist/cjs/toolbar/SceneToolbar.js +27 -0
- package/dist/cjs/toolbar/SceneToolbar.js.map +1 -0
- package/dist/cjs/toolbar/SceneToolbarButton.js +32 -0
- package/dist/cjs/toolbar/SceneToolbarButton.js.map +1 -0
- package/dist/cjs/toolbar/SceneToolbarGroup.js +27 -0
- package/dist/cjs/toolbar/SceneToolbarGroup.js.map +1 -0
- package/dist/cjs/toolbar/SceneToolbarSeparator.js +25 -0
- package/dist/cjs/toolbar/SceneToolbarSeparator.js.map +1 -0
- package/dist/esm/CratisComponents.stories.d.ts +29 -0
- package/dist/esm/CratisComponents.stories.d.ts.map +1 -0
- package/dist/esm/CratisComponents.stories.js +187 -0
- package/dist/esm/CratisComponents.stories.js.map +1 -0
- package/dist/esm/bindings/ArcRuntimeBoundary.d.ts +6 -0
- package/dist/esm/bindings/ArcRuntimeBoundary.d.ts.map +1 -0
- package/dist/esm/bindings/ArcRuntimeBoundary.js +35 -0
- package/dist/esm/bindings/ArcRuntimeBoundary.js.map +1 -0
- package/dist/esm/bindings/BindingKind.d.ts +5 -0
- package/dist/esm/bindings/BindingKind.d.ts.map +1 -0
- package/dist/esm/bindings/BindingKind.js +17 -0
- package/dist/esm/bindings/BindingKind.js.map +1 -0
- package/dist/esm/bindings/BoundConstructor.d.ts +2 -0
- package/dist/esm/bindings/BoundConstructor.d.ts.map +1 -0
- package/dist/esm/bindings/BoundConstructor.js +2 -0
- package/dist/esm/bindings/BoundConstructor.js.map +1 -0
- package/dist/esm/bindings/ElementBinding.d.ts +6 -0
- package/dist/esm/bindings/ElementBinding.d.ts.map +1 -0
- package/dist/esm/bindings/ElementBinding.js +2 -0
- package/dist/esm/bindings/ElementBinding.js.map +1 -0
- package/dist/esm/bindings/MissingBinding.d.ts +9 -0
- package/dist/esm/bindings/MissingBinding.d.ts.map +1 -0
- package/dist/esm/bindings/MissingBinding.js +22 -0
- package/dist/esm/bindings/MissingBinding.js.map +1 -0
- package/dist/esm/bindings/Placeholder.d.ts +7 -0
- package/dist/esm/bindings/Placeholder.d.ts.map +1 -0
- package/dist/esm/bindings/Placeholder.js +36 -0
- package/dist/esm/bindings/Placeholder.js.map +1 -0
- package/dist/esm/bindings/bindingRegistry.d.ts +11 -0
- package/dist/esm/bindings/bindingRegistry.d.ts.map +1 -0
- package/dist/esm/bindings/bindingRegistry.js +91 -0
- package/dist/esm/bindings/bindingRegistry.js.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_command_is_registered.d.ts +2 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_command_is_registered.d.ts.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_command_is_registered.js +25 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_command_is_registered.js.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_not_registered.d.ts +2 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_not_registered.d.ts.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_not_registered.js +12 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_not_registered.js.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_registered.d.ts +2 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_registered.d.ts.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_registered.js +23 -0
- package/dist/esm/bindings/for_bindingRegistry/when_a_query_is_registered.js.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_bindings_are_cleared.d.ts +2 -0
- package/dist/esm/bindings/for_bindingRegistry/when_bindings_are_cleared.d.ts.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_bindings_are_cleared.js +18 -0
- package/dist/esm/bindings/for_bindingRegistry/when_bindings_are_cleared.js.map +1 -0
- package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_command_binding.d.ts +2 -0
- package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_command_binding.d.ts.map +1 -0
- package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_command_binding.js +25 -0
- package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_command_binding.js.map +1 -0
- package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_query_binding.d.ts +2 -0
- package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_query_binding.d.ts.map +1 -0
- package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_query_binding.js +33 -0
- package/dist/esm/bindings/for_resolveElementBinding/when_resolving_a_query_binding.js.map +1 -0
- package/dist/esm/bindings/index.d.ts +9 -0
- package/dist/esm/bindings/index.d.ts.map +1 -0
- package/dist/esm/bindings/index.js +9 -0
- package/dist/esm/bindings/index.js.map +1 -0
- package/dist/esm/bindings/resolveElementBinding.d.ts +5 -0
- package/dist/esm/bindings/resolveElementBinding.d.ts.map +1 -0
- package/dist/esm/bindings/resolveElementBinding.js +32 -0
- package/dist/esm/bindings/resolveElementBinding.js.map +1 -0
- package/dist/esm/common/SceneDropdown.d.ts +3 -0
- package/dist/esm/common/SceneDropdown.d.ts.map +1 -0
- package/dist/esm/common/SceneDropdown.js +28 -0
- package/dist/esm/common/SceneDropdown.js.map +1 -0
- package/dist/esm/common/SceneErrorBoundary.d.ts +3 -0
- package/dist/esm/common/SceneErrorBoundary.d.ts.map +1 -0
- package/dist/esm/common/SceneErrorBoundary.js +18 -0
- package/dist/esm/common/SceneErrorBoundary.js.map +1 -0
- package/dist/esm/common/SceneIcon.d.ts +3 -0
- package/dist/esm/common/SceneIcon.d.ts.map +1 -0
- package/dist/esm/common/SceneIcon.js +20 -0
- package/dist/esm/common/SceneIcon.js.map +1 -0
- package/dist/esm/common/SceneTooltip.d.ts +3 -0
- package/dist/esm/common/SceneTooltip.d.ts.map +1 -0
- package/dist/esm/common/SceneTooltip.js +27 -0
- package/dist/esm/common/SceneTooltip.js.map +1 -0
- package/dist/esm/common/index.d.ts +5 -0
- package/dist/esm/common/index.d.ts.map +1 -0
- package/dist/esm/common/index.js +5 -0
- package/dist/esm/common/index.js.map +1 -0
- package/dist/esm/cratisComponents.d.ts +4 -0
- package/dist/esm/cratisComponents.d.ts.map +1 -0
- package/dist/esm/cratisComponents.js +103 -0
- package/dist/esm/cratisComponents.js.map +1 -0
- package/dist/esm/cratisComponentsPackage.d.ts +5 -0
- package/dist/esm/cratisComponentsPackage.d.ts.map +1 -0
- package/dist/esm/cratisComponentsPackage.js +102 -0
- package/dist/esm/cratisComponentsPackage.js.map +1 -0
- package/dist/esm/data/SceneDataTable.d.ts +3 -0
- package/dist/esm/data/SceneDataTable.d.ts.map +1 -0
- package/dist/esm/data/SceneDataTable.js +44 -0
- package/dist/esm/data/SceneDataTable.js.map +1 -0
- package/dist/esm/data/SceneObservableDataTable.d.ts +3 -0
- package/dist/esm/data/SceneObservableDataTable.d.ts.map +1 -0
- package/dist/esm/data/SceneObservableDataTable.js +42 -0
- package/dist/esm/data/SceneObservableDataTable.js.map +1 -0
- package/dist/esm/data/for_SceneDataTable/when_the_query_binding_is_missing.d.ts +2 -0
- package/dist/esm/data/for_SceneDataTable/when_the_query_binding_is_missing.d.ts.map +1 -0
- package/dist/esm/data/for_SceneDataTable/when_the_query_binding_is_missing.js +36 -0
- package/dist/esm/data/for_SceneDataTable/when_the_query_binding_is_missing.js.map +1 -0
- package/dist/esm/data/index.d.ts +3 -0
- package/dist/esm/data/index.d.ts.map +1 -0
- package/dist/esm/data/index.js +3 -0
- package/dist/esm/data/index.js.map +1 -0
- package/dist/esm/dialogs/SceneBusyIndicatorDialog.d.ts +3 -0
- package/dist/esm/dialogs/SceneBusyIndicatorDialog.d.ts.map +1 -0
- package/dist/esm/dialogs/SceneBusyIndicatorDialog.js +28 -0
- package/dist/esm/dialogs/SceneBusyIndicatorDialog.js.map +1 -0
- package/dist/esm/dialogs/SceneCommandDialog.d.ts +3 -0
- package/dist/esm/dialogs/SceneCommandDialog.d.ts.map +1 -0
- package/dist/esm/dialogs/SceneCommandDialog.js +45 -0
- package/dist/esm/dialogs/SceneCommandDialog.js.map +1 -0
- package/dist/esm/dialogs/SceneConfirmationDialog.d.ts +2 -0
- package/dist/esm/dialogs/SceneConfirmationDialog.d.ts.map +1 -0
- package/dist/esm/dialogs/SceneConfirmationDialog.js +23 -0
- package/dist/esm/dialogs/SceneConfirmationDialog.js.map +1 -0
- package/dist/esm/dialogs/SceneDialog.d.ts +3 -0
- package/dist/esm/dialogs/SceneDialog.d.ts.map +1 -0
- package/dist/esm/dialogs/SceneDialog.js +39 -0
- package/dist/esm/dialogs/SceneDialog.js.map +1 -0
- package/dist/esm/dialogs/SceneStepperCommandDialog.d.ts +3 -0
- package/dist/esm/dialogs/SceneStepperCommandDialog.d.ts.map +1 -0
- package/dist/esm/dialogs/SceneStepperCommandDialog.js +52 -0
- package/dist/esm/dialogs/SceneStepperCommandDialog.js.map +1 -0
- package/dist/esm/dialogs/index.d.ts +6 -0
- package/dist/esm/dialogs/index.d.ts.map +1 -0
- package/dist/esm/dialogs/index.js +6 -0
- package/dist/esm/dialogs/index.js.map +1 -0
- package/dist/esm/editors/SceneFilterPanel.d.ts +3 -0
- package/dist/esm/editors/SceneFilterPanel.d.ts.map +1 -0
- package/dist/esm/editors/SceneFilterPanel.js +55 -0
- package/dist/esm/editors/SceneFilterPanel.js.map +1 -0
- package/dist/esm/editors/SceneObjectContentEditor.d.ts +3 -0
- package/dist/esm/editors/SceneObjectContentEditor.d.ts.map +1 -0
- package/dist/esm/editors/SceneObjectContentEditor.js +35 -0
- package/dist/esm/editors/SceneObjectContentEditor.js.map +1 -0
- package/dist/esm/editors/SceneObjectNavigationalBar.d.ts +3 -0
- package/dist/esm/editors/SceneObjectNavigationalBar.d.ts.map +1 -0
- package/dist/esm/editors/SceneObjectNavigationalBar.js +32 -0
- package/dist/esm/editors/SceneObjectNavigationalBar.js.map +1 -0
- package/dist/esm/editors/SceneSchemaEditor.d.ts +3 -0
- package/dist/esm/editors/SceneSchemaEditor.d.ts.map +1 -0
- package/dist/esm/editors/SceneSchemaEditor.js +31 -0
- package/dist/esm/editors/SceneSchemaEditor.js.map +1 -0
- package/dist/esm/editors/SceneTimeMachine.d.ts +3 -0
- package/dist/esm/editors/SceneTimeMachine.d.ts.map +1 -0
- package/dist/esm/editors/SceneTimeMachine.js +30 -0
- package/dist/esm/editors/SceneTimeMachine.js.map +1 -0
- package/dist/esm/editors/filterDefinitions.d.ts +3 -0
- package/dist/esm/editors/filterDefinitions.d.ts.map +1 -0
- package/dist/esm/editors/filterDefinitions.js +57 -0
- package/dist/esm/editors/filterDefinitions.js.map +1 -0
- package/dist/esm/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.d.ts +2 -0
- package/dist/esm/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.d.ts.map +1 -0
- package/dist/esm/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.js +15 -0
- package/dist/esm/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.js.map +1 -0
- package/dist/esm/editors/for_filterDefinitions/when_reading_filter_definitions.d.ts +2 -0
- package/dist/esm/editors/for_filterDefinitions/when_reading_filter_definitions.d.ts.map +1 -0
- package/dist/esm/editors/for_filterDefinitions/when_reading_filter_definitions.js +39 -0
- package/dist/esm/editors/for_filterDefinitions/when_reading_filter_definitions.js.map +1 -0
- package/dist/esm/editors/for_timeMachineVersions/when_reading_versions.d.ts +2 -0
- package/dist/esm/editors/for_timeMachineVersions/when_reading_versions.d.ts.map +1 -0
- package/dist/esm/editors/for_timeMachineVersions/when_reading_versions.js +32 -0
- package/dist/esm/editors/for_timeMachineVersions/when_reading_versions.js.map +1 -0
- package/dist/esm/editors/index.d.ts +9 -0
- package/dist/esm/editors/index.d.ts.map +1 -0
- package/dist/esm/editors/index.js +9 -0
- package/dist/esm/editors/index.js.map +1 -0
- package/dist/esm/editors/timeMachineVersions.d.ts +3 -0
- package/dist/esm/editors/timeMachineVersions.d.ts.map +1 -0
- package/dist/esm/editors/timeMachineVersions.js +42 -0
- package/dist/esm/editors/timeMachineVersions.js.map +1 -0
- package/dist/esm/editors/useEditableCopy.d.ts +2 -0
- package/dist/esm/editors/useEditableCopy.d.ts.map +1 -0
- package/dist/esm/editors/useEditableCopy.js +37 -0
- package/dist/esm/editors/useEditableCopy.js.map +1 -0
- package/dist/esm/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.d.ts +2 -0
- package/dist/esm/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.d.ts.map +1 -0
- package/dist/esm/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.js +25 -0
- package/dist/esm/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.js.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.d.ts +2 -0
- package/dist/esm/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.d.ts.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.js +34 -0
- package/dist/esm/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.js.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_resolving_its_dependencies.d.ts +2 -0
- package/dist/esm/for_cratisComponentsPackage/when_resolving_its_dependencies.d.ts.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_resolving_its_dependencies.js +49 -0
- package/dist/esm/for_cratisComponentsPackage/when_resolving_its_dependencies.js.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_validating_the_bundle.d.ts +2 -0
- package/dist/esm/for_cratisComponentsPackage/when_validating_the_bundle.d.ts.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_validating_the_bundle.js +27 -0
- package/dist/esm/for_cratisComponentsPackage/when_validating_the_bundle.js.map +1 -0
- package/dist/esm/for_properties/when_a_property_has_the_wrong_type.d.ts +2 -0
- package/dist/esm/for_properties/when_a_property_has_the_wrong_type.d.ts.map +1 -0
- package/dist/esm/for_properties/when_a_property_has_the_wrong_type.js +24 -0
- package/dist/esm/for_properties/when_a_property_has_the_wrong_type.js.map +1 -0
- package/dist/esm/for_properties/when_a_property_is_missing.d.ts +2 -0
- package/dist/esm/for_properties/when_a_property_is_missing.d.ts.map +1 -0
- package/dist/esm/for_properties/when_a_property_is_missing.js +13 -0
- package/dist/esm/for_properties/when_a_property_is_missing.js.map +1 -0
- package/dist/esm/for_properties/when_a_property_is_present.d.ts +2 -0
- package/dist/esm/for_properties/when_a_property_is_present.d.ts.map +1 -0
- package/dist/esm/for_properties/when_a_property_is_present.js +21 -0
- package/dist/esm/for_properties/when_a_property_is_present.js.map +1 -0
- package/dist/esm/forms/SceneCommandForm.d.ts +3 -0
- package/dist/esm/forms/SceneCommandForm.d.ts.map +1 -0
- package/dist/esm/forms/SceneCommandForm.js +44 -0
- package/dist/esm/forms/SceneCommandForm.js.map +1 -0
- package/dist/esm/forms/fields/CommandFormField.d.ts +9 -0
- package/dist/esm/forms/fields/CommandFormField.d.ts.map +1 -0
- package/dist/esm/forms/fields/CommandFormField.js +29 -0
- package/dist/esm/forms/fields/CommandFormField.js.map +1 -0
- package/dist/esm/forms/fields/FieldBinding.d.ts +6 -0
- package/dist/esm/forms/fields/FieldBinding.d.ts.map +1 -0
- package/dist/esm/forms/fields/FieldBinding.js +2 -0
- package/dist/esm/forms/fields/FieldBinding.js.map +1 -0
- package/dist/esm/forms/fields/SceneCalendarField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneCalendarField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneCalendarField.js +39 -0
- package/dist/esm/forms/fields/SceneCalendarField.js.map +1 -0
- package/dist/esm/forms/fields/SceneCheckboxField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneCheckboxField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneCheckboxField.js +26 -0
- package/dist/esm/forms/fields/SceneCheckboxField.js.map +1 -0
- package/dist/esm/forms/fields/SceneChipsField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneChipsField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneChipsField.js +31 -0
- package/dist/esm/forms/fields/SceneChipsField.js.map +1 -0
- package/dist/esm/forms/fields/SceneColorPickerField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneColorPickerField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneColorPickerField.js +28 -0
- package/dist/esm/forms/fields/SceneColorPickerField.js.map +1 -0
- package/dist/esm/forms/fields/SceneDropdownField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneDropdownField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneDropdownField.js +33 -0
- package/dist/esm/forms/fields/SceneDropdownField.js.map +1 -0
- package/dist/esm/forms/fields/SceneInputTextField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneInputTextField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneInputTextField.js +43 -0
- package/dist/esm/forms/fields/SceneInputTextField.js.map +1 -0
- package/dist/esm/forms/fields/SceneMultiSelectField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneMultiSelectField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneMultiSelectField.js +38 -0
- package/dist/esm/forms/fields/SceneMultiSelectField.js.map +1 -0
- package/dist/esm/forms/fields/SceneNumberField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneNumberField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneNumberField.js +30 -0
- package/dist/esm/forms/fields/SceneNumberField.js.map +1 -0
- package/dist/esm/forms/fields/SceneRadioButtonField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneRadioButtonField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneRadioButtonField.js +33 -0
- package/dist/esm/forms/fields/SceneRadioButtonField.js.map +1 -0
- package/dist/esm/forms/fields/SceneRadioGroupField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneRadioGroupField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneRadioGroupField.js +34 -0
- package/dist/esm/forms/fields/SceneRadioGroupField.js.map +1 -0
- package/dist/esm/forms/fields/SceneSliderField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneSliderField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneSliderField.js +29 -0
- package/dist/esm/forms/fields/SceneSliderField.js.map +1 -0
- package/dist/esm/forms/fields/SceneTextAreaField.d.ts +3 -0
- package/dist/esm/forms/fields/SceneTextAreaField.d.ts.map +1 -0
- package/dist/esm/forms/fields/SceneTextAreaField.js +29 -0
- package/dist/esm/forms/fields/SceneTextAreaField.js.map +1 -0
- package/dist/esm/forms/fields/for_CommandFormField/when_the_field_names_no_property.d.ts +2 -0
- package/dist/esm/forms/fields/for_CommandFormField/when_the_field_names_no_property.d.ts.map +1 -0
- package/dist/esm/forms/fields/for_CommandFormField/when_the_field_names_no_property.js +12 -0
- package/dist/esm/forms/fields/for_CommandFormField/when_the_field_names_no_property.js.map +1 -0
- package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.d.ts +2 -0
- package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.d.ts.map +1 -0
- package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.js +24 -0
- package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.js.map +1 -0
- package/dist/esm/forms/fields/index.d.ts +16 -0
- package/dist/esm/forms/fields/index.d.ts.map +1 -0
- package/dist/esm/forms/fields/index.js +16 -0
- package/dist/esm/forms/fields/index.js.map +1 -0
- package/dist/esm/forms/fields/resolveFieldBinding.d.ts +4 -0
- package/dist/esm/forms/fields/resolveFieldBinding.d.ts.map +1 -0
- package/dist/esm/forms/fields/resolveFieldBinding.js +25 -0
- package/dist/esm/forms/fields/resolveFieldBinding.js.map +1 -0
- package/dist/esm/forms/index.d.ts +3 -0
- package/dist/esm/forms/index.d.ts.map +1 -0
- package/dist/esm/forms/index.js +3 -0
- package/dist/esm/forms/index.js.map +1 -0
- package/dist/esm/given.d.ts +3 -0
- package/dist/esm/given.d.ts.map +1 -0
- package/dist/esm/given.js +21 -0
- package/dist/esm/given.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +51 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/pages/SceneDataPage.d.ts +3 -0
- package/dist/esm/pages/SceneDataPage.d.ts.map +1 -0
- package/dist/esm/pages/SceneDataPage.js +43 -0
- package/dist/esm/pages/SceneDataPage.js.map +1 -0
- package/dist/esm/pages/SceneFormElement.d.ts +3 -0
- package/dist/esm/pages/SceneFormElement.d.ts.map +1 -0
- package/dist/esm/pages/SceneFormElement.js +24 -0
- package/dist/esm/pages/SceneFormElement.js.map +1 -0
- package/dist/esm/pages/ScenePage.d.ts +3 -0
- package/dist/esm/pages/ScenePage.d.ts.map +1 -0
- package/dist/esm/pages/ScenePage.js +26 -0
- package/dist/esm/pages/ScenePage.js.map +1 -0
- package/dist/esm/pages/for_ScenePage/when_rendering_a_page.d.ts +2 -0
- package/dist/esm/pages/for_ScenePage/when_rendering_a_page.d.ts.map +1 -0
- package/dist/esm/pages/for_ScenePage/when_rendering_a_page.js +31 -0
- package/dist/esm/pages/for_ScenePage/when_rendering_a_page.js.map +1 -0
- package/dist/esm/pages/index.d.ts +4 -0
- package/dist/esm/pages/index.d.ts.map +1 -0
- package/dist/esm/pages/index.js +4 -0
- package/dist/esm/pages/index.js.map +1 -0
- package/dist/esm/properties.d.ts +9 -0
- package/dist/esm/properties.d.ts.map +1 -0
- package/dist/esm/properties.js +95 -0
- package/dist/esm/properties.js.map +1 -0
- package/dist/esm/toolbar/SceneToolbar.d.ts +3 -0
- package/dist/esm/toolbar/SceneToolbar.d.ts.map +1 -0
- package/dist/esm/toolbar/SceneToolbar.js +25 -0
- package/dist/esm/toolbar/SceneToolbar.js.map +1 -0
- package/dist/esm/toolbar/SceneToolbarButton.d.ts +3 -0
- package/dist/esm/toolbar/SceneToolbarButton.d.ts.map +1 -0
- package/dist/esm/toolbar/SceneToolbarButton.js +30 -0
- package/dist/esm/toolbar/SceneToolbarButton.js.map +1 -0
- package/dist/esm/toolbar/SceneToolbarGroup.d.ts +3 -0
- package/dist/esm/toolbar/SceneToolbarGroup.d.ts.map +1 -0
- package/dist/esm/toolbar/SceneToolbarGroup.js +25 -0
- package/dist/esm/toolbar/SceneToolbarGroup.js.map +1 -0
- package/dist/esm/toolbar/SceneToolbarSeparator.d.ts +3 -0
- package/dist/esm/toolbar/SceneToolbarSeparator.d.ts.map +1 -0
- package/dist/esm/toolbar/SceneToolbarSeparator.js +23 -0
- package/dist/esm/toolbar/SceneToolbarSeparator.js.map +1 -0
- package/dist/esm/toolbar/index.d.ts +5 -0
- package/dist/esm/toolbar/index.d.ts.map +1 -0
- package/dist/esm/toolbar/index.js +5 -0
- package/dist/esm/toolbar/index.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/editors/SceneFilterPanel.tsx +52 -0
- package/editors/SceneObjectContentEditor.tsx +36 -0
- package/editors/SceneObjectNavigationalBar.tsx +34 -0
- package/editors/SceneSchemaEditor.tsx +34 -0
- package/editors/SceneTimeMachine.tsx +32 -0
- package/editors/filterDefinitions.ts +59 -0
- package/editors/for_SceneObjectNavigationalBar/when_navigating_back_up_the_trail.tsx +18 -0
- package/editors/for_filterDefinitions/when_reading_filter_definitions.ts +49 -0
- package/editors/for_timeMachineVersions/when_reading_versions.ts +39 -0
- package/editors/index.ts +11 -0
- package/editors/timeMachineVersions.ts +44 -0
- package/editors/useEditableCopy.ts +32 -0
- package/for_cratisComponents/when_rendering_a_screen_through_the_real_renderer.tsx +37 -0
- package/for_cratisComponentsPackage/when_a_profile_ranks_it_above_the_packages_it_layers_on.ts +49 -0
- package/for_cratisComponentsPackage/when_resolving_its_dependencies.ts +68 -0
- package/for_cratisComponentsPackage/when_validating_the_bundle.ts +39 -0
- package/for_properties/when_a_property_has_the_wrong_type.ts +41 -0
- package/for_properties/when_a_property_is_missing.ts +26 -0
- package/for_properties/when_a_property_is_present.ts +36 -0
- package/forms/SceneCommandForm.tsx +45 -0
- package/forms/fields/CommandFormField.tsx +32 -0
- package/forms/fields/FieldBinding.ts +26 -0
- package/forms/fields/SceneCalendarField.tsx +41 -0
- package/forms/fields/SceneCheckboxField.tsx +29 -0
- package/forms/fields/SceneChipsField.tsx +34 -0
- package/forms/fields/SceneColorPickerField.tsx +31 -0
- package/forms/fields/SceneDropdownField.tsx +36 -0
- package/forms/fields/SceneInputTextField.tsx +37 -0
- package/forms/fields/SceneMultiSelectField.tsx +40 -0
- package/forms/fields/SceneNumberField.tsx +33 -0
- package/forms/fields/SceneRadioButtonField.tsx +37 -0
- package/forms/fields/SceneRadioGroupField.tsx +36 -0
- package/forms/fields/SceneSliderField.tsx +32 -0
- package/forms/fields/SceneTextAreaField.tsx +32 -0
- package/forms/fields/for_CommandFormField/when_the_field_names_no_property.tsx +16 -0
- package/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.ts +34 -0
- package/forms/fields/index.ts +18 -0
- package/forms/fields/resolveFieldBinding.ts +27 -0
- package/forms/index.ts +5 -0
- package/given.ts +33 -0
- package/index.ts +14 -0
- package/package.json +68 -0
- package/pages/SceneDataPage.tsx +40 -0
- package/pages/SceneFormElement.tsx +21 -0
- package/pages/ScenePage.tsx +30 -0
- package/pages/for_ScenePage/when_rendering_a_page.tsx +39 -0
- package/pages/index.ts +6 -0
- package/properties.ts +112 -0
- package/storybook-static/assets/CommandDialog-B78_eDOU.css +1 -0
- package/storybook-static/assets/CratisComponents-qPooLvTv.css +1 -0
- package/storybook-static/assets/DataPage-CroWzXsC.css +1 -0
- package/storybook-static/assets/iframe-DQhZBFM5.css +1 -0
- package/theme/sceneTokenBridge.css +72 -0
- package/toolbar/SceneToolbar.tsx +28 -0
- package/toolbar/SceneToolbarButton.tsx +31 -0
- package/toolbar/SceneToolbarGroup.tsx +28 -0
- package/toolbar/SceneToolbarSeparator.tsx +21 -0
- package/toolbar/index.ts +7 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { expect } from 'chai';
|
|
5
|
+
import { render, screen } from '@testing-library/react';
|
|
6
|
+
import { externalComponent } from '../../../given';
|
|
7
|
+
import { SceneInputTextField } from '../SceneInputTextField';
|
|
8
|
+
|
|
9
|
+
describe('when the field names no property', () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
render(<SceneInputTextField element={externalComponent('Cratis.Components:inputTextField', { title: 'Customer' })} slots={{}} />);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('should render a placeholder rather than a field bound to nothing', () =>
|
|
15
|
+
expect(screen.getByText("Missing 'property' on Cratis.Components:inputTextField")).to.exist);
|
|
16
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { externalComponent } from '../../../given';
|
|
5
|
+
import { resolveFieldBinding } from '../resolveFieldBinding';
|
|
6
|
+
|
|
7
|
+
describe('when resolving a field binding', () => {
|
|
8
|
+
describe('and the element names a property with a title and description', () => {
|
|
9
|
+
const binding = resolveFieldBinding(
|
|
10
|
+
externalComponent('Cratis.Components:inputTextField', {
|
|
11
|
+
property: 'customerName',
|
|
12
|
+
title: 'Customer',
|
|
13
|
+
description: 'Who the invoice is for',
|
|
14
|
+
})
|
|
15
|
+
)!;
|
|
16
|
+
|
|
17
|
+
it('should read the named property off the command instance', () => binding.value({ customerName: 'Acme' })!.should.equal('Acme'));
|
|
18
|
+
it('should use the declared title', () => binding.title.should.equal('Customer'));
|
|
19
|
+
it('should carry the description', () => binding.description!.should.equal('Who the invoice is for'));
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('and the element names only a property', () => {
|
|
23
|
+
const binding = resolveFieldBinding(externalComponent('Cratis.Components:inputTextField', { property: 'customerName' }))!;
|
|
24
|
+
|
|
25
|
+
it('should fall back to the property name as the title', () => binding.title.should.equal('customerName'));
|
|
26
|
+
it('should carry no description', () => (binding.description === undefined).should.be.true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('and the element names no property', () => {
|
|
30
|
+
const binding = resolveFieldBinding(externalComponent('Cratis.Components:inputTextField', { title: 'Customer' }));
|
|
31
|
+
|
|
32
|
+
it('should resolve to nothing rather than an accessor that reads nothing', () => (binding === undefined).should.be.true);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
export * from './FieldBinding';
|
|
5
|
+
export * from './resolveFieldBinding';
|
|
6
|
+
export * from './CommandFormField';
|
|
7
|
+
export * from './SceneInputTextField';
|
|
8
|
+
export * from './SceneNumberField';
|
|
9
|
+
export * from './SceneCheckboxField';
|
|
10
|
+
export * from './SceneTextAreaField';
|
|
11
|
+
export * from './SceneDropdownField';
|
|
12
|
+
export * from './SceneSliderField';
|
|
13
|
+
export * from './SceneCalendarField';
|
|
14
|
+
export * from './SceneColorPickerField';
|
|
15
|
+
export * from './SceneMultiSelectField';
|
|
16
|
+
export * from './SceneChipsField';
|
|
17
|
+
export * from './SceneRadioButtonField';
|
|
18
|
+
export * from './SceneRadioGroupField';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { ExternalComponent } from '@cratis/scene.model';
|
|
5
|
+
import { stringProperty } from '../../properties';
|
|
6
|
+
import { FieldBinding } from './FieldBinding';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Turns an element's `property` name into the {@link FieldBinding} a `@cratis/components` field takes,
|
|
10
|
+
* or `undefined` when the screen never named a property.
|
|
11
|
+
*
|
|
12
|
+
* `undefined` rather than a default accessor, because a field bound to nothing is not a field with an
|
|
13
|
+
* empty value - it is a field that would silently never read or write anything, and the screen author
|
|
14
|
+
* needs to see that. The caller renders a placeholder instead.
|
|
15
|
+
*
|
|
16
|
+
* The label falls back to the property name, so a field is legible before anyone has written a `title`.
|
|
17
|
+
*/
|
|
18
|
+
export function resolveFieldBinding(element: ExternalComponent): FieldBinding | undefined {
|
|
19
|
+
const property = stringProperty(element.properties, 'property');
|
|
20
|
+
if (property === undefined) return undefined;
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
value: (instance: Record<string, unknown>) => instance[property],
|
|
24
|
+
title: stringProperty(element.properties, 'title') ?? property,
|
|
25
|
+
description: stringProperty(element.properties, 'description'),
|
|
26
|
+
};
|
|
27
|
+
}
|
package/forms/index.ts
ADDED
package/given.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { ExternalComponent, HorizontalAlignment, VerticalAlignment, Visibility } from '@cratis/scene.model';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Builds the {@link ExternalComponent} a renderer would hand an adapter, with every inherited layout
|
|
8
|
+
* property at its neutral value.
|
|
9
|
+
*
|
|
10
|
+
* An adapter only ever reads `componentName`, `properties` and `slots`, but the element it receives is a
|
|
11
|
+
* fully-formed `FrameworkElement`. Constructing one by hand in every spec would bury the two or three
|
|
12
|
+
* properties a scenario is actually about under twenty that are never read - so the noise lives here,
|
|
13
|
+
* once, and a spec says only what makes it different.
|
|
14
|
+
*/
|
|
15
|
+
export function externalComponent(componentName: string, properties: Record<string, unknown> = {}): ExternalComponent {
|
|
16
|
+
return {
|
|
17
|
+
id: componentName,
|
|
18
|
+
name: componentName,
|
|
19
|
+
componentName,
|
|
20
|
+
properties,
|
|
21
|
+
slots: {},
|
|
22
|
+
visibility: Visibility.Visible,
|
|
23
|
+
isEnabled: true,
|
|
24
|
+
opacity: 1,
|
|
25
|
+
size: {},
|
|
26
|
+
zIndex: 0,
|
|
27
|
+
minimumSize: {},
|
|
28
|
+
maximumSize: {},
|
|
29
|
+
margin: { left: 0, top: 0, right: 0, bottom: 0 },
|
|
30
|
+
horizontalAlignment: HorizontalAlignment.Stretch,
|
|
31
|
+
verticalAlignment: VerticalAlignment.Stretch,
|
|
32
|
+
};
|
|
33
|
+
}
|
package/index.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
export * from './properties';
|
|
5
|
+
export * from './bindings';
|
|
6
|
+
export * from './pages';
|
|
7
|
+
export * from './data';
|
|
8
|
+
export * from './forms';
|
|
9
|
+
export * from './dialogs';
|
|
10
|
+
export * from './common';
|
|
11
|
+
export * from './editors';
|
|
12
|
+
export * from './toolbar';
|
|
13
|
+
export * from './cratisComponents';
|
|
14
|
+
export * from './cratisComponentsPackage';
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cratis/scene.components",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The Cratis Components package: exposes @cratis/components' Arc-bound data, form and dialog composites as Scene components. Built on PrimeReact and Tailwind, and declares both as dependencies.",
|
|
5
|
+
"author": "Cratis",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Cratis/Scene.git"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"**/*.ts",
|
|
17
|
+
"**/*.tsx",
|
|
18
|
+
"**/*.css"
|
|
19
|
+
],
|
|
20
|
+
"main": "dist/cjs/index.js",
|
|
21
|
+
"module": "dist/esm/index.js",
|
|
22
|
+
"types": "dist/esm/index.d.ts",
|
|
23
|
+
"exports": {
|
|
24
|
+
"./package.json": "./package.json",
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/esm/index.d.ts",
|
|
27
|
+
"require": "./dist/cjs/index.js",
|
|
28
|
+
"import": "./dist/esm/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./styles": "./theme/sceneTokenBridge.css"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"prepare": "yarn g:build",
|
|
34
|
+
"clean": "yarn g:clean",
|
|
35
|
+
"build": "yarn g:build",
|
|
36
|
+
"lint": "yarn g:lint",
|
|
37
|
+
"lint:ci": "yarn g:lint:ci",
|
|
38
|
+
"test": "yarn g:test",
|
|
39
|
+
"ci": "yarn g:ci",
|
|
40
|
+
"up": "yarn g:up",
|
|
41
|
+
"dev": "storybook dev -p 6006",
|
|
42
|
+
"build-storybook": "storybook build"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@cratis/scene.engine": "0.1.0",
|
|
46
|
+
"@cratis/scene.model": "0.1.0",
|
|
47
|
+
"@cratis/scene.react": "0.1.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@cratis/components": "^2.8.1",
|
|
51
|
+
"@cratis/scene.engine": "0.1.0",
|
|
52
|
+
"@cratis/scene.model": "0.1.0",
|
|
53
|
+
"@cratis/scene.react": "0.1.0",
|
|
54
|
+
"@storybook/addon-links": "^10.4.1",
|
|
55
|
+
"@storybook/react": "^10.4.1",
|
|
56
|
+
"@storybook/react-vite": "^10.4.1",
|
|
57
|
+
"primereact": "10.9.8",
|
|
58
|
+
"react": "^19.2.6",
|
|
59
|
+
"react-dom": "^19.2.6",
|
|
60
|
+
"storybook": "^10.4.1"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"@cratis/components": ">=2.8.1 <3",
|
|
64
|
+
"primereact": "^10.9.0",
|
|
65
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
66
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { lazy } from 'react';
|
|
5
|
+
import { RegisteredComponentProps } from '@cratis/scene.react';
|
|
6
|
+
import { ArcRuntimeBoundary, BindingKind, MissingBinding, resolveElementBinding } from '../bindings';
|
|
7
|
+
import { booleanProperty, stringArrayProperty, stringProperty } from '../properties';
|
|
8
|
+
|
|
9
|
+
const DataPage = lazy(async () => ({ default: (await import('@cratis/components/DataPage')).DataPage }));
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The `Cratis.Components:dataPage` component - `DataPage` from `@cratis/components/DataPage`.
|
|
13
|
+
*
|
|
14
|
+
* The library's whole list-screen composite in one name: title bar, menubar, filterable table and
|
|
15
|
+
* optional details pane, all driven from a single query. It is the single highest-leverage thing this
|
|
16
|
+
* package exposes, because reproducing it out of `table` and `toolbar` in a screen would be pages of
|
|
17
|
+
* modeling for a worse result.
|
|
18
|
+
*
|
|
19
|
+
* The `query` property names an Arc query proxy; the columns and menu items come from the `content`
|
|
20
|
+
* slot as `DataPage.Columns` / `DataPage.MenuItems` children.
|
|
21
|
+
*/
|
|
22
|
+
export function SceneDataPage({ element, slots }: RegisteredComponentProps) {
|
|
23
|
+
const { name, target } = resolveElementBinding(element, BindingKind.Query);
|
|
24
|
+
if (!target) return <MissingBinding element={element} kind={BindingKind.Query} name={name} />;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<ArcRuntimeBoundary>
|
|
28
|
+
<DataPage
|
|
29
|
+
title={stringProperty(element.properties, 'title') ?? ''}
|
|
30
|
+
query={target}
|
|
31
|
+
emptyMessage={stringProperty(element.properties, 'emptyMessage') ?? ''}
|
|
32
|
+
dataKey={stringProperty(element.properties, 'dataKey')}
|
|
33
|
+
globalFilterFields={stringArrayProperty(element.properties, 'globalFilterFields')}
|
|
34
|
+
clientFiltering={booleanProperty(element.properties, 'clientFiltering')}
|
|
35
|
+
>
|
|
36
|
+
{slots.content}
|
|
37
|
+
</DataPage>
|
|
38
|
+
</ArcRuntimeBoundary>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { FormElement, IconDisplay } from '@cratis/components/Common';
|
|
5
|
+
import { RegisteredComponentProps } from '@cratis/scene.react';
|
|
6
|
+
import { stringProperty } from '../properties';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The `Cratis.Components:formElement` component - `FormElement` from `@cratis/components/Common`.
|
|
10
|
+
*
|
|
11
|
+
* Pairs an input with a leading icon addon so a row of unrelated inputs still lines up. The icon can be
|
|
12
|
+
* given two ways, and both are worth supporting: the `icon` property for the common case of a PrimeIcons
|
|
13
|
+
* class name, and an `icon` slot for a screen that wants a real component there. The slot wins when both
|
|
14
|
+
* are present, since a slot is the more specific statement.
|
|
15
|
+
*/
|
|
16
|
+
export function SceneFormElement({ element, slots }: RegisteredComponentProps) {
|
|
17
|
+
const icon = stringProperty(element.properties, 'icon');
|
|
18
|
+
const iconContent = slots.icon?.length ? slots.icon : icon === undefined ? undefined : <IconDisplay icon={icon} />;
|
|
19
|
+
|
|
20
|
+
return <FormElement icon={iconContent}>{slots.content}</FormElement>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { Page } from '@cratis/components/Common';
|
|
5
|
+
import { RegisteredComponentProps } from '@cratis/scene.react';
|
|
6
|
+
import { booleanProperty, stringProperty } from '../properties';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The `Cratis.Components:page` component - `Page` from `@cratis/components/Common`.
|
|
10
|
+
*
|
|
11
|
+
* The library's page primitive rather than a plain `div`, because it is what every other component in
|
|
12
|
+
* the library is laid out inside: a full-height flex column whose optional `panel` chrome is drawn from
|
|
13
|
+
* the same `--cratis-*` tokens as the tables and dialogs it contains. A screen that wraps its content in
|
|
14
|
+
* this gets that consistency for free; one that wraps it in a `div` has to reinvent it and will drift.
|
|
15
|
+
*
|
|
16
|
+
* Imported statically - `Page` is one of the library's Arc-free components, so it costs a screen nothing
|
|
17
|
+
* to use it without an Arc runtime present.
|
|
18
|
+
*/
|
|
19
|
+
export function ScenePage({ element, slots }: RegisteredComponentProps) {
|
|
20
|
+
return (
|
|
21
|
+
<Page
|
|
22
|
+
data-scene-id={element.id}
|
|
23
|
+
title={stringProperty(element.properties, 'title') ?? ''}
|
|
24
|
+
showTitle={booleanProperty(element.properties, 'showTitle')}
|
|
25
|
+
panel={booleanProperty(element.properties, 'panel')}
|
|
26
|
+
>
|
|
27
|
+
{slots.content}
|
|
28
|
+
</Page>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { expect } from 'chai';
|
|
5
|
+
import { render, screen } from '@testing-library/react';
|
|
6
|
+
import { externalComponent } from '../../given';
|
|
7
|
+
import { ScenePage } from '../ScenePage';
|
|
8
|
+
|
|
9
|
+
describe('when rendering a page', () => {
|
|
10
|
+
describe('and the screen asks for the title to be shown', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
const element = externalComponent('Cratis.Components:page', { title: 'Invoices', showTitle: true });
|
|
13
|
+
render(<ScenePage element={element} slots={{ content: [<span key='body'>Body</span>] }} />);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should render the title as the heading', () => expect(screen.getByRole('heading', { name: 'Invoices' })).to.exist);
|
|
17
|
+
it('should render the content slot', () => expect(screen.getByText('Body')).to.exist);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe('and the screen leaves the title hidden', () => {
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
const element = externalComponent('Cratis.Components:page', { title: 'Invoices' });
|
|
23
|
+
render(<ScenePage element={element} slots={{ content: [<span key='body'>Body</span>] }} />);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should render no heading', () => (screen.queryByRole('heading') === null).should.be.true);
|
|
27
|
+
it('should still render the content slot', () => expect(screen.getByText('Body')).to.exist);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('and the screen sets the title to something that is not a string', () => {
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
const element = externalComponent('Cratis.Components:page', { title: 42, showTitle: true });
|
|
33
|
+
render(<ScenePage element={element} slots={{}} />);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should fall back to an empty title rather than rendering the wrong type', () =>
|
|
37
|
+
screen.getByRole('heading').textContent!.should.equal(''));
|
|
38
|
+
});
|
|
39
|
+
});
|
package/pages/index.ts
ADDED
package/properties.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Narrow readers for an {@link ExternalComponent}'s `properties` bag.
|
|
6
|
+
*
|
|
7
|
+
* The bag is `Record<string, unknown>` because it survives a round trip through JSON - a `.play` screen
|
|
8
|
+
* is authored as text, compiled by Stage, and re-read by Studio, and none of those steps carry a
|
|
9
|
+
* TypeScript type with it. An adapter therefore has to narrow every value it reads, and the tempting
|
|
10
|
+
* shortcut (`element.properties.title as string`) is a lie the compiler will happily believe: a screen
|
|
11
|
+
* that writes `title: 42` then reaches the wrapped component as a number and fails somewhere far away.
|
|
12
|
+
*
|
|
13
|
+
* These helpers all answer the same way - the value when it really is of the asked-for type, `undefined`
|
|
14
|
+
* otherwise - so an adapter reads a property and applies its own default in one expression, and a
|
|
15
|
+
* mistyped property degrades to the default instead of corrupting the render.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Reads a string property, or `undefined` when it is absent or not a string.
|
|
20
|
+
*/
|
|
21
|
+
export function stringProperty(properties: Record<string, unknown>, name: string): string | undefined {
|
|
22
|
+
const value = properties[name];
|
|
23
|
+
return typeof value === 'string' ? value : undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Reads a boolean property, or `undefined` when it is absent or not a boolean.
|
|
28
|
+
*
|
|
29
|
+
* Deliberately not truthiness: a screen that sets `showTitle: 0` means something different from one that
|
|
30
|
+
* leaves it out, and only the second should fall back to the adapter's default.
|
|
31
|
+
*/
|
|
32
|
+
export function booleanProperty(properties: Record<string, unknown>, name: string): boolean | undefined {
|
|
33
|
+
const value = properties[name];
|
|
34
|
+
return typeof value === 'boolean' ? value : undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Reads a numeric property, or `undefined` when it is absent, not a number, or `NaN`.
|
|
39
|
+
*
|
|
40
|
+
* `NaN` is excluded because it is the one number that makes every downstream comparison silently false -
|
|
41
|
+
* a slider with `min: NaN` renders without complaint and behaves as if it had no minimum at all.
|
|
42
|
+
*/
|
|
43
|
+
export function numberProperty(properties: Record<string, unknown>, name: string): number | undefined {
|
|
44
|
+
const value = properties[name];
|
|
45
|
+
return typeof value === 'number' && !Number.isNaN(value) ? value : undefined;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Reads an array property, or `undefined` when it is absent or not an array.
|
|
50
|
+
*
|
|
51
|
+
* The element type is deliberately left as `unknown` - narrowing the elements is the caller's job,
|
|
52
|
+
* through {@link stringArrayProperty} or its own mapping - so this helper never has to guess what a
|
|
53
|
+
* heterogeneous list was supposed to be.
|
|
54
|
+
*/
|
|
55
|
+
export function arrayProperty(properties: Record<string, unknown>, name: string): unknown[] | undefined {
|
|
56
|
+
const value = properties[name];
|
|
57
|
+
return Array.isArray(value) ? value : undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Reads an array property and keeps only its string elements, or `undefined` when the property is absent
|
|
62
|
+
* or not an array.
|
|
63
|
+
*
|
|
64
|
+
* Non-string elements are dropped rather than rejecting the whole list, because these lists are
|
|
65
|
+
* column names, filter fields and the like: one bad entry should cost that one entry, not the entire
|
|
66
|
+
* table's filtering.
|
|
67
|
+
*/
|
|
68
|
+
export function stringArrayProperty(properties: Record<string, unknown>, name: string): string[] | undefined {
|
|
69
|
+
return arrayProperty(properties, name)?.filter((value): value is string => typeof value === 'string');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Reads an object property as a plain record, or `undefined` when it is absent, `null`, or an array.
|
|
74
|
+
*
|
|
75
|
+
* Arrays are excluded even though `typeof [] === 'object'`, because every caller here wants a keyed
|
|
76
|
+
* object - a JSON schema, a document being edited - and an array reaching one of those would be a
|
|
77
|
+
* different bug entirely.
|
|
78
|
+
*/
|
|
79
|
+
export function objectProperty(properties: Record<string, unknown>, name: string): Record<string, unknown> | undefined {
|
|
80
|
+
const value = properties[name];
|
|
81
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Reads an array property and keeps only its plain-object elements, or `undefined` when the property is
|
|
86
|
+
* absent or not an array.
|
|
87
|
+
*
|
|
88
|
+
* This is what an authored `options` list arrives as - `[{ label: 'Draft', value: 'draft' }, ...]` - and
|
|
89
|
+
* the same forgiving rule as {@link stringArrayProperty} applies: one malformed entry costs that entry,
|
|
90
|
+
* not the whole dropdown.
|
|
91
|
+
*/
|
|
92
|
+
export function objectArrayProperty(properties: Record<string, unknown>, name: string): Record<string, unknown>[] | undefined {
|
|
93
|
+
return arrayProperty(properties, name)?.filter(
|
|
94
|
+
(value): value is Record<string, unknown> => typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Reads a string property that has to be one of a fixed set of values, or `undefined` when it is absent
|
|
100
|
+
* or outside the set.
|
|
101
|
+
*
|
|
102
|
+
* Several of the wrapped `@cratis/components` props are string literal unions (`'horizontal' | 'vertical'`,
|
|
103
|
+
* `'top' | 'right' | 'bottom' | 'left'`). This is what turns an arbitrary authored string into one of
|
|
104
|
+
* them without an assertion: an unrecognized value falls back to the component's own default rather than
|
|
105
|
+
* being forced through as a value the component never expects to see.
|
|
106
|
+
*
|
|
107
|
+
* @param allowed The permitted values, most usefully written as a `const` tuple so `T` infers as the union.
|
|
108
|
+
*/
|
|
109
|
+
export function unionProperty<T extends string>(properties: Record<string, unknown>, name: string, allowed: readonly T[]): T | undefined {
|
|
110
|
+
const value = stringProperty(properties, name);
|
|
111
|
+
return value !== undefined && (allowed as readonly string[]).includes(value) ? (value as T) : undefined;
|
|
112
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.p-stepper [data-pc-section=header][data-p-active=false]{opacity:.5}.cratis-command-stepper{display:flex;flex-direction:column;gap:.75rem;width:100%}.cratis-command-stepper .p-stepper{width:100%}.cratis-command-stepper .p-stepperpanel-content{width:100%;box-sizing:border-box}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.cratis-object-navigational-bar{border-bottom:1px solid var(--cratis-surface-border)}._navigableRow_1aeeq_4{cursor:pointer;transition:background-color .15s}._navigableRow_1aeeq_4:hover{background-color:var(--cratis-surface-hover)!important}._bottomBorder_1aeeq_13{border-bottom:1px solid var(--cratis-surface-border)}// Copyright (c) Cratis. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. .tm-properties-table{width:100%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,SF Mono,monospace;font-size:13px}.tm-properties-row{border-bottom:1px solid var(--tm-border, rgba(255, 255, 255, .1))}.tm-properties-label{padding:8px 12px;color:var(--tm-text-muted, rgba(255, 255, 255, .6));font-weight:500;width:40%}.tm-properties-label--right{text-align:right}.tm-properties-value{padding:8px 12px;color:var(--tm-text, rgba(255, 255, 255, .9))}.tm-properties-value--right{text-align:right}.tm-properties-null{color:var(--tm-text-faint, rgba(255, 255, 255, .4))}.tm-properties-boolean-true{color:#4ade80}.tm-properties-boolean-false{color:#f87171}.tm-properties-number{color:#fbbf24}.tm-properties-date{color:#60a5fa}.tm-properties-complex{color:var(--tm-text-dim, rgba(255, 255, 255, .7))}.events-view-container{position:absolute;inset:0;padding:5rem 2rem 2rem;overflow-y:auto;background:transparent;z-index:1}.events-view-timeline{max-width:1200px;margin:0 auto;padding:2.5rem 0 3rem}.events-view-timeline .p-timeline{display:flex;flex-direction:column}.events-view-scroll-button{position:relative;margin-right:.5rem;width:44px;height:44px;border-radius:50%;border:1px solid var(--tm-border-subtle);background:var(--tm-dark-surface);color:var(--tm-text);display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 6px 18px #0000004d;transition:transform .2s ease,box-shadow .2s ease;z-index:5;pointer-events:auto}.events-view-scroll-button:hover{transform:translateY(-2px);box-shadow:0 10px 24px #0006}.events-view-scroll-button:active{transform:translateY(0)}.events-view-scroll-button--top{top:auto}.events-view-scroll-button--bottom{bottom:auto}.events-view-scroll-button-wrapper{position:sticky;display:flex;justify-content:flex-end;padding-right:.5rem;pointer-events:none;z-index:5;height:0;overflow:visible}.events-view-scroll-button-wrapper--top{top:4.5rem}.events-view-scroll-button-wrapper--bottom{bottom:2.5rem}.events-view-event-card{background:var(--tm-surface);border:1px solid var(--tm-border);border-radius:12px;padding:1.5rem;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:all .3s ease;max-width:380px}.events-view-event-card:hover{background:var(--tm-surface-hover);border-color:var(--tm-accent-border);transform:translateY(-2px);box-shadow:0 8px 24px #0000004d}.events-view-event-header{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--tm-border)}.events-view-event-name{font-size:1.25rem;font-weight:600;color:var(--tm-text);margin:0 0 .5rem;font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,Segoe UI,Roboto,sans-serif}.events-view-event-timestamp{font-size:.875rem;color:var(--tm-text-muted);font-family:-apple-system,BlinkMacSystemFont,SF Mono,monospace}.events-view-event-header--right,.events-view-event-name--right,.events-view-event-timestamp--right{text-align:right}.events-view-event-properties{margin-top:1rem}.events-view-marker{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;background:linear-gradient(135deg,var(--tm-accent-bg),rgba(100,150,255,.1));border:2px solid var(--tm-accent-border);border-radius:50%;position:relative;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);transition:all .3s ease}.events-view-marker:hover{background:linear-gradient(135deg,var(--tm-accent-bg-hover),var(--tm-accent-bg));border-color:var(--tm-accent-border-hover);transform:scale(1.1)}.events-view-marker-dot{width:.75rem;height:.75rem;background:var(--tm-accent);border-radius:50%;box-shadow:0 0 10px var(--tm-accent-glow)}.events-view-timeline .p-timeline-event-connector{background:linear-gradient(to bottom,var(--tm-accent-border),var(--tm-accent-bg))}.events-view-timeline .p-timeline-event:last-child .p-timeline-event-connector{visibility:hidden}.events-view-timeline .p-timeline-event-opposite,.events-view-timeline .p-timeline-event-content{padding:0 1.5rem;display:flex;align-items:center}.events-view-timeline .p-timeline-event:nth-child(odd) .p-timeline-event-content{justify-content:flex-start}.events-view-timeline .p-timeline-event:nth-child(2n) .p-timeline-event-content{justify-content:flex-end}.events-view-timeline .p-timeline-event:nth-child(odd) .p-timeline-event-opposite{justify-content:flex-end}.events-view-timeline .p-timeline-event:nth-child(2n) .p-timeline-event-opposite{justify-content:flex-start}.events-view-event-card--left,.events-view-event-card--right{max-width:380px}.events-view-timeline .p-timeline-event-opposite .events-view-event-card{text-align:right}.events-view-timeline .p-timeline-event-opposite .events-view-event-card table{margin-left:auto;direction:rtl}.events-view-timeline .p-timeline-event-opposite .events-view-event-card table td{direction:ltr;text-align:right}.time-machine{--tm-bg-deep: #0a0a1a;--tm-bg-deepest: #000005;--tm-text: rgba(255, 255, 255, .9);--tm-text-muted: rgba(255, 255, 255, .6);--tm-text-dim: rgba(255, 255, 255, .7);--tm-text-faint: rgba(255, 255, 255, .4);--tm-surface: rgba(255, 255, 255, .05);--tm-surface-hover: rgba(255, 255, 255, .08);--tm-surface-active: rgba(255, 255, 255, .1);--tm-border: rgba(255, 255, 255, .1);--tm-border-subtle: rgba(255, 255, 255, .15);--tm-accent: rgba(100, 150, 255, 1);--tm-accent-bg: rgba(100, 150, 255, .2);--tm-accent-bg-hover: rgba(100, 150, 255, .4);--tm-accent-border: rgba(100, 150, 255, .3);--tm-accent-border-hover: rgba(100, 150, 255, .8);--tm-accent-glow: rgba(100, 150, 255, .3);--tm-dark-surface: rgba(15, 23, 42, .75);position:relative;width:100%;height:100vh;overflow:hidden;background:radial-gradient(ellipse at center,var(--tm-bg-deep) 0%,var(--tm-bg-deepest) 100%);font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,Segoe UI,Roboto,sans-serif}.view-switcher{position:absolute;top:20px;left:50%;transform:translate(-50%);display:flex;gap:8px;background:var(--tm-surface);padding:6px;border-radius:12px;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid var(--tm-border);z-index:100}.view-button{width:48px;height:48px;border:none;border-radius:8px;background:transparent;color:var(--tm-text-muted);font-size:20px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.view-button:hover{background:var(--tm-surface-active);color:var(--tm-text)}.view-button.active{background:var(--tm-accent-bg);color:var(--tm-accent);box-shadow:0 0 15px var(--tm-accent-glow)}.view-button i{font-size:20px}.time-machine-background{position:absolute;inset:0;overflow:hidden;z-index:0;perspective:500px;perspective-origin:50% 50%}.stars{position:absolute;top:50%;left:50%;width:2px;height:2px;background:transparent;transform-style:preserve-3d;animation:starfield 16s linear infinite;box-shadow:24vw -15vh #ffffffe6,-32vw 28vh #fffc,45vw 35vh #ffffffb3,-18vw -40vh #ffffffe6,38vw -25vh #fffc,-42vw 15vh #ffffffb3,12vw 42vh #ffffffe6,-28vw -18vh #fffc,48vw 8vh #ffffffb3,-15vw 38vh #ffffffe6,32vw -42vh #fffc,-45vw -8vh #ffffffb3,8vw -35vh #ffffffe6,-38vw 42vh #fffc,42vw 18vh #ffffffb3,-8vw -28vh #ffffffe6,28vw 45vh #fffc,-48vw 25vh #ffffffb3,15vw -8vh #ffffffe6,-22vw 12vh #fffc}.stars-2{animation:starfield 16s linear infinite;animation-delay:-5.33s;box-shadow:-12vw 22vh #ffffffe6,35vw -32vh #fffc,-40vw -15vh #ffffffb3,22vw 40vh #ffffffe6,-25vw -35vh #fffc,40vw 12vh #ffffffb3,-35vw 32vh #ffffffe6,18vw -22vh #fffc,-10vw 45vh #ffffffb3,45vw -10vh #ffffffe6,-30vw -42vh #fffc,5vw 30vh #ffffffb3,-45vw 5vh #ffffffe6,30vw 22vh #fffc,-20vw -12vh #ffffffb3,48vw -38vh #ffffffe6,-5vw 18vh #fffc,25vw -45vh #ffffffb3,-48vw 38vh #ffffffe6,10vw -5vh #fffc}.stars-3{animation:starfield 16s linear infinite;animation-delay:-10.66s;box-shadow:18vw -28vh #ffffffe6,-28vw 35vh #fffc,42vw 25vh #ffffffb3,-15vw -45vh #ffffffe6,35vw -18vh #fffc,-42vw 8vh #ffffffb3,8vw 48vh #ffffffe6,-35vw -25vh #fffc,48vw -5vh #ffffffb3,-8vw 28vh #ffffffe6,25vw -48vh #fffc,-48vw -18vh #ffffffb3,5vw -38vh #ffffffe6,-25vw 48vh #fffc,38vw 5vh #ffffffb3,-18vw -32vh #ffffffe6,32vw 38vh #fffc,-38vw 18vh #ffffffb3,12vw -15vh #ffffffe6,-32vw 5vh #fffc}@keyframes starfield{0%{transform:translateZ(-600px);opacity:0}5%{opacity:1}90%{opacity:1}to{transform:translateZ(500px);opacity:0}}.time-machine-viewport{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;perspective:1200px;perspective-origin:center 25%;z-index:1;box-sizing:border-box}.windows-container{position:relative;width:60%;max-width:700px;height:55%;max-height:500px;transform-style:preserve-3d}.version-window{position:absolute;inset:0;background:transparent;overflow:visible;cursor:pointer;transform:translateZ(calc(var(--z-offset) * 1px)) translateY(calc(var(--depth) * -35px)) scale(var(--scale));opacity:var(--opacity);transition:transform .4s cubic-bezier(.25,.46,.45,.94),opacity .4s ease;transform-style:preserve-3d;will-change:transform,opacity;perspective:1500px}.version-window-inner{position:absolute;inset:0;border-radius:12px;transform-style:preserve-3d;transition:transform .6s cubic-bezier(.25,.46,.45,.94);box-shadow:0 0 0 1px #ffffff1a,0 20px 60px #00000080,0 0 40px #6464ff1a}.version-window.flipped .version-window-inner{transform:rotateY(180deg)}.version-window-face{position:absolute;inset:0;display:flex;flex-direction:column;border-radius:inherit;background:linear-gradient(180deg,#3a3a4a,#2a2a3a 2%,#1e1e28);backface-visibility:hidden;overflow:hidden;pointer-events:auto}.version-window-face--back{transform:rotateY(180deg);background:linear-gradient(180deg,#262638,#1b1b27)}.version-window.flipped .version-window-face--front{pointer-events:none}.version-window:not(.flipped) .version-window-face--back{pointer-events:none}.version-window.active .version-window-inner{box-shadow:0 0 0 2px #6496ff80,0 20px 60px #00000080,0 0 60px #6496ff33}.version-window:hover:not(.active) .version-window-inner{box-shadow:0 0 0 1px #fff3,0 25px 70px #0009,0 0 50px #6464ff26}.window-chrome{display:grid;grid-template-columns:auto 1fr auto;align-items:center;height:36px;padding:0 12px;background:linear-gradient(180deg,#4a4a5a,#3a3a4a);border-bottom:1px solid rgba(0,0,0,.3);gap:12px}.window-controls{display:flex;gap:8px}.control{width:12px;height:12px;border-radius:50%;background:#666}.control.close{background:#ff5f57}.control.minimize{background:#ffbd2e}.control.maximize{background:#28ca41}.window-title{text-align:center;font-size:13px;font-weight:500;color:#ffffffd9;margin:0}.window-actions{display:flex;align-items:center;justify-content:flex-end}.window-flip-button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;border:1px solid var(--tm-border-subtle);background:linear-gradient(180deg,#7882dc40,#3c468c40);color:var(--tm-text);cursor:pointer;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.window-flip-button:hover{transform:translateY(-1px);box-shadow:0 8px 18px #00000059;border-color:#78a0ff66}.window-flip-button:active{transform:translateY(0)}.window-flip-button:focus-visible{outline:2px solid rgba(120,160,255,.85);outline-offset:2px}.window-flip-button i{font-size:14px}.window-chrome--back{background:linear-gradient(180deg,#35354a,#2b2b3c)}.window-content{height:calc(100% - 36px);padding:20px;overflow:auto;background:linear-gradient(180deg,#1e1e28,#16161e);color:#e0e0e0}.window-content--events{display:flex;flex-direction:column;gap:1.5rem}.snapshot-event-list{display:flex;flex-direction:column;gap:1.25rem}.snapshot-event{background:var(--tm-surface);border:1px solid var(--tm-border);border-radius:10px;padding:1rem 1.25rem;box-shadow:0 10px 25px #0000004d}.snapshot-event-header{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem;margin-bottom:.75rem}.snapshot-event-name{font-size:1rem;font-weight:600;color:#fff}.snapshot-event-timestamp{font-size:.75rem;color:var(--tm-text-muted);font-family:-apple-system,BlinkMacSystemFont,SF Mono,monospace}.timeline{position:absolute;right:20px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;justify-content:center;z-index:10}.timeline-track{display:flex;flex-direction:column;gap:2px;padding:20px 0}.timeline-track::-webkit-scrollbar{display:none}.timeline-entry{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:4px 0;cursor:pointer;transform-origin:right center;transform:scale(var(--magnification, 1));transition:transform .15s cubic-bezier(.25,.46,.45,.94)}.timeline-tick{width:calc(20px * var(--magnification, 1));height:calc(2px * var(--magnification, 1));background:var(--tm-text-faint);border-radius:1px;transition:width .15s ease,height .15s ease,background .15s ease}.timeline-entry.selected .timeline-tick{background:#6a9fff;box-shadow:0 0 8px #6a9fff99}.timeline-entry.hovered .timeline-tick{background:var(--tm-text);box-shadow:0 0 6px var(--tm-surface-active)}.timeline-label{display:flex;flex-direction:column;align-items:flex-end;opacity:0;transform:translate(10px);transition:opacity .2s ease,transform .2s ease;pointer-events:none;white-space:nowrap}.timeline-entry.hovered .timeline-label,.timeline-entry.selected .timeline-label{opacity:1;transform:translate(0)}.timeline-date{font-size:11px;font-weight:600;color:#fff;text-shadow:0 1px 3px rgba(0,0,0,.5)}.timeline-time{font-size:10px;color:var(--tm-text-dim);text-shadow:0 1px 3px rgba(0,0,0,.5)}.navigation-controls{position:absolute;bottom:30px;left:50%;transform:translate(-50%);display:flex;gap:20px;z-index:10}.nav-button{width:60px;height:60px;border:none;border-radius:50%;background:linear-gradient(180deg,#646482cc,#3c3c5acc);color:#fff;font-size:28px;font-weight:300;cursor:pointer;display:flex;align-items:center;justify-content:center;line-height:1;padding:0;box-shadow:0 4px 20px #0006,inset 0 1px #fff3;transition:transform .2s ease,box-shadow .2s ease,opacity .2s ease;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.nav-button:hover:not(:disabled){transform:scale(1.1);box-shadow:0 6px 25px #00000080,inset 0 1px #ffffff4d,0 0 20px #6496ff4d}.nav-button:active:not(:disabled){transform:scale(.95)}.nav-button:disabled{opacity:.3;cursor:not-allowed}@media(max-width:768px){.time-machine-viewport{width:calc(100% - 120px)}.timeline{width:100px}.windows-container{width:85%;height:60%}.nav-button{width:50px;height:50px;font-size:24px}}.pv-filter-panel{position:fixed;width:min(280px,calc(100% - 2rem));max-height:calc(100vh - 6.5rem);background:linear-gradient(180deg,var(--cratis-surface-card),var(--cratis-surface-ground));border:1px solid var(--cratis-surface-border);border-radius:1rem;box-shadow:0 24px 60px #0000004d;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);overflow:hidden;z-index:12;display:flex;flex-direction:column}.pv-filter-panel.dragging{cursor:grabbing;-webkit-user-select:none;user-select:none}.pv-filter-panel.minimized{max-height:none}.pv-filter-panel-header{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:grab;background:var(--cratis-surface-section);border-bottom:1px solid var(--cratis-surface-border);flex-shrink:0}.pv-filter-panel.dragging .pv-filter-panel-header{cursor:grabbing}.pv-filter-panel-header h2{margin:0;font-size:.85rem;letter-spacing:.04em;text-transform:uppercase;color:var(--cratis-text-color);flex:1;pointer-events:none}.pv-minimize-btn,.pv-close-btn{appearance:none;border:none;border-radius:.4rem;width:1.5rem;height:1.5rem;display:flex;align-items:center;justify-content:center;background:var(--cratis-highlight-bg);color:var(--cratis-text-color);font-size:1rem;font-weight:500;cursor:pointer;transition:background .12s ease}.pv-minimize-btn:hover,.pv-close-btn:hover{background:var(--cratis-surface-hover)}.pv-close-btn{font-size:1.2rem}.pv-filter-panel-content{overflow:hidden;max-height:0;opacity:0;padding:0 1.25rem;transition:max-height .15s ease-out,opacity .1s ease-out,padding .15s ease-out}.pv-filter-panel-content.expanded{overflow-y:auto;flex:1;max-height:600px;opacity:1;padding:1rem 1.25rem 1.25rem}.pv-search{padding-bottom:1rem}.pv-search input{width:100%;padding:.65rem .85rem;border-radius:.75rem;border:1px solid var(--cratis-surface-border);background:var(--cratis-surface-ground);color:inherit;font-size:.95rem;box-shadow:inset 0 1px 0 var(--cratis-surface-border)}.pv-search input:focus{outline:none;border-color:var(--cratis-primary-color);box-shadow:var(--cratis-focus-ring)}.pv-filter-group-search{padding:0 0 .5rem}.pv-filter-group-search input{width:100%;padding:.4rem .6rem;border-radius:.5rem;border:1px solid var(--cratis-surface-border);background:var(--cratis-surface-ground);color:inherit;font-size:.85rem}.pv-filter-group-search input:focus{outline:none;border-color:var(--cratis-primary-color);box-shadow:var(--cratis-focus-ring)}.pv-filter-groups{display:flex;flex-direction:column;gap:.85rem}.pv-filter{background:var(--cratis-surface-overlay);border:1px solid var(--cratis-surface-border);border-radius:.85rem;padding:.75rem .85rem;transition:border-color .18s ease,box-shadow .18s ease}.pv-filter.expanded{border-color:var(--cratis-primary-color);box-shadow:0 15px 38px #0000004d}.pv-filter-trigger{display:flex;width:100%;align-items:center;justify-content:space-between;background:none;border:none;color:inherit;padding:0;cursor:pointer;font-size:.82rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.pv-filter-label{display:flex;align-items:center;gap:.4rem}.pv-filter-trigger-meta{display:inline-flex;align-items:center;gap:.5rem}.pv-filter-count{display:inline-flex;align-items:center;justify-content:center;min-width:1.5rem;padding:.15rem .45rem;border-radius:999px;background:var(--cratis-highlight-bg);color:var(--cratis-text-color);font-size:.7rem}.pv-filter-clear-header{appearance:none;border:none;width:1.5rem;height:1.5rem;border-radius:50%;background:var(--cratis-highlight-bg);color:var(--cratis-text-color);font-size:1.2rem;line-height:1;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .16s ease,transform .12s ease;padding:0}.pv-filter-clear-header:hover{background:var(--cratis-surface-hover);transform:scale(1.1)}.pv-filter-clear-header:active{transform:scale(.95)}.pv-filter-chevron{width:.65rem;height:.65rem;border-right:2px solid var(--cratis-text-color);border-bottom:2px solid var(--cratis-text-color);transform:rotate(45deg);transition:transform .18s ease}.pv-filter.expanded .pv-filter-chevron{transform:rotate(225deg)}.pv-filter-content{overflow:hidden;max-height:0;opacity:0;margin-top:0;padding-top:0;border-top:1px solid transparent;transition:max-height .12s ease-out,opacity 80ms ease-out,margin-top .12s ease-out,padding-top .12s ease-out,border-color .12s ease-out}.pv-filter-content.expanded{max-height:350px;opacity:1;margin-top:.75rem;padding-top:.75rem;border-top-color:var(--cratis-surface-border);overflow-y:auto}.pv-filter-content ul{list-style:none;margin:0;padding:0;display:grid;gap:.45rem}.pv-filter-content li label{display:grid;grid-template-columns:auto 1fr auto;gap:.6rem;align-items:center;padding:.45rem .5rem;border-radius:.55rem;border:1px solid transparent;cursor:pointer;transition:background .16s ease,border-color .16s ease}.pv-filter-content li label:hover{background:var(--cratis-surface-hover)}.pv-filter-content input[type=checkbox],.pv-filter-content input[type=radio]{accent-color:var(--cratis-primary-color)}.pv-filter-content li label span{font-size:.85rem}.pv-filter-clear{margin-top:.75rem;appearance:none;border:none;border-radius:.55rem;padding:.4rem .75rem;background:var(--cratis-highlight-bg);color:var(--cratis-text-color);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;cursor:pointer}.pv-option-count{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;color:var(--cratis-text-color-secondary);font-size:.75rem}.pv-filter-dropdown{position:fixed;width:min(320px,calc(100vw - 2rem));max-height:calc(100vh - 8rem);background:linear-gradient(180deg,var(--cratis-surface-card),var(--cratis-surface-ground));border:1px solid var(--cratis-surface-border);border-radius:.85rem;box-shadow:0 20px 50px #0006;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);overflow:hidden;z-index:1000;display:flex;flex-direction:column;will-change:opacity,transform;contain:layout}.pv-filter-dropdown-content{padding:1rem;overflow-y:auto;flex:1}.pv-range-histogram{padding:.5rem 0}.pv-histogram-bars{display:flex;align-items:flex-end;gap:2px;height:80px;padding:0 2px;margin-bottom:.5rem}.pv-histogram-bar{flex:1;min-width:8px;background:var(--cratis-highlight-bg);border:none;border-radius:2px 2px 0 0;cursor:pointer;transition:background .16s ease,transform .12s ease;padding:0}.pv-histogram-bar:hover{background:var(--cratis-surface-hover);transform:scaleY(1.02)}.pv-histogram-bar.in-range{background:var(--cratis-primary-color)}.pv-histogram-bar.partial{background:var(--cratis-highlight-bg)}.pv-range-slider{position:relative;height:24px;margin:.5rem 0}.pv-range-track{position:absolute;top:50%;left:0;right:0;height:4px;background:var(--cratis-surface-border);border-radius:2px;transform:translateY(-50%)}.pv-range-selection{position:absolute;top:50%;height:4px;background:var(--cratis-primary-color);border-radius:2px;transform:translateY(-50%);cursor:grab}.pv-range-selection:active{cursor:grabbing}.pv-range-handle{position:absolute;top:50%;width:16px;height:16px;background:var(--cratis-primary-color);border:2px solid var(--cratis-text-color);border-radius:50%;transform:translate(-50%,-50%);cursor:ew-resize;transition:transform .12s ease,box-shadow .12s ease;box-shadow:0 2px 8px #0000004d}.pv-range-handle:hover{transform:translate(-50%,-50%) scale(1.15);box-shadow:0 4px 12px var(--cratis-primary-color)}.pv-range-labels{display:flex;justify-content:space-between;font-size:.75rem;color:var(--cratis-text-color-secondary);font-variant-numeric:tabular-nums}.pv-range-clear{margin-top:.75rem;appearance:none;border:none;border-radius:.55rem;padding:.4rem .75rem;background:var(--cratis-highlight-bg);color:var(--cratis-text-color);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;cursor:pointer;width:100%}.pv-range-clear:hover{background:var(--cratis-surface-hover)}@media(max-width:900px){.pv-filter-panel{width:calc(100% - 2.5rem);left:1.25rem;right:1.25rem}}.toolbar{background:var(--cratis-surface-card);border:1px solid var(--cratis-surface-border);box-shadow:0 2px 8px #0000004d}.toolbar-button{color:var(--cratis-text-color-secondary);background:transparent;border:none;transition:background .15s,color .15s}.toolbar-button:hover{background:var(--cratis-surface-100);color:var(--cratis-text-color)}.toolbar-button--active,.toolbar-button--active:hover{background:var(--cratis-primary-color);color:var(--cratis-primary-color-text)}.toolbar-button--draggable{cursor:grab}.toolbar-button--draggable:active{cursor:grabbing}.toolbar-button__text{font-size:.875rem;font-weight:600;line-height:1;white-space:nowrap}.toolbar-project-name{padding:0 8px;font-size:.875rem;font-weight:500;color:var(--cratis-text-color);white-space:nowrap}.toolbar-section{position:relative;transition:width .35s cubic-bezier(.4,0,.2,1),height .35s cubic-bezier(.4,0,.2,1)}.toolbar-section--transitioning{overflow:hidden}.toolbar-context{position:absolute;top:0;left:0;transition:opacity .2s ease}.toolbar-context--active{opacity:1;pointer-events:auto}.toolbar-context--inactive{opacity:0;pointer-events:none}.toolbar-separator{background:var(--cratis-surface-border);flex-shrink:0;align-self:stretch}.toolbar-separator--in-vertical{height:1px;margin:.125rem .25rem}.toolbar-separator--in-horizontal{width:1px;margin:.25rem .125rem}.toolbar-fanout-item{position:relative}.toolbar-fanout-panel{position:absolute;top:50%;left:calc(-.5rem - 1px);transform:translateY(-50%);display:inline-flex;flex-direction:row;align-items:center;gap:.25rem;padding:.5rem;background:var(--cratis-surface-card);border:1px solid var(--cratis-surface-border);box-shadow:0 2px 8px #0000004d;border-radius:1rem;white-space:nowrap;z-index:10;pointer-events:none;opacity:0;clip-path:inset(0 100% 0 0 round 1rem);transition:clip-path .35s cubic-bezier(.4,0,.2,1),opacity .2s ease}.toolbar-fanout-panel--left{left:auto;right:calc(-.5rem - 1px);clip-path:inset(0 0 0 100% round 1rem)}.toolbar-fanout-panel--up{top:auto;right:auto;bottom:calc(100% + .5rem);left:50%;transform:translate(-50%);clip-path:inset(100% 0 0 0 round 1rem)}.toolbar-fanout-panel--down{top:calc(100% + .5rem);right:auto;left:50%;transform:translate(-50%);clip-path:inset(0 0 100% 0 round 1rem)}.toolbar-fanout-panel--visible{clip-path:inset(0 0 0 0 round 1rem);opacity:1;pointer-events:auto}.toolbar-fanout-panel--settled{clip-path:none}.toolbar-folder-item{position:relative}.toolbar-folder-panel{position:absolute;top:50%;left:calc(100% + .75rem);transform:translateY(-50%) scale(.92);transform-origin:left center;display:grid;grid-auto-rows:minmax(2.5rem,auto);gap:.25rem;padding:.5rem;background:var(--cratis-surface-card);border:1px solid var(--cratis-surface-border);box-shadow:0 2px 8px #0000004d;border-radius:1rem;z-index:10;pointer-events:none;opacity:0;clip-path:inset(0 100% 0 0 round 1rem);transition:clip-path .35s cubic-bezier(.4,0,.2,1),transform .35s cubic-bezier(.4,0,.2,1),opacity .2s ease}.toolbar-folder-panel--left{left:auto;right:calc(100% + .75rem);transform-origin:right center;clip-path:inset(0 0 0 100% round 1rem)}.toolbar-folder-panel--visible{clip-path:none;transform:translateY(-50%) scale(1);opacity:1;pointer-events:auto}.toolbar-folder-panel--list{display:flex;flex-direction:column;min-width:10rem}.toolbar-button--list{width:100%;justify-content:flex-start}.toolbar-button__label{font-size:.875rem;font-weight:500;color:inherit;white-space:nowrap}.toolbar:has(.toolbar-group){background:transparent;border:none;box-shadow:none;padding:0;gap:.5rem}.toolbar-group{background:var(--cratis-surface-card);border:1px solid var(--cratis-surface-border);box-shadow:0 2px 8px #0000004d}.toolbar-slot-section{position:relative;transition:width .35s cubic-bezier(.4,0,.2,1),height .35s cubic-bezier(.4,0,.2,1)}.toolbar-slot-section--transitioning{overflow:hidden}@keyframes toolbar-slot-fade-in{0%{opacity:0}to{opacity:1}}@keyframes toolbar-slot-fade-out{0%{opacity:1}to{opacity:0}}.toolbar-slot-incoming{position:absolute;top:0;left:0;animation:toolbar-slot-fade-in .2s ease forwards}.toolbar-slot-outgoing{position:absolute;top:0;left:0;animation:toolbar-slot-fade-out .2s ease forwards;pointer-events:none}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--separator-border: rgba(128, 128, 128, .35);--sash-hover-transition-duration: .1s}.allotment-module_splitView__L-yRc{height:100%;overflow:hidden;position:relative;width:100%}.allotment-module_splitView__L-yRc>.allotment-module_sashContainer__fzwJF{height:100%;pointer-events:none;position:absolute;width:100%}.allotment-module_splitView__L-yRc>.allotment-module_sashContainer__fzwJF>.allotment-module_sash__QA-2t{pointer-events:auto}.allotment-module_splitView__L-yRc>.allotment-module_splitViewContainer__rQnVa{height:100%;position:relative;white-space:nowrap;width:100%}.allotment-module_splitView__L-yRc>.allotment-module_splitViewContainer__rQnVa>.allotment-module_splitViewView__MGZ6O{overflow:hidden;position:absolute;white-space:initial}.allotment-module_splitView__L-yRc.allotment-module_vertical__WSwwa>.allotment-module_splitViewContainer__rQnVa>.allotment-module_splitViewView__MGZ6O{width:100%}.allotment-module_splitView__L-yRc.allotment-module_horizontal__7doS8>.allotment-module_splitViewContainer__rQnVa>.allotment-module_splitViewView__MGZ6O{height:100%}.allotment-module_splitView__L-yRc.allotment-module_separatorBorder__x-rDS>.allotment-module_splitViewContainer__rQnVa>.allotment-module_splitViewView__MGZ6O:not(:first-child):before{background-color:var(--separator-border);content:" ";left:0;pointer-events:none;position:absolute;top:0;z-index:5}.allotment-module_splitView__L-yRc.allotment-module_separatorBorder__x-rDS.allotment-module_vertical__WSwwa>.allotment-module_splitViewContainer__rQnVa>.allotment-module_splitViewView__MGZ6O:not(:first-child):before{height:1px;width:100%}.allotment-module_splitView__L-yRc.allotment-module_separatorBorder__x-rDS.allotment-module_horizontal__7doS8>.allotment-module_splitViewContainer__rQnVa>.allotment-module_splitViewView__MGZ6O:not(:first-child):before{height:100%;width:1px}:root{--focus-border: #007fd4;--sash-size: 8px;--sash-hover-size: 4px}.sash-module_sash__K-9lB{position:absolute;z-index:35;touch-action:none;pointer-events:auto;text-align:initial}.sash-module_sash__K-9lB.sash-module_disabled__Hm-wx{pointer-events:none}.sash-module_sash__K-9lB.sash-module_mac__Jf6OJ.sash-module_vertical__pB-rs{cursor:col-resize}.sash-module_sash__K-9lB.sash-module_vertical__pB-rs.sash-module_minimum__-UKxp{cursor:e-resize}.sash-module_sash__K-9lB.sash-module_vertical__pB-rs.sash-module_maximum__TCWxD{cursor:w-resize}.sash-module_sash__K-9lB.sash-module_mac__Jf6OJ.sash-module_horizontal__kFbiw{cursor:row-resize}.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw.sash-module_minimum__-UKxp{cursor:s-resize}.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw.sash-module_maximum__TCWxD{cursor:n-resize}.sash-module_sash__K-9lB.sash-module_disabled__Hm-wx{cursor:default!important;pointer-events:none!important}.sash-module_sash__K-9lB.sash-module_vertical__pB-rs{cursor:ew-resize;top:0;width:var(--sash-size);height:100%}.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw{cursor:ns-resize;left:0;width:100%;height:var(--sash-size)}.sash-module_sash__K-9lB:not(.sash-module_disabled__Hm-wx)>.sash-module_orthogonal-drag-handle__Yii2-{content:" ";height:calc(var(--sash-size) * 2);width:calc(var(--sash-size) * 2);z-index:100;display:block;cursor:all-scroll;position:absolute}.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw.sash-module_orthogonal-edge-north__f7Noe:not(.sash-module_disabled__Hm-wx)>.sash-module_orthogonal-drag-handle__Yii2-.sash-module_start__uZEDk,.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw.sash-module_orthogonal-edge-south__6ZrFC:not(.sash-module_disabled__Hm-wx)>.sash-module_orthogonal-drag-handle__Yii2-.sash-module_end__0TP-R{cursor:nwse-resize}.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw.sash-module_orthogonal-edge-north__f7Noe:not(.sash-module_disabled__Hm-wx)>.sash-module_orthogonal-drag-handle__Yii2-.sash-module_end__0TP-R,.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw.sash-module_orthogonal-edge-south__6ZrFC:not(.sash-module_disabled__Hm-wx)>.sash-module_orthogonal-drag-handle__Yii2-.sash-module_start__uZEDk{cursor:nesw-resize}.sash-module_sash__K-9lB.sash-module_vertical__pB-rs>.sash-module_orthogonal-drag-handle__Yii2-.sash-module_start__uZEDk{left:calc(var(--sash-size) * -.5);top:calc(var(--sash-size) * -1)}.sash-module_sash__K-9lB.sash-module_vertical__pB-rs>.sash-module_orthogonal-drag-handle__Yii2-.sash-module_end__0TP-R{left:calc(var(--sash-size) * -.5);bottom:calc(var(--sash-size) * -1)}.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw>.sash-module_orthogonal-drag-handle__Yii2-.sash-module_start__uZEDk{top:calc(var(--sash-size) * -.5);left:calc(var(--sash-size) * -1)}.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw>.sash-module_orthogonal-drag-handle__Yii2-.sash-module_end__0TP-R{top:calc(var(--sash-size) * -.5);right:calc(var(--sash-size) * -1)}.sash-module_sash__K-9lB:before{content:"";pointer-events:none;position:absolute;width:100%;height:100%;transition:background-color var(--sash-hover-transition-duration) ease-out;background:transparent}.sash-module_sash__K-9lB.sash-module_vertical__pB-rs:before{width:var(--sash-hover-size);left:calc(50% - (var(--sash-hover-size) / 2))}.sash-module_sash__K-9lB.sash-module_horizontal__kFbiw:before{height:var(--sash-hover-size);top:calc(50% - (var(--sash-hover-size) / 2))}.sash-module_sash__K-9lB.sash-module_hover__80W6I:before,.sash-module_sash__K-9lB.sash-module_active__bJspD:before{background:var(--focus-border)}
|