brep-io-kernel 1.0.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/LICENSE.md +32 -0
- package/README.md +144 -0
- package/dist-kernel/brep-kernel.js +74699 -0
- package/dist-kernel/help/CONTRIBUTING.html +248 -0
- package/dist-kernel/help/LICENSE.html +248 -0
- package/dist-kernel/help/MODELING.png +0 -0
- package/dist-kernel/help/PMI.png +0 -0
- package/dist-kernel/help/SKETCH.png +0 -0
- package/dist-kernel/help/assembly-constraints__Coincident_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Angle_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Distance_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Fixed_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Parallel_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints___Touch_Align_Constraint_dialog.png +0 -0
- package/dist-kernel/help/assembly-constraints__angle-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__coincident-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__distance-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__fixed-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__parallel-constraint.html +248 -0
- package/dist-kernel/help/assembly-constraints__solver.html +248 -0
- package/dist-kernel/help/assembly-constraints__touch-align-constraint.html +248 -0
- package/dist-kernel/help/brep-api.html +263 -0
- package/dist-kernel/help/brep-kernel.html +258 -0
- package/dist-kernel/help/brep-model.html +248 -0
- package/dist-kernel/help/cylindrical-face-radius-embedding.html +290 -0
- package/dist-kernel/help/dialog-screenshots.html +248 -0
- package/dist-kernel/help/extruded-sketch-radius-embedding.html +336 -0
- package/dist-kernel/help/features__Assembly_Component_dialog.png +0 -0
- package/dist-kernel/help/features__Boolean_dialog.png +0 -0
- package/dist-kernel/help/features__Chamfer_dialog.png +0 -0
- package/dist-kernel/help/features__Datium_dialog.png +0 -0
- package/dist-kernel/help/features__Extrude_dialog.png +0 -0
- package/dist-kernel/help/features__Fillet_dialog.png +0 -0
- package/dist-kernel/help/features__Helix_dialog.png +0 -0
- package/dist-kernel/help/features__Hole_dialog.png +0 -0
- package/dist-kernel/help/features__Image_Heightmap_Solid_dialog.png +0 -0
- package/dist-kernel/help/features__Image_to_Face_dialog.png +0 -0
- package/dist-kernel/help/features__Import_3D_Model_dialog.png +0 -0
- package/dist-kernel/help/features__Loft_dialog.png +0 -0
- package/dist-kernel/help/features__Mirror_dialog.png +0 -0
- package/dist-kernel/help/features__Offset_Shell_dialog.png +0 -0
- package/dist-kernel/help/features__Overlap_Cleanup_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_Linear_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_Radial_dialog.png +0 -0
- package/dist-kernel/help/features__Pattern_dialog.png +0 -0
- package/dist-kernel/help/features__Plane_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cone_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cube_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Cylinder_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Pyramid_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Sphere_dialog.png +0 -0
- package/dist-kernel/help/features__Primitive_Torus_dialog.png +0 -0
- package/dist-kernel/help/features__Remesh_dialog.png +0 -0
- package/dist-kernel/help/features__Revolve_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Contour_Flange_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Cutout_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Flange_dialog.png +0 -0
- package/dist-kernel/help/features__Sheet_Metal_Tab_dialog.png +0 -0
- package/dist-kernel/help/features__Sketch_dialog.png +0 -0
- package/dist-kernel/help/features__Spline_dialog.png +0 -0
- package/dist-kernel/help/features__Sweep_dialog.png +0 -0
- package/dist-kernel/help/features__Transform_dialog.png +0 -0
- package/dist-kernel/help/features__Tube_dialog.png +0 -0
- package/dist-kernel/help/features__assembly-component.html +248 -0
- package/dist-kernel/help/features__boolean.html +248 -0
- package/dist-kernel/help/features__chamfer.html +248 -0
- package/dist-kernel/help/features__datium.html +248 -0
- package/dist-kernel/help/features__datum.html +248 -0
- package/dist-kernel/help/features__extrude.html +248 -0
- package/dist-kernel/help/features__fillet.html +248 -0
- package/dist-kernel/help/features__helix.html +248 -0
- package/dist-kernel/help/features__hole.html +248 -0
- package/dist-kernel/help/features__image-heightmap-solid.html +248 -0
- package/dist-kernel/help/features__image-to-face-2D_dialog.png +0 -0
- package/dist-kernel/help/features__image-to-face-3D_dialog.png +0 -0
- package/dist-kernel/help/features__image-to-face.html +248 -0
- package/dist-kernel/help/features__import-3d-model.html +248 -0
- package/dist-kernel/help/features__index.html +248 -0
- package/dist-kernel/help/features__loft.html +248 -0
- package/dist-kernel/help/features__mirror.html +248 -0
- package/dist-kernel/help/features__offset-shell.html +248 -0
- package/dist-kernel/help/features__pattern-linear.html +248 -0
- package/dist-kernel/help/features__pattern-radial.html +248 -0
- package/dist-kernel/help/features__pattern.html +248 -0
- package/dist-kernel/help/features__plane.html +248 -0
- package/dist-kernel/help/features__primitive-cone.html +248 -0
- package/dist-kernel/help/features__primitive-cube.html +248 -0
- package/dist-kernel/help/features__primitive-cylinder.html +248 -0
- package/dist-kernel/help/features__primitive-pyramid.html +248 -0
- package/dist-kernel/help/features__primitive-sphere.html +248 -0
- package/dist-kernel/help/features__primitive-torus.html +248 -0
- package/dist-kernel/help/features__remesh.html +248 -0
- package/dist-kernel/help/features__revolve.html +248 -0
- package/dist-kernel/help/features__sheet-metal-contour-flange.html +248 -0
- package/dist-kernel/help/features__sheet-metal-flange.html +248 -0
- package/dist-kernel/help/features__sheet-metal-tab.html +248 -0
- package/dist-kernel/help/features__sketch.html +248 -0
- package/dist-kernel/help/features__spline.html +248 -0
- package/dist-kernel/help/features__sweep.html +248 -0
- package/dist-kernel/help/features__transform.html +248 -0
- package/dist-kernel/help/features__tube.html +248 -0
- package/dist-kernel/help/file-formats.html +248 -0
- package/dist-kernel/help/getting-started.html +248 -0
- package/dist-kernel/help/highlights.html +248 -0
- package/dist-kernel/help/history-systems.html +248 -0
- package/dist-kernel/help/how-it-works.html +248 -0
- package/dist-kernel/help/index.html +862 -0
- package/dist-kernel/help/input-params-schema.html +363 -0
- package/dist-kernel/help/inspector-improvements.html +248 -0
- package/dist-kernel/help/inspector.html +248 -0
- package/dist-kernel/help/modes__modeling.html +248 -0
- package/dist-kernel/help/modes__pmi.html +248 -0
- package/dist-kernel/help/modes__sketch.html +248 -0
- package/dist-kernel/help/plugins.html +248 -0
- package/dist-kernel/help/pmi-annotations__Angle_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Explode_Body_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Hole_Callout_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Leader_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Linear_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Note_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__Radial_Dimension_dialog.png +0 -0
- package/dist-kernel/help/pmi-annotations__angle-dimension.html +248 -0
- package/dist-kernel/help/pmi-annotations__explode-body.html +248 -0
- package/dist-kernel/help/pmi-annotations__hole-callout.html +248 -0
- package/dist-kernel/help/pmi-annotations__index.html +248 -0
- package/dist-kernel/help/pmi-annotations__leader.html +248 -0
- package/dist-kernel/help/pmi-annotations__linear-dimension.html +248 -0
- package/dist-kernel/help/pmi-annotations__note.html +248 -0
- package/dist-kernel/help/pmi-annotations__radial-dimension.html +248 -0
- package/dist-kernel/help/search-index.json +464 -0
- package/dist-kernel/help/simplified-radial-dimensions.html +298 -0
- package/dist-kernel/help/solid-methods.html +359 -0
- package/dist-kernel/help/table-of-contents.html +330 -0
- package/dist-kernel/help/ui-overview.html +248 -0
- package/dist-kernel/help/whats-new.html +248 -0
- package/package.json +54 -0
- package/src/BREP/AssemblyComponent.js +42 -0
- package/src/BREP/BREP.js +43 -0
- package/src/BREP/BetterSolid.js +805 -0
- package/src/BREP/Edge.js +103 -0
- package/src/BREP/Extrude.js +403 -0
- package/src/BREP/Face.js +187 -0
- package/src/BREP/MeshRepairer.js +634 -0
- package/src/BREP/OffsetShellSolid.js +614 -0
- package/src/BREP/PointCloudWrap.js +302 -0
- package/src/BREP/Revolve.js +345 -0
- package/src/BREP/SolidMethods/authoring.js +112 -0
- package/src/BREP/SolidMethods/booleanOps.js +230 -0
- package/src/BREP/SolidMethods/chamfer.js +122 -0
- package/src/BREP/SolidMethods/edgeResolution.js +25 -0
- package/src/BREP/SolidMethods/fillet.js +792 -0
- package/src/BREP/SolidMethods/index.js +72 -0
- package/src/BREP/SolidMethods/io.js +105 -0
- package/src/BREP/SolidMethods/lifecycle.js +103 -0
- package/src/BREP/SolidMethods/manifoldOps.js +375 -0
- package/src/BREP/SolidMethods/meshCleanup.js +2512 -0
- package/src/BREP/SolidMethods/meshQueries.js +264 -0
- package/src/BREP/SolidMethods/metadata.js +106 -0
- package/src/BREP/SolidMethods/metrics.js +51 -0
- package/src/BREP/SolidMethods/transforms.js +361 -0
- package/src/BREP/SolidMethods/visualize.js +508 -0
- package/src/BREP/SolidShared.js +26 -0
- package/src/BREP/Sweep.js +1596 -0
- package/src/BREP/Tube.js +857 -0
- package/src/BREP/Vertex.js +43 -0
- package/src/BREP/applyBooleanOperation.js +704 -0
- package/src/BREP/boundsUtils.js +48 -0
- package/src/BREP/chamfer.js +551 -0
- package/src/BREP/edgePolylineUtils.js +85 -0
- package/src/BREP/fillets/common.js +388 -0
- package/src/BREP/fillets/fillet.js +1422 -0
- package/src/BREP/fillets/filletGeometry.js +15 -0
- package/src/BREP/fillets/inset.js +389 -0
- package/src/BREP/fillets/offsetHelper.js +143 -0
- package/src/BREP/fillets/outset.js +88 -0
- package/src/BREP/helix.js +193 -0
- package/src/BREP/meshToBrep.js +234 -0
- package/src/BREP/primitives.js +279 -0
- package/src/BREP/setupManifold.js +71 -0
- package/src/BREP/threadGeometry.js +1120 -0
- package/src/BREP/triangleUtils.js +8 -0
- package/src/BREP/triangulate.js +608 -0
- package/src/FeatureRegistry.js +183 -0
- package/src/PartHistory.js +1132 -0
- package/src/UI/AccordionWidget.js +292 -0
- package/src/UI/CADmaterials.js +850 -0
- package/src/UI/EnvMonacoEditor.js +522 -0
- package/src/UI/FloatingWindow.js +396 -0
- package/src/UI/HistoryWidget.js +457 -0
- package/src/UI/MainToolbar.js +131 -0
- package/src/UI/ModelLibraryView.js +194 -0
- package/src/UI/OrthoCameraIdle.js +206 -0
- package/src/UI/PluginsWidget.js +280 -0
- package/src/UI/SceneListing.js +606 -0
- package/src/UI/SelectionFilter.js +629 -0
- package/src/UI/ViewCube.js +389 -0
- package/src/UI/assembly/AssemblyConstraintCollectionWidget.js +329 -0
- package/src/UI/assembly/AssemblyConstraintControlsWidget.js +282 -0
- package/src/UI/assembly/AssemblyConstraintsWidget.css +292 -0
- package/src/UI/assembly/AssemblyConstraintsWidget.js +1373 -0
- package/src/UI/assembly/constraintFaceUtils.js +115 -0
- package/src/UI/assembly/constraintHighlightUtils.js +70 -0
- package/src/UI/assembly/constraintLabelUtils.js +31 -0
- package/src/UI/assembly/constraintPointUtils.js +64 -0
- package/src/UI/assembly/constraintSelectionUtils.js +185 -0
- package/src/UI/assembly/constraintStatusUtils.js +142 -0
- package/src/UI/componentSelectorModal.js +240 -0
- package/src/UI/controls/CombinedTransformControls.js +386 -0
- package/src/UI/dialogs.js +351 -0
- package/src/UI/expressionsManager.js +100 -0
- package/src/UI/featureDialogWidgets/booleanField.js +25 -0
- package/src/UI/featureDialogWidgets/booleanOperationField.js +97 -0
- package/src/UI/featureDialogWidgets/buttonField.js +45 -0
- package/src/UI/featureDialogWidgets/componentSelectorField.js +102 -0
- package/src/UI/featureDialogWidgets/defaultField.js +23 -0
- package/src/UI/featureDialogWidgets/fileField.js +66 -0
- package/src/UI/featureDialogWidgets/index.js +34 -0
- package/src/UI/featureDialogWidgets/numberField.js +165 -0
- package/src/UI/featureDialogWidgets/optionsField.js +33 -0
- package/src/UI/featureDialogWidgets/referenceSelectionField.js +208 -0
- package/src/UI/featureDialogWidgets/stringField.js +24 -0
- package/src/UI/featureDialogWidgets/textareaField.js +28 -0
- package/src/UI/featureDialogWidgets/threadDesignationField.js +160 -0
- package/src/UI/featureDialogWidgets/transformField.js +252 -0
- package/src/UI/featureDialogWidgets/utils.js +43 -0
- package/src/UI/featureDialogWidgets/vec3Field.js +133 -0
- package/src/UI/featureDialogs.js +1414 -0
- package/src/UI/fileManagerWidget.js +615 -0
- package/src/UI/history/HistoryCollectionWidget.js +1294 -0
- package/src/UI/history/historyCollectionWidget.css.js +257 -0
- package/src/UI/history/historyDisplayInfo.js +133 -0
- package/src/UI/mobile.js +28 -0
- package/src/UI/objectDump.js +442 -0
- package/src/UI/pmi/AnnotationCollectionWidget.js +120 -0
- package/src/UI/pmi/AnnotationHistory.js +353 -0
- package/src/UI/pmi/AnnotationRegistry.js +90 -0
- package/src/UI/pmi/BaseAnnotation.js +269 -0
- package/src/UI/pmi/LabelOverlay.css +102 -0
- package/src/UI/pmi/LabelOverlay.js +191 -0
- package/src/UI/pmi/PMIMode.js +1550 -0
- package/src/UI/pmi/PMIViewsWidget.js +1098 -0
- package/src/UI/pmi/annUtils.js +729 -0
- package/src/UI/pmi/dimensions/AngleDimensionAnnotation.js +647 -0
- package/src/UI/pmi/dimensions/ExplodeBodyAnnotation.js +507 -0
- package/src/UI/pmi/dimensions/HoleCalloutAnnotation.js +462 -0
- package/src/UI/pmi/dimensions/LeaderAnnotation.js +403 -0
- package/src/UI/pmi/dimensions/LinearDimensionAnnotation.js +532 -0
- package/src/UI/pmi/dimensions/NoteAnnotation.js +110 -0
- package/src/UI/pmi/dimensions/RadialDimensionAnnotation.js +659 -0
- package/src/UI/pmi/pmiStyle.js +44 -0
- package/src/UI/sketcher/SketchMode3D.js +4095 -0
- package/src/UI/sketcher/dimensions.js +674 -0
- package/src/UI/sketcher/glyphs.js +236 -0
- package/src/UI/sketcher/highlights.js +60 -0
- package/src/UI/toolbarButtons/aboutButton.js +5 -0
- package/src/UI/toolbarButtons/exportButton.js +609 -0
- package/src/UI/toolbarButtons/flatPatternButton.js +307 -0
- package/src/UI/toolbarButtons/importButton.js +160 -0
- package/src/UI/toolbarButtons/inspectorToggleButton.js +12 -0
- package/src/UI/toolbarButtons/metadataButton.js +1063 -0
- package/src/UI/toolbarButtons/orientToFaceButton.js +114 -0
- package/src/UI/toolbarButtons/registerDefaultButtons.js +46 -0
- package/src/UI/toolbarButtons/saveButton.js +99 -0
- package/src/UI/toolbarButtons/scriptRunnerButton.js +302 -0
- package/src/UI/toolbarButtons/testsButton.js +26 -0
- package/src/UI/toolbarButtons/undoRedoButtons.js +25 -0
- package/src/UI/toolbarButtons/wireframeToggleButton.js +5 -0
- package/src/UI/toolbarButtons/zoomToFitButton.js +5 -0
- package/src/UI/triangleDebuggerWindow.js +945 -0
- package/src/UI/viewer.js +4228 -0
- package/src/assemblyConstraints/AssemblyConstraintHistory.js +1576 -0
- package/src/assemblyConstraints/AssemblyConstraintRegistry.js +120 -0
- package/src/assemblyConstraints/BaseAssemblyConstraint.js +66 -0
- package/src/assemblyConstraints/constraintExpressionUtils.js +35 -0
- package/src/assemblyConstraints/constraintUtils/parallelAlignment.js +676 -0
- package/src/assemblyConstraints/constraints/AngleConstraint.js +485 -0
- package/src/assemblyConstraints/constraints/CoincidentConstraint.js +194 -0
- package/src/assemblyConstraints/constraints/DistanceConstraint.js +616 -0
- package/src/assemblyConstraints/constraints/FixedConstraint.js +78 -0
- package/src/assemblyConstraints/constraints/ParallelConstraint.js +252 -0
- package/src/assemblyConstraints/constraints/TouchAlignConstraint.js +961 -0
- package/src/core/entities/HistoryCollectionBase.js +72 -0
- package/src/core/entities/ListEntityBase.js +109 -0
- package/src/core/entities/schemaProcesser.js +121 -0
- package/src/exporters/sheetMetalFlatPattern.js +659 -0
- package/src/exporters/sheetMetalUnfold.js +862 -0
- package/src/exporters/step.js +1135 -0
- package/src/exporters/threeMF.js +575 -0
- package/src/features/assemblyComponent/AssemblyComponentFeature.js +780 -0
- package/src/features/boolean/BooleanFeature.js +94 -0
- package/src/features/chamfer/ChamferFeature.js +116 -0
- package/src/features/datium/DatiumFeature.js +80 -0
- package/src/features/edgeFeatureUtils.js +41 -0
- package/src/features/extrude/ExtrudeFeature.js +143 -0
- package/src/features/fillet/FilletFeature.js +197 -0
- package/src/features/helix/HelixFeature.js +405 -0
- package/src/features/hole/HoleFeature.js +1050 -0
- package/src/features/hole/screwClearance.js +86 -0
- package/src/features/hole/threadDesignationCatalog.js +149 -0
- package/src/features/imageHeightSolid/ImageHeightmapSolidFeature.js +463 -0
- package/src/features/imageToFace/ImageToFaceFeature.js +727 -0
- package/src/features/imageToFace/imageEditor.js +1270 -0
- package/src/features/imageToFace/traceUtils.js +971 -0
- package/src/features/import3dModel/Import3dModelFeature.js +151 -0
- package/src/features/loft/LoftFeature.js +605 -0
- package/src/features/mirror/MirrorFeature.js +151 -0
- package/src/features/offsetFace/OffsetFaceFeature.js +370 -0
- package/src/features/offsetShell/OffsetShellFeature.js +89 -0
- package/src/features/overlapCleanup/OverlapCleanupFeature.js +85 -0
- package/src/features/pattern/PatternFeature.js +275 -0
- package/src/features/patternLinear/PatternLinearFeature.js +120 -0
- package/src/features/patternRadial/PatternRadialFeature.js +186 -0
- package/src/features/plane/PlaneFeature.js +154 -0
- package/src/features/primitiveCone/primitiveConeFeature.js +99 -0
- package/src/features/primitiveCube/primitiveCubeFeature.js +70 -0
- package/src/features/primitiveCylinder/primitiveCylinderFeature.js +91 -0
- package/src/features/primitivePyramid/primitivePyramidFeature.js +72 -0
- package/src/features/primitiveSphere/primitiveSphereFeature.js +62 -0
- package/src/features/primitiveTorus/primitiveTorusFeature.js +109 -0
- package/src/features/remesh/RemeshFeature.js +97 -0
- package/src/features/revolve/RevolveFeature.js +111 -0
- package/src/features/selectionUtils.js +118 -0
- package/src/features/sheetMetal/SheetMetalContourFlangeFeature.js +1656 -0
- package/src/features/sheetMetal/SheetMetalCutoutFeature.js +1056 -0
- package/src/features/sheetMetal/SheetMetalFlangeFeature.js +1568 -0
- package/src/features/sheetMetal/SheetMetalHemFeature.js +43 -0
- package/src/features/sheetMetal/SheetMetalObject.js +141 -0
- package/src/features/sheetMetal/SheetMetalTabFeature.js +176 -0
- package/src/features/sheetMetal/UNFOLD_NEUTRAL_REQUIREMENTS.md +153 -0
- package/src/features/sheetMetal/contour-flange-rebuild-spec.md +261 -0
- package/src/features/sheetMetal/profileUtils.js +25 -0
- package/src/features/sheetMetal/sheetMetalCleanup.js +9 -0
- package/src/features/sheetMetal/sheetMetalFaceTypes.js +146 -0
- package/src/features/sheetMetal/sheetMetalMetadata.js +165 -0
- package/src/features/sheetMetal/sheetMetalPipeline.js +169 -0
- package/src/features/sheetMetal/sheetMetalProfileUtils.js +216 -0
- package/src/features/sheetMetal/sheetMetalTabUtils.js +29 -0
- package/src/features/sheetMetal/sheetMetalTree.js +210 -0
- package/src/features/sketch/SketchFeature.js +955 -0
- package/src/features/sketch/sketchSolver2D/ConstraintEngine.js +800 -0
- package/src/features/sketch/sketchSolver2D/constraintDefinitions.js +704 -0
- package/src/features/sketch/sketchSolver2D/mathHelpersMod.js +307 -0
- package/src/features/spline/SplineEditorSession.js +988 -0
- package/src/features/spline/SplineFeature.js +1388 -0
- package/src/features/spline/splineUtils.js +218 -0
- package/src/features/sweep/SweepFeature.js +110 -0
- package/src/features/transform/TransformFeature.js +152 -0
- package/src/features/tube/TubeFeature.js +635 -0
- package/src/fs.proxy.js +625 -0
- package/src/idbStorage.js +254 -0
- package/src/index.js +12 -0
- package/src/main.js +15 -0
- package/src/metadataManager.js +64 -0
- package/src/path.proxy.js +277 -0
- package/src/plugins/ghLoader.worker.js +151 -0
- package/src/plugins/pluginManager.js +286 -0
- package/src/pmi/PMIViewsManager.js +134 -0
- package/src/services/componentLibrary.js +198 -0
- package/src/tests/ConsoleCapture.js +189 -0
- package/src/tests/S7-diagnostics-2025-12-23T18-37-23-570Z.json +630 -0
- package/src/tests/browserTests.js +597 -0
- package/src/tests/debugBoolean.js +225 -0
- package/src/tests/partFiles/badBoolean.json +957 -0
- package/src/tests/partFiles/extrudeTest.json +88 -0
- package/src/tests/partFiles/filletFail.json +58 -0
- package/src/tests/partFiles/import_TEst.part.part.json +646 -0
- package/src/tests/partFiles/sheetMetalHem.BREP.json +734 -0
- package/src/tests/test_boolean_subtract.js +27 -0
- package/src/tests/test_chamfer.js +17 -0
- package/src/tests/test_extrudeFace.js +24 -0
- package/src/tests/test_fillet.js +17 -0
- package/src/tests/test_fillet_nonClosed.js +45 -0
- package/src/tests/test_filletsMoreDifficult.js +46 -0
- package/src/tests/test_history_features_basic.js +149 -0
- package/src/tests/test_hole.js +282 -0
- package/src/tests/test_mirror.js +16 -0
- package/src/tests/test_offsetShellGrouping.js +85 -0
- package/src/tests/test_plane.js +4 -0
- package/src/tests/test_primitiveCone.js +11 -0
- package/src/tests/test_primitiveCube.js +7 -0
- package/src/tests/test_primitiveCylinder.js +8 -0
- package/src/tests/test_primitivePyramid.js +9 -0
- package/src/tests/test_primitiveSphere.js +17 -0
- package/src/tests/test_primitiveTorus.js +21 -0
- package/src/tests/test_pushFace.js +126 -0
- package/src/tests/test_sheetMetalContourFlange.js +125 -0
- package/src/tests/test_sheetMetal_features.js +80 -0
- package/src/tests/test_sketch_openLoop.js +45 -0
- package/src/tests/test_solidMetrics.js +58 -0
- package/src/tests/test_stlLoader.js +1889 -0
- package/src/tests/test_sweepFace.js +55 -0
- package/src/tests/test_tube.js +45 -0
- package/src/tests/test_tube_closedLoop.js +67 -0
- package/src/tests/tests.js +493 -0
- package/src/tools/assemblyConstraintDialogCapturePage.js +56 -0
- package/src/tools/dialogCapturePageFactory.js +227 -0
- package/src/tools/featureDialogCapturePage.js +47 -0
- package/src/tools/pmiAnnotationDialogCapturePage.js +60 -0
- package/src/utils/axisHelpers.js +99 -0
- package/src/utils/deepClone.js +69 -0
- package/src/utils/geometryTolerance.js +37 -0
- package/src/utils/normalizeTypeString.js +8 -0
- package/src/utils/xformMath.js +51 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
6
|
+
<title>Simplified Radial Dimension Interface - BREP</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root{
|
|
9
|
+
--bg:#0b0f14; --panel:#0f141b; --text:#d7dde6; --muted:#9aa7b2;
|
|
10
|
+
--border:#1b2430; --accent:#5cc8ff; --chip:#121823;
|
|
11
|
+
}
|
|
12
|
+
*{box-sizing:border-box}
|
|
13
|
+
html,body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono','Courier New',monospace}
|
|
14
|
+
main{max-width:1100px;margin:0 auto;padding:28px}
|
|
15
|
+
h1{margin:0 0 18px;font-size:22px;color:var(--accent);font-weight:700}
|
|
16
|
+
.summary{color:var(--muted);margin-bottom:22px}
|
|
17
|
+
.card{background:var(--panel);border:1px solid var(--border);border-radius:14px;padding:18px;margin:0 0 18px}
|
|
18
|
+
.readme{padding:0}
|
|
19
|
+
.readme .header{padding:16px 18px;border-bottom:1px solid var(--border)}
|
|
20
|
+
.readme .content{padding:18px}
|
|
21
|
+
.doc-card{padding:18px}
|
|
22
|
+
.doc-nav{margin:0 0 18px;display:flex;gap:12px;flex-wrap:wrap;align-items:center;color:var(--muted)}
|
|
23
|
+
.doc-nav-links{display:flex;gap:12px;flex-wrap:wrap;align-items:center}
|
|
24
|
+
.doc-nav a{color:var(--accent);font-weight:600}
|
|
25
|
+
.doc-list{list-style:none;margin:18px 0;padding:0}
|
|
26
|
+
.doc-list li{margin:6px 0}
|
|
27
|
+
.doc-list a{color:var(--accent)}
|
|
28
|
+
.nav-search{margin-left:auto;position:relative;display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end;min-width:240px;max-width:520px}
|
|
29
|
+
.search-title{font-weight:700;font-size:14px;margin-bottom:4px}
|
|
30
|
+
.search-hint{color:var(--muted);font-size:12px;margin:0}
|
|
31
|
+
.search-input-row{display:flex;gap:8px;align-items:center;width:100%}
|
|
32
|
+
.search-input{flex:1;border:1px solid var(--border);border-radius:10px;background:var(--chip);color:var(--text);padding:10px 12px}
|
|
33
|
+
.search-input:focus{outline:1px solid var(--accent);box-shadow:0 0 0 3px rgba(92,200,255,0.15)}
|
|
34
|
+
.search-clear{border:1px solid var(--border);background:var(--panel);color:var(--muted);border-radius:10px;padding:9px 12px;cursor:pointer;font-weight:600}
|
|
35
|
+
.search-clear:hover{border-color:var(--accent);color:var(--accent)}
|
|
36
|
+
.search-status{color:var(--muted);font-size:12px;margin-top:4px;width:100%;text-align:right}
|
|
37
|
+
.search-results{position:absolute;top:100%;right:0;margin-top:10px;border:1px solid var(--border);border-radius:12px;background:var(--panel);max-height:360px;overflow:auto;min-width:320px;max-width:520px;box-shadow:0 12px 30px rgba(0,0,0,0.35);z-index:25}
|
|
38
|
+
.search-results ul{list-style:none;margin:0;padding:0}
|
|
39
|
+
.search-item{padding:10px 12px;border-bottom:1px solid var(--border)}
|
|
40
|
+
.search-item:last-child{border-bottom:none}
|
|
41
|
+
.search-item a{display:block;color:var(--accent);font-weight:600}
|
|
42
|
+
.search-snippet{color:var(--muted);font-size:13px;margin-top:4px}
|
|
43
|
+
.search-results mark{background:rgba(92,200,255,0.2);color:var(--text);border-radius:4px;padding:0 2px}
|
|
44
|
+
.prose h1{font-size:24px;margin:0 0 12px}
|
|
45
|
+
.prose h2{font-size:18px;margin:18px 0 8px}
|
|
46
|
+
.prose h3{font-size:16px;margin:14px 0 6px}
|
|
47
|
+
.prose p{margin:0 0 10px}
|
|
48
|
+
.prose ul,.prose ol{margin:0 0 10px 18px}
|
|
49
|
+
.prose li{margin:4px 0}
|
|
50
|
+
.prose code{background:#0d1520;border:1px solid var(--border);padding:1px 5px;border-radius:6px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'Liberation Mono','Courier New',monospace;font-size:12px}
|
|
51
|
+
.prose pre{background:#0d1520;border:1px solid var(--border);padding:12px;border-radius:12px;overflow:auto}
|
|
52
|
+
.prose a{color:var(--accent)}
|
|
53
|
+
.prose img{max-width:100%;height:auto;}
|
|
54
|
+
.prose table{border-collapse:collapse;width:100%;margin:16px 0;background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden}
|
|
55
|
+
.prose th,.prose td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border)}
|
|
56
|
+
.prose th{background:var(--chip);color:var(--text);font-weight:600;font-size:13px}
|
|
57
|
+
.prose tr:last-child td{border-bottom:none}
|
|
58
|
+
.prose tbody tr:hover{background:rgba(92,200,255,0.05)}
|
|
59
|
+
.license{
|
|
60
|
+
background:var(--panel);border:1px solid var(--border);border-radius:14px;
|
|
61
|
+
padding:16px 16px 8px;margin:0 0 18px;
|
|
62
|
+
}
|
|
63
|
+
.license > h2{margin:0 0 10px;font-size:16px;font-weight:700}
|
|
64
|
+
.pkg{
|
|
65
|
+
border-top:1px solid var(--border);padding:10px 0;
|
|
66
|
+
display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;
|
|
67
|
+
}
|
|
68
|
+
.pkg:first-of-type{border-top:none}
|
|
69
|
+
.pkg .meta{display:flex;gap:10px;flex-wrap:wrap}
|
|
70
|
+
.pkg .name{font-weight:600}
|
|
71
|
+
.pkg .desc{color:var(--muted);margin-top:2px}
|
|
72
|
+
a{color:var(--accent);text-decoration:none} a:hover{text-decoration:underline}
|
|
73
|
+
.chip{background:var(--chip);border:1px solid var(--border);border-radius:999px;padding:2px 8px;font-size:12px;color:var(--muted)}
|
|
74
|
+
.footer{margin-top:26px;color:var(--muted);font-size:12px}
|
|
75
|
+
</style>
|
|
76
|
+
</head>
|
|
77
|
+
<body>
|
|
78
|
+
<main>
|
|
79
|
+
<nav class="doc-nav">
|
|
80
|
+
<div class="doc-nav-links">
|
|
81
|
+
<a href="index.html">Help Home</a><span>·</span><a href="/help/table-of-contents.html">Table of Contents</a><span>·</span><a href="https://github.com/mmiscool/BREP" target="_blank" rel="noopener noreferrer">GitHub</a>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="nav-search">
|
|
84
|
+
<div class="search-input-row">
|
|
85
|
+
<input type="search" id="doc-search" class="search-input" placeholder="Search docs... Type at least 2 characters to search" autocomplete="off" spellcheck="false" />
|
|
86
|
+
<button type="button" class="search-clear" id="doc-search-clear">Clear</button>
|
|
87
|
+
</div>
|
|
88
|
+
<div class="search-status" id="doc-search-status"></div>
|
|
89
|
+
<div class="search-results" id="doc-search-results" hidden>
|
|
90
|
+
<ul id="doc-search-list"></ul>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</nav>
|
|
94
|
+
<section class="card doc-card">
|
|
95
|
+
|
|
96
|
+
<div class="prose">
|
|
97
|
+
<h1>Simplified Radial Dimension Interface</h1><p>The radial dimension interface has been significantly simplified to take advantage of embedded radius metadata in cylindrical faces. Users now only need to select the cylindrical face itself, rather than manually specifying center points and edges.</p><h2>New Interface</h2><h3>Required Input</h3><ul><li><strong>Cylindrical Face</strong>: Select any cylindrical face (from primitives, extrusions, etc.)</li></ul><h3>Optional Inputs</h3><ul><li><strong>Projection Plane</strong>: Optional face to define the drawing plane for the dimension</li><li><strong>Display Style</strong>: Choose between radius (R) or diameter (⌀) display</li><li><strong>Alignment</strong>: Control dimension orientation (view, XY, YZ, ZX)</li><li><strong>Offset</strong>: Adjust dimension line offset distance</li><li><strong>Decimals</strong>: Number of decimal places to display</li><li><strong>Reference</strong>: Mark as reference dimension (parentheses)</li></ul><h2>Usage Examples</h2><h3>Basic Cylindrical Face Selection</h3><p><pre><code>javascript
|
|
98
|
+
// Create a radial dimension
|
|
99
|
+
const radialDim = RadialDimension.create(pmiMode);
|
|
100
|
+
|
|
101
|
+
// Simply select the cylindrical face - that's it!
|
|
102
|
+
radialDim.cylindricalFaceRef = 'MyCylinder_S';
|
|
103
|
+
radialDim.displayStyle = 'radius'; // or 'diameter'
|
|
104
|
+
|
|
105
|
+
// The system automatically:
|
|
106
|
+
// 1. Extracts radius from face metadata
|
|
107
|
+
// 2. Determines cylinder center and axis
|
|
108
|
+
// 3. Creates appropriate dimension geometry</code></pre></p><h3>With Projection Plane</h3><p><pre><code>javascript
|
|
109
|
+
// For dimensions that need specific orientation
|
|
110
|
+
radialDim.cylindricalFaceRef = 'MyCylinder_S';
|
|
111
|
+
radialDim.planeRef = 'WorkPlane_XY'; // Optional projection plane
|
|
112
|
+
radialDim.displayStyle = 'diameter';</code></pre></p><h2>Benefits of the New Interface</h2><h3>1. <strong>Simplified Workflow</strong></h3><ul><li><strong>Before</strong>: Select center point → Select edge/arc → Configure alignment</li><li><strong>After</strong>: Select cylindrical face → Done!</li></ul><h3>2. <strong>Automatic Precision</strong></h3><ul><li>Uses exact radius values from original geometry</li><li>No approximation errors from triangle mesh sampling</li><li>Consistent measurements regardless of mesh resolution</li></ul><h3>3. <strong>Intelligent Detection</strong></h3><ul><li>Automatically works with:</li></ul><p>- Primitive cylinders (<code>BREP.Cylinder</code>) - Extruded circular sketches - Revolved circular profiles - Boolean operation results</p><h3>4. <strong>Robust Behavior</strong></h3><ul><li>Gracefully handles transformations (rotation, scaling, translation)</li><li>Preserves accuracy through boolean operations</li><li>Maintains metadata through complex modeling operations</li></ul><h2>Supported Cylindrical Sources</h2><h3>Primitive Cylinders</h3><p><pre><code>javascript
|
|
113
|
+
const cylinder = new BREP.Cylinder({
|
|
114
|
+
radius: 5.0,
|
|
115
|
+
height: 10.0,
|
|
116
|
+
name: 'Pipe'
|
|
117
|
+
});
|
|
118
|
+
// Side face 'Pipe_S' automatically gets radius metadata</code></pre></p><h3>Extruded Circles</h3><p><pre><code>javascript
|
|
119
|
+
const extruded = new BREP.ExtrudeSolid({
|
|
120
|
+
face: circularSketch, // Circle with radius 3.0
|
|
121
|
+
distance: 8.0
|
|
122
|
+
});
|
|
123
|
+
// Side wall gets cylindrical metadata with radius 3.0</code></pre></p><h3>Equal-Radius Cones</h3><p><pre><code>javascript
|
|
124
|
+
const cylinder = new BREP.Cone({
|
|
125
|
+
r1: 4.0,
|
|
126
|
+
r2: 4.0, // Equal radii = cylindrical
|
|
127
|
+
h: 12.0
|
|
128
|
+
});
|
|
129
|
+
// Treated as cylindrical face with radius 4.0</code></pre></p><h2>Technical Implementation</h2><h3>Metadata Structure</h3><p>Cylindrical faces store this metadata: <pre><code>javascript
|
|
130
|
+
{
|
|
131
|
+
type: 'cylindrical',
|
|
132
|
+
radius: 5.0,
|
|
133
|
+
height: 10.0,
|
|
134
|
+
axis: [0, 1, 0], // Unit vector along cylinder axis
|
|
135
|
+
center: [0, 5.0, 0] // Center point of cylinder axis
|
|
136
|
+
}</code></pre></p><h3>Dimension Calculation</h3><ol><li><strong>Face Selection</strong>: User selects cylindrical face</li><li><strong>Metadata Lookup</strong>: System retrieves stored radius value</li><li><strong>Geometry Computation</strong>: Calculates center, axis, and surface points</li><li><strong>Projection</strong>: Applies any plane constraints or alignment rules</li><li><strong>Rendering</strong>: Draws dimension with exact radius value</li></ol><h3>Fallback Behavior</h3><p>If metadata is not available (legacy geometry), the system automatically falls back to geometric calculation from triangle mesh, ensuring backward compatibility.</p><h2>Migration from Old Interface</h2><h3>Old Schema (Deprecated)</h3><p><pre><code>javascript
|
|
137
|
+
{
|
|
138
|
+
centerRef: 'CenterVertex', // ❌ No longer needed
|
|
139
|
+
edgeRef: 'CircularEdge', // ❌ No longer needed
|
|
140
|
+
planeRef: 'ProjectionFace', // ✓ Still optional
|
|
141
|
+
// ... other settings
|
|
142
|
+
}</code></pre></p><h3>New Schema</h3><p><pre><code>javascript
|
|
143
|
+
{
|
|
144
|
+
cylindricalFaceRef: 'Cylinder_S', // ✓ Simple face selection
|
|
145
|
+
planeRef: 'ProjectionFace', // ✓ Optional projection plane
|
|
146
|
+
// ... other settings (unchanged)
|
|
147
|
+
}</code></pre></p><h2>Error Handling</h2><h3>Invalid Face Selection</h3><ul><li><strong>Non-cylindrical faces</strong>: Dimension creation fails gracefully</li><li><strong>Missing metadata</strong>: Falls back to geometric calculation</li><li><strong>Transformed geometry</strong>: Automatically applies transformations</li></ul><h3>Missing References</h3><ul><li><strong>No cylindrical face</strong>: Shows error message in UI</li><li><strong>Invalid plane reference</strong>: Uses view alignment as fallback</li><li><strong>Corrupted metadata</strong>: Attempts geometric reconstruction</li></ul><h2>Performance Benefits</h2><ul><li><strong>No geometric analysis</strong>: Direct metadata lookup vs mesh processing</li><li><strong>Reduced computation</strong>: Skip center/radius finding algorithms</li><li><strong>Faster updates</strong>: Dimension updates use cached metadata values</li><li><strong>Lower memory</strong>: No need to store intermediate geometric calculations</li></ul><h2>Future Enhancements</h2><p>This simplified interface enables future improvements:</p><ol><li><strong>Smart Face Detection</strong>: Auto-suggest cylindrical faces when tool is activated</li><li><strong>Multi-Radius Display</strong>: Show both inner/outer radii for thick cylinders</li><li><strong>Tolerance Integration</strong>: Display radius tolerances from design intent</li><li><strong>Parametric Updates</strong>: Dimensions update automatically when model changes</li></ol>
|
|
148
|
+
</div>
|
|
149
|
+
</section>
|
|
150
|
+
</main>
|
|
151
|
+
<script>
|
|
152
|
+
(() => {
|
|
153
|
+
const searchInput = document.getElementById("doc-search");
|
|
154
|
+
const resultsBox = document.getElementById("doc-search-results");
|
|
155
|
+
const resultsList = document.getElementById("doc-search-list");
|
|
156
|
+
const statusEl = document.getElementById("doc-search-status");
|
|
157
|
+
const clearBtn = document.getElementById("doc-search-clear");
|
|
158
|
+
if (!searchInput || !resultsBox || !resultsList || !statusEl || !clearBtn) return;
|
|
159
|
+
const indexUrl = "./search-index.json";
|
|
160
|
+
let indexPromise = null;
|
|
161
|
+
let cachedEntries = null;
|
|
162
|
+
|
|
163
|
+
const escapeHtml = (text = "") =>
|
|
164
|
+
text
|
|
165
|
+
.replace(/&/g, "&")
|
|
166
|
+
.replace(/</g, "<")
|
|
167
|
+
.replace(/>/g, ">");
|
|
168
|
+
|
|
169
|
+
const escapeRegExp = (text = "") => text.replace(/[.*+?^{}()|[]\$]/g, "\$&");
|
|
170
|
+
|
|
171
|
+
const highlight = (text, terms) => {
|
|
172
|
+
if (!terms.length) return escapeHtml(text);
|
|
173
|
+
const pattern = terms.map(escapeRegExp).join("|");
|
|
174
|
+
const regex = new RegExp(`(${pattern})`, "gi");
|
|
175
|
+
return escapeHtml(text).replace(regex, "<mark>$1</mark>");
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
const buildSnippet = (entry, terms) => {
|
|
179
|
+
const source = entry.content || entry.summary || "";
|
|
180
|
+
if (!source) return { plain: "", highlighted: "" };
|
|
181
|
+
let hit = source.length;
|
|
182
|
+
for (const term of terms) {
|
|
183
|
+
const idx = entry.contentLower.indexOf(term);
|
|
184
|
+
if (idx !== -1 && idx < hit) hit = idx;
|
|
185
|
+
}
|
|
186
|
+
if (!Number.isFinite(hit) || hit === source.length) hit = 0;
|
|
187
|
+
const start = Math.max(0, hit - 60);
|
|
188
|
+
const end = Math.min(source.length, hit + 140);
|
|
189
|
+
const snippet = source.slice(start, end);
|
|
190
|
+
return { plain: snippet, highlighted: highlight(snippet, terms) };
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const updateStatus = (message) => {
|
|
194
|
+
statusEl.textContent = message;
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const loadIndex = async () => {
|
|
198
|
+
if (cachedEntries) return cachedEntries;
|
|
199
|
+
if (!indexPromise) {
|
|
200
|
+
indexPromise = fetch(indexUrl, { cache: "no-store" })
|
|
201
|
+
.then((res) => {
|
|
202
|
+
if (!res.ok) throw new Error("Failed to load search index");
|
|
203
|
+
return res.json();
|
|
204
|
+
})
|
|
205
|
+
.then((json) => {
|
|
206
|
+
cachedEntries = Array.isArray(json)
|
|
207
|
+
? json.map((entry) => ({
|
|
208
|
+
...entry,
|
|
209
|
+
contentLower: (entry.content || "").toLowerCase(),
|
|
210
|
+
titleLower: (entry.title || "").toLowerCase(),
|
|
211
|
+
}))
|
|
212
|
+
: [];
|
|
213
|
+
return cachedEntries;
|
|
214
|
+
})
|
|
215
|
+
.catch((err) => {
|
|
216
|
+
console.error("Search index load failed", err);
|
|
217
|
+
cachedEntries = [];
|
|
218
|
+
throw err;
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return indexPromise;
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
const renderResults = (entries, terms) => {
|
|
225
|
+
if (!terms.length) {
|
|
226
|
+
resultsBox.hidden = true;
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (!entries.length) {
|
|
230
|
+
resultsList.innerHTML = '<li class="search-item"><div class="search-snippet">No matches found.</div></li>';
|
|
231
|
+
resultsBox.hidden = false;
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const rendered = entries
|
|
235
|
+
.slice(0, 30)
|
|
236
|
+
.map((entry) => {
|
|
237
|
+
const snippet = buildSnippet(entry, terms);
|
|
238
|
+
const title = highlight(entry.title || entry.href, terms);
|
|
239
|
+
const hasFragment = snippet.plain && snippet.plain.trim().length > 0;
|
|
240
|
+
const fragment = hasFragment ? `#:~:text=${encodeURIComponent(snippet.plain.trim())}` : "";
|
|
241
|
+
const hrefWithFragment = hasFragment
|
|
242
|
+
? (entry.href.includes("#") ? `${entry.href}&:~:text=${encodeURIComponent(snippet.plain.trim())}` : `${entry.href}${fragment}`)
|
|
243
|
+
: entry.href;
|
|
244
|
+
const snippetHtml = snippet.highlighted ? `<div class="search-snippet">${snippet.highlighted}</div>` : "";
|
|
245
|
+
return `<li class="search-item"><a href="${hrefWithFragment}">${title}</a>${snippetHtml}</li>`;
|
|
246
|
+
})
|
|
247
|
+
.join("");
|
|
248
|
+
resultsList.innerHTML = rendered;
|
|
249
|
+
resultsBox.hidden = false;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
const performSearch = async () => {
|
|
253
|
+
const rawQuery = searchInput.value.trim();
|
|
254
|
+
if (rawQuery.length < 2) {
|
|
255
|
+
updateStatus("Type at least 2 characters to search.");
|
|
256
|
+
resultsBox.hidden = true;
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const terms = rawQuery.toLowerCase().split(/\s+/).filter(Boolean);
|
|
260
|
+
updateStatus("Searching...");
|
|
261
|
+
try {
|
|
262
|
+
const entries = await loadIndex();
|
|
263
|
+
const matches = entries.filter((entry) =>
|
|
264
|
+
terms.every((term) => entry.contentLower.includes(term) || entry.titleLower.includes(term))
|
|
265
|
+
);
|
|
266
|
+
renderResults(matches, terms);
|
|
267
|
+
updateStatus(matches.length ? `${matches.length} result${matches.length === 1 ? "" : "s"} for "${rawQuery}"` : "No matches found.");
|
|
268
|
+
} catch (err) {
|
|
269
|
+
updateStatus("Search unavailable (could not load index).");
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
searchInput.addEventListener("input", performSearch);
|
|
274
|
+
|
|
275
|
+
searchInput.addEventListener("focus", () => {
|
|
276
|
+
if (!cachedEntries) {
|
|
277
|
+
loadIndex().catch(() => updateStatus("Search unavailable (could not load index)."));
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
clearBtn.addEventListener("click", () => {
|
|
282
|
+
searchInput.value = "";
|
|
283
|
+
resultsBox.hidden = true;
|
|
284
|
+
updateStatus("Type at least 2 characters to search.");
|
|
285
|
+
searchInput.focus();
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
document.addEventListener("keydown", (evt) => {
|
|
289
|
+
if (evt.key === "Escape" && document.activeElement === searchInput) {
|
|
290
|
+
searchInput.value = "";
|
|
291
|
+
resultsBox.hidden = true;
|
|
292
|
+
updateStatus("Type at least 2 characters to search.");
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
})();
|
|
296
|
+
</script>
|
|
297
|
+
</body>
|
|
298
|
+
</html>
|