@cratis/components 1.0.4 → 1.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/dist/cjs/CommandDialog/CommandDialog.js +2 -2
- package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -1
- package/dist/cjs/Common/Tooltip.css +10 -0
- package/dist/cjs/Common/Tooltip.js +17 -0
- package/dist/cjs/Common/Tooltip.js.map +1 -0
- package/dist/cjs/Common/index.js +2 -0
- package/dist/cjs/Common/index.js.map +1 -1
- package/dist/cjs/ObjectContentEditor/ObjectContentEditor.js +3 -16
- package/dist/cjs/ObjectContentEditor/ObjectContentEditor.js.map +1 -1
- package/dist/cjs/ObjectContentEditor/objectHelpers.js +19 -0
- package/dist/cjs/ObjectContentEditor/objectHelpers.js.map +1 -0
- package/dist/cjs/ObjectNavigationalBar/ObjectNavigationalBar.js +2 -10
- package/dist/cjs/ObjectNavigationalBar/ObjectNavigationalBar.js.map +1 -1
- package/dist/cjs/ObjectNavigationalBar/breadcrumbHelpers.js +15 -0
- package/dist/cjs/ObjectNavigationalBar/breadcrumbHelpers.js.map +1 -0
- package/dist/cjs/SchemaEditor/SchemaEditor.js +4 -35
- package/dist/cjs/SchemaEditor/SchemaEditor.js.map +1 -1
- package/dist/cjs/SchemaEditor/schemaHelpers.js +33 -0
- package/dist/cjs/SchemaEditor/schemaHelpers.js.map +1 -0
- package/dist/cjs/TimeMachine/Properties.js +2 -7
- package/dist/cjs/TimeMachine/Properties.js.map +1 -1
- package/dist/cjs/TimeMachine/propertiesHelpers.js +11 -0
- package/dist/cjs/TimeMachine/propertiesHelpers.js.map +1 -0
- package/dist/cjs/Toolbar/Toolbar.css +131 -0
- package/dist/cjs/Toolbar/Toolbar.js +9 -0
- package/dist/cjs/Toolbar/Toolbar.js.map +1 -0
- package/dist/cjs/Toolbar/ToolbarButton.js +12 -0
- package/dist/cjs/Toolbar/ToolbarButton.js.map +1 -0
- package/dist/cjs/Toolbar/ToolbarContext.js +6 -0
- package/dist/cjs/Toolbar/ToolbarContext.js.map +1 -0
- package/dist/cjs/Toolbar/ToolbarFanOutItem.js +33 -0
- package/dist/cjs/Toolbar/ToolbarFanOutItem.js.map +1 -0
- package/dist/cjs/Toolbar/ToolbarSection.js +32 -0
- package/dist/cjs/Toolbar/ToolbarSection.js.map +1 -0
- package/dist/cjs/Toolbar/index.js +16 -0
- package/dist/cjs/Toolbar/index.js.map +1 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -1
- package/dist/esm/CommandDialog/CommandDialog.js +2 -2
- package/dist/esm/CommandDialog/CommandDialog.js.map +1 -1
- package/dist/esm/Common/Tooltip.css +10 -0
- package/dist/esm/Common/Tooltip.d.ts +10 -0
- package/dist/esm/Common/Tooltip.d.ts.map +1 -0
- package/dist/esm/Common/Tooltip.js +15 -0
- package/dist/esm/Common/Tooltip.js.map +1 -0
- package/dist/esm/Common/index.d.ts +1 -0
- package/dist/esm/Common/index.d.ts.map +1 -1
- package/dist/esm/Common/index.js +1 -0
- package/dist/esm/Common/index.js.map +1 -1
- package/dist/esm/ObjectContentEditor/ObjectContentEditor.d.ts.map +1 -1
- package/dist/esm/ObjectContentEditor/ObjectContentEditor.js +1 -14
- package/dist/esm/ObjectContentEditor/ObjectContentEditor.js.map +1 -1
- package/dist/esm/ObjectContentEditor/objectHelpers.d.ts +3 -0
- package/dist/esm/ObjectContentEditor/objectHelpers.d.ts.map +1 -0
- package/dist/esm/ObjectContentEditor/objectHelpers.js +17 -0
- package/dist/esm/ObjectContentEditor/objectHelpers.js.map +1 -0
- package/dist/esm/ObjectNavigationalBar/ObjectNavigationalBar.d.ts.map +1 -1
- package/dist/esm/ObjectNavigationalBar/ObjectNavigationalBar.js +2 -10
- package/dist/esm/ObjectNavigationalBar/ObjectNavigationalBar.js.map +1 -1
- package/dist/esm/ObjectNavigationalBar/breadcrumbHelpers.d.ts +5 -0
- package/dist/esm/ObjectNavigationalBar/breadcrumbHelpers.d.ts.map +1 -0
- package/dist/esm/ObjectNavigationalBar/breadcrumbHelpers.js +13 -0
- package/dist/esm/ObjectNavigationalBar/breadcrumbHelpers.js.map +1 -0
- package/dist/esm/SchemaEditor/SchemaEditor.d.ts.map +1 -1
- package/dist/esm/SchemaEditor/SchemaEditor.js +2 -33
- package/dist/esm/SchemaEditor/SchemaEditor.js.map +1 -1
- package/dist/esm/SchemaEditor/schemaHelpers.d.ts +4 -0
- package/dist/esm/SchemaEditor/schemaHelpers.d.ts.map +1 -0
- package/dist/esm/SchemaEditor/schemaHelpers.js +30 -0
- package/dist/esm/SchemaEditor/schemaHelpers.js.map +1 -0
- package/dist/esm/TimeMachine/Properties.d.ts.map +1 -1
- package/dist/esm/TimeMachine/Properties.js +1 -6
- package/dist/esm/TimeMachine/Properties.js.map +1 -1
- package/dist/esm/TimeMachine/propertiesHelpers.d.ts +2 -0
- package/dist/esm/TimeMachine/propertiesHelpers.d.ts.map +1 -0
- package/dist/esm/TimeMachine/propertiesHelpers.js +9 -0
- package/dist/esm/TimeMachine/propertiesHelpers.js.map +1 -0
- package/dist/esm/Toolbar/Toolbar.css +131 -0
- package/dist/esm/Toolbar/Toolbar.d.ts +8 -0
- package/dist/esm/Toolbar/Toolbar.d.ts.map +1 -0
- package/dist/esm/Toolbar/Toolbar.js +7 -0
- package/dist/esm/Toolbar/Toolbar.js.map +1 -0
- package/dist/esm/Toolbar/Toolbar.stories.d.ts +11 -0
- package/dist/esm/Toolbar/Toolbar.stories.d.ts.map +1 -0
- package/dist/esm/Toolbar/Toolbar.stories.js +53 -0
- package/dist/esm/Toolbar/Toolbar.stories.js.map +1 -0
- package/dist/esm/Toolbar/ToolbarButton.d.ts +10 -0
- package/dist/esm/Toolbar/ToolbarButton.d.ts.map +1 -0
- package/dist/esm/Toolbar/ToolbarButton.js +10 -0
- package/dist/esm/Toolbar/ToolbarButton.js.map +1 -0
- package/dist/esm/Toolbar/ToolbarContext.d.ts +7 -0
- package/dist/esm/Toolbar/ToolbarContext.d.ts.map +1 -0
- package/dist/esm/Toolbar/ToolbarContext.js +4 -0
- package/dist/esm/Toolbar/ToolbarContext.js.map +1 -0
- package/dist/esm/Toolbar/ToolbarFanOutItem.d.ts +11 -0
- package/dist/esm/Toolbar/ToolbarFanOutItem.d.ts.map +1 -0
- package/dist/esm/Toolbar/ToolbarFanOutItem.js +31 -0
- package/dist/esm/Toolbar/ToolbarFanOutItem.js.map +1 -0
- package/dist/esm/Toolbar/ToolbarSection.d.ts +8 -0
- package/dist/esm/Toolbar/ToolbarSection.d.ts.map +1 -0
- package/dist/esm/Toolbar/ToolbarSection.js +30 -0
- package/dist/esm/Toolbar/ToolbarSection.js.map +1 -0
- package/dist/esm/Toolbar/index.d.ts +11 -0
- package/dist/esm/Toolbar/index.d.ts.map +1 -0
- package/dist/esm/Toolbar/index.js +6 -0
- package/dist/esm/Toolbar/index.js.map +1 -0
- package/dist/esm/given.d.ts +5 -0
- package/dist/esm/given.d.ts.map +1 -0
- package/dist/esm/given.js +7 -0
- package/dist/esm/given.js.map +1 -0
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaEditor.js","sources":["../../../SchemaEditor/SchemaEditor.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { Button } from 'primereact/button';\nimport { DataTable } from 'primereact/datatable';\nimport { Column } from 'primereact/column';\nimport { Menubar } from 'primereact/menubar';\nimport { Tooltip } from 'primereact/tooltip';\nimport * as faIcons from 'react-icons/fa6';\nimport { NameCell } from './NameCell';\nimport { TypeCell } from './TypeCell';\nimport { JsonSchema, JsonSchemaProperty, NavigationItem } from '../types/JsonSchema';\nimport { TypeFormat, DEFAULT_TYPE_FORMATS } from '../types/TypeFormat';\nimport css from './SchemaEditor.module.css';\nimport { MenuItem } from 'primereact/menuitem';\n\nexport interface SchemaEditorProps {\n schema: JsonSchema;\n eventTypeName?: string;\n canEdit?: boolean;\n canNotEditReason?: string;\n onChange?: (schema: JsonSchema) => void;\n onSave?: () => void;\n onCancel?: () => void;\n editMode?: boolean;\n saveDisabled?: boolean;\n cancelDisabled?: boolean;\n typeFormats?: TypeFormat[];\n}\n\nexport const SchemaEditor = ({ \n schema, \n eventTypeName = '', \n canEdit = true, \n canNotEditReason, \n onChange, \n onSave, \n onCancel, \n editMode, \n saveDisabled = false, \n cancelDisabled = false,\n typeFormats = DEFAULT_TYPE_FORMATS\n}: SchemaEditorProps) => {\n const [currentPath, setCurrentPath] = useState<string[]>([]);\n const [properties, setProperties] = useState<JsonSchemaProperty[]>([]);\n const [currentSchema, setCurrentSchema] = useState<JsonSchema>(schema);\n const [isEditMode, setIsEditMode] = useState(editMode ?? false);\n const [initialSchema, setInitialSchema] = useState<JsonSchema>(schema);\n const [validationErrors, setValidationErrors] = useState<Record<string, string>>({});\n\n useEffect(() => {\n if (!isEditMode) {\n setCurrentPath([]);\n }\n }, [isEditMode]);\n\n const validatePropertyName = useCallback((name: string, propertyId: string, allProperties: JsonSchemaProperty[]): string | undefined => {\n if (!name || name.trim() === '') {\n return 'Property name cannot be empty';\n }\n\n const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n if (!validIdentifierPattern.test(name)) {\n return 'Property name must start with a letter or underscore and contain only letters, numbers, and underscores';\n }\n\n const duplicates = allProperties.filter(p => p.name === name && p.id !== propertyId);\n if (duplicates.length > 0) {\n return 'Property name must be unique';\n }\n\n return undefined;\n }, []);\n\n const validateAllProperties = useCallback((properties: JsonSchemaProperty[]) => {\n const errors: Record<string, string> = {};\n\n properties.forEach(prop => {\n if (!prop.name) return;\n const error = validatePropertyName(prop.name, prop.id!, properties);\n if (error) {\n errors[prop.id!] = error;\n }\n });\n\n setValidationErrors(errors);\n return Object.keys(errors).length === 0;\n }, [validatePropertyName]);\n\n useEffect(() => {\n setCurrentSchema(schema);\n setInitialSchema(JSON.parse(JSON.stringify(schema)));\n }, [schema]);\n\n useEffect(() => {\n loadPropertiesForCurrentPath();\n }, [currentPath, currentSchema, isEditMode]);\n\n const loadPropertiesForCurrentPath = () => {\n let targetSchema: JsonSchema | JsonSchemaProperty = currentSchema;\n\n for (const segment of currentPath) {\n if (targetSchema.type === 'array' && segment === '$items') {\n targetSchema = targetSchema.items || {};\n } else if (targetSchema.properties && targetSchema.properties[segment]) {\n targetSchema = targetSchema.properties[segment] as JsonSchema | JsonSchemaProperty;\n } else {\n return;\n }\n }\n\n const schemaProps: JsonSchemaProperty[] = [];\n if (targetSchema.properties) {\n let idCounter = 0;\n for (const [name, property] of Object.entries(targetSchema.properties)) {\n schemaProps.push({\n id: `prop-${currentPath.join('-')}-${idCounter++}`,\n name,\n type: property.type || 'string',\n format: property.format,\n description: property.description,\n items: property.items,\n properties: property.properties,\n required: (currentSchema.required as string[] | undefined)?.includes(name) || false\n });\n }\n }\n\n setProperties(schemaProps);\n if (isEditMode) {\n validateAllProperties(schemaProps);\n }\n };\n\n const updateSchemaAtPath = useCallback((path: string[], updater: (schema: JsonSchema) => JsonSchema) => {\n const newSchema = JSON.parse(JSON.stringify(currentSchema));\n\n if (path.length === 0) {\n const updated = updater(newSchema);\n setCurrentSchema(updated);\n onChange?.(updated);\n return;\n }\n\n let targetSchema = newSchema;\n for (let i = 0; i < path.length - 1; i++) {\n const segment = path[i];\n if (targetSchema.type === 'array' && segment === '$items') {\n if (!targetSchema.items) {\n targetSchema.items = { type: 'object', properties: {} };\n }\n targetSchema = targetSchema.items;\n } else if (targetSchema.properties && targetSchema.properties[segment]) {\n targetSchema = targetSchema.properties[segment];\n }\n }\n\n const lastSegment = path[path.length - 1];\n if (targetSchema.type === 'array' && lastSegment === '$items') {\n targetSchema.items = updater(targetSchema.items || {});\n } else {\n if (!targetSchema.properties) {\n targetSchema.properties = {};\n }\n targetSchema.properties[lastSegment] = updater(targetSchema.properties[lastSegment] || {});\n }\n\n setCurrentSchema(newSchema);\n onChange?.(newSchema);\n }, [currentSchema, onChange]);\n\n const addProperty = useCallback(() => {\n updateSchemaAtPath(currentPath, (schema) => {\n const newProps = { ...(schema.properties || {}) };\n let newName = 'newProperty';\n let counter = 1;\n while (newProps[newName]) {\n newName = `newProperty${counter++}`;\n }\n newProps[newName] = { type: 'string' };\n return { ...schema, properties: newProps };\n });\n }, [currentPath, updateSchemaAtPath]);\n\n const removeProperty = useCallback((propertyName: string) => {\n updateSchemaAtPath(currentPath, (schema) => {\n const newProps = { ...(schema.properties || {}) };\n delete newProps[propertyName];\n return { ...schema, properties: newProps };\n });\n }, [currentPath, updateSchemaAtPath]);\n\n const updateProperty = useCallback((oldName: string, field: keyof JsonSchemaProperty, value: unknown, additionalUpdates?: Partial<JsonSchemaProperty>) => {\n updateSchemaAtPath(currentPath, (schema) => {\n const newProps = { ...(schema.properties || {}) };\n const prop = { ...(newProps[oldName] || {}) };\n\n if (field === 'name') {\n if (value !== oldName && !newProps[value as string]) {\n newProps[value as string] = prop;\n delete newProps[oldName];\n }\n } else if (field === 'type') {\n prop.type = value as string;\n if (value === 'array') {\n prop.items = { type: 'string' };\n delete prop.format;\n } else if (value === 'object') {\n prop.properties = {};\n delete prop.format;\n delete prop.items;\n } else {\n delete prop.items;\n delete prop.properties;\n }\n\n if (additionalUpdates) {\n if ('format' in additionalUpdates) {\n if (additionalUpdates.format) {\n prop.format = additionalUpdates.format as string;\n } else {\n delete prop.format;\n }\n }\n }\n\n newProps[oldName] = prop;\n } else if (field === 'format') {\n if (value && value !== 'none') {\n prop.format = value as string;\n } else {\n delete prop.format;\n }\n newProps[oldName] = prop;\n }\n\n return { ...schema, properties: newProps };\n });\n }, [currentPath, updateSchemaAtPath]);\n\n const updateArrayItemType = useCallback((propertyName: string, itemType: string) => {\n updateSchemaAtPath(currentPath, (schema) => {\n const newProps = { ...(schema.properties || {}) };\n const prop = { ...(newProps[propertyName] || {}) };\n\n if (itemType === 'object') {\n prop.items = { type: 'object', properties: {} };\n } else if (itemType === 'array') {\n prop.items = { type: 'array', items: { type: 'string' } };\n } else {\n prop.items = { type: itemType };\n }\n\n newProps[propertyName] = prop;\n return { ...schema, properties: newProps };\n });\n }, [currentPath, updateSchemaAtPath]);\n\n const navigateToProperty = useCallback((propertyName: string) => {\n setCurrentPath([...currentPath, propertyName]);\n }, [currentPath]);\n\n const navigateToArrayItems = useCallback((propertyName: string) => {\n setCurrentPath([...currentPath, propertyName, '$items']);\n }, [currentPath]);\n\n const navigateBack = useCallback(() => {\n if (currentPath.length > 0) {\n setCurrentPath(currentPath.slice(0, -1));\n }\n }, [currentPath]);\n\n const navigateToBreadcrumb = useCallback((index: number) => {\n const items = getBreadcrumbItems();\n setCurrentPath(items[index].path);\n }, [currentPath, eventTypeName]);\n\n const handleSave = useCallback(() => {\n onSave?.();\n setIsEditMode(false);\n }, [onSave]);\n\n const handleCancel = useCallback(() => {\n setCurrentSchema(JSON.parse(JSON.stringify(initialSchema)));\n onChange?.(JSON.parse(JSON.stringify(initialSchema)));\n setIsEditMode(false);\n onCancel?.();\n }, [initialSchema, onChange, onCancel]);\n\n const handleEdit = useCallback(() => {\n setInitialSchema(JSON.parse(JSON.stringify(currentSchema)));\n setIsEditMode(true);\n }, [currentSchema]);\n\n const getBreadcrumbItems = () => {\n const items: NavigationItem[] = [{ name: eventTypeName, path: [] }];\n\n for (let i = 0; i < currentPath.length; i++) {\n const segment = currentPath[i];\n if (segment === '$items') {\n items.push({\n name: '[items]',\n path: currentPath.slice(0, i + 1)\n });\n } else {\n items.push({\n name: segment,\n path: currentPath.slice(0, i + 1)\n });\n }\n }\n\n return items;\n };\n\n const getCurrentDescription = useCallback(() => {\n let targetSchema: JsonSchema | JsonSchemaProperty = currentSchema;\n\n for (const segment of currentPath) {\n if (targetSchema.type === 'array' && segment === '$items') {\n targetSchema = targetSchema.items || {};\n } else if (targetSchema.properties && targetSchema.properties[segment]) {\n targetSchema = targetSchema.properties[segment] as JsonSchema | JsonSchemaProperty;\n } else {\n return undefined;\n }\n }\n\n return targetSchema.description;\n }, [currentSchema, currentPath]);\n\n const hasValidationErrors = Object.keys(validationErrors).length > 0;\n\n const menuItems = useMemo(() => [\n ...(!isEditMode ? [{\n label: 'Edit',\n icon: <faIcons.FaPencil className='mr-2' />,\n command: canEdit ? handleEdit : undefined,\n className: !canEdit ? 'edit-disabled-with-reason' : undefined,\n template: !canEdit && canNotEditReason ? (item: MenuItem) => (\n <div\n className=\"p-menuitem-link p-disabled\"\n data-pr-tooltip={canNotEditReason}\n data-pr-position=\"bottom\"\n style={{ cursor: 'not-allowed', opacity: 0.6 }}\n >\n {item.icon}\n <span className=\"p-menuitem-text\">{item.label}</span>\n </div>\n ) : undefined\n }] : []),\n ...(isEditMode ? [\n ...(!saveDisabled ? [{\n label: 'Save',\n icon: <faIcons.FaCheck className='mr-2' />,\n command: hasValidationErrors ? undefined : handleSave,\n disabled: hasValidationErrors\n }] : []),\n ...(!cancelDisabled ? [{\n label: 'Cancel',\n icon: <faIcons.FaXmark className='mr-2' />,\n command: handleCancel\n }] : []),\n {\n label: 'Add Property',\n icon: <faIcons.FaPlus className='mr-2' />,\n command: addProperty\n }\n ] : [])\n ], [isEditMode, handleSave, handleCancel, handleEdit, addProperty, canEdit, canNotEditReason, hasValidationErrors, saveDisabled, cancelDisabled]);\n\n const breadcrumbItems = getBreadcrumbItems();\n const isAtRoot = currentPath.length === 0;\n const currentDescription = getCurrentDescription();\n\n return (\n <div className=\"schema-editor\" style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n <div className=\"px-4 py-4\">\n <Tooltip target=\"[data-pr-tooltip]\" />\n <div className=\"schema-editor-menubar\">\n <Menubar aria-label=\"Actions\" model={menuItems} />\n </div>\n </div>\n\n <div className=\"px-4 py-2 border-bottom-1 surface-border\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <Button\n icon={<faIcons.FaArrowLeft />}\n className=\"p-button-text p-button-sm\"\n onClick={navigateBack}\n disabled={isAtRoot}\n tooltip=\"Navigate back\"\n tooltipOptions={{ position: 'top' }}\n />\n <div style={{ fontSize: '0.9rem', color: 'var(--text-color-secondary)', cursor: 'pointer' }}>\n {breadcrumbItems.map((item, index) => (\n <span key={index}>\n {index > 0 && <span className=\"mx-2\">></span>}\n <span\n onClick={() => navigateToBreadcrumb(index)}\n style={{ cursor: 'pointer', textDecoration: index < breadcrumbItems.length - 1 ? 'underline' : 'none' }}\n >\n {item.name}\n </span>\n </span>\n ))}\n </div>\n </div>\n {currentDescription && (\n <div style={{ fontSize: '0.875rem', color: 'var(--text-color-secondary)', marginTop: '0.5rem', marginLeft: '2.5rem', fontStyle: 'italic', display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <faIcons.FaCircleInfo />\n <span>{currentDescription}</span>\n </div>\n )}\n </div>\n\n <div style={{ flex: 1, overflow: 'auto', padding: '1rem' }}>\n <Tooltip key={`nav-${eventTypeName}-${currentPath.join('/')}`} target=\".schema-navigation-tooltip\" mouseTrack mouseTrackTop={15} />\n <Tooltip key={`desc-${eventTypeName}-${currentPath.join('/')}`} target=\".schema-description-tooltip\" />\n <DataTable\n key={`${isEditMode}-${currentPath.join('/')}`}\n value={properties}\n dataKey=\"id\"\n emptyMessage=\"No properties defined\"\n rowClassName={(rowData: JsonSchemaProperty) => {\n if (!isEditMode && (rowData.type === 'object' || (rowData.type === 'array' && rowData.items?.type === 'object'))) {\n return css.navigableRow;\n }\n return '';\n }}\n onRowClick={(e) => {\n if (!isEditMode) {\n const rowData = e.data as JsonSchemaProperty;\n if (rowData.name) {\n if (rowData.type === 'object') {\n navigateToProperty(rowData.name);\n } else if (rowData.type === 'array' && rowData.items?.type === 'object') {\n navigateToArrayItems(rowData.name);\n }\n }\n }\n }}\n pt={{\n root: { style: { border: 'none' } },\n tbody: { style: { borderTop: '1px solid var(--surface-border)' } }\n }}\n >\n <Column\n field=\"name\"\n header=\"Property\"\n body={(rowData: JsonSchemaProperty) => (\n <NameCell\n rowData={rowData}\n isEditMode={isEditMode}\n onUpdate={updateProperty}\n validationError={validationErrors[rowData.id!]}\n />\n )}\n style={{ width: '30%' }}\n />\n <Column\n header=\"Type\"\n body={(rowData: JsonSchemaProperty) => (\n <TypeCell\n rowData={rowData}\n isEditMode={isEditMode}\n typeFormats={typeFormats}\n onUpdateProperty={updateProperty}\n onUpdateArrayItemType={updateArrayItemType}\n onNavigateToProperty={navigateToProperty}\n onNavigateToArrayItems={navigateToArrayItems}\n onRemoveProperty={removeProperty}\n />\n )}\n style={{ width: '70%' }}\n />\n </DataTable>\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SchemaEditor.js","sources":["../../../SchemaEditor/SchemaEditor.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { Button } from 'primereact/button';\nimport { DataTable } from 'primereact/datatable';\nimport { Column } from 'primereact/column';\nimport { Menubar } from 'primereact/menubar';\nimport { Tooltip } from 'primereact/tooltip';\nimport * as faIcons from 'react-icons/fa6';\nimport { NameCell } from './NameCell';\nimport { TypeCell } from './TypeCell';\nimport { JsonSchema, JsonSchemaProperty } from '../types/JsonSchema';\nimport { TypeFormat, DEFAULT_TYPE_FORMATS } from '../types/TypeFormat';\nimport { validatePropertyName, buildBreadcrumbItems } from './schemaHelpers';\nimport css from './SchemaEditor.module.css';\nimport { MenuItem } from 'primereact/menuitem';\n\nexport interface SchemaEditorProps {\n schema: JsonSchema;\n eventTypeName?: string;\n canEdit?: boolean;\n canNotEditReason?: string;\n onChange?: (schema: JsonSchema) => void;\n onSave?: () => void;\n onCancel?: () => void;\n editMode?: boolean;\n saveDisabled?: boolean;\n cancelDisabled?: boolean;\n typeFormats?: TypeFormat[];\n}\n\nexport const SchemaEditor = ({ \n schema, \n eventTypeName = '', \n canEdit = true, \n canNotEditReason, \n onChange, \n onSave, \n onCancel, \n editMode, \n saveDisabled = false, \n cancelDisabled = false,\n typeFormats = DEFAULT_TYPE_FORMATS\n}: SchemaEditorProps) => {\n const [currentPath, setCurrentPath] = useState<string[]>([]);\n const [properties, setProperties] = useState<JsonSchemaProperty[]>([]);\n const [currentSchema, setCurrentSchema] = useState<JsonSchema>(schema);\n const [isEditMode, setIsEditMode] = useState(editMode ?? false);\n const [initialSchema, setInitialSchema] = useState<JsonSchema>(schema);\n const [validationErrors, setValidationErrors] = useState<Record<string, string>>({});\n\n useEffect(() => {\n if (!isEditMode) {\n setCurrentPath([]);\n }\n }, [isEditMode]);\n\n const validateAllProperties = useCallback((properties: JsonSchemaProperty[]) => {\n const errors: Record<string, string> = {};\n\n properties.forEach(prop => {\n if (!prop.name) return;\n const error = validatePropertyName(prop.name, prop.id!, properties);\n if (error) {\n errors[prop.id!] = error;\n }\n });\n\n setValidationErrors(errors);\n return Object.keys(errors).length === 0;\n }, [validatePropertyName]);\n\n useEffect(() => {\n setCurrentSchema(schema);\n setInitialSchema(JSON.parse(JSON.stringify(schema)));\n }, [schema]);\n\n useEffect(() => {\n loadPropertiesForCurrentPath();\n }, [currentPath, currentSchema, isEditMode]);\n\n const loadPropertiesForCurrentPath = () => {\n let targetSchema: JsonSchema | JsonSchemaProperty = currentSchema;\n\n for (const segment of currentPath) {\n if (targetSchema.type === 'array' && segment === '$items') {\n targetSchema = targetSchema.items || {};\n } else if (targetSchema.properties && targetSchema.properties[segment]) {\n targetSchema = targetSchema.properties[segment] as JsonSchema | JsonSchemaProperty;\n } else {\n return;\n }\n }\n\n const schemaProps: JsonSchemaProperty[] = [];\n if (targetSchema.properties) {\n let idCounter = 0;\n for (const [name, property] of Object.entries(targetSchema.properties)) {\n schemaProps.push({\n id: `prop-${currentPath.join('-')}-${idCounter++}`,\n name,\n type: property.type || 'string',\n format: property.format,\n description: property.description,\n items: property.items,\n properties: property.properties,\n required: (currentSchema.required as string[] | undefined)?.includes(name) || false\n });\n }\n }\n\n setProperties(schemaProps);\n if (isEditMode) {\n validateAllProperties(schemaProps);\n }\n };\n\n const updateSchemaAtPath = useCallback((path: string[], updater: (schema: JsonSchema) => JsonSchema) => {\n const newSchema = JSON.parse(JSON.stringify(currentSchema));\n\n if (path.length === 0) {\n const updated = updater(newSchema);\n setCurrentSchema(updated);\n onChange?.(updated);\n return;\n }\n\n let targetSchema = newSchema;\n for (let i = 0; i < path.length - 1; i++) {\n const segment = path[i];\n if (targetSchema.type === 'array' && segment === '$items') {\n if (!targetSchema.items) {\n targetSchema.items = { type: 'object', properties: {} };\n }\n targetSchema = targetSchema.items;\n } else if (targetSchema.properties && targetSchema.properties[segment]) {\n targetSchema = targetSchema.properties[segment];\n }\n }\n\n const lastSegment = path[path.length - 1];\n if (targetSchema.type === 'array' && lastSegment === '$items') {\n targetSchema.items = updater(targetSchema.items || {});\n } else {\n if (!targetSchema.properties) {\n targetSchema.properties = {};\n }\n targetSchema.properties[lastSegment] = updater(targetSchema.properties[lastSegment] || {});\n }\n\n setCurrentSchema(newSchema);\n onChange?.(newSchema);\n }, [currentSchema, onChange]);\n\n const addProperty = useCallback(() => {\n updateSchemaAtPath(currentPath, (schema) => {\n const newProps = { ...(schema.properties || {}) };\n let newName = 'newProperty';\n let counter = 1;\n while (newProps[newName]) {\n newName = `newProperty${counter++}`;\n }\n newProps[newName] = { type: 'string' };\n return { ...schema, properties: newProps };\n });\n }, [currentPath, updateSchemaAtPath]);\n\n const removeProperty = useCallback((propertyName: string) => {\n updateSchemaAtPath(currentPath, (schema) => {\n const newProps = { ...(schema.properties || {}) };\n delete newProps[propertyName];\n return { ...schema, properties: newProps };\n });\n }, [currentPath, updateSchemaAtPath]);\n\n const updateProperty = useCallback((oldName: string, field: keyof JsonSchemaProperty, value: unknown, additionalUpdates?: Partial<JsonSchemaProperty>) => {\n updateSchemaAtPath(currentPath, (schema) => {\n const newProps = { ...(schema.properties || {}) };\n const prop = { ...(newProps[oldName] || {}) };\n\n if (field === 'name') {\n if (value !== oldName && !newProps[value as string]) {\n newProps[value as string] = prop;\n delete newProps[oldName];\n }\n } else if (field === 'type') {\n prop.type = value as string;\n if (value === 'array') {\n prop.items = { type: 'string' };\n delete prop.format;\n } else if (value === 'object') {\n prop.properties = {};\n delete prop.format;\n delete prop.items;\n } else {\n delete prop.items;\n delete prop.properties;\n }\n\n if (additionalUpdates) {\n if ('format' in additionalUpdates) {\n if (additionalUpdates.format) {\n prop.format = additionalUpdates.format as string;\n } else {\n delete prop.format;\n }\n }\n }\n\n newProps[oldName] = prop;\n } else if (field === 'format') {\n if (value && value !== 'none') {\n prop.format = value as string;\n } else {\n delete prop.format;\n }\n newProps[oldName] = prop;\n }\n\n return { ...schema, properties: newProps };\n });\n }, [currentPath, updateSchemaAtPath]);\n\n const updateArrayItemType = useCallback((propertyName: string, itemType: string) => {\n updateSchemaAtPath(currentPath, (schema) => {\n const newProps = { ...(schema.properties || {}) };\n const prop = { ...(newProps[propertyName] || {}) };\n\n if (itemType === 'object') {\n prop.items = { type: 'object', properties: {} };\n } else if (itemType === 'array') {\n prop.items = { type: 'array', items: { type: 'string' } };\n } else {\n prop.items = { type: itemType };\n }\n\n newProps[propertyName] = prop;\n return { ...schema, properties: newProps };\n });\n }, [currentPath, updateSchemaAtPath]);\n\n const navigateToProperty = useCallback((propertyName: string) => {\n setCurrentPath([...currentPath, propertyName]);\n }, [currentPath]);\n\n const navigateToArrayItems = useCallback((propertyName: string) => {\n setCurrentPath([...currentPath, propertyName, '$items']);\n }, [currentPath]);\n\n const navigateBack = useCallback(() => {\n if (currentPath.length > 0) {\n setCurrentPath(currentPath.slice(0, -1));\n }\n }, [currentPath]);\n\n const navigateToBreadcrumb = useCallback((index: number) => {\n const items = getBreadcrumbItems();\n setCurrentPath(items[index].path);\n }, [currentPath, eventTypeName]);\n\n const handleSave = useCallback(() => {\n onSave?.();\n setIsEditMode(false);\n }, [onSave]);\n\n const handleCancel = useCallback(() => {\n setCurrentSchema(JSON.parse(JSON.stringify(initialSchema)));\n onChange?.(JSON.parse(JSON.stringify(initialSchema)));\n setIsEditMode(false);\n onCancel?.();\n }, [initialSchema, onChange, onCancel]);\n\n const handleEdit = useCallback(() => {\n setInitialSchema(JSON.parse(JSON.stringify(currentSchema)));\n setIsEditMode(true);\n }, [currentSchema]);\n\n const getBreadcrumbItems = () => buildBreadcrumbItems(eventTypeName, currentPath);\n\n const getCurrentDescription = useCallback(() => {\n let targetSchema: JsonSchema | JsonSchemaProperty = currentSchema;\n\n for (const segment of currentPath) {\n if (targetSchema.type === 'array' && segment === '$items') {\n targetSchema = targetSchema.items || {};\n } else if (targetSchema.properties && targetSchema.properties[segment]) {\n targetSchema = targetSchema.properties[segment] as JsonSchema | JsonSchemaProperty;\n } else {\n return undefined;\n }\n }\n\n return targetSchema.description;\n }, [currentSchema, currentPath]);\n\n const hasValidationErrors = Object.keys(validationErrors).length > 0;\n\n const menuItems = useMemo(() => [\n ...(!isEditMode ? [{\n label: 'Edit',\n icon: <faIcons.FaPencil className='mr-2' />,\n command: canEdit ? handleEdit : undefined,\n className: !canEdit ? 'edit-disabled-with-reason' : undefined,\n template: !canEdit && canNotEditReason ? (item: MenuItem) => (\n <div\n className=\"p-menuitem-link p-disabled\"\n data-pr-tooltip={canNotEditReason}\n data-pr-position=\"bottom\"\n style={{ cursor: 'not-allowed', opacity: 0.6 }}\n >\n {item.icon}\n <span className=\"p-menuitem-text\">{item.label}</span>\n </div>\n ) : undefined\n }] : []),\n ...(isEditMode ? [\n ...(!saveDisabled ? [{\n label: 'Save',\n icon: <faIcons.FaCheck className='mr-2' />,\n command: hasValidationErrors ? undefined : handleSave,\n disabled: hasValidationErrors\n }] : []),\n ...(!cancelDisabled ? [{\n label: 'Cancel',\n icon: <faIcons.FaXmark className='mr-2' />,\n command: handleCancel\n }] : []),\n {\n label: 'Add Property',\n icon: <faIcons.FaPlus className='mr-2' />,\n command: addProperty\n }\n ] : [])\n ], [isEditMode, handleSave, handleCancel, handleEdit, addProperty, canEdit, canNotEditReason, hasValidationErrors, saveDisabled, cancelDisabled]);\n\n const breadcrumbItems = getBreadcrumbItems();\n const isAtRoot = currentPath.length === 0;\n const currentDescription = getCurrentDescription();\n\n return (\n <div className=\"schema-editor\" style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n <div className=\"px-4 py-4\">\n <Tooltip target=\"[data-pr-tooltip]\" />\n <div className=\"schema-editor-menubar\">\n <Menubar aria-label=\"Actions\" model={menuItems} />\n </div>\n </div>\n\n <div className=\"px-4 py-2 border-bottom-1 surface-border\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <Button\n icon={<faIcons.FaArrowLeft />}\n className=\"p-button-text p-button-sm\"\n onClick={navigateBack}\n disabled={isAtRoot}\n tooltip=\"Navigate back\"\n tooltipOptions={{ position: 'top' }}\n />\n <div style={{ fontSize: '0.9rem', color: 'var(--text-color-secondary)', cursor: 'pointer' }}>\n {breadcrumbItems.map((item, index) => (\n <span key={index}>\n {index > 0 && <span className=\"mx-2\">></span>}\n <span\n onClick={() => navigateToBreadcrumb(index)}\n style={{ cursor: 'pointer', textDecoration: index < breadcrumbItems.length - 1 ? 'underline' : 'none' }}\n >\n {item.name}\n </span>\n </span>\n ))}\n </div>\n </div>\n {currentDescription && (\n <div style={{ fontSize: '0.875rem', color: 'var(--text-color-secondary)', marginTop: '0.5rem', marginLeft: '2.5rem', fontStyle: 'italic', display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <faIcons.FaCircleInfo />\n <span>{currentDescription}</span>\n </div>\n )}\n </div>\n\n <div style={{ flex: 1, overflow: 'auto', padding: '1rem' }}>\n <Tooltip key={`nav-${eventTypeName}-${currentPath.join('/')}`} target=\".schema-navigation-tooltip\" mouseTrack mouseTrackTop={15} />\n <Tooltip key={`desc-${eventTypeName}-${currentPath.join('/')}`} target=\".schema-description-tooltip\" />\n <DataTable\n key={`${isEditMode}-${currentPath.join('/')}`}\n value={properties}\n dataKey=\"id\"\n emptyMessage=\"No properties defined\"\n rowClassName={(rowData: JsonSchemaProperty) => {\n if (!isEditMode && (rowData.type === 'object' || (rowData.type === 'array' && rowData.items?.type === 'object'))) {\n return css.navigableRow;\n }\n return '';\n }}\n onRowClick={(e) => {\n if (!isEditMode) {\n const rowData = e.data as JsonSchemaProperty;\n if (rowData.name) {\n if (rowData.type === 'object') {\n navigateToProperty(rowData.name);\n } else if (rowData.type === 'array' && rowData.items?.type === 'object') {\n navigateToArrayItems(rowData.name);\n }\n }\n }\n }}\n pt={{\n root: { style: { border: 'none' } },\n tbody: { style: { borderTop: '1px solid var(--surface-border)' } }\n }}\n >\n <Column\n field=\"name\"\n header=\"Property\"\n body={(rowData: JsonSchemaProperty) => (\n <NameCell\n rowData={rowData}\n isEditMode={isEditMode}\n onUpdate={updateProperty}\n validationError={validationErrors[rowData.id!]}\n />\n )}\n style={{ width: '30%' }}\n />\n <Column\n header=\"Type\"\n body={(rowData: JsonSchemaProperty) => (\n <TypeCell\n rowData={rowData}\n isEditMode={isEditMode}\n typeFormats={typeFormats}\n onUpdateProperty={updateProperty}\n onUpdateArrayItemType={updateArrayItemType}\n onNavigateToProperty={navigateToProperty}\n onNavigateToArrayItems={navigateToArrayItems}\n onRemoveProperty={removeProperty}\n />\n )}\n style={{ width: '70%' }}\n />\n </DataTable>\n </div>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { JsonSchemaProperty, NavigationItem } from '../types/JsonSchema';
|
|
2
|
+
export declare function validatePropertyName(name: string, propertyId: string, allProperties: JsonSchemaProperty[]): string | undefined;
|
|
3
|
+
export declare function buildBreadcrumbItems(eventTypeName: string, currentPath: string[]): NavigationItem[];
|
|
4
|
+
//# sourceMappingURL=schemaHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaHelpers.d.ts","sourceRoot":"","sources":["../../../SchemaEditor/schemaHelpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,MAAM,GAAG,SAAS,CAgB9H;AAKD,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAanG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
function validatePropertyName(name, propertyId, allProperties) {
|
|
2
|
+
if (!name || name.trim() === '') {
|
|
3
|
+
return 'Property name cannot be empty';
|
|
4
|
+
}
|
|
5
|
+
const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
6
|
+
if (!validIdentifierPattern.test(name)) {
|
|
7
|
+
return 'Property name must start with a letter or underscore and contain only letters, numbers, and underscores';
|
|
8
|
+
}
|
|
9
|
+
const duplicates = allProperties.filter(p => p.name === name && p.id !== propertyId);
|
|
10
|
+
if (duplicates.length > 0) {
|
|
11
|
+
return 'Property name must be unique';
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
function buildBreadcrumbItems(eventTypeName, currentPath) {
|
|
16
|
+
const items = [{ name: eventTypeName, path: [] }];
|
|
17
|
+
for (let i = 0; i < currentPath.length; i++) {
|
|
18
|
+
const segment = currentPath[i];
|
|
19
|
+
if (segment === '$items') {
|
|
20
|
+
items.push({ name: '[items]', path: currentPath.slice(0, i + 1) });
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
items.push({ name: segment, path: currentPath.slice(0, i + 1) });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return items;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { buildBreadcrumbItems, validatePropertyName };
|
|
30
|
+
//# sourceMappingURL=schemaHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaHelpers.js","sources":["../../../SchemaEditor/schemaHelpers.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { JsonSchemaProperty, NavigationItem } from '../types/JsonSchema';\n\n/**\n * Validates a property name, returning an error string or undefined if valid.\n */\nexport function validatePropertyName(name: string, propertyId: string, allProperties: JsonSchemaProperty[]): string | undefined {\n if (!name || name.trim() === '') {\n return 'Property name cannot be empty';\n }\n\n const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n if (!validIdentifierPattern.test(name)) {\n return 'Property name must start with a letter or underscore and contain only letters, numbers, and underscores';\n }\n\n const duplicates = allProperties.filter(p => p.name === name && p.id !== propertyId);\n if (duplicates.length > 0) {\n return 'Property name must be unique';\n }\n\n return undefined;\n}\n\n/**\n * Builds the list of breadcrumb navigation items from a path, using the event type name as the root.\n */\nexport function buildBreadcrumbItems(eventTypeName: string, currentPath: string[]): NavigationItem[] {\n const items: NavigationItem[] = [{ name: eventTypeName, path: [] }];\n\n for (let i = 0; i < currentPath.length; i++) {\n const segment = currentPath[i];\n if (segment === '$items') {\n items.push({ name: '[items]', path: currentPath.slice(0, i + 1) });\n } else {\n items.push({ name: segment, path: currentPath.slice(0, i + 1) });\n }\n }\n\n return items;\n}\n"],"names":[],"mappings":"SAQgB,oBAAoB,CAAC,IAAY,EAAE,UAAkB,EAAE,aAAmC,EAAA;IACtG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC7B,QAAA,OAAO,+BAA+B;IAC1C;IAEA,MAAM,sBAAsB,GAAG,0BAA0B;IACzD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACpC,QAAA,OAAO,yGAAyG;IACpH;IAEA,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC;AACpF,IAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,QAAA,OAAO,8BAA8B;IACzC;AAEA,IAAA,OAAO,SAAS;AACpB;AAKM,SAAU,oBAAoB,CAAC,aAAqB,EAAE,WAAqB,EAAA;AAC7E,IAAA,MAAM,KAAK,GAAqB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAEnE,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACzC,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;YACtB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACtE;aAAO;YACH,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACpE;IACJ;AAEA,IAAA,OAAO,KAAK;AAChB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Properties.d.ts","sourceRoot":"","sources":["../../../TimeMachine/Properties.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Properties.d.ts","sourceRoot":"","sources":["../../../TimeMachine/Properties.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,eAAe;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA4EhD,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { formatPropertyName } from './propertiesHelpers.js';
|
|
2
3
|
|
|
3
4
|
const Properties = ({ data, className, align = 'left' }) => {
|
|
4
5
|
const tableStyle = {
|
|
@@ -43,12 +44,6 @@ const Properties = ({ data, className, align = 'left' }) => {
|
|
|
43
44
|
}
|
|
44
45
|
return jsx("span", { children: String(value) });
|
|
45
46
|
};
|
|
46
|
-
const formatPropertyName = (key) => {
|
|
47
|
-
return key
|
|
48
|
-
.replace(/([A-Z])/g, ' $1')
|
|
49
|
-
.replace(/^./, str => str.toUpperCase())
|
|
50
|
-
.trim();
|
|
51
|
-
};
|
|
52
47
|
return (jsx("div", { className: className, children: jsx("table", { style: tableStyle, children: jsx("tbody", { children: data && Object.entries(data).map(([key, value], index) => (jsxs("tr", { style: rowStyle, children: [jsx("td", { style: labelStyle, children: formatPropertyName(key) }), jsx("td", { style: valueStyle, children: renderValue(value) })] }, `${key}-${index}`))) }) }) }));
|
|
53
48
|
};
|
|
54
49
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Properties.js","sources":["../../../TimeMachine/Properties.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React from 'react';\n\ninterface PropertiesProps {\n data: Record<string, unknown>;\n /** CSS class name for the container */\n className?: string;\n /** Text alignment for the table */\n align?: 'left' | 'right';\n}\n\nexport const Properties: React.FC<PropertiesProps> = ({ data, className, align = 'left' }) => {\n const tableStyle: React.CSSProperties = {\n width: '100%',\n borderCollapse: 'collapse',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Mono\", monospace',\n fontSize: '13px',\n };\n\n const rowStyle: React.CSSProperties = {\n borderBottom: '1px solid rgba(255,255,255,0.1)',\n };\n\n const labelStyle: React.CSSProperties = {\n padding: '8px 12px',\n color: 'rgba(255,255,255,0.6)',\n textAlign: align,\n fontWeight: 500,\n width: '40%',\n };\n\n const valueStyle: React.CSSProperties = {\n padding: '8px 12px',\n color: '#fff',\n textAlign: align,\n };\n\n const renderValue = (value: unknown): React.ReactNode => {\n if (value === null || value === undefined) {\n return <span style={{ color: 'rgba(255,255,255,0.4)' }}>null</span>;\n }\n\n if (typeof value === 'boolean') {\n return <span style={{ color: value ? '#4ade80' : '#f87171' }}>{value.toString()}</span>;\n }\n\n if (typeof value === 'number') {\n return <span style={{ color: '#fbbf24' }}>{value}</span>;\n }\n\n if (value instanceof Date) {\n return <span style={{ color: '#60a5fa' }}>{value.toLocaleString()}</span>;\n }\n\n if (Array.isArray(value)) {\n return (\n <span style={{ color: 'rgba(255,255,255,0.7)' }}>\n Array[{value.length}]\n </span>\n );\n }\n\n if (typeof value === 'object') {\n return (\n <span style={{ color: 'rgba(255,255,255,0.7)' }}>\n {'{'}...{'}'}\n </span>\n );\n }\n\n return <span>{String(value)}</span>;\n };\n\n
|
|
1
|
+
{"version":3,"file":"Properties.js","sources":["../../../TimeMachine/Properties.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React from 'react';\nimport { formatPropertyName } from './propertiesHelpers';\n\ninterface PropertiesProps {\n data: Record<string, unknown>;\n /** CSS class name for the container */\n className?: string;\n /** Text alignment for the table */\n align?: 'left' | 'right';\n}\n\nexport const Properties: React.FC<PropertiesProps> = ({ data, className, align = 'left' }) => {\n const tableStyle: React.CSSProperties = {\n width: '100%',\n borderCollapse: 'collapse',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"SF Mono\", monospace',\n fontSize: '13px',\n };\n\n const rowStyle: React.CSSProperties = {\n borderBottom: '1px solid rgba(255,255,255,0.1)',\n };\n\n const labelStyle: React.CSSProperties = {\n padding: '8px 12px',\n color: 'rgba(255,255,255,0.6)',\n textAlign: align,\n fontWeight: 500,\n width: '40%',\n };\n\n const valueStyle: React.CSSProperties = {\n padding: '8px 12px',\n color: '#fff',\n textAlign: align,\n };\n\n const renderValue = (value: unknown): React.ReactNode => {\n if (value === null || value === undefined) {\n return <span style={{ color: 'rgba(255,255,255,0.4)' }}>null</span>;\n }\n\n if (typeof value === 'boolean') {\n return <span style={{ color: value ? '#4ade80' : '#f87171' }}>{value.toString()}</span>;\n }\n\n if (typeof value === 'number') {\n return <span style={{ color: '#fbbf24' }}>{value}</span>;\n }\n\n if (value instanceof Date) {\n return <span style={{ color: '#60a5fa' }}>{value.toLocaleString()}</span>;\n }\n\n if (Array.isArray(value)) {\n return (\n <span style={{ color: 'rgba(255,255,255,0.7)' }}>\n Array[{value.length}]\n </span>\n );\n }\n\n if (typeof value === 'object') {\n return (\n <span style={{ color: 'rgba(255,255,255,0.7)' }}>\n {'{'}...{'}'}\n </span>\n );\n }\n\n return <span>{String(value)}</span>;\n };\n\n return (\n <div className={className}>\n <table style={tableStyle}>\n <tbody>\n {data && Object.entries(data).map(([key, value], index) => (\n <tr key={`${key}-${index}`} style={rowStyle}>\n <td style={labelStyle}>{formatPropertyName(key)}</td>\n <td style={valueStyle}>{renderValue(value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propertiesHelpers.d.ts","sourceRoot":"","sources":["../../../TimeMachine/propertiesHelpers.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propertiesHelpers.js","sources":["../../../TimeMachine/propertiesHelpers.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/**\n * Converts a camelCase property key to a human-readable Title Case label with spaces.\n */\nexport function formatPropertyName(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n}\n"],"names":[],"mappings":"AAMM,SAAU,kBAAkB,CAAC,GAAW,EAAA;AAC1C,IAAA,OAAO;AACF,SAAA,OAAO,CAAC,UAAU,EAAE,KAAK;SACzB,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE;AACtC,SAAA,IAAI,EAAE;AACf;;;;"}
|
|
@@ -0,0 +1,131 @@
|
|
|
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
|
+
/* ── Toolbar container ───────────────────────────────────────────────────── */
|
|
5
|
+
.toolbar {
|
|
6
|
+
background: var(--surface-card);
|
|
7
|
+
border: 1px solid var(--surface-border);
|
|
8
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* ── Toolbar button ──────────────────────────────────────────────────────── */
|
|
12
|
+
.toolbar-button {
|
|
13
|
+
color: var(--text-color-secondary);
|
|
14
|
+
background: transparent;
|
|
15
|
+
border: none;
|
|
16
|
+
transition: background 0.15s, color 0.15s;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.toolbar-button:hover {
|
|
20
|
+
background: var(--surface-100);
|
|
21
|
+
color: var(--text-color);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.toolbar-button--active {
|
|
25
|
+
background: var(--primary-color);
|
|
26
|
+
color: var(--primary-color-text);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.toolbar-button--active:hover {
|
|
30
|
+
background: var(--primary-color);
|
|
31
|
+
color: var(--primary-color-text);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* ── Toolbar project name label ──────────────────────────────────────────── */
|
|
35
|
+
.toolbar-project-name {
|
|
36
|
+
padding: 0 8px;
|
|
37
|
+
font-size: 0.875rem;
|
|
38
|
+
font-weight: 500;
|
|
39
|
+
color: var(--text-color);
|
|
40
|
+
white-space: nowrap;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* ── Toolbar section (context switching) ────────────────────────────────── */
|
|
44
|
+
|
|
45
|
+
/*
|
|
46
|
+
* The section is a fixed-size container that transitions smoothly between
|
|
47
|
+
* the dimensions required by each context.
|
|
48
|
+
* overflow is intentionally left as visible so that absolutely-positioned
|
|
49
|
+
* children (e.g. fan-out panels) can extend beyond the section's bounds.
|
|
50
|
+
* Inactive contexts are hidden via opacity/pointer-events, not overflow clipping.
|
|
51
|
+
*/
|
|
52
|
+
.toolbar-section {
|
|
53
|
+
position: relative;
|
|
54
|
+
transition:
|
|
55
|
+
width 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
56
|
+
height 0.35s cubic-bezier(0.4, 0, 0.2, 1);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* Every context is absolutely stacked at the top-left of the section.
|
|
61
|
+
* Only the active one is visible; the others fade out and lose pointer events.
|
|
62
|
+
*/
|
|
63
|
+
.toolbar-context {
|
|
64
|
+
position: absolute;
|
|
65
|
+
top: 0;
|
|
66
|
+
left: 0;
|
|
67
|
+
transition: opacity 0.2s ease;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.toolbar-context--active {
|
|
71
|
+
opacity: 1;
|
|
72
|
+
pointer-events: auto;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.toolbar-context--inactive {
|
|
76
|
+
opacity: 0;
|
|
77
|
+
pointer-events: none;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* ── Toolbar fan-out item ────────────────────────────────────────────────── */
|
|
81
|
+
|
|
82
|
+
/*
|
|
83
|
+
* The wrapper provides the positioning context for the absolutely-placed panel.
|
|
84
|
+
*/
|
|
85
|
+
.toolbar-fanout-item {
|
|
86
|
+
position: relative;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/*
|
|
90
|
+
* The fan-out panel is a floating pill that mirrors the Toolbar container style.
|
|
91
|
+
* When collapsed, it's hidden. When expanded, it appears elevated at the same
|
|
92
|
+
* position as the trigger button, with the trigger button as the first item.
|
|
93
|
+
* Vertically centered with where the collapsed button would be.
|
|
94
|
+
*/
|
|
95
|
+
.toolbar-fanout-panel {
|
|
96
|
+
position: absolute;
|
|
97
|
+
top: 50%;
|
|
98
|
+
left: calc(-0.5rem - 1px);
|
|
99
|
+
transform: translateY(-50%);
|
|
100
|
+
display: inline-flex;
|
|
101
|
+
flex-direction: row;
|
|
102
|
+
align-items: center;
|
|
103
|
+
gap: 0.25rem;
|
|
104
|
+
padding: 0.5rem;
|
|
105
|
+
background: var(--surface-card);
|
|
106
|
+
border: 1px solid var(--surface-border);
|
|
107
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
108
|
+
border-radius: 1rem;
|
|
109
|
+
white-space: nowrap;
|
|
110
|
+
z-index: 10;
|
|
111
|
+
pointer-events: none;
|
|
112
|
+
opacity: 0;
|
|
113
|
+
clip-path: inset(0 100% 0 0 round 1rem);
|
|
114
|
+
transition:
|
|
115
|
+
clip-path 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
116
|
+
opacity 0.2s ease;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* Panel fans out to the left — reveal animates right → left */
|
|
120
|
+
.toolbar-fanout-panel--left {
|
|
121
|
+
left: auto;
|
|
122
|
+
right: calc(-0.5rem - 1px);
|
|
123
|
+
clip-path: inset(0 0 0 100% round 1rem);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Expanded state — fully visible, pointer events restored */
|
|
127
|
+
.toolbar-fanout-panel--visible {
|
|
128
|
+
clip-path: inset(0 0 0 0 round 1rem);
|
|
129
|
+
opacity: 1;
|
|
130
|
+
pointer-events: auto;
|
|
131
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import './Toolbar.css';
|
|
3
|
+
export interface ToolbarProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
orientation?: 'vertical' | 'horizontal';
|
|
6
|
+
}
|
|
7
|
+
export declare const Toolbar: ({ children, orientation }: ToolbarProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=Toolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../Toolbar/Toolbar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,eAAe,CAAC;AAGvB,MAAM,WAAW,YAAY;IAEzB,QAAQ,EAAE,SAAS,CAAC;IAEpB,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;CAC3C;AAOD,eAAO,MAAM,OAAO,GAAI,2BAAwC,YAAY,4CAQ3E,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import './Toolbar.css';
|
|
3
|
+
|
|
4
|
+
const Toolbar = ({ children, orientation = 'vertical' }) => (jsx("div", { className: `toolbar inline-flex ${orientation === 'horizontal' ? 'flex-row' : 'flex-col'} items-center gap-1 p-2 rounded-2xl`, children: children }));
|
|
5
|
+
|
|
6
|
+
export { Toolbar };
|
|
7
|
+
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sources":["../../../Toolbar/Toolbar.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ReactNode } from 'react';\nimport './Toolbar.css';\n\n/** Props for the {@link Toolbar} component. */\nexport interface ToolbarProps {\n /** The {@link ToolbarButton} elements to render inside this toolbar group. */\n children: ReactNode;\n /** Layout direction of the toolbar (default: 'vertical'). */\n orientation?: 'vertical' | 'horizontal';\n}\n\n/**\n * A toolbar container that groups icon buttons with a rounded border,\n * mimicking the style of tools panels found in canvas-based applications.\n * Supports both vertical (default) and horizontal orientations.\n */\nexport const Toolbar = ({ children, orientation = 'vertical' }: ToolbarProps) => (\n <div\n className={`toolbar inline-flex ${\n orientation === 'horizontal' ? 'flex-row' : 'flex-col'\n } items-center gap-1 p-2 rounded-2xl`}\n >\n {children}\n </div>\n);\n"],"names":["_jsx"],"mappings":";;;AAmBO,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,UAAU,EAAgB,MACxEA,GAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAE,CAAA,oBAAA,EACP,WAAW,KAAK,YAAY,GAAG,UAAU,GAAG,UAChD,CAAA,mCAAA,CAAqC,EAAA,QAAA,EAEpC,QAAQ,EAAA,CACP;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { Toolbar } from './Toolbar';
|
|
3
|
+
declare const meta: Meta<typeof Toolbar>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof Toolbar>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const MultipleGroups: Story;
|
|
8
|
+
export declare const WithActiveButton: Story;
|
|
9
|
+
export declare const WithContexts: Story;
|
|
10
|
+
export declare const WithFanOut: Story;
|
|
11
|
+
//# sourceMappingURL=Toolbar.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.stories.d.ts","sourceRoot":"","sources":["../../../Toolbar/Toolbar.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,OAAO,CAM9B,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,OAAO,CAAC,CAAC;AAGtC,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,KAgB5B,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,KAqC9B,CAAC;AASF,eAAO,MAAM,YAAY,EAAE,KAoD1B,CAAC;AAQF,eAAO,MAAM,UAAU,EAAE,KA+CxB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Toolbar } from './Toolbar';
|
|
4
|
+
import { ToolbarButton } from './ToolbarButton';
|
|
5
|
+
import { ToolbarContext } from './ToolbarContext';
|
|
6
|
+
import { ToolbarFanOutItem } from './ToolbarFanOutItem';
|
|
7
|
+
import { ToolbarSection } from './ToolbarSection';
|
|
8
|
+
const meta = {
|
|
9
|
+
title: 'Components/Toolbar',
|
|
10
|
+
component: Toolbar,
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: 'centered',
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
export default meta;
|
|
16
|
+
export const Default = {
|
|
17
|
+
render: () => (_jsxs(Toolbar, { children: [_jsx(ToolbarButton, { icon: 'pi pi-arrow-up-left', tooltip: 'Select' }), _jsx(ToolbarButton, { icon: 'pi pi-clone', tooltip: 'Layers' }), _jsx(ToolbarButton, { icon: 'pi pi-circle', tooltip: 'Shapes' }), _jsx(ToolbarButton, { icon: 'pi pi-stop', tooltip: 'Rectangle' }), _jsx(ToolbarButton, { icon: 'pi pi-file', tooltip: 'Sticky note' })] })),
|
|
18
|
+
};
|
|
19
|
+
export const MultipleGroups = {
|
|
20
|
+
render: () => (_jsxs("div", { className: 'flex flex-col gap-2', children: [_jsxs(Toolbar, { children: [_jsx(ToolbarButton, { icon: 'pi pi-arrow-up-left', tooltip: 'Select' }), _jsx(ToolbarButton, { icon: 'pi pi-clone', tooltip: 'Layers' }), _jsx(ToolbarButton, { icon: 'pi pi-circle', tooltip: 'Shapes' }), _jsx(ToolbarButton, { icon: 'pi pi-stop', tooltip: 'Rectangle' }), _jsx(ToolbarButton, { icon: 'pi pi-file', tooltip: 'Sticky note' })] }), _jsxs(Toolbar, { children: [_jsx(ToolbarButton, { icon: 'pi pi-undo', tooltip: 'Undo' }), _jsx(ToolbarButton, { icon: 'pi pi-refresh', tooltip: 'Redo' })] })] })),
|
|
21
|
+
};
|
|
22
|
+
export const WithActiveButton = {
|
|
23
|
+
render: () => {
|
|
24
|
+
const ActiveDemo = () => {
|
|
25
|
+
const [active, setActive] = useState('select');
|
|
26
|
+
return (_jsxs(Toolbar, { children: [_jsx(ToolbarButton, { icon: 'pi pi-arrow-up-left', tooltip: 'Select', active: active === 'select', onClick: () => setActive('select') }), _jsx(ToolbarButton, { icon: 'pi pi-clone', tooltip: 'Layers', active: active === 'layers', onClick: () => setActive('layers') }), _jsx(ToolbarButton, { icon: 'pi pi-stop', tooltip: 'Rectangle', active: active === 'rectangle', onClick: () => setActive('rectangle') }), _jsx(ToolbarButton, { icon: 'pi pi-file', tooltip: 'Sticky note', active: active === 'sticky', onClick: () => setActive('sticky') })] }));
|
|
27
|
+
};
|
|
28
|
+
return _jsx(ActiveDemo, {});
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
export const WithContexts = {
|
|
32
|
+
render: () => {
|
|
33
|
+
const WithContextsDemo = () => {
|
|
34
|
+
const [currentContext, setCurrentContext] = useState('drawing');
|
|
35
|
+
return (_jsxs("div", { className: 'flex flex-col items-center gap-6', children: [_jsxs(Toolbar, { children: [_jsx(ToolbarButton, { icon: 'pi pi-arrow-up-left', tooltip: 'Select' }), _jsxs(ToolbarSection, { activeContext: currentContext, children: [_jsxs(ToolbarContext, { name: 'drawing', children: [_jsx(ToolbarButton, { icon: 'pi pi-pencil', tooltip: 'Draw' }), _jsx(ToolbarButton, { icon: 'pi pi-stop', tooltip: 'Rectangle' }), _jsx(ToolbarButton, { icon: 'pi pi-circle', tooltip: 'Circle' }), _jsx(ToolbarButton, { icon: 'pi pi-minus', tooltip: 'Line' })] }), _jsxs(ToolbarContext, { name: 'text', children: [_jsx(ToolbarButton, { icon: 'pi pi-align-center', tooltip: 'Align Center' }), _jsx(ToolbarButton, { icon: 'pi pi-align-left', tooltip: 'Align Left' })] })] }), _jsx(ToolbarButton, { icon: 'pi pi-undo', tooltip: 'Undo' })] }), _jsxs("div", { className: 'flex gap-2', children: [_jsx("button", { type: 'button', onClick: () => setCurrentContext('drawing'), className: `px-3 py-1 rounded text-sm transition-colors ${currentContext === 'drawing'
|
|
36
|
+
? 'bg-blue-600 text-white'
|
|
37
|
+
: 'bg-gray-600 text-gray-200 hover:bg-gray-500'}`, children: "Drawing tools" }), _jsx("button", { type: 'button', onClick: () => setCurrentContext('text'), className: `px-3 py-1 rounded text-sm transition-colors ${currentContext === 'text'
|
|
38
|
+
? 'bg-blue-600 text-white'
|
|
39
|
+
: 'bg-gray-600 text-gray-200 hover:bg-gray-500'}`, children: "Text tools" })] })] }));
|
|
40
|
+
};
|
|
41
|
+
return _jsx(WithContextsDemo, {});
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export const WithFanOut = {
|
|
45
|
+
render: () => {
|
|
46
|
+
const WithFanOutDemo = () => {
|
|
47
|
+
const [activeTool, setActiveTool] = useState('select');
|
|
48
|
+
return (_jsxs("div", { className: 'flex flex-col gap-2', children: [_jsxs(Toolbar, { children: [_jsx(ToolbarButton, { icon: 'pi pi-arrow-up-left', tooltip: 'Select', active: activeTool === 'select', onClick: () => setActiveTool('select') }), _jsxs(ToolbarFanOutItem, { icon: 'pi pi-th-large', tooltip: 'Shapes', children: [_jsx(ToolbarButton, { icon: 'pi pi-th-large', tooltip: 'Shapes', onClick: () => setActiveTool('shapes') }), _jsx(ToolbarButton, { icon: 'pi pi-exclamation-circle', tooltip: 'Info', onClick: () => setActiveTool('info') }), _jsx(ToolbarButton, { icon: 'pi pi-eye', tooltip: 'Preview', onClick: () => setActiveTool('preview') }), _jsx(ToolbarButton, { icon: 'pi pi-cog', tooltip: 'Settings', onClick: () => setActiveTool('settings') }), _jsx(ToolbarButton, { icon: 'pi pi-external-link', tooltip: 'Open', onClick: () => setActiveTool('open') })] }), _jsx(ToolbarButton, { icon: 'pi pi-stop', tooltip: 'Rectangle', active: activeTool === 'rectangle', onClick: () => setActiveTool('rectangle') }), _jsx(ToolbarButton, { icon: 'pi pi-file', tooltip: 'Sticky note', active: activeTool === 'sticky', onClick: () => setActiveTool('sticky') })] }), _jsxs(Toolbar, { children: [_jsx(ToolbarButton, { icon: 'pi pi-undo', tooltip: 'Undo' }), _jsx(ToolbarButton, { icon: 'pi pi-refresh', tooltip: 'Redo' })] })] }));
|
|
49
|
+
};
|
|
50
|
+
return _jsx(WithFanOutDemo, {});
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=Toolbar.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.stories.js","sourceRoot":"","sources":["../../../Toolbar/Toolbar.stories.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TooltipPosition } from '../Common/Tooltip';
|
|
2
|
+
export interface ToolbarButtonProps {
|
|
3
|
+
icon: string;
|
|
4
|
+
tooltip: string;
|
|
5
|
+
active?: boolean;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
tooltipPosition?: TooltipPosition;
|
|
8
|
+
}
|
|
9
|
+
export declare const ToolbarButton: ({ icon, tooltip, active, onClick, tooltipPosition }: ToolbarButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=ToolbarButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolbarButton.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarButton.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,WAAW,kBAAkB;IAE/B,IAAI,EAAE,MAAM,CAAC;IAGb,OAAO,EAAE,MAAM,CAAC;IAGhB,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAGrB,eAAe,CAAC,EAAE,eAAe,CAAC;CACrC;AAMD,eAAO,MAAM,aAAa,GAAI,qDAAuE,kBAAkB,4CAetH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Tooltip } from '../Common/Tooltip.js';
|
|
3
|
+
|
|
4
|
+
const ToolbarButton = ({ icon, tooltip, active = false, onClick, tooltipPosition = 'right' }) => {
|
|
5
|
+
const activeClass = active ? 'toolbar-button--active' : '';
|
|
6
|
+
return (jsx(Tooltip, { content: tooltip, position: tooltipPosition, children: jsx("button", { type: 'button', "aria-label": tooltip, onClick: onClick, className: `toolbar-button w-10 h-10 flex items-center justify-center rounded-lg cursor-pointer ${activeClass}`, children: jsx("i", { className: `${icon} text-lg` }) }) }));
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export { ToolbarButton };
|
|
10
|
+
//# sourceMappingURL=ToolbarButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolbarButton.js","sources":["../../../Toolbar/ToolbarButton.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Tooltip } from '../Common/Tooltip';\nimport type { TooltipPosition } from '../Common/Tooltip';\n\n/** Props for the {@link ToolbarButton} component. */\nexport interface ToolbarButtonProps {\n /** The PrimeIcons CSS class to use as the icon (e.g. 'pi pi-home'). */\n icon: string;\n\n /** Tooltip text shown when the user hovers over the button. */\n tooltip: string;\n\n /** Whether the button is currently in the active/selected state. */\n active?: boolean;\n\n /** Callback invoked when the button is clicked. */\n onClick?: () => void;\n\n /** Position of the tooltip relative to the button (default: 'right'). */\n tooltipPosition?: TooltipPosition;\n}\n\n/**\n * An icon button with a tooltip, intended to be placed inside a {@link Toolbar}.\n * Uses the shared {@link Tooltip} component for consistent hover labels.\n */\nexport const ToolbarButton = ({ icon, tooltip, active = false, onClick, tooltipPosition = 'right' }: ToolbarButtonProps) => {\n const activeClass = active ? 'toolbar-button--active' : '';\n\n return (\n <Tooltip content={tooltip} position={tooltipPosition}>\n <button\n type='button'\n aria-label={tooltip}\n onClick={onClick}\n className={`toolbar-button w-10 h-10 flex items-center justify-center rounded-lg cursor-pointer ${activeClass}`}\n >\n <i className={`${icon} text-lg`} />\n </button>\n </Tooltip>\n );\n};\n"],"names":["_jsx"],"mappings":";;;MA4Ba,aAAa,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,EAAsB,KAAI;IACvH,MAAM,WAAW,GAAG,MAAM,GAAG,wBAAwB,GAAG,EAAE;AAE1D,IAAA,QACIA,GAAA,CAAC,OAAO,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAA,QAAA,EAChDA,GAAA,CAAA,QAAA,EAAA,EACI,IAAI,EAAC,QAAQ,gBACD,OAAO,EACnB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,CAAA,oFAAA,EAAuF,WAAW,EAAE,EAAA,QAAA,EAE/GA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAE,GAAG,IAAI,CAAA,QAAA,CAAU,GAAI,EAAA,CAC9B,EAAA,CACH;AAElB;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolbarContext.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarContext.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C,MAAM,WAAW,mBAAmB;IAEhC,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,SAAS,CAAC;CACvB;AAQD,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolbarContext.js","sources":["../../../Toolbar/ToolbarContext.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { FC, ReactNode } from 'react';\n\n/** Props for the {@link ToolbarContext} component. */\nexport interface ToolbarContextProps {\n /** Unique name identifying this context within a {@link ToolbarSection}. */\n name: string;\n /** The toolbar items to render when this context is active. */\n children: ReactNode;\n}\n\n/**\n * Defines a named context (a set of toolbar items) within a {@link ToolbarSection}.\n * The section renders only the active context at a time and animates between them.\n *\n * This is a data-only component; its rendering is fully managed by {@link ToolbarSection}.\n */\nexport const ToolbarContext: FC<ToolbarContextProps> = () => null;\n"],"names":[],"mappings":"MAmBa,cAAc,GAA4B,MAAM;;;;"}
|